Use semantic roles
Application code should choose a semantic utility before reaching for a primitive color.
text-toned, bg-base, border-subtleFoundations, components, and patterns now live in separate pages so demos stay readable and reusable.
Foundations
Foundations define the reusable contract for color, typography, spacing-related scales, elevation, and responsive behavior. Product interfaces should consume this layer through semantic utilities and UI components.
Application code should choose a semantic utility before reaching for a primitive color.
text-toned, bg-base, border-subtleLight and dark mappings are changed in the theme source, not inside individual components.
Design System/source/themes.cssTailwind utilities are the readable API developers should use in Vue templates.
Design System/source/tailwind-theme.cssPrimitive palettes document available values, but they are not the default implementation layer.
Design System/source/tokens.cssThese are the canonical files developers should inspect before adding or changing visual behavior.
Primitive colors, radii, shadows, spacing, and fonts.
Design System/source/tokens.cssLight/dark semantic aliases consumed by Tailwind.
Design System/source/themes.cssToken mapping for the prototype utility classes.
Design System/source/tailwind-theme.cssCanonical type-heading, type-body, caption, and code scale.
Design System/source/typography.cssResponsive Tailwind thresholds used by patterns and layouts.
Design System/foundations/breakpoints.mdTheme-aware text, background, border, surface, and feedback roles.
Design System/foundations/semantic-colors.mdTransparent primitive overlays used for layered interaction states.
Design System/foundations/alpha-overlays.mdCategorical chart colors with dedicated light and dark mappings.
Design System/foundations/dataviz-colors.mdElevation scale for cards, panels, overlays, and popovers.
Design System/foundations/shadows.mdCentralized Lucide registry to avoid scattered imports.
components/ui/icon-registry.tsUsage rules, single sources, and reused instances.
design.mdSemantic tokens are the colors application code should use. The same class stays in the component while light and dark values are resolved by the theme.
Families shown here
Feedback text tokens are intentionally separate from feedback fill tokens for readable contrast.
Use these roles for hierarchy and readability. Prefer `text-default` for normal product copy.
text-dimmed--ui-text-dimmedDisabled or least prominent supporting text.
Light
--ds-color-neutral-600
Dark
--ds-color-neutral-400
text-muted--ui-text-mutedSecondary metadata, breadcrumbs, hints, and less prominent labels.
Light
--ds-color-neutral-600
Dark
--ds-color-neutral-400
text-toned--ui-text-tonedCard titles and emphasized text that should stay below highlighted.
Light
--ds-color-neutral-600
Dark
--ds-color-neutral-300
text-default--ui-textDefault application text.
Light
--ds-color-neutral-700
Dark
--ds-color-neutral-200
text-highlighted--ui-text-highlightedPrimary headings, active navigation, and strongest text.
Light
--ds-color-neutral-900
Dark
--ds-color-white
text-inverted--ui-text-invertedText placed on dark or selected surfaces.
Light
--ds-color-white
Dark
--ds-color-neutral-900
Use these for UI fills. The product page background is `bg-canvas`, which maps to the elevated background.
bg-base--ui-bgCards, menus, inputs, and table rows.
Light
--ds-color-white
Dark
--ds-color-neutral-900
bg-elevated--ui-bg-elevatedGlobal page background and table row hover.
Light
--ds-color-neutral-100
Dark
--ds-color-neutral-800
bg-accented--ui-bg-accentedSubtle hover pills and low-emphasis active fills.
Light
--ds-color-neutral-200
Dark
--ds-color-neutral-700
bg-selected--ui-bg-selectedLow-emphasis selected states. Do not use for table hover.
Light
--ds-color-primary-secondary
Dark
--ds-color-primary-800
bg-navigation-selected--ui-bg-navigation-selectedActive side navigation item only.
Light
--ds-color-primary-500
Dark
--ds-color-primary-300
bg-inverted--ui-bg-invertedInverted containers and contrast previews.
Light
--ds-color-neutral-900
Dark
--ds-color-white
Use border roles instead of primitive neutral steps. Header and footer rules use accented border.
border-base--ui-borderDefault component borders.
Light
--ds-color-neutral-200
Dark
--ds-color-neutral-700
border-subtle--ui-border-subtleInternal separators and low-contrast dividers.
Light
--ds-color-neutral-100
Dark
--ds-color-neutral-800
border-accented--ui-border-accentedStructural borders such as header and footer rules.
Light
--alpha-900-20
Dark
--alpha-white-20
Surface roles are editorial layout aliases. Components can use them when the role is structural.
bg-canvas--ds-semantic-canvasGlobal app and design-system page background.
Light
--ui-bg-elevated
Dark
--ui-bg-elevated
bg-surface--ds-semantic-surfaceRaised page regions and neutral panels.
Light
--ds-color-neutral-100
Dark
--ds-color-neutral-800
bg-surface-accent--ds-semantic-surface-accentSubtle nested panels and accented layout zones.
Light
--ds-color-neutral-200
Dark
--ds-color-neutral-700
bg-surface-raised--ds-semantic-surface-raisedCards, panels, and UI catalogue containers.
Light
--ds-color-white
Dark
--ds-color-neutral-800
Feedback tokens express meaning. Text roles are separate from fill roles so contrast stays correct in both themes.
text-primary--ui-text-primaryBrand-colored inline text and links that need text contrast.
Light
--ds-color-primary-700
Dark
--ds-color-primary-300
text-success--ui-text-successPositive text, verified labels, and success copy.
Light
--ds-color-success-700
Dark
--ds-color-success-400
text-warning--ui-text-warningWarning text and caution copy.
Light
--ds-color-warning-800
Dark
--ds-color-warning-300
text-error--ui-text-errorError text, destructive labels, and invalid field copy.
Light
--ds-color-error-700
Dark
--ds-color-error-400
bg-brand / text-brand--ds-semantic-brandPrimary actions, brand accents, and active controls.
Light
--ds-color-primary-600
Dark
--ds-color-primary-400
bg-success--ds-semantic-successPositive status fills, success badges, and confirmation states.
Light
--ds-color-success-500
Dark
--ds-color-success-400
bg-warning--ds-semantic-warningWarning status fills and attention states.
Light
--ds-color-warning-500
Dark
--ds-color-warning-400
bg-danger--ds-semantic-dangerDestructive action fills and high-emphasis error states.
Light
--ds-color-error-700
Dark
--ds-color-error-400
UiStatusMessage tone="info"--ui-status-info-bgSoft background for informational status messages.
Light
--ds-color-primary-500 / 25%
Dark
--ds-color-primary-400 / 25%
UiStatusMessage tone="danger"--ui-status-danger-bgSoft background for error and danger status messages.
Light
--ds-color-error-500 / 25%
Dark
--ds-color-error-400 / 25%
Alpha tokens are transparent primitives used to layer interaction states over an existing surface. They are exposed as Tailwind color utilities, but product code should still prefer semantic roles when a reusable meaning exists.
bg-alpha-900-10--alpha-900-10rgb(var(--ds-color-neutral-900) / 0.1)Subtle hover, selected states, and soft layering over a base fill.
Light canvas preview
Dark canvas preview
bg-alpha-900-20--alpha-900-20rgb(var(--ds-color-neutral-900) / 0.2)Stronger overlays when 10% is too quiet. Use sparingly and prefer semantic tokens first.
Light canvas preview
Dark canvas preview
bg-alpha-white-20--alpha-white-20rgb(var(--ds-color-white) / 0.2)Dark-theme counterpart to Neutral 900 / 20% for borders and overlays on dark surfaces.
Light canvas preview
Dark canvas preview
Use these categorical colors for charts and ranked distributions. They are intentionally separate from semantic feedback colors so a chart segment never implies success, warning, or error by accident.
bg-dataviz-1--ds-dataviz-1Light · --ds-color-dataviz-1-light
Dark · --ds-color-dataviz-1-dark
bg-dataviz-2--ds-dataviz-2Light · --ds-color-dataviz-2-light
Dark · --ds-color-dataviz-2-dark
bg-dataviz-3--ds-dataviz-3Light · --ds-color-dataviz-3-light
Dark · --ds-color-dataviz-3-dark
bg-dataviz-4--ds-dataviz-4Light · --ds-color-dataviz-4-light
Dark · --ds-color-dataviz-4-dark
bg-dataviz-5--ds-dataviz-5Light · --ds-color-dataviz-5-light
Dark · --ds-color-dataviz-5-dark
bg-dataviz-6--ds-dataviz-6Light · --ds-color-dataviz-6-light
Dark · --ds-color-dataviz-6-dark
bg-dataviz-7--ds-dataviz-7Light · --ds-color-dataviz-7-light
Dark · --ds-color-dataviz-7-dark
bg-dataviz-8--ds-dataviz-8Light · --ds-color-dataviz-8-light
Dark · --ds-color-dataviz-8-dark
bg-dataviz-9--ds-dataviz-9Light · --ds-color-dataviz-9-light
Dark · --ds-color-dataviz-9-dark
bg-dataviz-10--ds-dataviz-10Light · --ds-color-dataviz-10-light
Dark · --ds-color-dataviz-10-dark
bg-dataviz-11--ds-dataviz-11Light · --ds-color-dataviz-11-light
Dark · --ds-color-dataviz-11-dark
bg-dataviz-12--ds-dataviz-12Light · --ds-color-dataviz-12-light
Dark · --ds-color-dataviz-12-dark
bg-dataviz-13--ds-dataviz-13Light · --ds-color-dataviz-13-light
Dark · --ds-color-dataviz-13-dark
bg-dataviz-14--ds-dataviz-14Light · --ds-color-dataviz-14-light
Dark · --ds-color-dataviz-14-dark
Use the palette in order for categorical charts. If a chart has more than six meaningful categories, keep the first categories visible and aggregate the long tail into an “Other” bucket before assigning the next token.
Product layout thresholds are defined once and consumed through Tailwind responsive utilities.
sm
640px40remSmall adjustments above narrow mobile.
md
768px48remTablet threshold, intermediate header, and active side navigation.
lg
1024px64remCompact desktop start, full header, and content grids.
xl
1280px80remLarge desktop and more generous grids.
2xl
1536px96remFull 12-column product rail and floating patterns.
Shadows are theme-aware and use the neutral shadow color token instead of hardcoded black.
shadow-drop-smSubtle lift for compact controls or tiny previews.
0 1px 2px / 5%
shadow-dropDefault card elevation when a surface needs light depth.
0 1px 2px / 6%, 0 1px 3px / 10%
shadow-drop-mdRaised cards, floating controls, and compact panels.
0 2px 4px -1px / 6%, 0 4px 6px -1px / 10%
shadow-drop-lgPanels that sit above the page surface.
0 4px 6px -2px / 5%, 0 10px 15px -3px / 10%
shadow-drop-xlHigh-emphasis overlays and important editable states.
0 10px 10px -5px / 4%, 0 20px 25px -5px / 10%
shadow-drop-2xlModal-level elevation; use rarely.
0 25px 50px -12px / 25%
The `type-*` styles are the only canonical type scale for the prototype. Do not create local font-size or tracking utilities in product pages.
Heading/XXLarge
type-heading-xxlargePrimary page title
Make it simple, but significant.
Heading/XLarge
type-heading-xlargeMajor section title
Make it simple, but significant.
Heading/Large
type-heading-largeStandard section
Make it simple, but significant.
Heading/Medium
type-heading-mediumCard or subsection
Make it simple, but significant.
Heading/Small
type-heading-smallSecondary block
Make it simple, but significant.
Heading/XSmall
type-heading-xsmallCompact title
Make it simple, but significant.
Body/Large
type-body-largeImportant text, intro, message
Good design starts with clear hierarchy and readable rhythm.
Body/Large Strong
type-body-large-strongImportant emphasized text
Good design starts with clear hierarchy and readable rhythm.
Body/Medium
type-body-mediumDefault body text
Good design starts with clear hierarchy and readable rhythm.
Body/Medium Caps
type-body-medium-capsAuthor names and uppercase editorial metadata
Grace Abbott
Body/Medium Strong
type-body-medium-strongReadable labels, values, and controls
Good design starts with clear hierarchy and readable rhythm.
Caption/Medium
type-caption-mediumHelp text and secondary text
The details are not the details. They make the design.
Caption/Medium Strong
type-caption-medium-strongEmphasized caption
The details are not the details. They make the design.
Caption/Small
type-caption-smallCompact metadata
The details are not the details. They make the design.
Caption/Small Strong
type-caption-small-strongEmphasized compact metadata
The details are not the details. They make the design.
Code
type-codePaths, tokens, and technical values
catalog-books.ts
Primitive colors are shown as compact ramps because developers should normally use the semantic tokens above.
--ds-color-primary-*50
100
200
300
400
500
600
700
800
900
950
--ds-color-neutral-*50
100
200
300
400
500
600
700
800
900
950
--ds-color-success-*50
100
200
300
400
500
600
700
800
900
950
--ds-color-warning-*50
100
200
300
400
500
600
700
800
900
950
--ds-color-error-*50
100
200
300
400
500
600
700
800
900
950