@momoi-labs/kiso 0.1.0

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.
Files changed (73) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +63 -0
  3. package/kiso/AGENTS.md +50 -0
  4. package/kiso/README.md +62 -0
  5. package/kiso/docs/accessibility.md +87 -0
  6. package/kiso/docs/brand.md +95 -0
  7. package/kiso/docs/components/README.md +58 -0
  8. package/kiso/docs/components/alert.md +158 -0
  9. package/kiso/docs/components/badge.md +135 -0
  10. package/kiso/docs/components/breadcrumb.md +66 -0
  11. package/kiso/docs/components/button.md +168 -0
  12. package/kiso/docs/components/card.md +154 -0
  13. package/kiso/docs/components/checkbox.md +91 -0
  14. package/kiso/docs/components/command-palette.md +165 -0
  15. package/kiso/docs/components/drawer.md +79 -0
  16. package/kiso/docs/components/dropdown-menu.md +178 -0
  17. package/kiso/docs/components/empty-state.md +142 -0
  18. package/kiso/docs/components/form-field.md +115 -0
  19. package/kiso/docs/components/header.md +79 -0
  20. package/kiso/docs/components/helper-text.md +86 -0
  21. package/kiso/docs/components/icon-button.md +161 -0
  22. package/kiso/docs/components/input.md +99 -0
  23. package/kiso/docs/components/label.md +88 -0
  24. package/kiso/docs/components/link.md +152 -0
  25. package/kiso/docs/components/modal-dialog.md +82 -0
  26. package/kiso/docs/components/navigation.md +68 -0
  27. package/kiso/docs/components/page-header.md +70 -0
  28. package/kiso/docs/components/pagination.md +129 -0
  29. package/kiso/docs/components/popover.md +74 -0
  30. package/kiso/docs/components/search.md +147 -0
  31. package/kiso/docs/components/select.md +105 -0
  32. package/kiso/docs/components/sidebar.md +74 -0
  33. package/kiso/docs/components/skeleton.md +140 -0
  34. package/kiso/docs/components/spinner.md +125 -0
  35. package/kiso/docs/components/switch.md +92 -0
  36. package/kiso/docs/components/table.md +255 -0
  37. package/kiso/docs/components/tabs.md +69 -0
  38. package/kiso/docs/components/textarea.md +91 -0
  39. package/kiso/docs/components/toast.md +80 -0
  40. package/kiso/docs/components/tooltip.md +162 -0
  41. package/kiso/docs/components/validation-message.md +96 -0
  42. package/kiso/docs/data-interfaces.md +309 -0
  43. package/kiso/docs/evolution.md +35 -0
  44. package/kiso/docs/patterns/README.md +40 -0
  45. package/kiso/docs/patterns/application-shell.md +106 -0
  46. package/kiso/docs/patterns/command-palette.md +142 -0
  47. package/kiso/docs/patterns/confirmations.md +158 -0
  48. package/kiso/docs/patterns/crud.md +139 -0
  49. package/kiso/docs/patterns/dashboard.md +102 -0
  50. package/kiso/docs/patterns/destructive-actions.md +137 -0
  51. package/kiso/docs/patterns/developer-oriented-interfaces.md +162 -0
  52. package/kiso/docs/patterns/empty-states.md +76 -0
  53. package/kiso/docs/patterns/errors.md +93 -0
  54. package/kiso/docs/patterns/filtering.md +147 -0
  55. package/kiso/docs/patterns/keyboard-shortcuts.md +155 -0
  56. package/kiso/docs/patterns/large-data-tables.md +182 -0
  57. package/kiso/docs/patterns/list-detail.md +118 -0
  58. package/kiso/docs/patterns/loading.md +80 -0
  59. package/kiso/docs/patterns/login-authentication.md +101 -0
  60. package/kiso/docs/patterns/onboarding.md +94 -0
  61. package/kiso/docs/patterns/pagination.md +121 -0
  62. package/kiso/docs/patterns/permission-denied.md +84 -0
  63. package/kiso/docs/patterns/search.md +150 -0
  64. package/kiso/docs/patterns/settings.md +100 -0
  65. package/kiso/docs/patterns/sorting.md +121 -0
  66. package/kiso/docs/principles.md +122 -0
  67. package/kiso/docs/tokens.md +95 -0
  68. package/kiso/docs/voice-and-tone.md +154 -0
  69. package/package.json +42 -0
  70. package/tokens/build/tokens.css +143 -0
  71. package/tokens/build/tokens.d.ts +160 -0
  72. package/tokens/build/tokens.json +88 -0
  73. package/tokens/build/tokens.scss +89 -0
