@mezzanine-ui/system 0.16.0 → 1.0.0-alpha.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 (58) hide show
  1. package/_system.scss +46 -7
  2. package/effect/_effect.scss +63 -0
  3. package/effect/_index.scss +1 -0
  4. package/effect/constants.d.ts +1 -0
  5. package/effect/constants.js +3 -0
  6. package/effect/index.d.ts +2 -0
  7. package/effect/index.js +1 -0
  8. package/effect/typings.d.ts +32 -0
  9. package/motion/_motion.scss +47 -11
  10. package/motion/duration.d.ts +1 -1
  11. package/motion/duration.js +6 -5
  12. package/motion/easing.d.ts +1 -1
  13. package/motion/easing.js +3 -4
  14. package/package.json +1 -1
  15. package/palette/_index.scss +3 -1
  16. package/palette/_palette.scss +3 -203
  17. package/palette/_primitives.scss +267 -0
  18. package/palette/_semantic.scss +537 -0
  19. package/palette/constants.d.ts +1 -1
  20. package/palette/constants.js +2 -2
  21. package/palette/index.js +1 -1
  22. package/palette/typings.d.ts +86 -0
  23. package/radius/_index.scss +1 -0
  24. package/radius/_radius.scss +71 -0
  25. package/radius/constants.d.ts +1 -0
  26. package/radius/constants.js +3 -0
  27. package/radius/index.d.ts +3 -0
  28. package/radius/index.js +2 -0
  29. package/radius/radius.d.ts +18 -0
  30. package/radius/radius.js +32 -0
  31. package/size/_size.scss +6 -1
  32. package/size/size.d.ts +2 -0
  33. package/spacing/_index.scss +3 -1
  34. package/spacing/_primitives.scss +137 -0
  35. package/spacing/_semantic.scss +566 -0
  36. package/spacing/_spacing.scss +2 -18
  37. package/spacing/constants.d.ts +1 -0
  38. package/spacing/constants.js +2 -1
  39. package/spacing/index.js +1 -1
  40. package/spacing/toSpacingCssVar.d.ts +1 -0
  41. package/spacing/toSpacingCssVar.js +1 -0
  42. package/spacing/typings.d.ts +81 -0
  43. package/transition/_transition.scss +25 -9
  44. package/typography/SF-Mono/SFMonoMedium.woff +0 -0
  45. package/typography/SF-Mono/SFMonoRegular.woff +0 -0
  46. package/typography/SF-Mono/SFMonoSemibold.woff +0 -0
  47. package/typography/_index.scss +4 -1
  48. package/typography/_primitives.scss +318 -0
  49. package/typography/_semantic.scss +237 -0
  50. package/typography/_sf-mono.scss +34 -0
  51. package/typography/_typography.scss +4 -248
  52. package/typography/_utils.scss +4 -0
  53. package/typography/index.js +1 -0
  54. package/typography/typings.d.ts +9 -1
  55. package/typography/typings.js +4 -0
  56. package/z-index/_z-index.scss +1 -1
  57. package/palette/_constants.scss +0 -267
  58. package/palette/_utils.scss +0 -47
