@q1travel/design-system 0.1.0 → 0.3.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.
- package/.agents/skills/product-design/AGENTS.md +9 -0
- package/.agents/skills/product-design/SKILL.md +63 -0
- package/.agents/skills/product-design/exemplars/README.md +12 -0
- package/.agents/skills/product-design/references/copy.md +7 -0
- package/.agents/skills/product-design/references/coverage-gaps.md +9 -0
- package/.agents/skills/product-design/references/glossary.md +5 -0
- package/.agents/skills/product-design/references/interface-quality.md +7 -0
- package/.agents/skills/product-design/references/patterns.md +13 -0
- package/.agents/skills/product-design/references/product-judgment.md +7 -0
- package/.agents/skills/product-design/references/resilience.md +13 -0
- package/.agents/skills/product-design/references/review-geist.md +94 -0
- package/.agents/skills/product-design/references/rules.md +17 -0
- package/.agents/skills/product-design/references/surfaces-forms.md +14 -0
- package/.agents/skills/product-design/references/surfaces-overlays.md +12 -0
- package/.agents/skills/product-design/references/surfaces.md +14 -0
- package/bin/q1-design.mjs +464 -0
- package/contracts/design-engineering-principles.md +39 -0
- package/contracts/design.dark.md +333 -0
- package/contracts/design.md +333 -0
- package/contracts/icon-system.md +77 -0
- package/contracts/implementation-map.md +29 -0
- package/contracts/interface-guidelines.md +122 -0
- package/contracts/token-naming.md +82 -0
- package/{dist → dist-pkg}/design-system.d.ts +36 -26
- package/{dist → dist-pkg}/design-system.js +222 -216
- package/{dist → dist-pkg}/style.css +2 -2
- package/package.json +19 -9
- package/tooling/README.md +9 -0
- package/tooling/scripts/evals/fixtures.json +7 -0
- package/tooling/scripts/evals/rules-checklist.json +23 -0
- package/tooling/scripts/evals/transition-all/after/example.css +4 -0
- 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.
|