JM Family Design System

Color System

The JM Family Enterprises color palette, token architecture, and interactive tools for selecting and validating color combinations. For contrast requirements and broader accessibility guidance, see Foundations › Accessibility.

Brand Foundation

Color begins with the JM Family brand. The signature color is teal. The design system extends the brand palette into a full-scale token system that supports light and dark themes, accessible contrast ratios, and semantic meaning.

Primary Colors

JM Family Classic Teal
#008996 · RGB 0, 137, 150 · PMS 321
Main color, icons, backgrounds, accents
JM Family Modern Teal
#00838F · RGB 0, 131, 143 · PMS 7474
Main color, icons, backgrounds, accents
Dark Teal
#115662 · RGB 17, 86, 98 · PMS 5473
Icons, backgrounds, accents

Neutral Colors

Light Teal
#C3E2E5 · RGB 195, 226, 229 · PMS 628
Backgrounds, accents
Light Gray
#F8F8F8 · RGB 248, 248, 248 · PMS Cool Gray 1
Backgrounds
Black
#000000 · RGB 0, 0, 0 · PMS
Text, backgrounds, icons
White
#FFFFFF · RGB 255, 255, 255 · PMS
Backgrounds

Secondary Colors

Orange
#F15B29 · RGB 241, 91, 41 · PMS 1645
Backgrounds, accents, icons
Yellow
#FBB038 · RGB 251, 176, 56 · PMS 143
Backgrounds, accents, icons
Green
#6EC3A3 · RGB 110, 195, 163 · PMS 338
Backgrounds, accents, icons
From brand to tokens
The brand guidelines define 10 named colors. The design system expands these into full 10-step scales (50–900) for each hue, enabling consistent tinting and shading. The exact brand hex values appear at specific scale positions within the global palette below.

Global Palette

Global tokens are the raw color values. They define every available color but carry no semantic meaning. Components should never reference global tokens directly — always use semantic tokens.

Gray
BluePrimary brand
Green
Yellow
RedUI only — not in brand palette
SkyUI only — not in brand palette
White & Black

Semantic Tokens

Semantic tokens are what components actually consume. They define purpose, not appearance. The same semantic token resolves to different global values depending on the active theme.

Text Colors

TokenDescriptionLightDarkCSS Custom Property
color.text.primaryPrimary body text, headings. Highest contrast.#121214#F3F4F6--color-text-primary
color.text.secondaryCaptions, helper text, metadata, timestamps.#6B7280#9CA3AF--color-text-secondary
color.text.tertiaryPlaceholder text, least prominent text.#9CA3AF#6B7280--color-text-tertiary
color.text.disabledText on disabled elements.#D1D5DB#4B5563--color-text-disabled
color.text.inverseText on dark/inverted backgrounds.#FFFFFF#121214--color-text-inverse
color.text.brandBrand accent text. Modern Teal.#00838F#5FB3BC--color-text-brand
color.text.link.defaultDefault link text. Modern Teal.#00838F#2C9DA8--color-text-link-default
color.text.link.hoverLink hover state. Dark Teal.#115662#5FB3BC--color-text-link-hover
color.text.link.visitedVisited link.#0A6B76#96CDD3--color-text-link-visited
color.text.successSuccess message text.#15803D#BBF7D0--color-text-success
color.text.warningWarning message text.#A16207#FEF08A--color-text-warning
color.text.errorError message text.#B91C1C#FECACA--color-text-error
color.text.infoInformational message text.#0369A1#BAE6FD--color-text-info

Surface Colors

TokenDescriptionLightDarkCSS Custom Property
color.surface.defaultPage background.#FFFFFF#121214--color-surface-default
color.surface.subtleAlternating rows, subtle section backgrounds.#F9FAFB#1F2937--color-surface-subtle
color.surface.mutedCard backgrounds, code blocks, sidebar.#F3F4F6#1F2937--color-surface-muted
color.surface.elevatedModals, dropdowns. Distinguished from default by elevation shadow.#FFFFFF#1F2937--color-surface-elevated
color.surface.overlayScrim behind modals and dialogs.rgba(17, 24, 39, 0.5)rgba(0, 0, 0, 0.6)--color-surface-overlay
color.surface.inverseDark surfaces, footer, inverted sections.#121214#F3F4F6--color-surface-inverse
color.surface.brandBrand accent background. Light Teal tint.#E8F5F7#0C3D45--color-surface-brand

Action Colors

