@q1travel/design-system 0.2.0 → 0.3.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.
Files changed (32) hide show
  1. package/.agents/skills/product-design/AGENTS.md +9 -0
  2. package/.agents/skills/product-design/SKILL.md +63 -0
  3. package/.agents/skills/product-design/exemplars/README.md +12 -0
  4. package/.agents/skills/product-design/references/copy.md +7 -0
  5. package/.agents/skills/product-design/references/coverage-gaps.md +9 -0
  6. package/.agents/skills/product-design/references/glossary.md +5 -0
  7. package/.agents/skills/product-design/references/interface-quality.md +7 -0
  8. package/.agents/skills/product-design/references/patterns.md +13 -0
  9. package/.agents/skills/product-design/references/product-judgment.md +7 -0
  10. package/.agents/skills/product-design/references/resilience.md +13 -0
  11. package/.agents/skills/product-design/references/review-geist.md +94 -0
  12. package/.agents/skills/product-design/references/rules.md +17 -0
  13. package/.agents/skills/product-design/references/surfaces-forms.md +14 -0
  14. package/.agents/skills/product-design/references/surfaces-overlays.md +12 -0
  15. package/.agents/skills/product-design/references/surfaces.md +14 -0
  16. package/bin/q1-design.mjs +464 -0
  17. package/contracts/design-engineering-principles.md +39 -0
  18. package/contracts/design.dark.md +333 -0
  19. package/contracts/design.md +333 -0
  20. package/contracts/icon-system.md +77 -0
  21. package/contracts/implementation-map.md +29 -0
  22. package/contracts/interface-guidelines.md +122 -0
  23. package/contracts/token-naming.md +82 -0
  24. package/{dist → dist-pkg}/design-system.d.ts +2 -2
  25. package/{dist → dist-pkg}/design-system.js +630 -628
  26. package/{dist → dist-pkg}/style.css +76 -78
  27. package/package.json +19 -9
  28. package/tooling/README.md +9 -0
  29. package/tooling/scripts/evals/fixtures.json +7 -0
  30. package/tooling/scripts/evals/rules-checklist.json +23 -0
  31. package/tooling/scripts/evals/transition-all/after/example.css +4 -0
  32. package/tooling/scripts/evals/transition-all/before/example.css +4 -0
