@rowkit/tokens 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,68 @@
1
+ # @rowkit/tokens
2
+
3
+ [![npm](https://img.shields.io/npm/v/@rowkit/tokens?color=3b5bdb)](https://www.npmjs.com/package/@rowkit/tokens)
4
+ [![license](https://img.shields.io/npm/l/@rowkit/tokens)](https://github.com/NikolaiKushner/rowkit/blob/main/LICENSE)
5
+
6
+ The design tokens behind [rowkit](https://www.npmjs.com/package/rowkit) — colour, spacing, typography, radii, shadows, layers and motion.
7
+
8
+ Usable on its own. Nothing here depends on Vue, so a chart library, a design tool or an email template can read the same values the components use.
9
+
10
+ **[Live reference](https://rowkit.dev/foundations/tokens)** · **[GitHub](https://github.com/NikolaiKushner/rowkit)**
11
+
12
+ ## Install
13
+
14
+ ```bash
15
+ npm i @rowkit/tokens
16
+ ```
17
+
18
+ ## Two layers
19
+
20
+ **Primitives** are the raw ramps: `--color-primary-600` is one specific blue and means nothing on its own. **Semantic** tokens name a role — `--color-surface`, `--color-text-muted`, `--color-border` — and point at a primitive through `var()`.
21
+
22
+ Only the semantic layer changes under `.dark`, which is what makes dark mode a matter of repointing references rather than hunting hex codes.
23
+
24
+ ## Use
25
+
26
+ As a Tailwind v4 theme:
27
+
28
+ ```css
29
+ @import 'tailwindcss';
30
+ @import '@rowkit/tokens/css';
31
+ ```
32
+
33
+ Every token becomes a theme value, so `bg-surface`, `text-text-muted`, `p-4`, `rounded-md` and `shadow-lg` resolve to the scales above.
34
+
35
+ As CSS custom properties, for anything Tailwind does not cover:
36
+
37
+ ```css
38
+ .my-thing {
39
+ background: var(--color-surface-subtle);
40
+ border-radius: var(--radius-md);
41
+ }
42
+ ```
43
+
44
+ Or in TypeScript, fully typed, when a value has to reach JavaScript:
45
+
46
+ ```ts
47
+ import { tokens } from '@rowkit/tokens'
48
+
49
+ tokens.color.primary[600] // 'oklch(0.546 0.209 259)'
50
+
51
+ const series = [tokens.color.primary[500], tokens.color.success[500]]
52
+ ```
53
+
54
+ `tokens` is grouped by scale rather than flattened, so `tokens.color.primary[600]` narrows to its literal type and autocompletes at every level.
55
+
56
+ ## Notes on the values
57
+
58
+ **Colour is OKLCH, clamped to sRGB.** Every chromatic family shares one lightness ramp, so `primary-600`, `danger-600` and `success-600` carry the same perceptual weight. Chroma is clamped to the sRGB gamut on purpose: OKLCH can express colours outside it, and browsers gamut-map those by their own rules — which makes a token render differently on a P3 laptop than on an sRGB monitor.
59
+
60
+ **Contrast is asserted, not claimed.** Every semantic pairing is checked against WCAG AA in the package's own tests, in both themes.
61
+
62
+ **Spacing keys are multiples of 4px.** `4` is 1rem, `2` is 8px — the convention most Vue and Tailwind developers already carry.
63
+
64
+ **Layer order is a build gate.** `z-index.test.ts` asserts a modal sits above an overlay, a tooltip above everything, and that consecutive layers stay at least 100 apart.
65
+
66
+ ## License
67
+
68
+ MIT © Nikolai Kushner
package/dist/index.d.ts CHANGED
@@ -18,21 +18,21 @@
18
18
  * @import '@rowkit/tokens/css';
19
19
  * ```
20
20
  */
21
- export { colorPrimitives, colorSteps, danger, neutral, primary, semanticColorDark, semanticColorLight, success, warning, } from './color';
22
- export type { ColorRef, ColorStep, SemanticColorName } from './color';
23
- export { duration, easing } from './motion';
24
- export type { DurationName, EasingName } from './motion';
25
- export { radius } from './radius';
26
- export type { RadiusName } from './radius';
27
- export { shadow } from './shadow';
28
- export type { ShadowName } from './shadow';
29
- export { spacing, spacingBase } from './spacing';
30
- export type { SpacingName } from './spacing';
31
- export { fontFamily, fontSize, fontWeight, letterSpacing, lineHeight } from './typography';
32
- export type { FontSizeName } from './typography';
33
- export { zIndex } from './z-index';
34
- export type { ZIndexName } from './z-index';
35
- export { buildThemeCss } from './css';
21
+ export { colorPrimitives, colorSteps, danger, neutral, primary, semanticColorDark, semanticColorLight, success, warning, } from './color.js';
22
+ export type { ColorRef, ColorStep, SemanticColorName } from './color.js';
23
+ export { duration, easing } from './motion.js';
24
+ export type { DurationName, EasingName } from './motion.js';
25
+ export { radius } from './radius.js';
26
+ export type { RadiusName } from './radius.js';
27
+ export { shadow } from './shadow.js';
28
+ export type { ShadowName } from './shadow.js';
29
+ export { spacing, spacingBase } from './spacing.js';
30
+ export type { SpacingName } from './spacing.js';
31
+ export { fontFamily, fontSize, fontWeight, letterSpacing, lineHeight } from './typography.js';
32
+ export type { FontSizeName } from './typography.js';
33
+ export { zIndex } from './z-index.js';
34
+ export type { ZIndexName } from './z-index.js';
35
+ export { buildThemeCss } from './css.js';
36
36
  /**
37
37
  * Every rowkit token in one object.
38
38
  *
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  //#region package.json
2
- var e = "0.1.0", t = [
2
+ var e = "0.1.1", t = [
3
3
  50,
4
4
  100,
5
5
  200,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../package.json","../src/color.ts","../src/motion.ts","../src/radius.ts","../src/shadow.ts","../src/spacing.ts","../src/typography.ts","../src/z-index.ts","../src/css.ts","../src/index.ts"],"sourcesContent":["{\n \"name\": \"@rowkit/tokens\",\n \"version\": \"0.1.0\",\n \"description\": \"Design tokens for rowkit — consumable without importing components.\",\n \"license\": \"MIT\",\n \"author\": \"Nikolai Kushner\",\n \"homepage\": \"https://rowkit.dev\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/NikolaiKushner/rowkit.git\",\n \"directory\": \"packages/tokens\"\n },\n \"bugs\": \"https://github.com/NikolaiKushner/rowkit/issues\",\n \"keywords\": [\n \"design-tokens\",\n \"design-system\",\n \"rowkit\"\n ],\n \"type\": \"module\",\n \"sideEffects\": false,\n \"files\": [\n \"dist\"\n ],\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\"\n },\n \"./css\": \"./dist/tokens.css\",\n \"./package.json\": \"./package.json\"\n },\n \"publishConfig\": {\n \"access\": \"public\",\n \"provenance\": true\n },\n \"engines\": {\n \"node\": \">=20.19.0\"\n },\n \"scripts\": {\n \"build\": \"vue-tsc -b tsconfig.lib.json --force && vite build && node scripts/emit-css.mjs && node scripts/emit-reference.mjs\",\n \"typecheck\": \"vue-tsc -b --force\",\n \"reference\": \"pnpm build && open dist/reference.html\"\n }\n}\n","/**\n * Colour primitives and semantic mappings.\n *\n * ## How the scales were derived\n *\n * Every chromatic family shares one lightness ramp and one chroma envelope, so\n * `primary-600`, `danger-600` and `success-600` are the same perceptual weight\n * and can be swapped without relayering the design. Families differ only by\n * hue and a chroma factor.\n *\n * Chroma at each step is clamped to the sRGB gamut boundary. OKLCH can express\n * colours outside sRGB, and browsers gamut-map them per their own rules — that\n * makes a token render differently on a P3 laptop than on an sRGB monitor.\n * Clamping trades a little vividness for identical output everywhere.\n *\n * `warning` carries a lightness bump through its midtones: at a shared\n * lightness, yellow is far less saturated than blue or red, so the unbumped\n * steps read as muddy brown rather than amber.\n *\n * Contrast for every semantic pair is asserted in `contrast.test.ts` — the\n * ratios are a build gate, not a claim in a comment.\n */\n\n/** The eleven steps every colour family provides. */\nexport const colorSteps = [50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950] as const\n\n/** One step of a colour family. */\nexport type ColorStep = (typeof colorSteps)[number]\n\n/**\n * Cool-slate neutral (hue 264). Roughly 70% of the pixels in a data table:\n * page background, row borders, muted labels, table chrome.\n */\nexport const neutral = {\n 50: 'oklch(0.984 0.003 264)',\n 100: 'oklch(0.968 0.004 264)',\n 200: 'oklch(0.928 0.006 264)',\n 300: 'oklch(0.869 0.01 264)',\n 400: 'oklch(0.704 0.018 264)',\n 500: 'oklch(0.551 0.024 264)',\n 600: 'oklch(0.446 0.027 264)',\n 700: 'oklch(0.373 0.028 264)',\n 800: 'oklch(0.279 0.03 264)',\n 900: 'oklch(0.21 0.033 264)',\n 950: 'oklch(0.13 0.036 264)',\n} as const\n\n/** Brand blue (hue 259). Drives links, focus rings and primary actions. */\nexport const primary = {\n 50: 'oklch(0.97 0.014 259)',\n 100: 'oklch(0.936 0.03 259)',\n 200: 'oklch(0.885 0.055 259)',\n 300: 'oklch(0.809 0.095 259)',\n 400: 'oklch(0.715 0.147 259)',\n 500: 'oklch(0.623 0.201 259)',\n 600: 'oklch(0.546 0.209 259)',\n 700: 'oklch(0.488 0.187 259)',\n 800: 'oklch(0.442 0.165 259)',\n 900: 'oklch(0.396 0.135 259)',\n 950: 'oklch(0.282 0.086 259)',\n} as const\n\n/** Green (hue 152). Reserved for successful outcomes, never for brand accent. */\nexport const success = {\n 50: 'oklch(0.97 0.014 152)',\n 100: 'oklch(0.936 0.036 152)',\n 200: 'oklch(0.885 0.064 152)',\n 300: 'oklch(0.809 0.097 152)',\n 400: 'oklch(0.715 0.145 152)',\n 500: 'oklch(0.623 0.162 152)',\n 600: 'oklch(0.546 0.142 152)',\n 700: 'oklch(0.488 0.127 152)',\n 800: 'oklch(0.442 0.115 152)',\n 900: 'oklch(0.396 0.103 152)',\n 950: 'oklch(0.282 0.073 152)',\n} as const\n\n/** Amber (hue 75), lightness-bumped through the midtones. See the module note. */\nexport const warning = {\n 50: 'oklch(0.97 0.016 75)',\n 100: 'oklch(0.936 0.04 75)',\n 200: 'oklch(0.885 0.071 75)',\n 300: 'oklch(0.849 0.108 75)',\n 400: 'oklch(0.785 0.162 75)',\n 500: 'oklch(0.723 0.15 75)',\n 600: 'oklch(0.616 0.128 75)',\n 700: 'oklch(0.528 0.11 75)',\n 800: 'oklch(0.442 0.092 75)',\n 900: 'oklch(0.396 0.082 75)',\n 950: 'oklch(0.282 0.059 75)',\n} as const\n\n/** Red (hue 25). Destructive actions and error states. */\nexport const danger = {\n 50: 'oklch(0.97 0.014 25)',\n 100: 'oklch(0.936 0.032 25)',\n 200: 'oklch(0.885 0.06 25)',\n 300: 'oklch(0.809 0.107 25)',\n 400: 'oklch(0.715 0.17 25)',\n 500: 'oklch(0.623 0.214 25)',\n 600: 'oklch(0.546 0.218 25)',\n 700: 'oklch(0.488 0.195 25)',\n 800: 'oklch(0.442 0.165 25)',\n 900: 'oklch(0.396 0.135 25)',\n 950: 'oklch(0.282 0.086 25)',\n} as const\n\n/**\n * Every primitive colour, keyed by the CSS custom property it becomes.\n *\n * These are the only place a literal colour value appears in rowkit. Everything\n * else — semantic tokens, component variants — references one of these.\n */\nexport const colorPrimitives = {\n white: 'oklch(1 0 0)',\n black: 'oklch(0 0 0)',\n ...prefix('neutral', neutral),\n ...prefix('primary', primary),\n ...prefix('success', success),\n ...prefix('warning', warning),\n ...prefix('danger', danger),\n} as const\n\nfunction prefix<N extends string>(\n name: N,\n scale: Record<ColorStep, string>\n): Record<`${N}-${ColorStep}`, string> {\n const out: Record<string, string> = {}\n for (const step of colorSteps) out[`${name}-${step}`] = scale[step]\n return out\n}\n\n/** A reference to a primitive colour, as a CSS `var()` expression. */\nexport type ColorRef = `var(--color-${string})`\n\nconst ref = (token: keyof typeof colorPrimitives): ColorRef => `var(--color-${token})`\n\n/**\n * Light-mode semantic colours.\n *\n * Semantic tokens never hold a literal colour — each one points at a primitive\n * through `var()`, so re-theming means repointing references rather than\n * hunting down hex codes. `semantic.test.ts` enforces this.\n */\nexport const semanticColorLight = {\n /** Page background, behind all surfaces. */\n background: ref('neutral-50'),\n /** Cards, panels, table bodies — the plane content sits on. */\n surface: ref('white'),\n /** Table headers, toolbars: a surface that recedes slightly. */\n 'surface-subtle': ref('neutral-100'),\n /** Row hover. */\n 'surface-hover': ref('neutral-100'),\n /** Row press / active. */\n 'surface-active': ref('neutral-200'),\n /** Selected table row. */\n 'surface-selected': ref('primary-50'),\n /** Disabled control background. */\n 'surface-disabled': ref('neutral-100'),\n /**\n * Loading placeholder fill.\n *\n * Its own token rather than a reuse of `surface-active`, which means \"this\n * row is being pressed\". A skeleton is never interactive, so borrowing an\n * interaction token would tie the two together for any future re-theme.\n *\n * Exempt from contrast rules: skeletons are `aria-hidden` decoration\n * standing in for content that has not arrived, so there is nothing for a\n * reader to perceive and WCAG 1.4.11 does not apply.\n */\n skeleton: ref('neutral-200'),\n\n /** Primary body and heading text. */\n text: ref('neutral-900'),\n /**\n * Secondary text, column labels, help text.\n *\n * `neutral-600`, not `500`. A table header is muted text on `surface-subtle`,\n * and at `500` that pairing reached only 4.41:1 — passing on white, failing\n * WCAG 1.4.3 on the recessed surface this token is most often used against.\n * `600` clears it at 6.90:1 and is still 2.3× lighter than `text`, so the\n * hierarchy survives.\n */\n 'text-muted': ref('neutral-600'),\n /** Placeholders and de-emphasised metadata. */\n 'text-subtle': ref('neutral-400'),\n /** Text on a disabled control. */\n 'text-disabled': ref('neutral-400'),\n\n /**\n * Decorative hairline: row separators, card outlines.\n *\n * Deliberately below 3:1 against the surface. Do not use it for the boundary\n * of an interactive control — see {@link semanticColorLight['border-control']}.\n */\n border: ref('neutral-200'),\n /** Emphasised decorative border: dividers that need to read as structure. */\n 'border-strong': ref('neutral-300'),\n /** Barely-there separation inside a dense group. */\n 'border-subtle': ref('neutral-100'),\n /**\n * Boundary of an interactive control — text inputs, checkboxes, outlined\n * buttons.\n *\n * WCAG 1.4.11 requires 3:1 against the adjacent surface for the visual\n * boundary of a UI component. `border` manages only 1.24:1 and\n * `border-strong` 1.49:1, so neither is legal here; this token is the\n * lightest neutral that clears the bar (4.83:1 on `surface`).\n */\n 'border-control': ref('neutral-500'),\n /** Focus ring. Never remove the ring — recolour it. */\n 'focus-ring': ref('primary-600'),\n\n /** Base colour shadows are mixed from. */\n shadow: ref('neutral-950'),\n\n // `neutral` completes the status family so a component's variant matrix has\n // no special case: a neutral Badge reads the same token names as a danger\n // one. It is the default state — \"no status\" — not an absence of styling.\n 'neutral-solid': ref('neutral-700'),\n 'neutral-solid-hover': ref('neutral-800'),\n 'neutral-on-solid': ref('white'),\n 'neutral-subtle': ref('neutral-100'),\n 'neutral-on-subtle': ref('neutral-700'),\n 'neutral-border': ref('neutral-200'),\n\n 'primary-solid': ref('primary-600'),\n 'primary-solid-hover': ref('primary-700'),\n 'primary-on-solid': ref('white'),\n 'primary-subtle': ref('primary-50'),\n 'primary-on-subtle': ref('primary-700'),\n 'primary-border': ref('primary-200'),\n\n 'success-solid': ref('success-600'),\n 'success-solid-hover': ref('success-700'),\n 'success-on-solid': ref('white'),\n 'success-subtle': ref('success-50'),\n 'success-on-subtle': ref('success-700'),\n 'success-border': ref('success-200'),\n\n // Amber is squeezed from both sides in light mode. It cannot carry white text\n // at any usable weight (white on warning-600 is 3.78:1), and a bright amber\n // fill has no discernible edge against a near-white page (warning-400 vs\n // background is 1.92:1, failing WCAG 1.4.11). warning-600 is the only step\n // that satisfies both: 3.61:1 against the page, 4.69:1 for dark text.\n //\n // Hover therefore brightens rather than darkens — warning-700 would drop dark\n // text to 3.27:1.\n 'warning-solid': ref('warning-600'),\n 'warning-solid-hover': ref('warning-500'),\n 'warning-on-solid': ref('neutral-900'),\n 'warning-subtle': ref('warning-50'),\n 'warning-on-subtle': ref('warning-700'),\n 'warning-border': ref('warning-200'),\n\n 'danger-solid': ref('danger-600'),\n 'danger-solid-hover': ref('danger-700'),\n 'danger-on-solid': ref('white'),\n 'danger-subtle': ref('danger-50'),\n 'danger-on-subtle': ref('danger-700'),\n 'danger-border': ref('danger-200'),\n} as const\n\n/**\n * Dark-mode semantic colours, applied under `.dark`.\n *\n * Solid fills use the bright `400` step with dark text rather than mirroring\n * light mode's `600` with white text. On a near-black page a `600` fill only\n * reaches 3.6–4.4:1 against the background — the button itself becomes hard to\n * locate even though its label is legible. The `400` fill scores 7.4–8.5:1 on\n * both label and background.\n */\nexport const semanticColorDark = {\n background: ref('neutral-950'),\n surface: ref('neutral-900'),\n 'surface-subtle': ref('neutral-800'),\n 'surface-hover': ref('neutral-800'),\n 'surface-active': ref('neutral-700'),\n 'surface-selected': ref('primary-950'),\n 'surface-disabled': ref('neutral-800'),\n // Lifts off `surface` (neutral-900) rather than receding. On a dark page a\n // placeholder darker than its card reads as a hole in the layout.\n skeleton: ref('neutral-800'),\n\n text: ref('neutral-50'),\n 'text-muted': ref('neutral-400'),\n 'text-subtle': ref('neutral-500'),\n 'text-disabled': ref('neutral-600'),\n\n border: ref('neutral-800'),\n 'border-strong': ref('neutral-700'),\n 'border-subtle': ref('neutral-900'),\n // neutral-500 is again the lightest step clearing 3:1, here against\n // `surface` (neutral-900) at 3.67:1.\n 'border-control': ref('neutral-500'),\n 'focus-ring': ref('primary-400'),\n\n shadow: ref('black'),\n\n 'neutral-solid': ref('neutral-400'),\n 'neutral-solid-hover': ref('neutral-300'),\n 'neutral-on-solid': ref('neutral-950'),\n 'neutral-subtle': ref('neutral-800'),\n 'neutral-on-subtle': ref('neutral-200'),\n 'neutral-border': ref('neutral-700'),\n\n 'primary-solid': ref('primary-400'),\n 'primary-solid-hover': ref('primary-300'),\n 'primary-on-solid': ref('neutral-950'),\n 'primary-subtle': ref('primary-950'),\n 'primary-on-subtle': ref('primary-300'),\n 'primary-border': ref('primary-800'),\n\n 'success-solid': ref('success-400'),\n 'success-solid-hover': ref('success-300'),\n 'success-on-solid': ref('neutral-950'),\n 'success-subtle': ref('success-950'),\n 'success-on-subtle': ref('success-300'),\n 'success-border': ref('success-800'),\n\n 'warning-solid': ref('warning-400'),\n 'warning-solid-hover': ref('warning-300'),\n 'warning-on-solid': ref('neutral-950'),\n 'warning-subtle': ref('warning-950'),\n 'warning-on-subtle': ref('warning-300'),\n 'warning-border': ref('warning-800'),\n\n 'danger-solid': ref('danger-400'),\n 'danger-solid-hover': ref('danger-300'),\n 'danger-on-solid': ref('neutral-950'),\n 'danger-subtle': ref('danger-950'),\n 'danger-on-subtle': ref('danger-300'),\n 'danger-border': ref('danger-800'),\n} as const\n\n/** Names of every semantic colour token. */\nexport type SemanticColorName = keyof typeof semanticColorLight\n","/**\n * Motion durations and easing curves.\n *\n * Durations are short. In a data-dense interface an animation is feedback, not\n * decoration: the user is scanning rows, and anything past ~200ms reads as the\n * interface lagging rather than responding.\n *\n * Every consumer of these tokens is still responsible for honouring\n * `prefers-reduced-motion` — a token cannot express that.\n */\nexport const duration = {\n /** No transition. */\n instant: '0ms',\n /** Hover and focus states — must feel immediate. */\n fast: '120ms',\n /** Dropdowns, popovers, most enter/exit transitions. */\n normal: '200ms',\n /** Dialogs and large surfaces, where more travel needs more time. */\n slow: '320ms',\n} as const\n\n/** Easing curves. */\nexport const easing = {\n /** Linear. Progress indicators only. */\n linear: 'linear',\n /**\n * The default for anything that both enters and leaves. Fast out of the\n * gate, gentle at rest.\n */\n standard: 'cubic-bezier(0.2, 0, 0, 1)',\n /** Entering the screen: decelerate into place. */\n enter: 'cubic-bezier(0, 0, 0.2, 1)',\n /** Leaving the screen: accelerate away. */\n exit: 'cubic-bezier(0.4, 0, 1, 1)',\n} as const\n\n/** Names of every duration token. */\nexport type DurationName = keyof typeof duration\n/** Names of every easing token. */\nexport type EasingName = keyof typeof easing\n","/**\n * Corner radii.\n *\n * Restrained by design: heavily rounded corners waste horizontal space at the\n * edges of a dense grid and make adjacent cells read as separate objects.\n */\nexport const radius = {\n /** Square. Table cells, and anything that tiles edge to edge. */\n none: '0rem',\n /** 2px — checkboxes, tags inside a cell. */\n xs: '0.125rem',\n /** 4px — inputs, buttons, badges. The rowkit default. */\n sm: '0.25rem',\n /** 6px — cards, popovers. */\n md: '0.375rem',\n /** 8px — dialogs. */\n lg: '0.5rem',\n /** 12px — large empty-state panels. */\n xl: '0.75rem',\n /** Pill. Status chips and avatars. */\n full: '9999px',\n} as const\n\n/** Names of every radius token. */\nexport type RadiusName = keyof typeof radius\n","/**\n * Elevation shadows.\n *\n * Each shadow mixes from `--color-shadow`, a semantic token, rather than\n * hardcoding a colour — so dark mode swaps the base to pure black by\n * repointing one variable.\n *\n * Dark mode leans on surface lightness for elevation rather than on shadows.\n * A shadow is a darker region, and on a near-black page there is very little\n * headroom left to darken; the raised surface colour does the work instead.\n */\nexport const shadow = {\n /** No elevation. */\n none: 'none',\n /** Hairline lift — sticky table headers, input focus. */\n xs: '0 1px 2px 0 color-mix(in oklab, var(--color-shadow) 6%, transparent)',\n /** Resting cards. */\n sm: '0 1px 3px 0 color-mix(in oklab, var(--color-shadow) 8%, transparent), 0 1px 2px -1px color-mix(in oklab, var(--color-shadow) 8%, transparent)',\n /** Dropdowns, popovers. */\n md: '0 4px 6px -1px color-mix(in oklab, var(--color-shadow) 9%, transparent), 0 2px 4px -2px color-mix(in oklab, var(--color-shadow) 9%, transparent)',\n /** Menus over content. */\n lg: '0 10px 15px -3px color-mix(in oklab, var(--color-shadow) 10%, transparent), 0 4px 6px -4px color-mix(in oklab, var(--color-shadow) 10%, transparent)',\n /** Modal dialogs. */\n xl: '0 20px 25px -5px color-mix(in oklab, var(--color-shadow) 12%, transparent), 0 8px 10px -6px color-mix(in oklab, var(--color-shadow) 12%, transparent)',\n /** Horizontal-scroll affordance on a sticky table column. */\n 'scroll-x': '8px 0 8px -8px color-mix(in oklab, var(--color-shadow) 15%, transparent)',\n} as const\n\n/** Names of every shadow token. */\nexport type ShadowName = keyof typeof shadow\n","/**\n * Spacing scale.\n *\n * Keys are multiples of the 4px base unit, matching the convention most Vue and\n * Tailwind developers already carry in their heads: `4` is 1rem, `2` is 8px.\n * Fractional steps are deliberately absent — they would need escaped CSS custom\n * property names (`--spacing-0\\.5`), and Tailwind v4 already derives arbitrary\n * fractions from {@link spacingBase}.\n *\n * The low end is dense on purpose. A table cell padded at `2`/`3` is the\n * difference between a grid that shows twenty rows and one that shows twelve.\n */\nexport const spacing = {\n /** Zero. */\n 0: '0rem',\n /** 1px — hairline offsets and optical nudges, not layout. */\n px: '1px',\n /** 4px — icon-to-label gap. */\n 1: '0.25rem',\n /** 8px — dense table cell padding. */\n 2: '0.5rem',\n /** 12px — default table cell padding, compact control padding. */\n 3: '0.75rem',\n /** 16px — default control padding, tight card padding. */\n 4: '1rem',\n /** 20px */\n 5: '1.25rem',\n /** 24px — card padding, gap between form fields. */\n 6: '1.5rem',\n /** 32px — section spacing. */\n 8: '2rem',\n /** 40px */\n 10: '2.5rem',\n /** 48px — gap between major page regions. */\n 12: '3rem',\n /** 64px — page gutters. */\n 16: '4rem',\n /** 80px */\n 20: '5rem',\n /** 96px — empty-state vertical padding. */\n 24: '6rem',\n} as const\n\n/**\n * The base unit Tailwind v4 multiplies for dynamic spacing utilities.\n *\n * Emitting this as `--spacing` keeps `p-7` and `mt-3.5` working even though\n * neither has a named token above.\n */\nexport const spacingBase = '0.25rem'\n\n/** Names of every spacing token. */\nexport type SpacingName = keyof typeof spacing\n","/**\n * Typography scale.\n *\n * Weighted toward the small end: a dashboard spends most of its type budget\n * between 12px and 16px, and the sizes above `xl` exist for empty states and\n * page titles rather than for data.\n */\n\n/** Font families. Both stacks start with a system font — no webfont request. */\nexport const fontFamily = {\n /** UI and body text. */\n sans: [\n 'ui-sans-serif',\n 'system-ui',\n '-apple-system',\n 'Segoe UI',\n 'Roboto',\n 'Helvetica Neue',\n 'Arial',\n 'sans-serif',\n ].join(', '),\n /** IDs, hashes, numeric columns that must align vertically. */\n mono: [\n 'ui-monospace',\n 'SFMono-Regular',\n 'Menlo',\n 'Consolas',\n 'Liberation Mono',\n 'monospace',\n ].join(', '),\n} as const\n\n/**\n * Font sizes, each paired with the line height it should almost always use.\n *\n * Pairing them prevents the most common typographic bug in a dense table:\n * shrinking the font without shrinking leading, so rows stay tall and the\n * density gain evaporates.\n */\nexport const fontSize = {\n /** 12px — table metadata, badges, column headers. */\n xs: { size: '0.75rem', lineHeight: '1rem' },\n /** 14px — the default for table cells and form controls. */\n sm: { size: '0.875rem', lineHeight: '1.25rem' },\n /** 16px — body copy outside of data views. */\n base: { size: '1rem', lineHeight: '1.5rem' },\n /** 18px — card titles. */\n lg: { size: '1.125rem', lineHeight: '1.75rem' },\n /** 20px — section headings. */\n xl: { size: '1.25rem', lineHeight: '1.75rem' },\n /** 24px — page titles, empty-state headings. */\n '2xl': { size: '1.5rem', lineHeight: '2rem' },\n /** 30px — the largest size rowkit ships. */\n '3xl': { size: '1.875rem', lineHeight: '2.25rem' },\n} as const\n\n/** Font weights. */\nexport const fontWeight = {\n /** Body text. */\n normal: '400',\n /** Column headers, subtle emphasis. */\n medium: '500',\n /** Buttons, card titles. */\n semibold: '600',\n /** Page titles. */\n bold: '700',\n} as const\n\n/** Letter spacing. Tightening only pays off at display sizes. */\nexport const letterSpacing = {\n tight: '-0.015em',\n normal: '0em',\n /** For uppercase micro-labels, which need air to stay readable. */\n wide: '0.04em',\n} as const\n\n/** Standalone line heights, for when text is not using a paired {@link fontSize}. */\nexport const lineHeight = {\n none: '1',\n tight: '1.25',\n snug: '1.375',\n normal: '1.5',\n relaxed: '1.625',\n} as const\n\n/** Names of every font size token. */\nexport type FontSizeName = keyof typeof fontSize\n","/**\n * Stacking layers.\n *\n * Spaced by 100 so a consumer can slot their own chrome — an app header, a\n * cookie banner — between two rowkit layers without editing rowkit or starting\n * a `z-index: 99999` arms race.\n *\n * The ordering is not arbitrary. A tooltip must outrank a toast, because a\n * toast can carry an action button that itself has a tooltip. A popover must\n * outrank a modal, because a select inside a dialog opens a popover.\n */\nexport const zIndex = {\n /** Default flow. */\n base: '0',\n /** Sticky table header and pinned columns. */\n sticky: '100',\n /** Dropdown menus attached to page-level content. */\n dropdown: '200',\n /** Backdrop behind a modal. */\n overlay: '300',\n /** Dialog surface. */\n modal: '400',\n /** Popovers and selects — must sit above a dialog to work inside one. */\n popover: '500',\n /** Toast queue. */\n toast: '600',\n /** Tooltips outrank everything, including toasts. */\n tooltip: '700',\n} as const\n\n/** Names of every z-index token. */\nexport type ZIndexName = keyof typeof zIndex\n","import { colorPrimitives, semanticColorDark, semanticColorLight } from './color'\nimport { duration, easing } from './motion'\nimport { radius } from './radius'\nimport { shadow } from './shadow'\nimport { spacing, spacingBase } from './spacing'\nimport { fontFamily, fontSize, fontWeight, letterSpacing, lineHeight } from './typography'\nimport { zIndex } from './z-index'\n\n/**\n * Emits the Tailwind v4 `@theme` block for the rowkit token set.\n *\n * The TypeScript objects are the single source of truth; this function derives\n * the stylesheet from them, so the two cannot drift. `css.test.ts` asserts that\n * every token in every scale reaches the output.\n *\n * Dark mode works by repointing *semantic* tokens under `.dark`. Primitives are\n * emitted once and never change — `--color-primary-600` is the same colour in\n * both themes; what changes is which primitive `--color-primary-solid` points\n * at. That is why the theme can flip without a single hardcoded colour moving.\n *\n * @returns The complete stylesheet, ready to write to disk.\n */\nexport function buildThemeCss(): string {\n return [\n header(),\n '',\n // Tailwind v4 defaults the `dark:` variant to prefers-color-scheme. rowkit\n // uses a class so an app can offer an explicit theme switch.\n '@custom-variant dark (&:where(.dark, .dark *));',\n '',\n '@theme {',\n section('colour primitives — the only literal colours in rowkit'),\n ...entries(colorPrimitives, (k) => `--color-${k}`),\n '',\n section('semantic colours — light (defaults)'),\n ...entries(semanticColorLight, (k) => `--color-${k}`),\n '',\n section('spacing'),\n ` --spacing: ${spacingBase};`,\n ...entries(spacing, (k) => `--spacing-${k}`),\n '',\n section('typography'),\n ...entries(fontFamily, (k) => `--font-${k}`),\n ...fontSizeEntries(),\n ...entries(fontWeight, (k) => `--font-weight-${k}`),\n ...entries(letterSpacing, (k) => `--tracking-${k}`),\n ...entries(lineHeight, (k) => `--leading-${k}`),\n '',\n section('radii'),\n ...entries(radius, (k) => `--radius-${k}`),\n '',\n section('shadows'),\n ...entries(shadow, (k) => `--shadow-${k}`),\n '',\n section('motion'),\n // Tailwind v4's namespaces are `--transition-duration-*` and `--ease-*`.\n // A name outside a namespace it recognises is not an error — it simply\n // generates no utility, which is why `duration-fast` silently produced\n // nothing until the compile test in packages/ui went looking for it.\n ...entries(duration, (k) => `--transition-duration-${k}`),\n ...entries(easing, (k) => `--ease-${k}`),\n '',\n section('stacking layers'),\n ...entries(zIndex, (k) => `--z-index-${k}`),\n '}',\n '',\n '/* Dark mode repoints semantic tokens only. Primitives are theme-agnostic. */',\n '.dark {',\n ...entries(semanticColorDark, (k) => `--color-${k}`),\n '}',\n '',\n ].join('\\n')\n}\n\nfunction header(): string {\n return [\n '/*',\n ' * rowkit design tokens.',\n ' *',\n ' * GENERATED FILE — DO NOT EDIT.',\n ' * Source of truth: packages/tokens/src/*.ts',\n ' * Regenerate with: pnpm --filter @rowkit/tokens build',\n ' */',\n ].join('\\n')\n}\n\nfunction section(label: string): string {\n return ` /* ${label} */`\n}\n\n/** Renders `key: value` pairs as indented custom property declarations. */\nfunction entries(scale: Record<string, string>, toVar: (key: string) => string): string[] {\n return Object.entries(scale).map(([key, value]) => ` ${toVar(key)}: ${value};`)\n}\n\n/**\n * Font sizes use Tailwind v4's paired form, where `--text-sm--line-height`\n * supplies the leading that ships with `text-sm`.\n */\nfunction fontSizeEntries(): string[] {\n return Object.entries(fontSize).flatMap(([key, value]) => [\n ` --text-${key}: ${value.size};`,\n ` --text-${key}--line-height: ${value.lineHeight};`,\n ])\n}\n","/**\n * `@rowkit/tokens` — the design token layer behind rowkit.\n *\n * Consumable on its own: import {@link tokens} for a fully typed object, or\n * `@rowkit/tokens/css` for the Tailwind v4 `@theme` block. Nothing here depends\n * on Vue, so a design tool, a docs site, or a chart library can read the same\n * values the components use.\n *\n * @example Typed access to a primitive\n * ```ts\n * import { tokens } from '@rowkit/tokens'\n * tokens.color.primary[600] // 'oklch(0.546 0.209 259)'\n * ```\n *\n * @example The stylesheet\n * ```css\n * @import 'tailwindcss';\n * @import '@rowkit/tokens/css';\n * ```\n */\n\nimport { version as pkgVersion } from '../package.json' with { type: 'json' }\nimport {\n colorPrimitives,\n danger,\n neutral,\n primary,\n semanticColorDark,\n semanticColorLight,\n success,\n warning,\n} from './color'\nimport { duration, easing } from './motion'\nimport { radius } from './radius'\nimport { shadow } from './shadow'\nimport { spacing, spacingBase } from './spacing'\nimport { fontFamily, fontSize, fontWeight, letterSpacing, lineHeight } from './typography'\nimport { zIndex } from './z-index'\n\nexport {\n colorPrimitives,\n colorSteps,\n danger,\n neutral,\n primary,\n semanticColorDark,\n semanticColorLight,\n success,\n warning,\n} from './color'\nexport type { ColorRef, ColorStep, SemanticColorName } from './color'\n\nexport { duration, easing } from './motion'\nexport type { DurationName, EasingName } from './motion'\n\nexport { radius } from './radius'\nexport type { RadiusName } from './radius'\n\nexport { shadow } from './shadow'\nexport type { ShadowName } from './shadow'\n\nexport { spacing, spacingBase } from './spacing'\nexport type { SpacingName } from './spacing'\n\nexport { fontFamily, fontSize, fontWeight, letterSpacing, lineHeight } from './typography'\nexport type { FontSizeName } from './typography'\n\nexport { zIndex } from './z-index'\nexport type { ZIndexName } from './z-index'\n\nexport { buildThemeCss } from './css'\n\n/**\n * Every rowkit token in one object.\n *\n * Grouped by scale rather than flattened, so `tokens.color.primary[600]`\n * narrows to its literal type and autocompletes each level.\n */\nexport const tokens = {\n color: {\n neutral,\n primary,\n success,\n warning,\n danger,\n /** Flat map of every primitive, keyed by CSS custom property suffix. */\n primitives: colorPrimitives,\n /** Semantic tokens, which reference primitives via `var()`. */\n semantic: {\n light: semanticColorLight,\n dark: semanticColorDark,\n },\n },\n spacing,\n spacingBase,\n font: {\n family: fontFamily,\n size: fontSize,\n weight: fontWeight,\n letterSpacing,\n lineHeight,\n },\n radius,\n shadow,\n zIndex,\n motion: {\n duration,\n easing,\n },\n} as const\n\n/** The shape of {@link tokens}. */\nexport type Tokens = typeof tokens\n\n/**\n * The `@rowkit/tokens` version this build was produced from.\n *\n * Read from `package.json` rather than written out. A literal here went stale\n * the moment Changesets bumped the manifest — it edits `package.json` and\n * nothing was updating the constant, so the first release broke its own test.\n * Rollup tree-shakes the JSON down to this one string, so nothing else ships.\n */\nexport const version: string = pkgVersion\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../package.json","../src/color.ts","../src/motion.ts","../src/radius.ts","../src/shadow.ts","../src/spacing.ts","../src/typography.ts","../src/z-index.ts","../src/css.ts","../src/index.ts"],"sourcesContent":["{\n \"name\": \"@rowkit/tokens\",\n \"version\": \"0.1.1\",\n \"description\": \"Design tokens for rowkit — consumable without importing components.\",\n \"license\": \"MIT\",\n \"author\": \"Nikolai Kushner\",\n \"homepage\": \"https://rowkit.dev\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/NikolaiKushner/rowkit.git\",\n \"directory\": \"packages/tokens\"\n },\n \"bugs\": \"https://github.com/NikolaiKushner/rowkit/issues\",\n \"keywords\": [\n \"design-tokens\",\n \"design-system\",\n \"rowkit\"\n ],\n \"type\": \"module\",\n \"sideEffects\": false,\n \"files\": [\n \"dist\"\n ],\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\"\n },\n \"./css\": \"./dist/tokens.css\",\n \"./package.json\": \"./package.json\"\n },\n \"publishConfig\": {\n \"access\": \"public\",\n \"provenance\": true\n },\n \"engines\": {\n \"node\": \">=20.19.0\"\n },\n \"scripts\": {\n \"build\": \"vue-tsc -b tsconfig.lib.json --force && vite build && node scripts/fix-dts-specifiers.mjs && node scripts/emit-css.mjs && node scripts/emit-reference.mjs\",\n \"typecheck\": \"vue-tsc -b --force\",\n \"reference\": \"pnpm build && open dist/reference.html\"\n }\n}\n","/**\n * Colour primitives and semantic mappings.\n *\n * ## How the scales were derived\n *\n * Every chromatic family shares one lightness ramp and one chroma envelope, so\n * `primary-600`, `danger-600` and `success-600` are the same perceptual weight\n * and can be swapped without relayering the design. Families differ only by\n * hue and a chroma factor.\n *\n * Chroma at each step is clamped to the sRGB gamut boundary. OKLCH can express\n * colours outside sRGB, and browsers gamut-map them per their own rules — that\n * makes a token render differently on a P3 laptop than on an sRGB monitor.\n * Clamping trades a little vividness for identical output everywhere.\n *\n * `warning` carries a lightness bump through its midtones: at a shared\n * lightness, yellow is far less saturated than blue or red, so the unbumped\n * steps read as muddy brown rather than amber.\n *\n * Contrast for every semantic pair is asserted in `contrast.test.ts` — the\n * ratios are a build gate, not a claim in a comment.\n */\n\n/** The eleven steps every colour family provides. */\nexport const colorSteps = [50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950] as const\n\n/** One step of a colour family. */\nexport type ColorStep = (typeof colorSteps)[number]\n\n/**\n * Cool-slate neutral (hue 264). Roughly 70% of the pixels in a data table:\n * page background, row borders, muted labels, table chrome.\n */\nexport const neutral = {\n 50: 'oklch(0.984 0.003 264)',\n 100: 'oklch(0.968 0.004 264)',\n 200: 'oklch(0.928 0.006 264)',\n 300: 'oklch(0.869 0.01 264)',\n 400: 'oklch(0.704 0.018 264)',\n 500: 'oklch(0.551 0.024 264)',\n 600: 'oklch(0.446 0.027 264)',\n 700: 'oklch(0.373 0.028 264)',\n 800: 'oklch(0.279 0.03 264)',\n 900: 'oklch(0.21 0.033 264)',\n 950: 'oklch(0.13 0.036 264)',\n} as const\n\n/** Brand blue (hue 259). Drives links, focus rings and primary actions. */\nexport const primary = {\n 50: 'oklch(0.97 0.014 259)',\n 100: 'oklch(0.936 0.03 259)',\n 200: 'oklch(0.885 0.055 259)',\n 300: 'oklch(0.809 0.095 259)',\n 400: 'oklch(0.715 0.147 259)',\n 500: 'oklch(0.623 0.201 259)',\n 600: 'oklch(0.546 0.209 259)',\n 700: 'oklch(0.488 0.187 259)',\n 800: 'oklch(0.442 0.165 259)',\n 900: 'oklch(0.396 0.135 259)',\n 950: 'oklch(0.282 0.086 259)',\n} as const\n\n/** Green (hue 152). Reserved for successful outcomes, never for brand accent. */\nexport const success = {\n 50: 'oklch(0.97 0.014 152)',\n 100: 'oklch(0.936 0.036 152)',\n 200: 'oklch(0.885 0.064 152)',\n 300: 'oklch(0.809 0.097 152)',\n 400: 'oklch(0.715 0.145 152)',\n 500: 'oklch(0.623 0.162 152)',\n 600: 'oklch(0.546 0.142 152)',\n 700: 'oklch(0.488 0.127 152)',\n 800: 'oklch(0.442 0.115 152)',\n 900: 'oklch(0.396 0.103 152)',\n 950: 'oklch(0.282 0.073 152)',\n} as const\n\n/** Amber (hue 75), lightness-bumped through the midtones. See the module note. */\nexport const warning = {\n 50: 'oklch(0.97 0.016 75)',\n 100: 'oklch(0.936 0.04 75)',\n 200: 'oklch(0.885 0.071 75)',\n 300: 'oklch(0.849 0.108 75)',\n 400: 'oklch(0.785 0.162 75)',\n 500: 'oklch(0.723 0.15 75)',\n 600: 'oklch(0.616 0.128 75)',\n 700: 'oklch(0.528 0.11 75)',\n 800: 'oklch(0.442 0.092 75)',\n 900: 'oklch(0.396 0.082 75)',\n 950: 'oklch(0.282 0.059 75)',\n} as const\n\n/** Red (hue 25). Destructive actions and error states. */\nexport const danger = {\n 50: 'oklch(0.97 0.014 25)',\n 100: 'oklch(0.936 0.032 25)',\n 200: 'oklch(0.885 0.06 25)',\n 300: 'oklch(0.809 0.107 25)',\n 400: 'oklch(0.715 0.17 25)',\n 500: 'oklch(0.623 0.214 25)',\n 600: 'oklch(0.546 0.218 25)',\n 700: 'oklch(0.488 0.195 25)',\n 800: 'oklch(0.442 0.165 25)',\n 900: 'oklch(0.396 0.135 25)',\n 950: 'oklch(0.282 0.086 25)',\n} as const\n\n/**\n * Every primitive colour, keyed by the CSS custom property it becomes.\n *\n * These are the only place a literal colour value appears in rowkit. Everything\n * else — semantic tokens, component variants — references one of these.\n */\nexport const colorPrimitives = {\n white: 'oklch(1 0 0)',\n black: 'oklch(0 0 0)',\n ...prefix('neutral', neutral),\n ...prefix('primary', primary),\n ...prefix('success', success),\n ...prefix('warning', warning),\n ...prefix('danger', danger),\n} as const\n\nfunction prefix<N extends string>(\n name: N,\n scale: Record<ColorStep, string>\n): Record<`${N}-${ColorStep}`, string> {\n const out: Record<string, string> = {}\n for (const step of colorSteps) out[`${name}-${step}`] = scale[step]\n return out\n}\n\n/** A reference to a primitive colour, as a CSS `var()` expression. */\nexport type ColorRef = `var(--color-${string})`\n\nconst ref = (token: keyof typeof colorPrimitives): ColorRef => `var(--color-${token})`\n\n/**\n * Light-mode semantic colours.\n *\n * Semantic tokens never hold a literal colour — each one points at a primitive\n * through `var()`, so re-theming means repointing references rather than\n * hunting down hex codes. `semantic.test.ts` enforces this.\n */\nexport const semanticColorLight = {\n /** Page background, behind all surfaces. */\n background: ref('neutral-50'),\n /** Cards, panels, table bodies — the plane content sits on. */\n surface: ref('white'),\n /** Table headers, toolbars: a surface that recedes slightly. */\n 'surface-subtle': ref('neutral-100'),\n /** Row hover. */\n 'surface-hover': ref('neutral-100'),\n /** Row press / active. */\n 'surface-active': ref('neutral-200'),\n /** Selected table row. */\n 'surface-selected': ref('primary-50'),\n /** Disabled control background. */\n 'surface-disabled': ref('neutral-100'),\n /**\n * Loading placeholder fill.\n *\n * Its own token rather than a reuse of `surface-active`, which means \"this\n * row is being pressed\". A skeleton is never interactive, so borrowing an\n * interaction token would tie the two together for any future re-theme.\n *\n * Exempt from contrast rules: skeletons are `aria-hidden` decoration\n * standing in for content that has not arrived, so there is nothing for a\n * reader to perceive and WCAG 1.4.11 does not apply.\n */\n skeleton: ref('neutral-200'),\n\n /** Primary body and heading text. */\n text: ref('neutral-900'),\n /**\n * Secondary text, column labels, help text.\n *\n * `neutral-600`, not `500`. A table header is muted text on `surface-subtle`,\n * and at `500` that pairing reached only 4.41:1 — passing on white, failing\n * WCAG 1.4.3 on the recessed surface this token is most often used against.\n * `600` clears it at 6.90:1 and is still 2.3× lighter than `text`, so the\n * hierarchy survives.\n */\n 'text-muted': ref('neutral-600'),\n /** Placeholders and de-emphasised metadata. */\n 'text-subtle': ref('neutral-400'),\n /** Text on a disabled control. */\n 'text-disabled': ref('neutral-400'),\n\n /**\n * Decorative hairline: row separators, card outlines.\n *\n * Deliberately below 3:1 against the surface. Do not use it for the boundary\n * of an interactive control — see {@link semanticColorLight['border-control']}.\n */\n border: ref('neutral-200'),\n /** Emphasised decorative border: dividers that need to read as structure. */\n 'border-strong': ref('neutral-300'),\n /** Barely-there separation inside a dense group. */\n 'border-subtle': ref('neutral-100'),\n /**\n * Boundary of an interactive control — text inputs, checkboxes, outlined\n * buttons.\n *\n * WCAG 1.4.11 requires 3:1 against the adjacent surface for the visual\n * boundary of a UI component. `border` manages only 1.24:1 and\n * `border-strong` 1.49:1, so neither is legal here; this token is the\n * lightest neutral that clears the bar (4.83:1 on `surface`).\n */\n 'border-control': ref('neutral-500'),\n /** Focus ring. Never remove the ring — recolour it. */\n 'focus-ring': ref('primary-600'),\n\n /** Base colour shadows are mixed from. */\n shadow: ref('neutral-950'),\n\n // `neutral` completes the status family so a component's variant matrix has\n // no special case: a neutral Badge reads the same token names as a danger\n // one. It is the default state — \"no status\" — not an absence of styling.\n 'neutral-solid': ref('neutral-700'),\n 'neutral-solid-hover': ref('neutral-800'),\n 'neutral-on-solid': ref('white'),\n 'neutral-subtle': ref('neutral-100'),\n 'neutral-on-subtle': ref('neutral-700'),\n 'neutral-border': ref('neutral-200'),\n\n 'primary-solid': ref('primary-600'),\n 'primary-solid-hover': ref('primary-700'),\n 'primary-on-solid': ref('white'),\n 'primary-subtle': ref('primary-50'),\n 'primary-on-subtle': ref('primary-700'),\n 'primary-border': ref('primary-200'),\n\n 'success-solid': ref('success-600'),\n 'success-solid-hover': ref('success-700'),\n 'success-on-solid': ref('white'),\n 'success-subtle': ref('success-50'),\n 'success-on-subtle': ref('success-700'),\n 'success-border': ref('success-200'),\n\n // Amber is squeezed from both sides in light mode. It cannot carry white text\n // at any usable weight (white on warning-600 is 3.78:1), and a bright amber\n // fill has no discernible edge against a near-white page (warning-400 vs\n // background is 1.92:1, failing WCAG 1.4.11). warning-600 is the only step\n // that satisfies both: 3.61:1 against the page, 4.69:1 for dark text.\n //\n // Hover therefore brightens rather than darkens — warning-700 would drop dark\n // text to 3.27:1.\n 'warning-solid': ref('warning-600'),\n 'warning-solid-hover': ref('warning-500'),\n 'warning-on-solid': ref('neutral-900'),\n 'warning-subtle': ref('warning-50'),\n 'warning-on-subtle': ref('warning-700'),\n 'warning-border': ref('warning-200'),\n\n 'danger-solid': ref('danger-600'),\n 'danger-solid-hover': ref('danger-700'),\n 'danger-on-solid': ref('white'),\n 'danger-subtle': ref('danger-50'),\n 'danger-on-subtle': ref('danger-700'),\n 'danger-border': ref('danger-200'),\n} as const\n\n/**\n * Dark-mode semantic colours, applied under `.dark`.\n *\n * Solid fills use the bright `400` step with dark text rather than mirroring\n * light mode's `600` with white text. On a near-black page a `600` fill only\n * reaches 3.6–4.4:1 against the background — the button itself becomes hard to\n * locate even though its label is legible. The `400` fill scores 7.4–8.5:1 on\n * both label and background.\n */\nexport const semanticColorDark = {\n background: ref('neutral-950'),\n surface: ref('neutral-900'),\n 'surface-subtle': ref('neutral-800'),\n 'surface-hover': ref('neutral-800'),\n 'surface-active': ref('neutral-700'),\n 'surface-selected': ref('primary-950'),\n 'surface-disabled': ref('neutral-800'),\n // Lifts off `surface` (neutral-900) rather than receding. On a dark page a\n // placeholder darker than its card reads as a hole in the layout.\n skeleton: ref('neutral-800'),\n\n text: ref('neutral-50'),\n 'text-muted': ref('neutral-400'),\n 'text-subtle': ref('neutral-500'),\n 'text-disabled': ref('neutral-600'),\n\n border: ref('neutral-800'),\n 'border-strong': ref('neutral-700'),\n 'border-subtle': ref('neutral-900'),\n // neutral-500 is again the lightest step clearing 3:1, here against\n // `surface` (neutral-900) at 3.67:1.\n 'border-control': ref('neutral-500'),\n 'focus-ring': ref('primary-400'),\n\n shadow: ref('black'),\n\n 'neutral-solid': ref('neutral-400'),\n 'neutral-solid-hover': ref('neutral-300'),\n 'neutral-on-solid': ref('neutral-950'),\n 'neutral-subtle': ref('neutral-800'),\n 'neutral-on-subtle': ref('neutral-200'),\n 'neutral-border': ref('neutral-700'),\n\n 'primary-solid': ref('primary-400'),\n 'primary-solid-hover': ref('primary-300'),\n 'primary-on-solid': ref('neutral-950'),\n 'primary-subtle': ref('primary-950'),\n 'primary-on-subtle': ref('primary-300'),\n 'primary-border': ref('primary-800'),\n\n 'success-solid': ref('success-400'),\n 'success-solid-hover': ref('success-300'),\n 'success-on-solid': ref('neutral-950'),\n 'success-subtle': ref('success-950'),\n 'success-on-subtle': ref('success-300'),\n 'success-border': ref('success-800'),\n\n 'warning-solid': ref('warning-400'),\n 'warning-solid-hover': ref('warning-300'),\n 'warning-on-solid': ref('neutral-950'),\n 'warning-subtle': ref('warning-950'),\n 'warning-on-subtle': ref('warning-300'),\n 'warning-border': ref('warning-800'),\n\n 'danger-solid': ref('danger-400'),\n 'danger-solid-hover': ref('danger-300'),\n 'danger-on-solid': ref('neutral-950'),\n 'danger-subtle': ref('danger-950'),\n 'danger-on-subtle': ref('danger-300'),\n 'danger-border': ref('danger-800'),\n} as const\n\n/** Names of every semantic colour token. */\nexport type SemanticColorName = keyof typeof semanticColorLight\n","/**\n * Motion durations and easing curves.\n *\n * Durations are short. In a data-dense interface an animation is feedback, not\n * decoration: the user is scanning rows, and anything past ~200ms reads as the\n * interface lagging rather than responding.\n *\n * Every consumer of these tokens is still responsible for honouring\n * `prefers-reduced-motion` — a token cannot express that.\n */\nexport const duration = {\n /** No transition. */\n instant: '0ms',\n /** Hover and focus states — must feel immediate. */\n fast: '120ms',\n /** Dropdowns, popovers, most enter/exit transitions. */\n normal: '200ms',\n /** Dialogs and large surfaces, where more travel needs more time. */\n slow: '320ms',\n} as const\n\n/** Easing curves. */\nexport const easing = {\n /** Linear. Progress indicators only. */\n linear: 'linear',\n /**\n * The default for anything that both enters and leaves. Fast out of the\n * gate, gentle at rest.\n */\n standard: 'cubic-bezier(0.2, 0, 0, 1)',\n /** Entering the screen: decelerate into place. */\n enter: 'cubic-bezier(0, 0, 0.2, 1)',\n /** Leaving the screen: accelerate away. */\n exit: 'cubic-bezier(0.4, 0, 1, 1)',\n} as const\n\n/** Names of every duration token. */\nexport type DurationName = keyof typeof duration\n/** Names of every easing token. */\nexport type EasingName = keyof typeof easing\n","/**\n * Corner radii.\n *\n * Restrained by design: heavily rounded corners waste horizontal space at the\n * edges of a dense grid and make adjacent cells read as separate objects.\n */\nexport const radius = {\n /** Square. Table cells, and anything that tiles edge to edge. */\n none: '0rem',\n /** 2px — checkboxes, tags inside a cell. */\n xs: '0.125rem',\n /** 4px — inputs, buttons, badges. The rowkit default. */\n sm: '0.25rem',\n /** 6px — cards, popovers. */\n md: '0.375rem',\n /** 8px — dialogs. */\n lg: '0.5rem',\n /** 12px — large empty-state panels. */\n xl: '0.75rem',\n /** Pill. Status chips and avatars. */\n full: '9999px',\n} as const\n\n/** Names of every radius token. */\nexport type RadiusName = keyof typeof radius\n","/**\n * Elevation shadows.\n *\n * Each shadow mixes from `--color-shadow`, a semantic token, rather than\n * hardcoding a colour — so dark mode swaps the base to pure black by\n * repointing one variable.\n *\n * Dark mode leans on surface lightness for elevation rather than on shadows.\n * A shadow is a darker region, and on a near-black page there is very little\n * headroom left to darken; the raised surface colour does the work instead.\n */\nexport const shadow = {\n /** No elevation. */\n none: 'none',\n /** Hairline lift — sticky table headers, input focus. */\n xs: '0 1px 2px 0 color-mix(in oklab, var(--color-shadow) 6%, transparent)',\n /** Resting cards. */\n sm: '0 1px 3px 0 color-mix(in oklab, var(--color-shadow) 8%, transparent), 0 1px 2px -1px color-mix(in oklab, var(--color-shadow) 8%, transparent)',\n /** Dropdowns, popovers. */\n md: '0 4px 6px -1px color-mix(in oklab, var(--color-shadow) 9%, transparent), 0 2px 4px -2px color-mix(in oklab, var(--color-shadow) 9%, transparent)',\n /** Menus over content. */\n lg: '0 10px 15px -3px color-mix(in oklab, var(--color-shadow) 10%, transparent), 0 4px 6px -4px color-mix(in oklab, var(--color-shadow) 10%, transparent)',\n /** Modal dialogs. */\n xl: '0 20px 25px -5px color-mix(in oklab, var(--color-shadow) 12%, transparent), 0 8px 10px -6px color-mix(in oklab, var(--color-shadow) 12%, transparent)',\n /** Horizontal-scroll affordance on a sticky table column. */\n 'scroll-x': '8px 0 8px -8px color-mix(in oklab, var(--color-shadow) 15%, transparent)',\n} as const\n\n/** Names of every shadow token. */\nexport type ShadowName = keyof typeof shadow\n","/**\n * Spacing scale.\n *\n * Keys are multiples of the 4px base unit, matching the convention most Vue and\n * Tailwind developers already carry in their heads: `4` is 1rem, `2` is 8px.\n * Fractional steps are deliberately absent — they would need escaped CSS custom\n * property names (`--spacing-0\\.5`), and Tailwind v4 already derives arbitrary\n * fractions from {@link spacingBase}.\n *\n * The low end is dense on purpose. A table cell padded at `2`/`3` is the\n * difference between a grid that shows twenty rows and one that shows twelve.\n */\nexport const spacing = {\n /** Zero. */\n 0: '0rem',\n /** 1px — hairline offsets and optical nudges, not layout. */\n px: '1px',\n /** 4px — icon-to-label gap. */\n 1: '0.25rem',\n /** 8px — dense table cell padding. */\n 2: '0.5rem',\n /** 12px — default table cell padding, compact control padding. */\n 3: '0.75rem',\n /** 16px — default control padding, tight card padding. */\n 4: '1rem',\n /** 20px */\n 5: '1.25rem',\n /** 24px — card padding, gap between form fields. */\n 6: '1.5rem',\n /** 32px — section spacing. */\n 8: '2rem',\n /** 40px */\n 10: '2.5rem',\n /** 48px — gap between major page regions. */\n 12: '3rem',\n /** 64px — page gutters. */\n 16: '4rem',\n /** 80px */\n 20: '5rem',\n /** 96px — empty-state vertical padding. */\n 24: '6rem',\n} as const\n\n/**\n * The base unit Tailwind v4 multiplies for dynamic spacing utilities.\n *\n * Emitting this as `--spacing` keeps `p-7` and `mt-3.5` working even though\n * neither has a named token above.\n */\nexport const spacingBase = '0.25rem'\n\n/** Names of every spacing token. */\nexport type SpacingName = keyof typeof spacing\n","/**\n * Typography scale.\n *\n * Weighted toward the small end: a dashboard spends most of its type budget\n * between 12px and 16px, and the sizes above `xl` exist for empty states and\n * page titles rather than for data.\n */\n\n/** Font families. Both stacks start with a system font — no webfont request. */\nexport const fontFamily = {\n /** UI and body text. */\n sans: [\n 'ui-sans-serif',\n 'system-ui',\n '-apple-system',\n 'Segoe UI',\n 'Roboto',\n 'Helvetica Neue',\n 'Arial',\n 'sans-serif',\n ].join(', '),\n /** IDs, hashes, numeric columns that must align vertically. */\n mono: [\n 'ui-monospace',\n 'SFMono-Regular',\n 'Menlo',\n 'Consolas',\n 'Liberation Mono',\n 'monospace',\n ].join(', '),\n} as const\n\n/**\n * Font sizes, each paired with the line height it should almost always use.\n *\n * Pairing them prevents the most common typographic bug in a dense table:\n * shrinking the font without shrinking leading, so rows stay tall and the\n * density gain evaporates.\n */\nexport const fontSize = {\n /** 12px — table metadata, badges, column headers. */\n xs: { size: '0.75rem', lineHeight: '1rem' },\n /** 14px — the default for table cells and form controls. */\n sm: { size: '0.875rem', lineHeight: '1.25rem' },\n /** 16px — body copy outside of data views. */\n base: { size: '1rem', lineHeight: '1.5rem' },\n /** 18px — card titles. */\n lg: { size: '1.125rem', lineHeight: '1.75rem' },\n /** 20px — section headings. */\n xl: { size: '1.25rem', lineHeight: '1.75rem' },\n /** 24px — page titles, empty-state headings. */\n '2xl': { size: '1.5rem', lineHeight: '2rem' },\n /** 30px — the largest size rowkit ships. */\n '3xl': { size: '1.875rem', lineHeight: '2.25rem' },\n} as const\n\n/** Font weights. */\nexport const fontWeight = {\n /** Body text. */\n normal: '400',\n /** Column headers, subtle emphasis. */\n medium: '500',\n /** Buttons, card titles. */\n semibold: '600',\n /** Page titles. */\n bold: '700',\n} as const\n\n/** Letter spacing. Tightening only pays off at display sizes. */\nexport const letterSpacing = {\n tight: '-0.015em',\n normal: '0em',\n /** For uppercase micro-labels, which need air to stay readable. */\n wide: '0.04em',\n} as const\n\n/** Standalone line heights, for when text is not using a paired {@link fontSize}. */\nexport const lineHeight = {\n none: '1',\n tight: '1.25',\n snug: '1.375',\n normal: '1.5',\n relaxed: '1.625',\n} as const\n\n/** Names of every font size token. */\nexport type FontSizeName = keyof typeof fontSize\n","/**\n * Stacking layers.\n *\n * Spaced by 100 so a consumer can slot their own chrome — an app header, a\n * cookie banner — between two rowkit layers without editing rowkit or starting\n * a `z-index: 99999` arms race.\n *\n * The ordering is not arbitrary. A tooltip must outrank a toast, because a\n * toast can carry an action button that itself has a tooltip. A popover must\n * outrank a modal, because a select inside a dialog opens a popover.\n */\nexport const zIndex = {\n /** Default flow. */\n base: '0',\n /** Sticky table header and pinned columns. */\n sticky: '100',\n /** Dropdown menus attached to page-level content. */\n dropdown: '200',\n /** Backdrop behind a modal. */\n overlay: '300',\n /** Dialog surface. */\n modal: '400',\n /** Popovers and selects — must sit above a dialog to work inside one. */\n popover: '500',\n /** Toast queue. */\n toast: '600',\n /** Tooltips outrank everything, including toasts. */\n tooltip: '700',\n} as const\n\n/** Names of every z-index token. */\nexport type ZIndexName = keyof typeof zIndex\n","import { colorPrimitives, semanticColorDark, semanticColorLight } from './color'\nimport { duration, easing } from './motion'\nimport { radius } from './radius'\nimport { shadow } from './shadow'\nimport { spacing, spacingBase } from './spacing'\nimport { fontFamily, fontSize, fontWeight, letterSpacing, lineHeight } from './typography'\nimport { zIndex } from './z-index'\n\n/**\n * Emits the Tailwind v4 `@theme` block for the rowkit token set.\n *\n * The TypeScript objects are the single source of truth; this function derives\n * the stylesheet from them, so the two cannot drift. `css.test.ts` asserts that\n * every token in every scale reaches the output.\n *\n * Dark mode works by repointing *semantic* tokens under `.dark`. Primitives are\n * emitted once and never change — `--color-primary-600` is the same colour in\n * both themes; what changes is which primitive `--color-primary-solid` points\n * at. That is why the theme can flip without a single hardcoded colour moving.\n *\n * @returns The complete stylesheet, ready to write to disk.\n */\nexport function buildThemeCss(): string {\n return [\n header(),\n '',\n // Tailwind v4 defaults the `dark:` variant to prefers-color-scheme. rowkit\n // uses a class so an app can offer an explicit theme switch.\n '@custom-variant dark (&:where(.dark, .dark *));',\n '',\n '@theme {',\n section('colour primitives — the only literal colours in rowkit'),\n ...entries(colorPrimitives, (k) => `--color-${k}`),\n '',\n section('semantic colours — light (defaults)'),\n ...entries(semanticColorLight, (k) => `--color-${k}`),\n '',\n section('spacing'),\n ` --spacing: ${spacingBase};`,\n ...entries(spacing, (k) => `--spacing-${k}`),\n '',\n section('typography'),\n ...entries(fontFamily, (k) => `--font-${k}`),\n ...fontSizeEntries(),\n ...entries(fontWeight, (k) => `--font-weight-${k}`),\n ...entries(letterSpacing, (k) => `--tracking-${k}`),\n ...entries(lineHeight, (k) => `--leading-${k}`),\n '',\n section('radii'),\n ...entries(radius, (k) => `--radius-${k}`),\n '',\n section('shadows'),\n ...entries(shadow, (k) => `--shadow-${k}`),\n '',\n section('motion'),\n // Tailwind v4's namespaces are `--transition-duration-*` and `--ease-*`.\n // A name outside a namespace it recognises is not an error — it simply\n // generates no utility, which is why `duration-fast` silently produced\n // nothing until the compile test in packages/ui went looking for it.\n ...entries(duration, (k) => `--transition-duration-${k}`),\n ...entries(easing, (k) => `--ease-${k}`),\n '',\n section('stacking layers'),\n ...entries(zIndex, (k) => `--z-index-${k}`),\n '}',\n '',\n '/* Dark mode repoints semantic tokens only. Primitives are theme-agnostic. */',\n '.dark {',\n ...entries(semanticColorDark, (k) => `--color-${k}`),\n '}',\n '',\n ].join('\\n')\n}\n\nfunction header(): string {\n return [\n '/*',\n ' * rowkit design tokens.',\n ' *',\n ' * GENERATED FILE — DO NOT EDIT.',\n ' * Source of truth: packages/tokens/src/*.ts',\n ' * Regenerate with: pnpm --filter @rowkit/tokens build',\n ' */',\n ].join('\\n')\n}\n\nfunction section(label: string): string {\n return ` /* ${label} */`\n}\n\n/** Renders `key: value` pairs as indented custom property declarations. */\nfunction entries(scale: Record<string, string>, toVar: (key: string) => string): string[] {\n return Object.entries(scale).map(([key, value]) => ` ${toVar(key)}: ${value};`)\n}\n\n/**\n * Font sizes use Tailwind v4's paired form, where `--text-sm--line-height`\n * supplies the leading that ships with `text-sm`.\n */\nfunction fontSizeEntries(): string[] {\n return Object.entries(fontSize).flatMap(([key, value]) => [\n ` --text-${key}: ${value.size};`,\n ` --text-${key}--line-height: ${value.lineHeight};`,\n ])\n}\n","/**\n * `@rowkit/tokens` — the design token layer behind rowkit.\n *\n * Consumable on its own: import {@link tokens} for a fully typed object, or\n * `@rowkit/tokens/css` for the Tailwind v4 `@theme` block. Nothing here depends\n * on Vue, so a design tool, a docs site, or a chart library can read the same\n * values the components use.\n *\n * @example Typed access to a primitive\n * ```ts\n * import { tokens } from '@rowkit/tokens'\n * tokens.color.primary[600] // 'oklch(0.546 0.209 259)'\n * ```\n *\n * @example The stylesheet\n * ```css\n * @import 'tailwindcss';\n * @import '@rowkit/tokens/css';\n * ```\n */\n\nimport { version as pkgVersion } from '../package.json' with { type: 'json' }\nimport {\n colorPrimitives,\n danger,\n neutral,\n primary,\n semanticColorDark,\n semanticColorLight,\n success,\n warning,\n} from './color'\nimport { duration, easing } from './motion'\nimport { radius } from './radius'\nimport { shadow } from './shadow'\nimport { spacing, spacingBase } from './spacing'\nimport { fontFamily, fontSize, fontWeight, letterSpacing, lineHeight } from './typography'\nimport { zIndex } from './z-index'\n\nexport {\n colorPrimitives,\n colorSteps,\n danger,\n neutral,\n primary,\n semanticColorDark,\n semanticColorLight,\n success,\n warning,\n} from './color'\nexport type { ColorRef, ColorStep, SemanticColorName } from './color'\n\nexport { duration, easing } from './motion'\nexport type { DurationName, EasingName } from './motion'\n\nexport { radius } from './radius'\nexport type { RadiusName } from './radius'\n\nexport { shadow } from './shadow'\nexport type { ShadowName } from './shadow'\n\nexport { spacing, spacingBase } from './spacing'\nexport type { SpacingName } from './spacing'\n\nexport { fontFamily, fontSize, fontWeight, letterSpacing, lineHeight } from './typography'\nexport type { FontSizeName } from './typography'\n\nexport { zIndex } from './z-index'\nexport type { ZIndexName } from './z-index'\n\nexport { buildThemeCss } from './css'\n\n/**\n * Every rowkit token in one object.\n *\n * Grouped by scale rather than flattened, so `tokens.color.primary[600]`\n * narrows to its literal type and autocompletes each level.\n */\nexport const tokens = {\n color: {\n neutral,\n primary,\n success,\n warning,\n danger,\n /** Flat map of every primitive, keyed by CSS custom property suffix. */\n primitives: colorPrimitives,\n /** Semantic tokens, which reference primitives via `var()`. */\n semantic: {\n light: semanticColorLight,\n dark: semanticColorDark,\n },\n },\n spacing,\n spacingBase,\n font: {\n family: fontFamily,\n size: fontSize,\n weight: fontWeight,\n letterSpacing,\n lineHeight,\n },\n radius,\n shadow,\n zIndex,\n motion: {\n duration,\n easing,\n },\n} as const\n\n/** The shape of {@link tokens}. */\nexport type Tokens = typeof tokens\n\n/**\n * The `@rowkit/tokens` version this build was produced from.\n *\n * Read from `package.json` rather than written out. A literal here went stale\n * the moment Changesets bumped the manifest — it edits `package.json` and\n * nothing was updating the constant, so the first release broke its own test.\n * Rollup tree-shakes the JSON down to this one string, so nothing else ships.\n */\nexport const version: string = pkgVersion\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rowkit/tokens",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Design tokens for rowkit — consumable without importing components.",
5
5
  "license": "MIT",
6
6
  "author": "Nikolai Kushner",
@@ -40,7 +40,7 @@
40
40
  "node": ">=20.19.0"
41
41
  },
42
42
  "scripts": {
43
- "build": "vue-tsc -b tsconfig.lib.json --force && vite build && node scripts/emit-css.mjs && node scripts/emit-reference.mjs",
43
+ "build": "vue-tsc -b tsconfig.lib.json --force && vite build && node scripts/fix-dts-specifiers.mjs && node scripts/emit-css.mjs && node scripts/emit-reference.mjs",
44
44
  "typecheck": "vue-tsc -b --force",
45
45
  "reference": "pnpm build && open dist/reference.html"
46
46
  }