@@ -0,0 +1,160 @@
1
+ /**
2
+ * Do not edit directly, this file was auto-generated.
3
+ */
4
+
5
+ /** Pure white. Light theme elevated surface. */
6
+ export const colorWhite: string;
7
+ /** Pure black. Reserved for overlays and shadows. */
8
+ export const colorBlack: string;
9
+ export const colorNeutral100: string;
10
+ export const colorNeutral200: string;
11
+ export const colorNeutral300: string;
12
+ export const colorNeutral400: string;
13
+ export const colorNeutral500: string;
14
+ export const colorNeutral600: string;
15
+ export const colorNeutral700: string;
16
+ export const colorNeutral800: string;
17
+ export const colorNeutral900: string;
18
+ export const colorAccent200: string;
19
+ export const colorAccent300: string;
20
+ export const colorAccent400: string;
21
+ export const colorAccent600: string;
22
+ export const colorAccent700: string;
23
+ export const colorAccent800: string;
24
+ export const colorAccent900: string;
25
+ /** Base accent primitive. Airy lilac on dark (10.03:1) and deeper violet on light (6.36:1) — calibrated up from the marketing site accent, which fails AA in both themes. */
26
+ export const colorAccentBase: string;
27
+ /** Success status primitive. */
28
+ export const colorStatusSuccess: string;
29
+ /** Warning status primitive. */
30
+ export const colorStatusWarning: string;
31
+ /** Danger status primitive. */
32
+ export const colorStatusDanger: string;
33
+ /** Info status primitive. */
34
+ export const colorStatusInfo: string;
35
+ /** App canvas. Surface role, never text. */
36
+ export const semanticBackground: string;
37
+ /** Cards, panels, table rows. Surface role. */
38
+ export const semanticSurface: string;
39
+ /** Menus, popovers, dialogs. Surface role. */
40
+ export const semanticElevatedSurface: string;
41
+ /** Primary text. Text-eligible: passes WCAG AA 4.5:1 on background, surface and elevated-surface in both themes. */
42
+ export const semanticForeground: string;
43
+ /** Secondary text, labels. Text-eligible: passes WCAG AA 4.5:1 on background, surface and elevated-surface in both themes. */
44
+ export const semanticMutedForeground: string;
45
+ /** Placeholders, timestamps, hints. Large text and non-essential metadata only (>=3:1). Never body copy. */
46
+ export const semanticSubtleForeground: string;
47
+ /** Dividers and input outlines. Non-text role. */
48
+ export const semanticBorder: string;
49
+ /** Primary interactive colour: links, active state, primary button fill. Text-eligible: passes WCAG AA 4.5:1 on background, surface and elevated-surface in both themes. */
50
+ export const semanticPrimary: string;
51
+ /** Emphasis and highlight. Text-eligible: passes WCAG AA 4.5:1 on background, surface and elevated-surface in both themes. */
52
+ export const semanticAccent: string;
53
+ /** Positive state. Text-eligible: passes WCAG AA 4.5:1 on background, surface and elevated-surface in both themes. */
54
+ export const semanticSuccess: string;
55
+ /** Caution state. Text-eligible: passes WCAG AA 4.5:1 on background, surface and elevated-surface in both themes. */
56
+ export const semanticWarning: string;
57
+ /** Destructive or error state. Text-eligible: passes WCAG AA 4.5:1 on background, surface and elevated-surface in both themes. */
58
+ export const semanticDanger: string;
59
+ /** Neutral informational state. Text-eligible: passes WCAG AA 4.5:1 on background, surface and elevated-surface in both themes. */
60
+ export const semanticInfo: string;
61
+ /** Focus ring. Non-text role. >=3:1 against background. */
62
+ export const semanticFocus: string;
63
+ /** Disabled text and controls. Exempt from contrast minimums per WCAG 1.4.3. */
64
+ export const semanticDisabled: string;
65
+ /** Heading family. Inter, same as body; headings differentiate by size and weight. */
66
+ export const fontHeading: string;
67
+ /** Body family. Inter for interface text. */
68
+ export const fontBody: string;
69
+ /** Monospace family. Code and machine-readable values (hashes, identifiers). Numeric tables use body with tabular figures, not mono. */
70
+ export const fontMono: string;
71
+ /** Step -2. Captions, timestamps, footnotes, table metadata. */
72
+ export const typeSizeMetadata: string;
73
+ /** Step -1. Labels, buttons, form captions, small UI text. */
74
+ export const typeSizeLabel: string;
75
+ /** Step 0. Body copy; base size for code and numeric text. */
76
+ export const typeSizeBody: string;
77
+ /** Step +1. Small headings, card titles. */
78
+ export const typeSizeH3: string;
79
+ /** Step +2. Section headings. */
80
+ export const typeSizeH2: string;
81
+ /** Step +3. Page headings. */
82
+ export const typeSizeH1: string;
83
+ /** Step +4. Display headings - the calm ceiling; the 48px hero is marketing scale, not product scale. */
84
+ export const typeSizeDisplay: string;
85
+ /** Regular - body, metadata, code. */
86
+ export const typeWeightRegular: number;
87
+ /** Medium - labels, display headings. */
88
+ export const typeWeightMedium: number;
89
+ /** Semibold - headings. */
90
+ export const typeWeightSemibold: number;
91
+ /** Bold - emphasis within headings. */
92
+ export const typeWeightBold: number;
93
+ /** Display and headings. */
94
+ export const typeLineHeightTight: number;
95
+ /** Body, labels, code. */
96
+ export const typeLineHeightNormal: number;
97
+ /** Long-form reading, notes. 1.6 is rationalized - 1.75 is part of the ad-hoc set and is deliberately not reused. */
98
+ export const typeLineHeightRelaxed: number;
99
+ /** Display and headings - a hair tighter than body. */
100
+ export const typeLetterSpacingHeading: string;
101
+ /** Neutral tracking - the default for body, metadata and code roles. */
102
+ export const typeLetterSpacingNormal: string;
103
+ /** Labels and small UI text. */
104
+ export const typeLetterSpacingLabel: string;
105
+ /** Display headings. */
106
+ export const typeRoleDisplay: string;
107
+ /** Page headings (h1); h2 and h3 step down through type.size. */
108
+ export const typeRoleHeading: string;
109
+ /** Body copy. */
110
+ export const typeRoleBody: string;
111
+ /** Labels, buttons, form captions. */
112
+ export const typeRoleLabel: string;
113
+ /** Captions, timestamps, footnotes. */
114
+ export const typeRoleMetadata: string;
115
+ /** Code and data values (monospace). */
116
+ export const typeRoleCode: string;
117
+ /** Numeric and tabular data. Carries the namespaced com.momoi-labs.kiso.fontVariantNumeric extension (tabular-nums), emitted by the formatter as the global --font-variant-numeric feature token. */
118
+ export const typeRoleNumeric: string;
119
+ /** Tight internal padding, icon gaps. */
120
+ export const spacingXs: string;
121
+ /** Component padding, small gaps. */
122
+ export const spacingSm: string;
123
+ /** Default padding, form gaps. */
124
+ export const spacingMd: string;
125
+ /** Card padding, section gaps. */
126
+ export const spacingLg: string;
127
+ /** Page margins, panel gaps. */
128
+ export const spacingXl: string;
129
+ /** Wide page margins, dialog padding. */
130
+ export const spacing2xl: string;
131
+ /** Section spacing. */
132
+ export const spacing3xl: string;
133
+ /** Large section spacing, hero padding. */
134
+ export const spacing4xl: string;
135
+ /** Inputs, small controls. */
136
+ export const radiusSm: string;
137
+ /** Cards, buttons, panels. */
138
+ export const radiusMd: string;
139
+ /** Dialogs, popovers, large surfaces. */
140
+ export const radiusLg: string;
141
+ /** Pills, badges, avatars. */
142
+ export const radiusFull: string;
143
+ /** Cards on canvas - subtle separation. */
144
+ export const shadowSm: string;
145
+ /** Menus, popovers, dialogs - floating layers. */
146
+ export const shadowMd: string;
147
+ /** Focus and hover feedback. */
148
+ export const motionDurationFast: string;
149
+ /** Open/close and state changes. */
150
+ export const motionDurationNormal: string;
151
+ /** Ease-out - elements settle, no bounce, no delight for its own sake. */
152
+ export const motionEasingStandard: string;
153
+ /** Small tablets, portrait. */
154
+ export const breakpointSm: string;
155
+ /** Tablets, landscape phones. */
156
+ export const breakpointMd: string;
157
+ /** Desktop. */
158
+ export const breakpointLg: string;
159
+ /** Wide desktop. */
160
+ export const breakpointXl: string;
@@ -0,0 +1,88 @@
1
+ {
2
+ "color-white": {"colorSpace":"srgb","components":[1,1,1],"hex":"#ffffff"},
3
+ "color-black": {"colorSpace":"srgb","components":[0,0,0],"hex":"#000000"},
4
+ "color-neutral-100": {"colorSpace":"srgb","components":[0.9804,0.9765,0.9686],"hex":"#faf9f7"},
5
+ "color-neutral-200": {"colorSpace":"srgb","components":[0.9569,0.949,0.9333],"hex":"#f4f2ee"},
6
+ "color-neutral-300": {"colorSpace":"srgb","components":[0.8784,0.8627,0.8392],"hex":"#e0dcd6"},
7
+ "color-neutral-400": {"colorSpace":"srgb","components":[0.7137,0.698,0.6824],"hex":"#b6b2ae"},
8
+ "color-neutral-500": {"colorSpace":"srgb","components":[0.5412,0.5216,0.498],"hex":"#8a857f"},
9
+ "color-neutral-600": {"colorSpace":"srgb","components":[0.3725,0.3569,0.3412],"hex":"#5f5b57"},
10
+ "color-neutral-700": {"colorSpace":"srgb","components":[0.1922,0.1843,0.2157],"hex":"#312f37"},
11
+ "color-neutral-800": {"colorSpace":"srgb","components":[0.149,0.1451,0.1686],"hex":"#26252b"},
12
+ "color-neutral-900": {"colorSpace":"srgb","components":[0.1059,0.102,0.1176],"hex":"#1b1a1e"},
13
+ "color-accent-200": {"colorSpace":"srgb","components":[0.9294,0.9098,0.9922],"hex":"#ede8fd"},
14
+ "color-accent-300": {"colorSpace":"srgb","components":[0.8706,0.8353,0.9843],"hex":"#ded5fb"},
15
+ "color-accent-400": {"colorSpace":"srgb","components":[0.7686,0.7059,0.9608],"hex":"#c4b4f5"},
16
+ "color-accent-600": {"colorSpace":"srgb","components":[0.4902,0.4078,0.8196],"hex":"#7d68d1"},
17
+ "color-accent-700": {"colorSpace":"srgb","components":[0.3961,0.3216,0.7216],"hex":"#6552b8"},
18
+ "color-accent-800": {"colorSpace":"srgb","components":[0.2745,0.1882,0.6196],"hex":"#46309e"},
19
+ "color-accent-900": {"colorSpace":"srgb","components":[0.1804,0.1294,0.4392],"hex":"#2e2170"},
20
+ "color-accent-base": {"colorSpace":"srgb","components":[0.7961,0.7412,0.9686],"hex":"#cbbdf7"},
21
+ "color-status-success": {"colorSpace":"srgb","components":[0.3059,0.8392,0.6039],"hex":"#4ed69a"},
22
+ "color-status-warning": {"colorSpace":"srgb","components":[0.9098,0.7529,0.3529],"hex":"#e8c05a"},
23
+ "color-status-danger": {"colorSpace":"srgb","components":[0.9569,0.5255,0.498],"hex":"#f4867f"},
24
+ "color-status-info": {"colorSpace":"srgb","components":[0.5608,0.7882,0.9608],"hex":"#8fc9f5"},
25
+ "semantic-background": {"colorSpace":"srgb","components":[0.1059,0.102,0.1176],"hex":"#1b1a1e"},
26
+ "semantic-surface": {"colorSpace":"srgb","components":[0.149,0.1451,0.1686],"hex":"#26252b"},
27
+ "semantic-elevated-surface": {"colorSpace":"srgb","components":[0.1922,0.1843,0.2157],"hex":"#312f37"},
28
+ "semantic-foreground": {"colorSpace":"srgb","components":[0.9804,0.9765,0.9686],"hex":"#faf9f7"},
29
+ "semantic-muted-foreground": {"colorSpace":"srgb","components":[0.7137,0.698,0.6824],"hex":"#b6b2ae"},
30
+ "semantic-subtle-foreground": {"colorSpace":"srgb","components":[0.5412,0.5216,0.498],"hex":"#8a857f"},
31
+ "semantic-border": {"colorSpace":"srgb","components":[0.3725,0.3569,0.3412],"hex":"#5f5b57"},
32
+ "semantic-primary": {"colorSpace":"srgb","components":[0.7961,0.7412,0.9686],"hex":"#cbbdf7"},
33
+ "semantic-accent": {"colorSpace":"srgb","components":[0.8706,0.8353,0.9843],"hex":"#ded5fb"},
34
+ "semantic-success": {"colorSpace":"srgb","components":[0.3059,0.8392,0.6039],"hex":"#4ed69a"},
35
+ "semantic-warning": {"colorSpace":"srgb","components":[0.9098,0.7529,0.3529],"hex":"#e8c05a"},
36
+ "semantic-danger": {"colorSpace":"srgb","components":[0.9569,0.5255,0.498],"hex":"#f4867f"},
37
+ "semantic-info": {"colorSpace":"srgb","components":[0.5608,0.7882,0.9608],"hex":"#8fc9f5"},
38
+ "semantic-focus": {"colorSpace":"srgb","components":[0.8706,0.8353,0.9843],"hex":"#ded5fb"},
39
+ "semantic-disabled": {"colorSpace":"srgb","components":[0.3725,0.3569,0.3412],"hex":"#5f5b57"},
40
+ "font-heading": ["Inter","system-ui","sans-serif"],
41
+ "font-body": ["Inter","system-ui","sans-serif"],
42
+ "font-mono": ["JetBrains Mono","ui-monospace","monospace"],
43
+ "type-size-metadata": {"value":11,"unit":"px"},
44
+ "type-size-label": {"value":13,"unit":"px"},
45
+ "type-size-body": {"value":16,"unit":"px"},
46
+ "type-size-h3": {"value":19,"unit":"px"},
47
+ "type-size-h2": {"value":23,"unit":"px"},
48
+ "type-size-h1": {"value":28,"unit":"px"},
49
+ "type-size-display": {"value":33,"unit":"px"},
50
+ "type-weight-regular": 400,
51
+ "type-weight-medium": 500,
52
+ "type-weight-semibold": 600,
53
+ "type-weight-bold": 700,
54
+ "type-line-height-tight": 1.2,
55
+ "type-line-height-normal": 1.5,
56
+ "type-line-height-relaxed": 1.6,
57
+ "type-letter-spacing-heading": {"value":-0.01,"unit":"rem"},
58
+ "type-letter-spacing-normal": {"value":0,"unit":"rem"},
59
+ "type-letter-spacing-label": {"value":0.02,"unit":"rem"},
60
+ "type-role-display": {"fontFamily":["Inter","system-ui","sans-serif"],"fontSize":{"value":33,"unit":"px"},"fontWeight":500,"letterSpacing":{"value":-0.01,"unit":"rem"},"lineHeight":1.2},
61
+ "type-role-heading": {"fontFamily":["Inter","system-ui","sans-serif"],"fontSize":{"value":28,"unit":"px"},"fontWeight":600,"letterSpacing":{"value":-0.01,"unit":"rem"},"lineHeight":1.2},
62
+ "type-role-body": {"fontFamily":["Inter","system-ui","sans-serif"],"fontSize":{"value":16,"unit":"px"},"fontWeight":400,"letterSpacing":{"value":0,"unit":"rem"},"lineHeight":1.5},
63
+ "type-role-label": {"fontFamily":["Inter","system-ui","sans-serif"],"fontSize":{"value":13,"unit":"px"},"fontWeight":500,"letterSpacing":{"value":0.02,"unit":"rem"},"lineHeight":1.5},
64
+ "type-role-metadata": {"fontFamily":["Inter","system-ui","sans-serif"],"fontSize":{"value":11,"unit":"px"},"fontWeight":400,"letterSpacing":{"value":0,"unit":"rem"},"lineHeight":1.5},
65
+ "type-role-code": {"fontFamily":["JetBrains Mono","ui-monospace","monospace"],"fontSize":{"value":13,"unit":"px"},"fontWeight":400,"letterSpacing":{"value":0,"unit":"rem"},"lineHeight":1.5},
66
+ "type-role-numeric": {"fontFamily":["Inter","system-ui","sans-serif"],"fontSize":{"value":16,"unit":"px"},"fontWeight":400,"letterSpacing":{"value":0,"unit":"rem"},"lineHeight":1.5},
67
+ "spacing-xs": {"value":4,"unit":"px"},
68
+ "spacing-sm": {"value":8,"unit":"px"},
69
+ "spacing-md": {"value":12,"unit":"px"},
70
+ "spacing-lg": {"value":16,"unit":"px"},
71
+ "spacing-xl": {"value":24,"unit":"px"},
72
+ "spacing-2xl": {"value":32,"unit":"px"},
73
+ "spacing-3xl": {"value":48,"unit":"px"},
74
+ "spacing-4xl": {"value":64,"unit":"px"},
75
+ "radius-sm": {"value":4,"unit":"px"},
76
+ "radius-md": {"value":8,"unit":"px"},
77
+ "radius-lg": {"value":12,"unit":"px"},
78
+ "radius-full": {"value":9999,"unit":"px"},
79
+ "shadow-sm": {"color":{"colorSpace":"srgb","components":[0,0,0],"alpha":0.24,"hex":"#000000"},"offsetX":{"value":0,"unit":"px"},"offsetY":{"value":1,"unit":"px"},"blur":{"value":2,"unit":"px"},"spread":{"value":0,"unit":"px"}},
80
+ "shadow-md": {"color":{"colorSpace":"srgb","components":[0,0,0],"alpha":0.32,"hex":"#000000"},"offsetX":{"value":0,"unit":"px"},"offsetY":{"value":2,"unit":"px"},"blur":{"value":8,"unit":"px"},"spread":{"value":0,"unit":"px"}},
81
+ "motion-duration-fast": {"value":120,"unit":"ms"},
82
+ "motion-duration-normal": {"value":200,"unit":"ms"},
83
+ "motion-easing-standard": [0.2,0,0,1],
84
+ "breakpoint-sm": {"value":640,"unit":"px"},
85
+ "breakpoint-md": {"value":768,"unit":"px"},
86
+ "breakpoint-lg": {"value":1024,"unit":"px"},
87
+ "breakpoint-xl": {"value":1280,"unit":"px"}
88
+ }
@@ -0,0 +1,89 @@
1
+
2
+ // Do not edit directly, this file was auto-generated.
3
+
4
+ $color-white: #ffffff; // Pure white. Light theme elevated surface.
5
+ $color-black: #000000; // Pure black. Reserved for overlays and shadows.
6
+ $color-neutral-100: #faf9f7;
7
+ $color-neutral-200: #f4f2ee;
8
+ $color-neutral-300: #e0dcd6;
9
+ $color-neutral-400: #b6b2ae;
10
+ $color-neutral-500: #8a857f;
11
+ $color-neutral-600: #5f5b57;
12
+ $color-neutral-700: #312f37;
13
+ $color-neutral-800: #26252b;
14
+ $color-neutral-900: #1b1a1e;
15
+ $color-accent-200: #ede8fd;
16
+ $color-accent-300: #ded5fb;
17
+ $color-accent-400: #c4b4f5;
18
+ $color-accent-600: #7d68d1;
19
+ $color-accent-700: #6552b8;
20
+ $color-accent-800: #46309e;
21
+ $color-accent-900: #2e2170;
22
+ $color-accent-base: #cbbdf7; // Base accent primitive. Airy lilac on dark (10.03:1) and deeper violet on light (6.36:1) — calibrated up from the marketing site accent, which fails AA in both themes.
23
+ $color-status-success: #4ed69a; // Success status primitive.
24
+ $color-status-warning: #e8c05a; // Warning status primitive.
25
+ $color-status-danger: #f4867f; // Danger status primitive.
26
+ $color-status-info: #8fc9f5; // Info status primitive.
27
+ $semantic-background: #1b1a1e; // App canvas. Surface role, never text.
28
+ $semantic-surface: #26252b; // Cards, panels, table rows. Surface role.
29
+ $semantic-elevated-surface: #312f37; // Menus, popovers, dialogs. Surface role.
30
+ $semantic-foreground: #faf9f7; // Primary text. Text-eligible: passes WCAG AA 4.5:1 on background, surface and elevated-surface in both themes.
31
+ $semantic-muted-foreground: #b6b2ae; // Secondary text, labels. Text-eligible: passes WCAG AA 4.5:1 on background, surface and elevated-surface in both themes.
32
+ $semantic-subtle-foreground: #8a857f; // Placeholders, timestamps, hints. Large text and non-essential metadata only (>=3:1). Never body copy.
33
+ $semantic-border: #5f5b57; // Dividers and input outlines. Non-text role.
34
+ $semantic-primary: #cbbdf7; // Primary interactive colour: links, active state, primary button fill. Text-eligible: passes WCAG AA 4.5:1 on background, surface and elevated-surface in both themes.
35
+ $semantic-accent: #ded5fb; // Emphasis and highlight. Text-eligible: passes WCAG AA 4.5:1 on background, surface and elevated-surface in both themes.
36
+ $semantic-success: #4ed69a; // Positive state. Text-eligible: passes WCAG AA 4.5:1 on background, surface and elevated-surface in both themes.
37
+ $semantic-warning: #e8c05a; // Caution state. Text-eligible: passes WCAG AA 4.5:1 on background, surface and elevated-surface in both themes.
38
+ $semantic-danger: #f4867f; // Destructive or error state. Text-eligible: passes WCAG AA 4.5:1 on background, surface and elevated-surface in both themes.
39
+ $semantic-info: #8fc9f5; // Neutral informational state. Text-eligible: passes WCAG AA 4.5:1 on background, surface and elevated-surface in both themes.
40
+ $semantic-focus: #ded5fb; // Focus ring. Non-text role. >=3:1 against background.
41
+ $semantic-disabled: #5f5b57; // Disabled text and controls. Exempt from contrast minimums per WCAG 1.4.3.
42
+ $font-heading: Inter, system-ui, sans-serif; // Heading family. Inter, same as body; headings differentiate by size and weight.
43
+ $font-body: Inter, system-ui, sans-serif; // Body family. Inter for interface text.
44
+ $font-mono: 'JetBrains Mono', ui-monospace, monospace; // Monospace family. Code and machine-readable values (hashes, identifiers). Numeric tables use body with tabular figures, not mono.
45
+ $type-size-metadata: 11px; // Step -2. Captions, timestamps, footnotes, table metadata.
46
+ $type-size-label: 13px; // Step -1. Labels, buttons, form captions, small UI text.
47
+ $type-size-body: 16px; // Step 0. Body copy; base size for code and numeric text.
48
+ $type-size-h3: 19px; // Step +1. Small headings, card titles.
49
+ $type-size-h2: 23px; // Step +2. Section headings.
50
+ $type-size-h1: 28px; // Step +3. Page headings.
51
+ $type-size-display: 33px; // Step +4. Display headings - the calm ceiling; the 48px hero is marketing scale, not product scale.
52
+ $type-weight-regular: 400; // Regular - body, metadata, code.
53
+ $type-weight-medium: 500; // Medium - labels, display headings.
54
+ $type-weight-semibold: 600; // Semibold - headings.
55
+ $type-weight-bold: 700; // Bold - emphasis within headings.
56
+ $type-line-height-tight: 1.2; // Display and headings.
57
+ $type-line-height-normal: 1.5; // Body, labels, code.
58
+ $type-line-height-relaxed: 1.6; // Long-form reading, notes. 1.6 is rationalized - 1.75 is part of the ad-hoc set and is deliberately not reused.
59
+ $type-letter-spacing-heading: -0.01rem; // Display and headings - a hair tighter than body.
60
+ $type-letter-spacing-normal: 0rem; // Neutral tracking - the default for body, metadata and code roles.
61
+ $type-letter-spacing-label: 0.02rem; // Labels and small UI text.
62
+ $type-role-display: 500 33px/1.2 Inter, system-ui, sans-serif; // Display headings.
63
+ $type-role-heading: 600 28px/1.2 Inter, system-ui, sans-serif; // Page headings (h1); h2 and h3 step down through type.size.
64
+ $type-role-body: 400 16px/1.5 Inter, system-ui, sans-serif; // Body copy.
65
+ $type-role-label: 500 13px/1.5 Inter, system-ui, sans-serif; // Labels, buttons, form captions.
66
+ $type-role-metadata: 400 11px/1.5 Inter, system-ui, sans-serif; // Captions, timestamps, footnotes.
67
+ $type-role-code: 400 13px/1.5 'JetBrains Mono', ui-monospace, monospace; // Code and data values (monospace).
68
+ $type-role-numeric: 400 16px/1.5 Inter, system-ui, sans-serif; // Numeric and tabular data. Carries the namespaced com.momoi-labs.kiso.fontVariantNumeric extension (tabular-nums), emitted by the formatter as the global --font-variant-numeric feature token.
69
+ $spacing-xs: 4px; // Tight internal padding, icon gaps.
70
+ $spacing-sm: 8px; // Component padding, small gaps.
71
+ $spacing-md: 12px; // Default padding, form gaps.
72
+ $spacing-lg: 16px; // Card padding, section gaps.
73
+ $spacing-xl: 24px; // Page margins, panel gaps.
74
+ $spacing-2xl: 32px; // Wide page margins, dialog padding.
75
+ $spacing-3xl: 48px; // Section spacing.
76
+ $spacing-4xl: 64px; // Large section spacing, hero padding.
77
+ $radius-sm: 4px; // Inputs, small controls.
78
+ $radius-md: 8px; // Cards, buttons, panels.
79
+ $radius-lg: 12px; // Dialogs, popovers, large surfaces.
80
+ $radius-full: 9999px; // Pills, badges, avatars.
81
+ $shadow-sm: 0px 1px 2px 0px rgb(0% 0% 0% / 0.24); // Cards on canvas - subtle separation.
82
+ $shadow-md: 0px 2px 8px 0px rgb(0% 0% 0% / 0.32); // Menus, popovers, dialogs - floating layers.
83
+ $motion-duration-fast: 120ms; // Focus and hover feedback.
84
+ $motion-duration-normal: 200ms; // Open/close and state changes.
85
+ $motion-easing-standard: cubic-bezier(0.2, 0, 0, 1); // Ease-out - elements settle, no bounce, no delight for its own sake.
86
+ $breakpoint-sm: 640px; // Small tablets, portrait.
87
+ $breakpoint-md: 768px; // Tablets, landscape phones.
88
+ $breakpoint-lg: 1024px; // Desktop.
89
+ $breakpoint-xl: 1280px; // Wide desktop.