TokenDescriptionLightDarkCSS Custom Property
color.action.primary.defaultPrimary button/action background. Modern Teal.#00838F#2C9DA8--color-action-primary-default
color.action.primary.hoverPrimary action hover. Dark Teal.#115662#5FB3BC--color-action-primary-hover
color.action.primary.activePrimary action pressed/active.#0C3D45#96CDD3--color-action-primary-active
color.action.primary.disabledDisabled action background.#E5E7EB#374151--color-action-primary-disabled
color.action.primary.textText on primary action.#FFFFFF#121214--color-action-primary-text
color.action.secondary.defaultSecondary button background.#FFFFFFtransparent--color-action-secondary-default
color.action.secondary.hoverSecondary button hover.#F9FAFB#1F2937--color-action-secondary-hover
color.action.secondary.activeSecondary button pressed.#F3F4F6#374151--color-action-secondary-active
color.action.secondary.borderSecondary button border.#D1D5DB#4B5563--color-action-secondary-border
color.action.secondary.textText on secondary action.#374151#E5E7EB--color-action-secondary-text
color.action.tertiary.defaultTertiary/ghost button background.transparenttransparent--color-action-tertiary-default
color.action.tertiary.hoverTertiary button hover.#F9FAFB#1F2937--color-action-tertiary-hover
color.action.tertiary.textTertiary button text. Modern Teal.#00838F#2C9DA8--color-action-tertiary-text
color.action.danger.defaultDestructive action background.#B91C1C#B91C1C--color-action-danger-default
color.action.danger.hoverDestructive action hover.#7F1D1D#7F1D1D--color-action-danger-hover
color.action.danger.textText on destructive action.#FFFFFF#FFFFFF--color-action-danger-text

Border Colors

TokenDescriptionLightDarkCSS Custom Property
color.border.defaultStandard borders, dividers, separators.#E5E7EB#374151--color-border-default
color.border.strongEmphasized borders, input borders.#9CA3AF#6B7280--color-border-strong
color.border.focusFocus ring color.#008996#2C9DA8--color-border-focus
color.border.brandBrand accent border. Classic Teal.#008996#2C9DA8--color-border-brand
color.border.errorError state border.#EF4444#EF4444--color-border-error
color.border.successSuccess state border.#22C55E#22C55E--color-border-success

Feedback Colors

TokenDescriptionLightDarkCSS Custom Property
color.feedback.success.bgSuccess alert/toast background.#F0FDF4#14532D--color-feedback-success-bg
color.feedback.success.iconSuccess alert icon.#22C55E#22C55E--color-feedback-success-icon
color.feedback.warning.bgWarning alert/toast background.#FEFCE8#713F12--color-feedback-warning-bg
color.feedback.warning.iconWarning alert icon.#EAB308#EAB308--color-feedback-warning-icon
color.feedback.error.bgError alert/toast background.#FEF2F2#7F1D1D--color-feedback-error-bg
color.feedback.error.iconError alert icon.#EF4444#EF4444--color-feedback-error-icon
color.feedback.info.bgInfo alert/toast background.#F0F9FF#0C4A6E--color-feedback-info-bg
color.feedback.info.iconInfo alert icon.#0EA5E9#0EA5E9--color-feedback-info-icon

Theme Comparison

The design system supports light and dark themes. Components use identical semantic token names in both themes — only the resolved values change.

Light Theme
Card Heading
This is body text inside a card component showing how text appears on the default surface.
Primary Button
LabelText inputHelper text
Success message
SecondaryTertiary
Dark Theme
Card Heading
This is body text inside a card component showing how text appears on the default surface.
Primary Button
LabelText inputHelper text
Success message
SecondaryTertiary

Token Value Mapping

