Skip to main content

Design Tokens

Primitive and semantic tokens for JobJitsu. Components consume semantic tokens; themes re-map them (THEME_DARK.md, THEME_LIGHT.md).


1. Color primitives​

Brand​

TokenHexName
--jj-color-indigo-950#0B0A1AMidnight Ink
--jj-color-indigo-900#1E1B4BDeep Indigo
--jj-color-indigo-800#312E81Indigo elevated (panels on dark)
--jj-color-teal-400#2DD4BFElectric Teal
--jj-color-teal-500#14B8A6Teal AA (body on dark)
--jj-color-teal-600#0D9488Teal pressed / strong

Neutrals​

TokenHexName
--jj-color-white#FFFFFFWhite
--jj-color-cloud-50#F8FAFCSoft Cloud
--jj-color-slate-100#F1F5F9Cloud muted
--jj-color-slate-200#E2E8F0Border light
--jj-color-slate-300#CBD5E1Border strong light
--jj-color-slate-500#64748BText secondary
--jj-color-slate-600#475569Text secondary strong
--jj-color-slate-800#1E293BText primary on light
--jj-color-slate-900#0F172ANear-black text

Feedback​

TokenHexNameRole
--jj-color-jade-500#10B981JadeSuccess
--jj-color-jade-600#059669Jade strongSuccess pressed
--jj-color-amber-500#F59E0BAmberCaution / pending
--jj-color-amber-600#D97706Amber strongCaution pressed
--jj-color-rose-500#F43F5ERoseError (not brand-loud; use sparingly)
--jj-color-rose-600#E11D48Rose strongError pressed

Alpha helpers (use on theme surfaces)​

TokenValueUse
--jj-alpha-teal-15color-mix(in srgb, var(--jj-color-teal-400) 15%, transparent)Soft teal wash
--jj-alpha-teal-25color-mix(in srgb, var(--jj-color-teal-400) 25%, transparent)Hover wash
--jj-alpha-white-06color-mix(in srgb, white 6%, transparent)Dark hairlines
--jj-alpha-black-06color-mix(in srgb, black 6%, transparent)Light hairlines

2. Semantic color tokens​

Themes assign these. Prefer these in Jj* components.

Surfaces​

TokenPurpose
--jj-color-bg-canvasApp background
--jj-color-bg-surfacePanels, sidebars
--jj-color-bg-elevatedPopovers, menus, toasts
--jj-color-bg-mutedSubtle wells, code/log chrome
--jj-color-bg-inverseInverse strips (rare)

Text​

TokenPurpose
--jj-color-text-primaryBody and titles
--jj-color-text-secondaryMeta, captions
--jj-color-text-tertiaryPlaceholders, disabled hints
--jj-color-text-inverseText on inverse/primary fills
--jj-color-text-linkLinks
--jj-color-text-on-accentText on teal CTAs

Borders & focus​

TokenPurpose
--jj-color-border-subtleDividers
--jj-color-border-defaultInputs, lists
--jj-color-border-strongEmphasized containers
--jj-color-focus-ringKeyboard focus

Actions & status​

TokenPurpose
--jj-color-accentPrimary accent (teal)
--jj-color-accent-hoverAccent hover
--jj-color-accent-pressedAccent pressed
--jj-color-accent-mutedAccent wash backgrounds
--jj-color-successSuccess
--jj-color-success-mutedSuccess wash
--jj-color-cautionCaution / follow-up due
--jj-color-caution-mutedCaution wash
--jj-color-dangerError / destructive
--jj-color-danger-mutedError wash

Privacy chrome​

TokenPurpose
--jj-color-privacy-pill-bgAgent on-device pill background
--jj-color-privacy-pill-fgAgent on-device pill text
--jj-color-privacy-pill-borderAgent on-device pill border

3. Spacing​

4px base unit (--jj-space-unit). Desktop-dense: tighter than consumer mobile, never cramped. All spacing is a multiple of 4 (hairline borders 1px excepted).

TokenValueTypical use
--jj-space-0.52pxIcon optical tweaks
--jj-space-14pxTight inline gaps
--jj-space-28pxLabel → control; button group gap
--jj-space-312pxControl padding Y; list row vertical
--jj-space-416pxDefault gap; list row padding X
--jj-space-520pxSection inner padding (compact)
--jj-space-624pxPanel/modal padding; section gap
--jj-space-832pxView padding; major stacks
--jj-space-1040pxEmpty-state vertical rhythm
--jj-space-1248pxRare large separations
--jj-space-1664pxOnboarding hero breathing room

Rules: prefer scale tokens over arbitrary values; density first (one step tighter than marketing-site padding); hierarchy via type and section gaps, not oversized card padding; click targets stay ≥ 32px tall (RESPONSIVE.md).


4. Border radius​

Subtle rounding — native tool, not toy. Pills are reserved for privacy/status chrome.

TokenValueUse
--jj-radius-none0Full-bleed panels; tables/logs flush to edge
--jj-radius-sm4pxInputs, selects, compact chips
--jj-radius-md6pxButtons, list row hover, menus
--jj-radius-lg8pxPanels, dialogs, popovers, toasts
--jj-radius-xl12pxRare large empty-state frames
--jj-radius-pill999pxAgent · On-device pill, status containers

Rules: never default everything to rounded-full; nested radii inner ≤ outer; tables and logs stay near none/sm for density.


5. Elevation​

Soft, short shadows — paper in low light, not floating marketing cards. Prefer surface + hairline border (--jj-color-border-subtle) before adding shadow. Values are dark-theme defaults; light theme uses softer alphas (THEME_LIGHT.md).

TokenValue (dark)Use
--jj-shadow-nonenoneFlat lists, tables, logs, sidebars
--jj-shadow-sm0 1px 2px rgba(0,0,0,0.35)Subtle controls, compact menus
--jj-shadow-md0 4px 12px rgba(0,0,0,0.40)Popovers, dropdowns
--jj-shadow-lg0 8px 24px rgba(0,0,0,0.45)Modals, toasts
--jj-shadow-focus0 0 0 3px color-mix(in srgb, var(--jj-color-focus-ring) 45%, transparent)Focus ring companion

Overlay scrim: --jj-overlay-scrim — dark rgba(0,0,0,0.55), light rgba(15,23,42,0.35). Modals use scrim + lg shadow.

Rules: no stacked colored glows (teal bloom, purple haze); only one elevated layer competing at a time; never use elevation to manufacture urgency.


6. Other token categories​

CategoryDoc
TypographyTYPOGRAPHY.md
MotionANIMATION.md

7. Icon size tokens​

TokenValueUse
--jj-icon-sm16pxInline, dense rows
--jj-icon-md20pxDefault controls
--jj-icon-lg24pxEmpty states, section anchors

Stroke: 2px, rounded caps/joins (Lucide). Colors follow text/icon semantic tokens; interactive hover → accent.


8. Z-index scale​

TokenValueLayer
--jj-z-base0Content
--jj-z-sticky100Sticky headers / status
--jj-z-dropdown200Menus
--jj-z-popover300Popovers
--jj-z-toast400Toasts
--jj-z-modal500Modals
--jj-z-privacy600Always-on privacy chrome if overlaying

Keep the scale short — calm UI, few competing layers.


9. Usage rules​

  • Do not use purple nebula accents or glow stacks — off-brand.
  • Teal envelope flap on the logo stays #2DD4BF — never retint.
  • Prefer semantic tokens in components; primitives only in theme files.
  • Pair status color with icon + text (ACCESSIBILITY.md).