@@ -0,0 +1,537 @@
1
+ @use '../utils/list';
2
+ @use '../utils/map';
3
+ @use 'sass:string';
4
+ @use './primitives' as primitive;
5
+
6
+ $prefix: mzn-color;
7
+
8
+ // 定義所有情境類型
9
+ $semantic-contexts: (
10
+ layer,
11
+ background,
12
+ text,
13
+ icon,
14
+ border,
15
+ separator,
16
+ overlay,
17
+ surface,
18
+ shadow
19
+ );
20
+
21
+ $semantic-colors: (
22
+ layer: (
23
+ 01: (
24
+ light: primitive.variable(gray, 100),
25
+ dark: primitive.variable(black-base, black),
26
+ ),
27
+ 02: (
28
+ light: primitive.variable(white-base, white),
29
+ dark: primitive.variable(gray, 900),
30
+ ),
31
+ 03: (
32
+ light: primitive.variable(gray, 50),
33
+ dark: primitive.variable(gray, 800),
34
+ ),
35
+ ),
36
+ background: (
37
+ base: (
38
+ light: primitive.variable(white-base, white),
39
+ dark: primitive.variable(gray, 900),
40
+ ),
41
+ menu: (
42
+ light: primitive.variable(white-base, white),
43
+ dark: primitive.variable(gray, 950),
44
+ ),
45
+ inverse: (
46
+ light: primitive.variable(white-base, white),
47
+ dark: primitive.variable(gray, 950),
48
+ ),
49
+ fixed-dark: (
50
+ light: primitive.variable(gray, 700),
51
+ dark: primitive.variable(gray, 950),
52
+ ),
53
+ neutral-ghost: (
54
+ light: primitive.variable(gray, 50),
55
+ dark: primitive.variable(gray, 950),
56
+ ),
57
+ neutral-faint: (
58
+ light: primitive.variable(gray, 100),
59
+ dark: primitive.variable(gray, 800),
60
+ ),
61
+ neutral-subtle: (
62
+ light: primitive.variable(gray, 200),
63
+ dark: primitive.variable(gray, 700),
64
+ ),
65
+ neutral-light: (
66
+ light: primitive.variable(gray, 300),
67
+ dark: primitive.variable(gray, 600),
68
+ ),
69
+ neutral: (
70
+ light: primitive.variable(gray, 400),
71
+ dark: primitive.variable(gray, 500),
72
+ ),
73
+ neutral-strong: (
74
+ light: primitive.variable(gray, 600),
75
+ dark: primitive.variable(gray, 400),
76
+ ),
77
+ neutral-solid: (
78
+ light: primitive.variable(gray, 700),
79
+ dark: primitive.variable(gray, 300),
80
+ ),
81
+ brand-ghost: (
82
+ light: primitive.variable(brand, 50),
83
+ dark: primitive.variable(brand, 950),
84
+ ),
85
+ brand-faint: (
86
+ light: primitive.variable(brand, 100),
87
+ dark: primitive.variable(brand, 900),
88
+ ),
89
+ brand-subtle: (
90
+ light: primitive.variable(brand, 200),
91
+ dark: primitive.variable(brand, 800),
92
+ ),
93
+ brand-light: (
94
+ light: primitive.variable(brand, 300),
95
+ dark: primitive.variable(brand, 700),
96
+ ),
97
+ brand: (
98
+ light: primitive.variable(brand, 500),
99
+ dark: primitive.variable(brand, 500),
100
+ ),
101
+ brand-strong: (
102
+ light: primitive.variable(brand, 700),
103
+ dark: primitive.variable(brand, 300),
104
+ ),
105
+ brand-solid: (
106
+ light: primitive.variable(brand, 800),
107
+ dark: primitive.variable(brand, 200),
108
+ ),
109
+ error-ghost: (
110
+ light: primitive.variable(red, 50),
111
+ dark: primitive.variable(red, 950),
112
+ ),
113
+ error-faint: (
114
+ light: primitive.variable(red, 100),
115
+ dark: primitive.variable(red, 900),
116
+ ),
117
+ error-subtle: (
118
+ light: primitive.variable(red, 200),
119
+ dark: primitive.variable(red, 800),
120
+ ),
121
+ error-light: (
122
+ light: primitive.variable(red, 300),
123
+ dark: primitive.variable(red, 700),
124
+ ),
125
+ error: (
126
+ light: primitive.variable(red, 500),
127
+ dark: primitive.variable(red, 500),
128
+ ),
129
+ error-strong: (
130
+ light: primitive.variable(red, 700),
131
+ dark: primitive.variable(red, 400),
132
+ ),
133
+ error-solid: (
134
+ light: primitive.variable(red, 800),
135
+ dark: primitive.variable(red, 300),
136
+ ),
137
+ warning-ghost: (
138
+ light: primitive.variable(yellow, 50),
139
+ dark: primitive.variable(yellow, 950),
140
+ ),
141
+ warning-faint: (
142
+ light: primitive.variable(yellow, 100),
143
+ dark: primitive.variable(yellow, 900),
144
+ ),
145
+ warning: (
146
+ light: primitive.variable(yellow, 500),
147
+ dark: primitive.variable(yellow, 500),
148
+ ),
149
+ success-ghost: (
150
+ light: primitive.variable(green, 50),
151
+ dark: primitive.variable(green, 950),
152
+ ),
153
+ success-faint: (
154
+ light: primitive.variable(green, 100),
155
+ dark: primitive.variable(green, 950),
156
+ ),
157
+ success: (
158
+ light: primitive.variable(green, 500),
159
+ dark: primitive.variable(green, 500),
160
+ ),
161
+ info-ghost: (
162
+ light: primitive.variable(blue, 50),
163
+ dark: primitive.variable(blue, 950),
164
+ ),
165
+ info-faint: (
166
+ light: primitive.variable(blue, 100),
167
+ dark: primitive.variable(blue, 900),
168
+ ),
169
+ info: (
170
+ light: primitive.variable(blue, 500),
171
+ dark: primitive.variable(blue, 500),
172
+ ),
173
+ ),
174
+ text: (
175
+ fixed-light: (
176
+ light: primitive.variable(white-base, white),
177
+ dark: primitive.variable(white-base, white),
178
+ ),
179
+ neutral-faint: (
180
+ light: primitive.variable(gray, 300),
181
+ dark: primitive.variable(gray, 600),
182
+ ),
183
+ neutral-light: (
184
+ light: primitive.variable(gray, 400),
185
+ dark: primitive.variable(gray, 500),
186
+ ),
187
+ neutral: (
188
+ light: primitive.variable(gray, 500),
189
+ dark: primitive.variable(gray, 400),
190
+ ),
191
+ neutral-strong: (
192
+ light: primitive.variable(gray, 700),
193
+ dark: primitive.variable(gray, 300),
194
+ ),
195
+ neutral-solid: (
196
+ light: primitive.variable(gray, 900),
197
+ dark: primitive.variable(white-base, white),
198
+ ),
199
+ brand: (
200
+ light: primitive.variable(brand, 500),
201
+ dark: primitive.variable(brand, 400),
202
+ ),
203
+ brand-strong: (
204
+ light: primitive.variable(brand, 700),
205
+ dark: primitive.variable(brand, 200),
206
+ ),
207
+ brand-solid: (
208
+ light: primitive.variable(brand, 800),
209
+ dark: primitive.variable(brand, 100),
210
+ ),
211
+ error: (
212
+ light: primitive.variable(red, 500),
213
+ dark: primitive.variable(red, 500),
214
+ ),
215
+ error-strong: (
216
+ light: primitive.variable(red, 700),
217
+ dark: primitive.variable(red, 300),
218
+ ),
219
+ error-solid: (
220
+ light: primitive.variable(red, 800),
221
+ dark: primitive.variable(red, 200),
222
+ ),
223
+ warning: (
224
+ light: primitive.variable(yellow, 500),
225
+ dark: primitive.variable(yellow, 500),
226
+ ),
227
+ warning-strong: (
228
+ light: primitive.variable(yellow, 700),
229
+ dark: primitive.variable(yellow, 400),
230
+ ),
231
+ success: (
232
+ light: primitive.variable(green, 500),
233
+ dark: primitive.variable(green, 400),
234
+ ),
235
+ info: (
236
+ light: primitive.variable(blue, 500),
237
+ dark: primitive.variable(blue, 400),
238
+ ),
239
+ info-strong: (
240
+ light: primitive.variable(blue, 700),
241
+ dark: primitive.variable(blue, 300),
242
+ ),
243
+ ),
244
+ icon: (
245
+ fixed-light: (
246
+ light: primitive.variable(white-base, white),
247
+ dark: primitive.variable(white-base, white),
248
+ ),
249
+ neutral-faint: (
250
+ light: primitive.variable(gray, 300),
251
+ dark: primitive.variable(gray, 600),
252
+ ),
253
+ neutral-light: (
254
+ light: primitive.variable(gray, 400),
255
+ dark: primitive.variable(gray, 500),
256
+ ),
257
+ neutral: (
258
+ light: primitive.variable(gray, 500),
259
+ dark: primitive.variable(gray, 400),
260
+ ),
261
+ neutral-strong: (
262
+ light: primitive.variable(gray, 700),
263
+ dark: primitive.variable(gray, 300),
264
+ ),
265
+ neutral-bold: (
266
+ light: primitive.variable(gray, 800),
267
+ dark: primitive.variable(gray, 100),
268
+ ),
269
+ neutral-solid: (
270
+ light: primitive.variable(gray, 900),
271
+ dark: primitive.variable(white-base, white),
272
+ ),
273
+ brand: (
274
+ light: primitive.variable(brand, 500),
275
+ dark: primitive.variable(brand, 400),
276
+ ),
277
+ brand-strong: (
278
+ light: primitive.variable(brand, 800),
279
+ dark: primitive.variable(brand, 200),
280
+ ),
281
+ brand-solid: (
282
+ light: primitive.variable(brand, 900),
283
+ dark: primitive.variable(brand, 100),
284
+ ),
285
+ error: (
286
+ light: primitive.variable(red, 500),
287
+ dark: primitive.variable(red, 500),
288
+ ),
289
+ error-strong: (
290
+ light: primitive.variable(red, 600),
291
+ dark: primitive.variable(red, 400),
292
+ ),
293
+ error-solid: (
294
+ light: primitive.variable(red, 700),
295
+ dark: primitive.variable(red, 300),
296
+ ),
297
+ warning: (
298
+ light: primitive.variable(yellow, 500),
299
+ dark: primitive.variable(yellow, 500),
300
+ ),
301
+ warning-strong: (
302
+ light: primitive.variable(yellow, 700),
303
+ dark: primitive.variable(yellow, 400),
304
+ ),
305
+ success: (
306
+ light: primitive.variable(green, 500),
307
+ dark: primitive.variable(green, 400),
308
+ ),
309
+ success-strong: (
310
+ light: primitive.variable(green, 700),
311
+ dark: primitive.variable(green, 300),
312
+ ),
313
+ info: (
314
+ light: primitive.variable(blue, 500),
315
+ dark: primitive.variable(blue, 500),
316
+ ),
317
+ info-strong: (
318
+ light: primitive.variable(blue, 700),
319
+ dark: primitive.variable(blue, 300),
320
+ ),
321
+ ),
322
+ border: (
323
+ fixed-light: (
324
+ light: primitive.variable(white-base, white),
325
+ dark: primitive.variable(white-base, white),
326
+ ),
327
+ fixed-light-alpha: (
328
+ light: primitive.variable(white-base, white-alpha-20),
329
+ dark: primitive.variable(white-base, white-alpha-20),
330
+ ),
331
+ neutral-faint: (
332
+ light: primitive.variable(gray, 200),
333
+ dark: primitive.variable(gray, 700),
334
+ ),
335
+ neutral-light: (
336
+ light: primitive.variable(gray, 300),
337
+ dark: primitive.variable(gray, 600),
338
+ ),
339
+ neutral: (
340
+ light: primitive.variable(gray, 400),
341
+ dark: primitive.variable(gray, 500),
342
+ ),
343
+ neutral-strong: (
344
+ light: primitive.variable(gray, 600),
345
+ dark: primitive.variable(gray, 300),
346
+ ),
347
+ brand: (
348
+ light: primitive.variable(brand, 500),
349
+ dark: primitive.variable(brand, 500),
350
+ ),
351
+ error-subtle: (
352
+ light: primitive.variable(red, 300),
353
+ dark: primitive.variable(red, 600),
354
+ ),
355
+ error: (
356
+ light: primitive.variable(red, 500),
357
+ dark: primitive.variable(red, 500),
358
+ ),
359
+ warning-subtle: (
360
+ light: primitive.variable(yellow, 300),
361
+ dark: primitive.variable(yellow, 600),
362
+ ),
363
+ warning: (
364
+ light: primitive.variable(yellow, 500),
365
+ dark: primitive.variable(yellow, 500),
366
+ ),
367
+ ),
368
+ separator: (
369
+ neutral-faint: (
370
+ light: primitive.variable(gray, 200),
371
+ dark: primitive.variable(gray, 700),
372
+ ),
373
+ neutral-light: (
374
+ light: primitive.variable(gray, 300),
375
+ dark: primitive.variable(gray, 600),
376
+ ),
377
+ neutral: (
378
+ light: primitive.variable(gray, 400),
379
+ dark: primitive.variable(gray, 500),
380
+ ),
381
+ brand: (
382
+ light: primitive.variable(brand, 500),
383
+ dark: primitive.variable(brand, 500),
384
+ ),
385
+ ),
386
+ overlay: (
387
+ strong: (
388
+ light: primitive.variable(black-base, black-alpha-60),
389
+ dark: primitive.variable(black-base, black-alpha-60),
390
+ ),
391
+ default: (
392
+ light: primitive.variable(black-base, black-alpha-40),
393
+ dark: primitive.variable(black-base, black-alpha-40),
394
+ ),
395
+ subtle: (
396
+ light: primitive.variable(black-base, black-alpha-30),
397
+ dark: primitive.variable(black-base, black-alpha-30),
398
+ ),
399
+ ),
400
+ surface: (
401
+ solid: (
402
+ light: primitive.variable(white-base, white-alpha-90),
403
+ dark: primitive.variable(black-base, black-alpha-80),
404
+ ),
405
+ strong: (
406
+ light: primitive.variable(white-base, white-alpha-60),
407
+ dark: primitive.variable(black-base, black-alpha-60),
408
+ ),
409
+ subtle: (
410
+ light: primitive.variable(white-base, white-alpha-30),
411
+ dark: primitive.variable(black-base, black-alpha-30),
412
+ ),
413
+ ghost: (
414
+ light: primitive.variable(white-base, white-alpha-10),
415
+ dark: primitive.variable(black-base, black-alpha-10),
416
+ ),
417
+ ),
418
+ shadow: (
419
+ dark: (
420
+ light: primitive.variable(black-base, black-alpha-10),
421
+ dark: primitive.variable(black-base, black-alpha-90),
422
+ ),
423
+ dark-light: (
424
+ light: primitive.variable(black-base, black-alpha-8),
425
+ dark: primitive.variable(black-base, black-alpha-20),
426
+ ),
427
+ dark-faint: (
428
+ light: primitive.variable(black-base, black-alpha-5),
429
+ dark: primitive.variable(black-base, black-alpha-20),
430
+ ),
431
+ dark-ghost: (
432
+ light: primitive.variable(black-base, black-alpha-3),
433
+ dark: primitive.variable(black-base, black-alpha-10),
434
+ ),
435
+ light-faint: (
436
+ light: primitive.variable(white-base, white-alpha-5),
437
+ dark: primitive.variable(white-base, white-alpha-5),
438
+ ),
439
+ brand: (
440
+ light: primitive.variable(brand-base, brand-alpha-30),
441
+ dark: primitive.variable(brand-base, brand-alpha-20),
442
+ ),
443
+ ),
444
+ );
445
+
446
+ // 驗證 context 是否有效
447
+ @function is-valid-context($context) {
448
+ @return list.index($semantic-contexts, $context) != null;
449
+ }
450
+
451
+ // 驗證 tone 是否對該 context 有效
452
+ @function is-valid-tone($context, $tone, $colors: $semantic-colors) {
453
+ @if not is-valid-context($context) {
454
+ @return false;
455
+ }
456
+
457
+ $context-map: map.get($colors, $context);
458
+
459
+ @if not $context-map {
460
+ @return false;
461
+ }
462
+
463
+ @return map.has-key($context-map, $tone);
464
+ }
465
+
466
+ // 取得特定 context 的所有 tones
467
+ @function get-context-tones($context, $colors: $semantic-colors) {
468
+ @if not is-valid-context($context) {
469
+ @error 'Invalid context "#{$context}". Valid contexts are: #{$semantic-contexts}';
470
+ }
471
+
472
+ $context-map: map.get($colors, $context);
473
+
474
+ @if not $context-map {
475
+ @return ();
476
+ }
477
+
478
+ @return map.keys($context-map);
479
+ }
480
+
481
+ // 取得 CSS 變數名稱
482
+ @function get-semantic-var-name($context, $tone) {
483
+ @return --#{$prefix}-#{$context}-#{$tone};
484
+ }
485
+
486
+ // 取得 semantic color 的 CSS 變數引用
487
+ @function variable($context, $tone, $alpha: null) {
488
+ @if not is-valid-context($context) {
489
+ @error 'Invalid context "#{$context}". Valid contexts are: #{$semantic-contexts}';
490
+ }
491
+
492
+ $var-ref: var(#{get-semantic-var-name($context, $tone)});
493
+
494
+ // 如果沒有指定 alpha,直接返回 CSS 變數
495
+ @if not $alpha {
496
+ @return $var-ref;
497
+ }
498
+
499
+ // 驗證 alpha 範圍 (0-100)
500
+ @if $alpha < 0 or $alpha > 100 {
501
+ @error 'Alpha value must be between 0 and 100, got #{$alpha}';
502
+ }
503
+
504
+ // 使用 color-mix 來動態設定透明度
505
+ @return string.unquote('color-mix(in srgb, #{$var-ref} #{$alpha}%, transparent)');
506
+ }
507
+
508
+ // 檢查顏色值是否已定義(包括 CSS 變數)
509
+ @function is-semantic-color-defined($value) {
510
+ @return $value != null;
511
+ }
512
+
513
+ // 生成所有 semantic color CSS 變數
514
+ // mode: 'light' 或 'dark'
515
+ @mixin variables($mode: light, $colors: ()) {
516
+ $colors: map.deep-merge($semantic-colors, $colors);
517
+
518
+ @each $context, $tones in $colors {
519
+ @if not is-valid-context($context) {
520
+ @error 'Invalid context "#{$context}" in semantic colors map. Valid contexts are: #{$semantic-contexts}';
521
+ }
522
+
523
+ @each $tone, $modes in $tones {
524
+ @if not is-valid-tone($context, $tone, $colors) {
525
+ $valid-tones: get-context-tones($context, $colors);
526
+
527
+ @error 'Invalid tone "#{$tone}" for context "#{$context}". Valid tones are: #{$valid-tones}';
528
+ }
529
+
530
+ $color: map.get($modes, $mode);
531
+
532
+ @if is-semantic-color-defined($color) {
533
+ #{get-semantic-var-name($context, $tone)}: #{$color};
534
+ }
535
+ }
536
+ }
537
+ }
@@ -1 +1 @@
1
- export declare const palettePrefix = "mzn-color";
1
+ export declare const colorSemanticPrefix = "mzn-color";
@@ -1,3 +1,3 @@
1
- const palettePrefix = 'mzn-color';
1
+ const colorSemanticPrefix = 'mzn-color';
2
2
 
3
- export { palettePrefix };
3
+ export { colorSemanticPrefix };
package/palette/index.js CHANGED
@@ -1 +1 @@
1
- export { palettePrefix } from './constants.js';
1
+ export { colorSemanticPrefix } from './constants.js';
@@ -1,9 +1,95 @@
1
+ /** @deprecated Legacy */
1
2
  export type MainColor = 'primary' | 'secondary' | 'error' | 'warning' | 'success';
3
+ /** @deprecated Legacy */
2
4
  export type GradualMainColor = `${MainColor}-${'light' | 'dark'}`;
5
+ /** @deprecated Legacy */
3
6
  export type StatefulMainColor = `${MainColor}-${'hover-bg' | 'active-bg'}`;
7
+ /** @deprecated Legacy */
4
8
  export type MainContrastTextColor = `on-${MainColor}`;
9
+ /** @deprecated Legacy */
5
10
  export type TextColor = `text-${'primary' | 'secondary' | 'disabled'}`;
11
+ /** @deprecated Legacy */
6
12
  export type ActionForegroundColor = `action-${'active' | 'inactive' | 'disabled'}`;
13
+ /** @deprecated Legacy */
7
14
  export type ActionBackgroundColor = `action-${'disabled-bg'}`;
15
+ /** @deprecated Legacy */
8
16
  export type ActionColor = ActionForegroundColor | ActionBackgroundColor;
17
+ /** @deprecated Legacy */
9
18
  export type Color = MainColor | GradualMainColor | MainContrastTextColor | TextColor | ActionColor | 'bg' | 'surface' | 'border' | 'divider';
19
+ /**
20
+ * Semantic color contexts - 語意化顏色的使用情境
21
+ */
22
+ export type SemanticContext = 'layer' | 'background' | 'text' | 'icon' | 'border' | 'separator' | 'overlay' | 'surface' | 'shadow';
23
+ /**
24
+ * Layer tones - 圖層層級
25
+ */
26
+ export type LayerTone = '01' | '02' | '03';
27
+ /**
28
+ * Background tones - 背景顏色調性
29
+ */
30
+ export type BackgroundTone = 'base' | 'menu' | 'inverse' | 'fixed-dark' | 'neutral-ghost' | 'neutral-faint' | 'neutral-subtle' | 'neutral' | 'neutral-strong' | 'neutral-solid' | 'brand-ghost' | 'brand-faint' | 'brand-subtle' | 'brand-light' | 'brand' | 'brand-strong' | 'brand-solid' | 'error-ghost' | 'error-faint' | 'error-subtle' | 'error-light' | 'error' | 'error-strong' | 'error-solid' | 'warning-ghost' | 'warning-faint' | 'warning' | 'success-ghost' | 'success-faint' | 'success' | 'info-ghost' | 'info-faint' | 'info';
31
+ /**
32
+ * Text tones - 文字顏色調性
33
+ */
34
+ export type TextTone = 'fixed-light' | 'neutral-faint' | 'neutral-light' | 'neutral' | 'neutral-strong' | 'neutral-solid' | 'brand' | 'brand-strong' | 'brand-solid' | 'error' | 'error-strong' | 'error-solid' | 'warning' | 'warning-strong' | 'success' | 'info' | 'info-strong';
35
+ /**
36
+ * Icon tones - 圖示顏色調性
37
+ */
38
+ export type IconTone = 'fixed-light' | 'neutral-faint' | 'neutral-light' | 'neutral' | 'neutral-strong' | 'neutral-bold' | 'neutral-solid' | 'brand' | 'brand-strong' | 'brand-solid' | 'error' | 'error-strong' | 'error-solid' | 'warning' | 'warning-strong' | 'success' | 'success-strong' | 'info' | 'info-strong';
39
+ /**
40
+ * Border tones - 邊框顏色調性
41
+ */
42
+ export type BorderTone = 'fixed-light' | 'fixed-light-alpha' | 'neutral-faint' | 'neutral-light' | 'neutral' | 'neutral-strong' | 'brand' | 'error-subtle' | 'error' | 'warning-subtle' | 'warning';
43
+ /**
44
+ * Separator tones - 分隔線顏色調性
45
+ */
46
+ export type SeparatorTone = 'neutral-faint' | 'neutral-light' | 'neutral' | 'brand';
47
+ /**
48
+ * Overlay tones - 遮罩顏色調性
49
+ */
50
+ export type OverlayTone = 'strong' | 'default' | 'subtle';
51
+ /**
52
+ * Surface tones - 表面顏色調性(半透明)
53
+ */
54
+ export type SurfaceTone = 'solid' | 'strong' | 'subtle' | 'ghost';
55
+ /**
56
+ * Shadow tones - 陰影顏色調性
57
+ */
58
+ export type ShadowTone = 'dark' | 'dark-light' | 'dark-faint' | 'dark-ghost' | 'light-faint' | 'brand';
59
+ /**
60
+ * 所有 semantic tones 的聯集型別
61
+ */
62
+ export type SemanticTone = LayerTone | BackgroundTone | TextTone | IconTone | BorderTone | SeparatorTone | OverlayTone | SurfaceTone | ShadowTone;
63
+ /**
64
+ * Context 與對應 Tone 的映射型別
65
+ */
66
+ export type SemanticToneMap = {
67
+ layer: LayerTone;
68
+ background: BackgroundTone;
69
+ text: TextTone;
70
+ icon: IconTone;
71
+ border: BorderTone;
72
+ separator: SeparatorTone;
73
+ overlay: OverlayTone;
74
+ surface: SurfaceTone;
75
+ shadow: ShadowTone;
76
+ };
77
+ /**
78
+ * 取得特定 context 的 tone 型別
79
+ * @example
80
+ * type BgTone = SemanticToneFor<'background'>;
81
+ */
82
+ export type SemanticToneFor<C extends SemanticContext> = SemanticToneMap[C];
83
+ /**
84
+ * Semantic color 完整型別 - context + tone 組合
85
+ * @example
86
+ * const color: SemanticColor = 'background-brand';
87
+ * const color2: SemanticColor = 'text-neutral';
88
+ */
89
+ export type SemanticColor = {
90
+ [C in SemanticContext]: `${C}-${SemanticToneFor<C>}`;
91
+ }[SemanticContext];
92
+ /**
93
+ * Color mode - 顏色模式
94
+ */
95
+ export type ColorMode = 'light' | 'dark';
@@ -0,0 +1 @@
1
+ @forward './radius';