@@ -0,0 +1,333 @@
1
+ ---
2
+ version: alpha
3
+ name: q1travel Design System
4
+ theme: dark
5
+ description: q1travel design contract for consistent, accessible product experiences.
6
+ source-policy:
7
+ reference: "External visual references provide intent, not implementation source."
8
+ implementation: "Translate references into q1travel tokens and canonical components before production use."
9
+ forbidden: "Reference markup, class names, copied computed styles, and screenshot-only dimensions."
10
+ colors:
11
+ primary: "#533afd"
12
+ primary-hover: "#4631d6"
13
+ primary-press: "#342899"
14
+ secondary: "#a0a0a0"
15
+ tertiary: "#006efe"
16
+ neutral: "#1a1a1a"
17
+ background-100: "#000000"
18
+ background-200: "#000000"
19
+ text-primary: "#ededed"
20
+ text-secondary: "#a0a0a0"
21
+ text-muted: "#7d7d7d"
22
+ brand-preview-light-bg: "#ffffff"
23
+ brand-preview-light-fg: "#171717"
24
+ brand-preview-dark-bg: "#000000"
25
+ brand-preview-dark-fg: "#ededed"
26
+ mask-visible: "#ffffff"
27
+ mask-opaque: "#000000"
28
+ gray-100: "#1a1a1a"
29
+ gray-200: "#1f1f1f"
30
+ gray-300: "#292929"
31
+ gray-400: "#2e2e2e"
32
+ gray-500: "#454545"
33
+ gray-600: "#878787"
34
+ gray-700: "#8f8f8f"
35
+ gray-800: "#7d7d7d"
36
+ gray-900: "#a0a0a0"
37
+ gray-1000: "#ededed"
38
+ primary-100: "#15103a"
39
+ primary-200: "#1a1547"
40
+ primary-300: "#241a6b"
41
+ primary-400: "#2b2080"
42
+ primary-500: "#342899"
43
+ primary-600: "#5b41f5"
44
+ primary-700: "#533afd"
45
+ primary-800: "#4631d6"
46
+ primary-900: "#9c8cff"
47
+ primary-1000: "#ece9ff"
48
+ blue-100: "#06193a"
49
+ blue-200: "#022248"
50
+ blue-300: "#002f62"
51
+ blue-400: "#003674"
52
+ blue-500: "#00418b"
53
+ blue-600: "#0090ff"
54
+ blue-700: "#006efe"
55
+ blue-800: "#005be7"
56
+ blue-900: "#47a8ff"
57
+ blue-1000: "#eaf6ff"
58
+ red-100: "#330a11"
59
+ red-200: "#440d13"
60
+ red-300: "#5d0e17"
61
+ red-400: "#6f101b"
62
+ red-500: "#88151f"
63
+ red-600: "#f32e40"
64
+ red-700: "#f13242"
65
+ red-800: "#e2162a"
66
+ red-900: "#ff565f"
67
+ red-1000: "#ffe9ed"
68
+ amber-100: "#2a1700"
69
+ amber-200: "#361900"
70
+ amber-300: "#502800"
71
+ amber-400: "#5b3000"
72
+ amber-500: "#703e00"
73
+ amber-600: "#ed9a00"
74
+ amber-700: "#ffae00"
75
+ amber-800: "#ff9300"
76
+ amber-900: "#ff9300"
77
+ amber-1000: "#fff3d5"
78
+ green-100: "#002608"
79
+ green-200: "#00320b"
80
+ green-300: "#003a0e"
81
+ green-400: "#004615"
82
+ green-500: "#006717"
83
+ green-600: "#00952d"
84
+ green-700: "#00ac3a"
85
+ green-800: "#009432"
86
+ green-900: "#00ca50"
87
+ green-1000: "#d8ffe4"
88
+ teal-100: "#00231b"
89
+ teal-200: "#002b22"
90
+ teal-300: "#003d34"
91
+ teal-400: "#004035"
92
+ teal-500: "#006354"
93
+ teal-600: "#009e86"
94
+ teal-700: "#00aa95"
95
+ teal-800: "#00927f"
96
+ teal-900: "#00cfb7"
97
+ teal-1000: "#cbfff5"
98
+ purple-100: "#290c33"
99
+ purple-200: "#341142"
100
+ purple-300: "#47185e"
101
+ purple-400: "#541a76"
102
+ purple-500: "#642290"
103
+ purple-600: "#9440d5"
104
+ purple-700: "#9440d5"
105
+ purple-800: "#7d2bba"
106
+ purple-900: "#c472fb"
107
+ purple-1000: "#fbecff"
108
+ pink-100: "#310d1e"
109
+ pink-200: "#420c25"
110
+ pink-300: "#571032"
111
+ pink-400: "#5d0c34"
112
+ pink-500: "#76063f"
113
+ pink-600: "#ba0056"
114
+ pink-700: "#f12b82"
115
+ pink-800: "#e7006d"
116
+ pink-900: "#ff4d8d"
117
+ pink-1000: "#ffe9f4"
118
+ semantic-colors:
119
+ action-primary: "{colors.primary}"
120
+ action-primary-hover: "{colors.primary-hover}"
121
+ action-primary-press: "{colors.primary-press}"
122
+ action-on-primary: "#ffffff"
123
+ surface-canvas: "{colors.background-100}"
124
+ surface-subtle: "{colors.gray-100}"
125
+ surface-panel: "{colors.background-100}"
126
+ border: "{colors.gray-200}"
127
+ border-strong: "{colors.gray-500}"
128
+ text-primary: "{colors.text-primary}"
129
+ text-secondary: "{colors.text-secondary}"
130
+ text-muted: "{colors.text-muted}"
131
+ selection-background: "{colors.text-primary}"
132
+ selection-foreground: "{colors.background-100}"
133
+ focus-ring: "{colors.primary}"
134
+ status-success: "{colors.green-900}"
135
+ status-warning: "{colors.amber-700}"
136
+ status-danger: "{colors.red-900}"
137
+ typography:
138
+ heading-72:
139
+ fontFamily: Noto Sans SC
140
+ fontSize: 72px
141
+ fontWeight: 500
142
+ lineHeight: 72px
143
+ letterSpacing: -0.06em
144
+ heading-64:
145
+ fontFamily: Noto Sans SC
146
+ fontSize: 64px
147
+ fontWeight: 500
148
+ lineHeight: 68px
149
+ letterSpacing: -0.06em
150
+ heading-56:
151
+ fontFamily: Noto Sans SC
152
+ fontSize: 56px
153
+ fontWeight: 500
154
+ lineHeight: 60px
155
+ letterSpacing: -0.06em
156
+ heading-48:
157
+ fontFamily: Noto Sans SC
158
+ fontSize: 48px
159
+ fontWeight: 500
160
+ lineHeight: 52px
161
+ letterSpacing: -0.06em
162
+ heading-40:
163
+ fontFamily: Noto Sans SC
164
+ fontSize: 40px
165
+ fontWeight: 500
166
+ lineHeight: 44px
167
+ letterSpacing: -0.06em
168
+ heading-32:
169
+ fontFamily: Noto Sans SC
170
+ fontSize: 32px
171
+ fontWeight: 500
172
+ lineHeight: 38px
173
+ letterSpacing: -0.04em
174
+ heading-24:
175
+ fontFamily: Noto Sans SC
176
+ fontSize: 24px
177
+ fontWeight: 500
178
+ lineHeight: 32px
179
+ letterSpacing: -0.04em
180
+ heading-20:
181
+ fontFamily: Noto Sans SC
182
+ fontSize: 20px
183
+ fontWeight: 500
184
+ lineHeight: 28px
185
+ letterSpacing: -0.02em
186
+ heading-16:
187
+ fontFamily: Noto Sans SC
188
+ fontSize: 16px
189
+ fontWeight: 500
190
+ lineHeight: 24px
191
+ letterSpacing: -0.02em
192
+ heading-14:
193
+ fontFamily: Noto Sans SC
194
+ fontSize: 14px
195
+ fontWeight: 500
196
+ lineHeight: 20px
197
+ letterSpacing: -0.02em
198
+ label-14:
199
+ fontFamily: Noto Sans SC
200
+ fontSize: 14px
201
+ fontWeight: 400
202
+ lineHeight: 20px
203
+ letterSpacing: 0
204
+ label-13:
205
+ fontFamily: Noto Sans SC
206
+ fontSize: 13px
207
+ fontWeight: 400
208
+ lineHeight: 18px
209
+ letterSpacing: 0
210
+ copy-16:
211
+ fontFamily: Noto Sans SC
212
+ fontSize: 16px
213
+ fontWeight: 400
214
+ lineHeight: 24px
215
+ letterSpacing: 0
216
+ copy-14:
217
+ fontFamily: Noto Sans SC
218
+ fontSize: 14px
219
+ fontWeight: 400
220
+ lineHeight: 20px
221
+ letterSpacing: 0
222
+ code-13:
223
+ fontFamily: Geist Mono
224
+ fontSize: 13px
225
+ fontWeight: 400
226
+ lineHeight: 18px
227
+ letterSpacing: 0
228
+ spacing:
229
+ 1: 4px
230
+ 2: 8px
231
+ 3: 12px
232
+ 4: 16px
233
+ 6: 24px
234
+ 8: 32px
235
+ 10: 40px
236
+ 16: 64px
237
+ 24: 96px
238
+ base: 4px
239
+ sizing:
240
+ control-default: 40px
241
+ rounded:
242
+ xs: 4px
243
+ sm: 6px
244
+ md: 8px
245
+ lg: 12px
246
+ xl: 16px
247
+ full: 9999px
248
+ materials:
249
+ base:
250
+ backgroundColor: "{semantic-colors.surface-panel}"
251
+ borderColor: "{semantic-colors.border}"
252
+ rounded: "{rounded.sm}"
253
+ small:
254
+ backgroundColor: "{semantic-colors.surface-panel}"
255
+ borderColor: "{semantic-colors.border}"
256
+ rounded: "{rounded.sm}"
257
+ medium:
258
+ backgroundColor: "{semantic-colors.surface-panel}"
259
+ borderColor: "{semantic-colors.border}"
260
+ rounded: "{rounded.lg}"
261
+ menu:
262
+ backgroundColor: "{semantic-colors.surface-panel}"
263
+ borderColor: "{semantic-colors.border-strong}"
264
+ rounded: "{rounded.lg}"
265
+ modal:
266
+ backgroundColor: "{semantic-colors.surface-panel}"
267
+ borderColor: "{semantic-colors.border-strong}"
268
+ rounded: "{rounded.lg}"
269
+ components:
270
+ button-primary:
271
+ backgroundColor: "{semantic-colors.action-primary}"
272
+ hoverBackgroundColor: "{semantic-colors.action-primary-hover}"
273
+ pressBackgroundColor: "{semantic-colors.action-primary-press}"
274
+ textColor: "{semantic-colors.action-on-primary}"
275
+ typography: "{typography.label-14}"
276
+ rounded: "{rounded.sm}"
277
+ height: 40px
278
+ button-secondary:
279
+ backgroundColor: "{semantic-colors.surface-panel}"
280
+ hoverBackgroundColor: "{semantic-colors.surface-subtle}"
281
+ textColor: "{semantic-colors.text-primary}"
282
+ borderColor: "{semantic-colors.border-strong}"
283
+ typography: "{typography.label-14}"
284
+ rounded: "{rounded.sm}"
285
+ height: 40px
286
+ input:
287
+ backgroundColor: "{semantic-colors.surface-panel}"
288
+ textColor: "{semantic-colors.text-primary}"
289
+ placeholderColor: "{semantic-colors.text-muted}"
290
+ borderColor: "{semantic-colors.border-strong}"
291
+ focusColor: "{semantic-colors.focus-ring}"
292
+ typography: "{typography.label-14}"
293
+ rounded: "{rounded.sm}"
294
+ height: 40px
295
+ checkbox:
296
+ checkedBackgroundColor: "{semantic-colors.action-primary}"
297
+ borderColor: "{semantic-colors.border-strong}"
298
+ focusColor: "{semantic-colors.focus-ring}"
299
+ rounded: "{rounded.xs}"
300
+ radio:
301
+ checkedColor: "{semantic-colors.action-primary}"
302
+ borderColor: "{semantic-colors.border-strong}"
303
+ focusColor: "{semantic-colors.focus-ring}"
304
+ rounded: "{rounded.full}"
305
+ switch:
306
+ checkedBackgroundColor: "{semantic-colors.action-primary}"
307
+ backgroundColor: "{colors.gray-300}"
308
+ focusColor: "{semantic-colors.focus-ring}"
309
+ rounded: "{rounded.full}"
310
+ tabs:
311
+ activeBackgroundColor: "{semantic-colors.surface-subtle}"
312
+ textColor: "{semantic-colors.text-secondary}"
313
+ activeTextColor: "{semantic-colors.text-primary}"
314
+ borderColor: "{semantic-colors.border}"
315
+ ---
316
+
317
+ # q1travel Design System
318
+
319
+ ## Overview
320
+
321
+ This is the dark-theme source contract. It keeps token names aligned with the light contract and changes values only where the theme requires a different surface, text, border, or status value.
322
+
323
+ ## Token Layers
324
+
325
+ - Core tokens define source design values such as color, spacing, radius, and typography.
326
+ - Semantic tokens describe product meaning such as action, surface, border, text, focus, and status.
327
+ - Component mappings consume semantic tokens and define shared behavior for controls and documentation specimens.
328
+
329
+ ## Usage
330
+
331
+ - Product code should consume semantic tokens and component mappings before using core values directly.
332
+ - Theme-specific values may differ, but token names should stay stable across light and dark contracts.
333
+ - Current theme resolved values are inspection output only; source values live in this contract and the runtime token layer.
@@ -0,0 +1,333 @@
1
+ ---
2
+ version: alpha
3
+ name: q1travel Design System
4
+ theme: light
5
+ description: q1travel design contract for consistent, accessible product experiences.
6
+ source-policy:
7
+ reference: "External visual references provide intent, not implementation source."
8
+ implementation: "Translate references into q1travel tokens and canonical components before production use."
9
+ forbidden: "Reference markup, class names, copied computed styles, and screenshot-only dimensions."
10
+ colors:
11
+ primary: "#533afd"
12
+ primary-hover: "#4434d4"
13
+ primary-press: "#2e2b8c"
14
+ secondary: "#4d4d4d"
15
+ tertiary: "#006bff"
16
+ neutral: "#f2f2f2"
17
+ background-100: "#ffffff"
18
+ background-200: "#fafafa"
19
+ text-primary: "#171717"
20
+ text-secondary: "#4d4d4d"
21
+ text-muted: "#8f8f8f"
22
+ brand-preview-light-bg: "#ffffff"
23
+ brand-preview-light-fg: "#171717"
24
+ brand-preview-dark-bg: "#000000"
25
+ brand-preview-dark-fg: "#ededed"
26
+ mask-visible: "#ffffff"
27
+ mask-opaque: "#000000"
28
+ gray-100: "#f2f2f2"
29
+ gray-200: "#ebebeb"
30
+ gray-300: "#e6e6e6"
31
+ gray-400: "#eaeaea"
32
+ gray-500: "#c9c9c9"
33
+ gray-600: "#a8a8a8"
34
+ gray-700: "#8f8f8f"
35
+ gray-800: "#7d7d7d"
36
+ gray-900: "#4d4d4d"
37
+ gray-1000: "#171717"
38
+ primary-100: "#f1efff"
39
+ primary-200: "#e4e0ff"
40
+ primary-300: "#cbc4ff"
41
+ primary-400: "#aa9eff"
42
+ primary-500: "#8776ff"
43
+ primary-600: "#6b55ff"
44
+ primary-700: "#533afd"
45
+ primary-800: "#4434d4"
46
+ primary-900: "#2e2b8c"
47
+ primary-1000: "#17124f"
48
+ blue-100: "#f0f7ff"
49
+ blue-200: "#e9f4ff"
50
+ blue-300: "#dfefff"
51
+ blue-400: "#cae7ff"
52
+ blue-500: "#94ccff"
53
+ blue-600: "#48aeff"
54
+ blue-700: "#006bff"
55
+ blue-800: "#0059ec"
56
+ blue-900: "#005ff2"
57
+ blue-1000: "#002359"
58
+ red-100: "#ffeeef"
59
+ red-200: "#ffe8ea"
60
+ red-300: "#ffe3e4"
61
+ red-400: "#ffd7d6"
62
+ red-500: "#ffb1b3"
63
+ red-600: "#ff676d"
64
+ red-700: "#fc0035"
65
+ red-800: "#ea001d"
66
+ red-900: "#d8001b"
67
+ red-1000: "#47000c"
68
+ amber-100: "#fff6de"
69
+ amber-200: "#fff4cf"
70
+ amber-300: "#fff1c1"
71
+ amber-400: "#ffdc73"
72
+ amber-500: "#ffc543"
73
+ amber-600: "#ffa600"
74
+ amber-700: "#ffae00"
75
+ amber-800: "#ff9300"
76
+ amber-900: "#aa4d00"
77
+ amber-1000: "#561900"
78
+ green-100: "#ecfdec"
79
+ green-200: "#e5fce7"
80
+ green-300: "#d3fad1"
81
+ green-400: "#b9f5bc"
82
+ green-500: "#82eb8d"
83
+ green-600: "#4ce15e"
84
+ green-700: "#28a948"
85
+ green-800: "#279141"
86
+ green-900: "#107d32"
87
+ green-1000: "#003a00"
88
+ teal-100: "#defffb"
89
+ teal-200: "#ddfef6"
90
+ teal-300: "#ccf9f1"
91
+ teal-400: "#b1f7ec"
92
+ teal-500: "#52f0db"
93
+ teal-600: "#00e3c4"
94
+ teal-700: "#00ac96"
95
+ teal-800: "#00927f"
96
+ teal-900: "#007f70"
97
+ teal-1000: "#003f34"
98
+ purple-100: "#faf0ff"
99
+ purple-200: "#f9f0ff"
100
+ purple-300: "#f6e8ff"
101
+ purple-400: "#f2d9ff"
102
+ purple-500: "#dfa7ff"
103
+ purple-600: "#c979ff"
104
+ purple-700: "#a000f8"
105
+ purple-800: "#8500d1"
106
+ purple-900: "#7d00cc"
107
+ purple-1000: "#2f004e"
108
+ pink-100: "#ffe8f6"
109
+ pink-200: "#ffe8f3"
110
+ pink-300: "#ffdfeb"
111
+ pink-400: "#ffd3e1"
112
+ pink-500: "#fdb3cc"
113
+ pink-600: "#f97ea7"
114
+ pink-700: "#f22782"
115
+ pink-800: "#e4106e"
116
+ pink-900: "#c41562"
117
+ pink-1000: "#460523"
118
+ semantic-colors:
119
+ action-primary: "{colors.primary}"
120
+ action-primary-hover: "{colors.primary-hover}"
121
+ action-primary-press: "{colors.primary-press}"
122
+ action-on-primary: "#ffffff"
123
+ surface-canvas: "{colors.background-100}"
124
+ surface-subtle: "{colors.background-200}"
125
+ surface-panel: "{colors.background-100}"
126
+ border: "{colors.gray-400}"
127
+ border-strong: "{colors.gray-500}"
128
+ text-primary: "{colors.text-primary}"
129
+ text-secondary: "{colors.text-secondary}"
130
+ text-muted: "{colors.text-muted}"
131
+ selection-background: "{colors.text-primary}"
132
+ selection-foreground: "{colors.background-100}"
133
+ focus-ring: "{colors.primary}"
134
+ status-success: "{colors.green-700}"
135
+ status-warning: "{colors.amber-900}"
136
+ status-danger: "{colors.red-700}"
137
+ typography:
138
+ heading-72:
139
+ fontFamily: Noto Sans SC
140
+ fontSize: 72px
141
+ fontWeight: 500
142
+ lineHeight: 72px
143
+ letterSpacing: -0.06em
144
+ heading-64:
145
+ fontFamily: Noto Sans SC
146
+ fontSize: 64px
147
+ fontWeight: 500
148
+ lineHeight: 68px
149
+ letterSpacing: -0.06em
150
+ heading-56:
151
+ fontFamily: Noto Sans SC
152
+ fontSize: 56px
153
+ fontWeight: 500
154
+ lineHeight: 60px
155
+ letterSpacing: -0.06em
156
+ heading-48:
157
+ fontFamily: Noto Sans SC
158
+ fontSize: 48px
159
+ fontWeight: 500
160
+ lineHeight: 52px
161
+ letterSpacing: -0.06em
162
+ heading-40:
163
+ fontFamily: Noto Sans SC
164
+ fontSize: 40px
165
+ fontWeight: 500
166
+ lineHeight: 44px
167
+ letterSpacing: -0.06em
168
+ heading-32:
169
+ fontFamily: Noto Sans SC
170
+ fontSize: 32px
171
+ fontWeight: 500
172
+ lineHeight: 38px
173
+ letterSpacing: -0.04em
174
+ heading-24:
175
+ fontFamily: Noto Sans SC
176
+ fontSize: 24px
177
+ fontWeight: 500
178
+ lineHeight: 32px
179
+ letterSpacing: -0.04em
180
+ heading-20:
181
+ fontFamily: Noto Sans SC
182
+ fontSize: 20px
183
+ fontWeight: 500
184
+ lineHeight: 28px
185
+ letterSpacing: -0.02em
186
+ heading-16:
187
+ fontFamily: Noto Sans SC
188
+ fontSize: 16px
189
+ fontWeight: 500
190
+ lineHeight: 24px
191
+ letterSpacing: -0.02em
192
+ heading-14:
193
+ fontFamily: Noto Sans SC
194
+ fontSize: 14px
195
+ fontWeight: 500
196
+ lineHeight: 20px
197
+ letterSpacing: -0.02em
198
+ label-14:
199
+ fontFamily: Noto Sans SC
200
+ fontSize: 14px
201
+ fontWeight: 400
202
+ lineHeight: 20px
203
+ letterSpacing: 0
204
+ label-13:
205
+ fontFamily: Noto Sans SC
206
+ fontSize: 13px
207
+ fontWeight: 400
208
+ lineHeight: 18px
209
+ letterSpacing: 0
210
+ copy-16:
211
+ fontFamily: Noto Sans SC
212
+ fontSize: 16px
213
+ fontWeight: 400
214
+ lineHeight: 24px
215
+ letterSpacing: 0
216
+ copy-14:
217
+ fontFamily: Noto Sans SC
218
+ fontSize: 14px
219
+ fontWeight: 400
220
+ lineHeight: 20px
221
+ letterSpacing: 0
222
+ code-13:
223
+ fontFamily: Geist Mono
224
+ fontSize: 13px
225
+ fontWeight: 400
226
+ lineHeight: 18px
227
+ letterSpacing: 0
228
+ spacing:
229
+ 1: 4px
230
+ 2: 8px
231
+ 3: 12px
232
+ 4: 16px
233
+ 6: 24px
234
+ 8: 32px
235
+ 10: 40px
236
+ 16: 64px
237
+ 24: 96px
238
+ base: 4px
239
+ sizing:
240
+ control-default: 40px
241
+ rounded:
242
+ xs: 4px
243
+ sm: 6px
244
+ md: 8px
245
+ lg: 12px
246
+ xl: 16px
247
+ full: 9999px
248
+ materials:
249
+ base:
250
+ backgroundColor: "{semantic-colors.surface-panel}"
251
+ borderColor: "{semantic-colors.border}"
252
+ rounded: "{rounded.sm}"
253
+ small:
254
+ backgroundColor: "{semantic-colors.surface-panel}"
255
+ borderColor: "{semantic-colors.border}"
256
+ rounded: "{rounded.sm}"
257
+ medium:
258
+ backgroundColor: "{semantic-colors.surface-panel}"
259
+ borderColor: "{semantic-colors.border}"
260
+ rounded: "{rounded.lg}"
261
+ menu:
262
+ backgroundColor: "{semantic-colors.surface-panel}"
263
+ borderColor: "{semantic-colors.border-strong}"
264
+ rounded: "{rounded.lg}"
265
+ modal:
266
+ backgroundColor: "{semantic-colors.surface-panel}"
267
+ borderColor: "{semantic-colors.border-strong}"
268
+ rounded: "{rounded.lg}"
269
+ components:
270
+ button-primary:
271
+ backgroundColor: "{semantic-colors.action-primary}"
272
+ hoverBackgroundColor: "{semantic-colors.action-primary-hover}"
273
+ pressBackgroundColor: "{semantic-colors.action-primary-press}"
274
+ textColor: "{semantic-colors.action-on-primary}"
275
+ typography: "{typography.label-14}"
276
+ rounded: "{rounded.sm}"
277
+ height: 40px
278
+ button-secondary:
279
+ backgroundColor: "{semantic-colors.surface-panel}"
280
+ hoverBackgroundColor: "{semantic-colors.surface-subtle}"
281
+ textColor: "{semantic-colors.text-primary}"
282
+ borderColor: "{semantic-colors.border-strong}"
283
+ typography: "{typography.label-14}"
284
+ rounded: "{rounded.sm}"
285
+ height: 40px
286
+ input:
287
+ backgroundColor: "{semantic-colors.surface-panel}"
288
+ textColor: "{semantic-colors.text-primary}"
289
+ placeholderColor: "{semantic-colors.text-muted}"
290
+ borderColor: "{semantic-colors.border-strong}"
291
+ focusColor: "{semantic-colors.focus-ring}"
292
+ typography: "{typography.label-14}"
293
+ rounded: "{rounded.sm}"
294
+ height: 40px
295
+ checkbox:
296
+ checkedBackgroundColor: "{semantic-colors.action-primary}"
297
+ borderColor: "{semantic-colors.border-strong}"
298
+ focusColor: "{semantic-colors.focus-ring}"
299
+ rounded: "{rounded.xs}"
300
+ radio:
301
+ checkedColor: "{semantic-colors.action-primary}"
302
+ borderColor: "{semantic-colors.border-strong}"
303
+ focusColor: "{semantic-colors.focus-ring}"
304
+ rounded: "{rounded.full}"
305
+ switch:
306
+ checkedBackgroundColor: "{semantic-colors.action-primary}"
307
+ backgroundColor: "{colors.gray-300}"
308
+ focusColor: "{semantic-colors.focus-ring}"
309
+ rounded: "{rounded.full}"
310
+ tabs:
311
+ activeBackgroundColor: "{semantic-colors.surface-subtle}"
312
+ textColor: "{semantic-colors.text-secondary}"
313
+ activeTextColor: "{semantic-colors.text-primary}"
314
+ borderColor: "{semantic-colors.border}"
315
+ ---
316
+
317
+ # q1travel Design System
318
+
319
+ ## Overview
320
+
321
+ This is the light-theme source contract. It defines token names, semantic roles, and component mappings before documentation examples are rendered.
322
+
323
+ ## Token Layers
324
+
325
+ - Core tokens define source design values such as color, spacing, radius, and typography.
326
+ - Semantic tokens describe product meaning such as action, surface, border, text, focus, and status.
327
+ - Component mappings consume semantic tokens and define shared behavior for controls and documentation specimens.
328
+
329
+ ## Usage
330
+
331
+ - Product code should consume semantic tokens and component mappings before using core values directly.
332
+ - Theme-specific values may differ, but token names should stay stable across light and dark contracts.
333
+ - Current theme resolved values are inspection output only; source values live in this contract and the runtime token layer.