TokenLight ValueDark Value
color.text.primary#121214#F3F4F6
color.text.secondary#6B7280#9CA3AF
color.text.tertiary#9CA3AF#6B7280
color.text.disabled#D1D5DB#4B5563
color.text.inverse#FFFFFF#121214
color.text.brand#00838F#5FB3BC
color.text.link.default#00838F#2C9DA8
color.text.link.hover#115662#5FB3BC
color.text.link.visited#0A6B76#96CDD3
color.text.success#15803D#BBF7D0
color.text.warning#A16207#FEF08A
color.text.error#B91C1C#FECACA
color.text.info#0369A1#BAE6FD
color.surface.default#FFFFFF#121214
color.surface.subtle#F9FAFB#1F2937
color.surface.muted#F3F4F6#1F2937
color.surface.elevated#FFFFFF#1F2937
color.surface.overlayrgba(17, 24, 39, 0.5)rgba(0, 0, 0, 0.6)
color.surface.inverse#121214#F3F4F6
color.surface.brand#E8F5F7#0C3D45
color.action.primary.default#00838F#2C9DA8
color.action.primary.hover#115662#5FB3BC
color.action.primary.active#0C3D45#96CDD3
color.action.primary.disabled#E5E7EB#374151
color.action.primary.text#FFFFFF#121214
color.action.secondary.default#FFFFFFtransparent
color.action.secondary.hover#F9FAFB#1F2937
color.action.secondary.active#F3F4F6#374151
color.action.secondary.border#D1D5DB#4B5563
color.action.secondary.text#374151#E5E7EB
color.action.tertiary.hover#F9FAFB#1F2937
color.action.tertiary.text#00838F#2C9DA8
color.border.default#E5E7EB#374151
color.border.strong#9CA3AF#6B7280
color.border.focus#008996#2C9DA8
color.border.brand#008996#2C9DA8
color.feedback.success.bg#F0FDF4#14532D
color.feedback.warning.bg#FEFCE8#713F12
color.feedback.error.bg#FEF2F2#7F1D1D
color.feedback.info.bg#F0F9FF#0C4A6E
color.accent.orange.bg#FEF2EC#B8431F
color.accent.orange.text#B8431F#F15B29
color.accent.yellow.bg#FEF6E5#BF822A
color.accent.yellow.text#BF822A#FBB038
color.accent.green.bg#E8F4EE#4A9A7C
color.accent.green.text#4A9A7C#6EC3A3

Contrast Checker

Every text and interactive element must meet WCAG 2.2 AA contrast requirements. Use this tool to verify any color combination.

The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
18.71:1
AA Normal Text AA Large Text AAA Normal Text AAA Large Text

Preset Contrast Grid

Pre-calculated contrast ratios for the most important token pairings. Click any row to load it into the contrast checker above.

ForegroundBackgroundPreviewRatioMinStatus
color.text.primarycolor.surface.defaultAa18.71:14.5:1✓ Pass
color.text.primarycolor.surface.subtleAa17.9:14.5:1✓ Pass
color.text.primarycolor.surface.mutedAa17:14.5:1✓ Pass
color.text.secondarycolor.surface.defaultAa4.83:14.5:1✓ Pass
color.text.inversecolor.surface.inverseAa18.71:14.5:1✓ Pass
color.text.inversecolor.action.primary.defaultAa4.52:14.5:1✓ Pass
color.action.primary.textcolor.action.primary.defaultAa4.52:14.5:1✓ Pass
color.action.secondary.textcolor.surface.defaultAa10.31:14.5:1✓ Pass
color.action.danger.textcolor.action.danger.defaultAa6.47:14.5:1✓ Pass
color.text.link.defaultcolor.surface.defaultAa4.52:14.5:1✓ Pass
color.text.errorcolor.feedback.error.bgAa5.91:14.5:1✓ Pass
color.text.successcolor.feedback.success.bgAa4.79:14.5:1✓ Pass
color.text.warningcolor.feedback.warning.bgAa4.76:14.5:1✓ Pass
color.text.infocolor.feedback.info.bgAa5.57:14.5:1✓ Pass

Usage Guidelines

Token Selection Rules

  1. Always use semantic tokens. Never reference global tokens in component code. If you need a color that doesn’t have a semantic token, propose a new one — don’t hardcode a global.
  2. Never hardcode hex values. Every color in the application must come from a token. This ensures theme compatibility and brand consistency.
  3. Check contrast before committing. Use the checker above or run the build validation. If a combination fails, choose a different token — don’t override the value.

Do / Don’t

Do
color: var(--color-text-primary);
Don’t
color: #111827;
Hardcoded hex values break theme support.
Do

Use semantic text tokens that resolve to accessible values for each theme.

Don’t

Use global tokens directly in component code (e.g., var(--color-gray-900)).

Do

Use semantic feedback tokens for status indicators (color.feedback.error.bg + color.text.error).

Don’t

Use brand orange for error states. Orange communicates warmth in the brand, not danger.

Do

Use color.text.inverse on color.surface.inverse or color.action.primary.default.

Don’t

Use color.text.primary on dark backgrounds — invisible in light theme.