@ketvietlab/design-system 0.1.3

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 (106) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +48 -0
  3. package/dist/catalogue/catalogue.css +344 -0
  4. package/dist/catalogue/index.d.ts +22 -0
  5. package/dist/catalogue/index.d.ts.map +1 -0
  6. package/dist/catalogue/index.js +421 -0
  7. package/dist/catalogue/index.js.map +1 -0
  8. package/dist/catalogue/page-surfaces.d.ts +15 -0
  9. package/dist/catalogue/page-surfaces.d.ts.map +1 -0
  10. package/dist/catalogue/page-surfaces.js +162 -0
  11. package/dist/catalogue/page-surfaces.js.map +1 -0
  12. package/dist/catalogue/styles.css +2 -0
  13. package/dist/contract/index.d.ts +3 -0
  14. package/dist/contract/index.d.ts.map +1 -0
  15. package/dist/contract/index.js +37 -0
  16. package/dist/contract/index.js.map +1 -0
  17. package/dist/foundations/reset.css +42 -0
  18. package/dist/foundations/tokens.css +305 -0
  19. package/dist/index.d.ts +35 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +20 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/layouts/index.d.ts +68 -0
  24. package/dist/layouts/index.d.ts.map +1 -0
  25. package/dist/layouts/index.js +66 -0
  26. package/dist/layouts/index.js.map +1 -0
  27. package/dist/layouts/layouts.css +332 -0
  28. package/dist/layouts/shell.css +154 -0
  29. package/dist/layouts/shell.d.ts +27 -0
  30. package/dist/layouts/shell.d.ts.map +1 -0
  31. package/dist/layouts/shell.js +24 -0
  32. package/dist/layouts/shell.js.map +1 -0
  33. package/dist/patterns/board-page.d.ts +14 -0
  34. package/dist/patterns/board-page.d.ts.map +1 -0
  35. package/dist/patterns/board-page.js +28 -0
  36. package/dist/patterns/board-page.js.map +1 -0
  37. package/dist/patterns/dashboard-page.d.ts +13 -0
  38. package/dist/patterns/dashboard-page.d.ts.map +1 -0
  39. package/dist/patterns/dashboard-page.js +25 -0
  40. package/dist/patterns/dashboard-page.js.map +1 -0
  41. package/dist/patterns/data-table.d.ts +26 -0
  42. package/dist/patterns/data-table.d.ts.map +1 -0
  43. package/dist/patterns/data-table.js +6 -0
  44. package/dist/patterns/data-table.js.map +1 -0
  45. package/dist/patterns/form-page.d.ts +8 -0
  46. package/dist/patterns/form-page.d.ts.map +1 -0
  47. package/dist/patterns/form-page.js +22 -0
  48. package/dist/patterns/form-page.js.map +1 -0
  49. package/dist/patterns/list-page.d.ts +31 -0
  50. package/dist/patterns/list-page.d.ts.map +1 -0
  51. package/dist/patterns/list-page.js +41 -0
  52. package/dist/patterns/list-page.js.map +1 -0
  53. package/dist/patterns/modal-sheet.d.ts +11 -0
  54. package/dist/patterns/modal-sheet.d.ts.map +1 -0
  55. package/dist/patterns/modal-sheet.js +11 -0
  56. package/dist/patterns/modal-sheet.js.map +1 -0
  57. package/dist/patterns/page-shell.d.ts +24 -0
  58. package/dist/patterns/page-shell.d.ts.map +1 -0
  59. package/dist/patterns/page-shell.js +11 -0
  60. package/dist/patterns/page-shell.js.map +1 -0
  61. package/dist/patterns/patterns.css +1435 -0
  62. package/dist/patterns/pipeline.d.ts +29 -0
  63. package/dist/patterns/pipeline.d.ts.map +1 -0
  64. package/dist/patterns/pipeline.js +26 -0
  65. package/dist/patterns/pipeline.js.map +1 -0
  66. package/dist/patterns/record-form.d.ts +18 -0
  67. package/dist/patterns/record-form.d.ts.map +1 -0
  68. package/dist/patterns/record-form.js +14 -0
  69. package/dist/patterns/record-form.js.map +1 -0
  70. package/dist/patterns/record-page.d.ts +30 -0
  71. package/dist/patterns/record-page.d.ts.map +1 -0
  72. package/dist/patterns/record-page.js +29 -0
  73. package/dist/patterns/record-page.js.map +1 -0
  74. package/dist/patterns/workspace-page.d.ts +23 -0
  75. package/dist/patterns/workspace-page.d.ts.map +1 -0
  76. package/dist/patterns/workspace-page.js +26 -0
  77. package/dist/patterns/workspace-page.js.map +1 -0
  78. package/dist/primitives/actions.d.ts +30 -0
  79. package/dist/primitives/actions.d.ts.map +1 -0
  80. package/dist/primitives/actions.js +8 -0
  81. package/dist/primitives/actions.js.map +1 -0
  82. package/dist/primitives/feedback.d.ts +19 -0
  83. package/dist/primitives/feedback.d.ts.map +1 -0
  84. package/dist/primitives/feedback.js +23 -0
  85. package/dist/primitives/feedback.js.map +1 -0
  86. package/dist/primitives/field.d.ts +22 -0
  87. package/dist/primitives/field.d.ts.map +1 -0
  88. package/dist/primitives/field.js +29 -0
  89. package/dist/primitives/field.js.map +1 -0
  90. package/dist/primitives/navigation.css +99 -0
  91. package/dist/primitives/navigation.d.ts +26 -0
  92. package/dist/primitives/navigation.d.ts.map +1 -0
  93. package/dist/primitives/navigation.js +16 -0
  94. package/dist/primitives/navigation.js.map +1 -0
  95. package/dist/primitives/primitives.css +489 -0
  96. package/dist/primitives/progress.css +46 -0
  97. package/dist/primitives/progress.d.ts +10 -0
  98. package/dist/primitives/progress.d.ts.map +1 -0
  99. package/dist/primitives/progress.js +13 -0
  100. package/dist/primitives/progress.js.map +1 -0
  101. package/dist/primitives/status.d.ts +27 -0
  102. package/dist/primitives/status.d.ts.map +1 -0
  103. package/dist/primitives/status.js +16 -0
  104. package/dist/primitives/status.js.map +1 -0
  105. package/dist/styles.css +9 -0
  106. package/package.json +58 -0
@@ -0,0 +1,489 @@
1
+ @layer ket.app {
2
+ :where([data-kv-design-system]) [data-ui="action"] {
3
+ display: inline-flex;
4
+ min-height: var(--kv-control-height);
5
+ align-items: center;
6
+ justify-content: center;
7
+ gap: 0.4375rem;
8
+ padding-inline: var(--kv-space-3);
9
+ border: 1px solid var(--kv-border-default);
10
+ border-radius: var(--kv-radius-sm);
11
+ background: var(--kv-interactive-bg);
12
+ color: var(--kv-text-secondary);
13
+ font-size: var(--kv-text-sm);
14
+ font-weight: var(--kv-weight-medium);
15
+ line-height: 1;
16
+ text-decoration: none;
17
+ white-space: nowrap;
18
+ cursor: pointer;
19
+ transition:
20
+ background var(--kv-motion-fast),
21
+ border-color var(--kv-motion-fast),
22
+ transform var(--kv-motion-fast);
23
+ }
24
+
25
+ :where([data-kv-design-system]) [data-ui="action"]:hover:not(:disabled) {
26
+ border-color: var(--kv-border-strong);
27
+ background: var(--kv-interactive-hover);
28
+ color: var(--kv-text-main);
29
+ }
30
+
31
+ :where([data-kv-design-system]) [data-ui="action"]:active:not(:disabled) {
32
+ background: var(--kv-interactive-active);
33
+ transform: translateY(1px);
34
+ }
35
+
36
+ :where([data-kv-design-system]) [data-ui="action"][data-variant="primary"] {
37
+ border-color: var(--kv-action-primary-bg);
38
+ background: var(--kv-action-primary-bg);
39
+ color: var(--kv-action-primary-ink);
40
+ }
41
+
42
+ :where([data-kv-design-system]) [data-ui="action"][data-variant="primary"]:hover:not(:disabled) {
43
+ border-color: var(--kv-action-primary-hover);
44
+ background: var(--kv-action-primary-hover);
45
+ }
46
+
47
+ :where([data-kv-design-system]) [data-ui="action"][data-variant="primary"]:active:not(:disabled) {
48
+ border-color: var(--kv-action-primary-active);
49
+ background: var(--kv-action-primary-active);
50
+ }
51
+
52
+ :where([data-kv-design-system]) [data-ui="action"][data-variant="tertiary"] {
53
+ border-color: transparent;
54
+ background: transparent;
55
+ color: var(--kv-text-secondary);
56
+ }
57
+
58
+ :where([data-kv-design-system]) [data-ui="action"][data-variant="tertiary"]:hover:not(:disabled) {
59
+ border-color: transparent;
60
+ background: color-mix(in srgb, var(--kv-text-main) 5%, transparent);
61
+ }
62
+
63
+ :where([data-kv-design-system]) [data-ui="action"][data-variant="destructive"] {
64
+ border-color: var(--kv-danger-border);
65
+ background: transparent;
66
+ color: var(--kv-danger);
67
+ }
68
+
69
+ :where([data-kv-design-system]) [data-ui="action"][data-variant="destructive"]:hover:not(:disabled) {
70
+ border-color: var(--kv-danger-border);
71
+ background: var(--kv-danger-bg);
72
+ color: var(--kv-danger-hover);
73
+ }
74
+
75
+ :where([data-kv-design-system]) [data-ui="action"][data-size="compact"] {
76
+ min-height: var(--kv-control-height-compact);
77
+ padding-inline: var(--kv-space-2);
78
+ font-size: var(--kv-text-xs);
79
+ }
80
+
81
+ :where([data-kv-design-system]) [data-ui="action"][data-size="prominent"] {
82
+ min-height: var(--kv-control-height-prominent);
83
+ padding-inline: var(--kv-space-5);
84
+ font-size: var(--kv-text-base);
85
+ }
86
+
87
+ :where([data-kv-design-system]) [data-ui="action"]:disabled {
88
+ border-color: var(--kv-panel-border);
89
+ background: var(--kv-interactive-disabled);
90
+ color: var(--kv-text-disabled);
91
+ cursor: not-allowed;
92
+ }
93
+
94
+ :where([data-kv-design-system]) [data-ui="action-leading"] {
95
+ display: inline-grid;
96
+ width: 1rem;
97
+ height: 1rem;
98
+ place-items: center;
99
+ font-family: var(--kv-font-mono);
100
+ }
101
+
102
+ :where([data-kv-design-system]) [data-ui="action-label"] {
103
+ min-width: 0;
104
+ overflow: hidden;
105
+ line-height: var(--kv-leading-normal);
106
+ text-overflow: ellipsis;
107
+ }
108
+
109
+ :where([data-kv-design-system]) [data-ui="action-spinner"] {
110
+ width: 0.8rem;
111
+ height: 0.8rem;
112
+ border: 2px solid currentcolor;
113
+ border-right-color: transparent;
114
+ border-radius: 50%;
115
+ animation: kv-spin 700ms linear infinite;
116
+ }
117
+
118
+ :where([data-kv-design-system]) [data-ui="action-group"] {
119
+ display: flex;
120
+ flex-wrap: wrap;
121
+ align-items: center;
122
+ gap: var(--kv-space-2);
123
+ }
124
+
125
+ :where([data-kv-design-system]) [data-ui="badge"] {
126
+ display: inline-flex;
127
+ min-height: 1.4rem;
128
+ align-items: center;
129
+ gap: 0.3125rem;
130
+ padding: 0.125rem 0.4375rem;
131
+ border: 1px solid transparent;
132
+ border-radius: var(--kv-radius-sm);
133
+ background: color-mix(in srgb, var(--kv-text-main) 7%, transparent);
134
+ color: var(--kv-text-secondary);
135
+ font-size: var(--kv-text-xs);
136
+ font-weight: var(--kv-weight-medium);
137
+ white-space: nowrap;
138
+ }
139
+
140
+ :where([data-kv-design-system]) [data-ui="badge"][data-tone="info"] {
141
+ background: var(--kv-color-info-soft);
142
+ color: var(--kv-color-info);
143
+ }
144
+
145
+ :where([data-kv-design-system]) [data-ui="badge"][data-tone="positive"] {
146
+ background: var(--kv-color-positive-soft);
147
+ color: var(--kv-color-positive);
148
+ }
149
+
150
+ :where([data-kv-design-system]) [data-ui="badge"][data-tone="warning"] {
151
+ background: var(--kv-color-warning-soft);
152
+ color: var(--kv-color-warning);
153
+ }
154
+
155
+ :where([data-kv-design-system]) [data-ui="badge"][data-tone="danger"] {
156
+ background: var(--kv-color-danger-soft);
157
+ color: var(--kv-color-danger);
158
+ }
159
+
160
+ :where([data-kv-design-system]) [data-ui="tag"] {
161
+ display: inline-flex;
162
+ min-height: 1.6rem;
163
+ align-items: center;
164
+ gap: var(--kv-space-1);
165
+ padding-inline: var(--kv-space-2);
166
+ border: 1px solid var(--kv-color-line);
167
+ border-radius: var(--kv-radius-sm);
168
+ background: var(--kv-color-surface);
169
+ font-size: var(--kv-text-xs);
170
+ font-weight: 650;
171
+ }
172
+
173
+ :where([data-kv-design-system]) [data-ui="tag-remove"] {
174
+ display: grid;
175
+ width: 1rem;
176
+ height: 1rem;
177
+ place-items: center;
178
+ border-radius: var(--kv-radius-xs);
179
+ color: var(--kv-color-ink-muted);
180
+ text-decoration: none;
181
+ }
182
+
183
+ :where([data-kv-design-system]) [data-ui="tag-remove"]:hover {
184
+ background: var(--kv-color-danger-soft);
185
+ color: var(--kv-color-danger);
186
+ }
187
+
188
+ :where([data-kv-design-system]) [data-ui="count-badge"] {
189
+ display: inline-grid;
190
+ min-width: 1.4rem;
191
+ height: 1.4rem;
192
+ place-items: center;
193
+ padding-inline: var(--kv-space-1);
194
+ border-radius: var(--kv-radius-full);
195
+ background: var(--kv-color-accent-soft);
196
+ color: var(--kv-color-accent);
197
+ font-family: var(--kv-font-mono);
198
+ font-size: var(--kv-text-xs);
199
+ font-weight: 800;
200
+ }
201
+
202
+ :where([data-kv-design-system]) [data-ui="avatar"] {
203
+ display: inline-grid;
204
+ width: 2rem;
205
+ height: 2rem;
206
+ place-items: center;
207
+ border: 1px solid var(--kv-color-line-strong);
208
+ border-radius: 50%;
209
+ background: var(--kv-color-accent-soft);
210
+ color: var(--kv-color-accent);
211
+ font-size: var(--kv-text-xs);
212
+ font-weight: 800;
213
+ }
214
+
215
+ :where([data-kv-design-system]) [data-ui="avatar"][data-size="small"] {
216
+ width: 1.5rem;
217
+ height: 1.5rem;
218
+ }
219
+
220
+ :where([data-kv-design-system]) [data-ui="avatar"][data-size="large"] {
221
+ width: 3rem;
222
+ height: 3rem;
223
+ font-size: var(--kv-text-sm);
224
+ }
225
+
226
+ :where([data-kv-design-system]) [data-ui="code"] {
227
+ padding: 0.15rem 0.35rem;
228
+ border-radius: var(--kv-radius-xs);
229
+ background: var(--kv-color-surface-subtle);
230
+ color: var(--kv-color-ink-secondary);
231
+ font-family: var(--kv-font-mono);
232
+ font-size: 0.85em;
233
+ overflow-wrap: anywhere;
234
+ }
235
+
236
+ :where([data-kv-design-system]) [data-ui="notice"] {
237
+ display: grid;
238
+ grid-template-columns: auto minmax(0, 1fr) auto;
239
+ gap: var(--kv-space-3);
240
+ align-items: start;
241
+ padding: var(--kv-space-3) var(--kv-space-4);
242
+ border: 1px solid var(--kv-color-line);
243
+ border-left: 3px solid var(--kv-color-info);
244
+ border-radius: var(--kv-radius-sm);
245
+ background: var(--kv-color-info-soft);
246
+ }
247
+
248
+ :where([data-kv-design-system]) [data-ui="notice"][data-tone="positive"] {
249
+ border-left-color: var(--kv-color-positive);
250
+ background: var(--kv-color-positive-soft);
251
+ }
252
+
253
+ :where([data-kv-design-system]) [data-ui="notice"][data-tone="warning"] {
254
+ border-left-color: var(--kv-color-warning);
255
+ background: var(--kv-color-warning-soft);
256
+ }
257
+
258
+ :where([data-kv-design-system]) [data-ui="notice"][data-tone="danger"] {
259
+ border-left-color: var(--kv-color-danger);
260
+ background: var(--kv-color-danger-soft);
261
+ }
262
+
263
+ :where([data-kv-design-system]) [data-ui="notice-mark"] {
264
+ width: 0.65rem;
265
+ height: 0.65rem;
266
+ margin-top: 0.35rem;
267
+ border-radius: 50%;
268
+ background: currentcolor;
269
+ }
270
+
271
+ :where([data-kv-design-system]) [data-ui="notice-copy"] {
272
+ min-width: 0;
273
+ }
274
+
275
+ :where([data-kv-design-system]) [data-ui="notice-title"] {
276
+ margin-bottom: var(--kv-space-1);
277
+ font-weight: 800;
278
+ }
279
+
280
+ :where([data-kv-design-system]) [data-ui="notice-message"] {
281
+ margin-bottom: 0;
282
+ color: var(--kv-color-ink-secondary);
283
+ font-size: var(--kv-text-sm);
284
+ }
285
+
286
+ :where([data-kv-design-system]) [data-ui="notice-actions"] {
287
+ align-self: center;
288
+ }
289
+
290
+ :where([data-kv-design-system]) [data-ui="empty"] {
291
+ display: grid;
292
+ min-height: 11rem;
293
+ place-items: center;
294
+ align-content: center;
295
+ padding: var(--kv-space-8);
296
+ color: var(--kv-color-ink-secondary);
297
+ text-align: center;
298
+ }
299
+
300
+ :where([data-kv-design-system]) [data-ui="empty-mark"] {
301
+ display: grid;
302
+ width: 2.5rem;
303
+ height: 2.5rem;
304
+ margin-bottom: var(--kv-space-3);
305
+ place-items: center;
306
+ border: 1px solid var(--kv-color-line-strong);
307
+ border-radius: 50%;
308
+ color: var(--kv-color-accent);
309
+ font-size: var(--kv-text-lg);
310
+ }
311
+
312
+ :where([data-kv-design-system]) [data-ui="empty-title"] {
313
+ margin-bottom: var(--kv-space-1);
314
+ color: var(--kv-color-ink);
315
+ font-weight: 800;
316
+ }
317
+
318
+ :where([data-kv-design-system]) [data-ui="empty-message"] {
319
+ max-width: 34rem;
320
+ margin-bottom: 0;
321
+ font-size: var(--kv-text-sm);
322
+ }
323
+
324
+ :where([data-kv-design-system]) [data-ui="empty-actions"] {
325
+ margin-top: var(--kv-space-4);
326
+ }
327
+
328
+ :where([data-kv-design-system]) [data-ui="loading"] {
329
+ display: grid;
330
+ gap: var(--kv-space-3);
331
+ padding: var(--kv-space-4);
332
+ }
333
+
334
+ :where([data-kv-design-system]) [data-ui="loading-label"] {
335
+ color: var(--kv-color-ink-muted);
336
+ font-size: var(--kv-text-xs);
337
+ font-weight: 750;
338
+ letter-spacing: 0.08em;
339
+ text-transform: uppercase;
340
+ }
341
+
342
+ :where([data-kv-design-system]) [data-ui="skeleton"] {
343
+ display: grid;
344
+ gap: var(--kv-space-2);
345
+ }
346
+
347
+ :where([data-kv-design-system]) [data-ui="skeleton-line"] {
348
+ height: 0.7rem;
349
+ border-radius: var(--kv-radius-xs);
350
+ background: linear-gradient(
351
+ 90deg,
352
+ var(--kv-color-surface-subtle),
353
+ var(--kv-color-line),
354
+ var(--kv-color-surface-subtle)
355
+ );
356
+ background-size: 200% 100%;
357
+ animation: kv-shimmer 1.5s ease infinite;
358
+ }
359
+
360
+ :where([data-kv-design-system]) [data-ui="skeleton-line"][data-line="2"] {
361
+ width: 82%;
362
+ }
363
+
364
+ :where([data-kv-design-system]) [data-ui="skeleton-line"][data-line="3"] {
365
+ width: 58%;
366
+ }
367
+
368
+ :where([data-kv-design-system]) [data-ui="field"] {
369
+ display: grid;
370
+ min-width: 0;
371
+ gap: var(--kv-space-1);
372
+ margin: 0;
373
+ padding: 0;
374
+ border: 0;
375
+ }
376
+
377
+ :where([data-kv-design-system]) [data-ui="field"][data-kind="checkbox"] {
378
+ grid-template-columns: auto minmax(0, 1fr);
379
+ align-items: center;
380
+ gap: var(--kv-space-2);
381
+ }
382
+
383
+ :where([data-kv-design-system]) [data-ui="field-label"] {
384
+ color: var(--kv-text-secondary);
385
+ font-size: var(--kv-text-sm);
386
+ font-weight: var(--kv-weight-medium);
387
+ }
388
+
389
+ :where([data-kv-design-system]) [data-ui="field-required"] {
390
+ color: var(--kv-color-danger);
391
+ }
392
+
393
+ :where([data-kv-design-system]) [data-ui="field-control"] {
394
+ width: 100%;
395
+ min-height: var(--kv-control-height);
396
+ padding: 0 var(--kv-space-2-5);
397
+ border: 1px solid var(--kv-field-border);
398
+ border-radius: var(--kv-radius-sm);
399
+ background: var(--kv-input-bg);
400
+ color: var(--kv-input-text);
401
+ font-size: var(--kv-text-sm);
402
+ }
403
+
404
+ :where([data-kv-design-system]) [data-ui="field-control"]::placeholder {
405
+ color: var(--kv-input-placeholder);
406
+ }
407
+
408
+ :where([data-kv-design-system]) [data-ui="field-control"]:hover:not(:focus-visible, :disabled) {
409
+ border-color: var(--kv-input-border-hover);
410
+ background: var(--kv-input-bg-hover);
411
+ }
412
+
413
+ :where([data-kv-design-system]) [data-ui="field-control"]:focus-visible {
414
+ border-color: var(--kv-input-border-focus);
415
+ background: var(--kv-input-bg-focus);
416
+ box-shadow: var(--kv-input-ring);
417
+ outline: none;
418
+ }
419
+
420
+ :where([data-kv-design-system]) [data-ui="field-control"]:disabled {
421
+ border-color: var(--kv-panel-border);
422
+ background: var(--kv-interactive-disabled);
423
+ color: var(--kv-text-disabled);
424
+ cursor: not-allowed;
425
+ }
426
+
427
+ :where([data-kv-design-system]) textarea[data-ui="field-control"] {
428
+ min-height: 6.875rem;
429
+ padding: var(--kv-space-2-5) var(--kv-space-3);
430
+ resize: vertical;
431
+ }
432
+
433
+ :where([data-kv-design-system]) input[type="checkbox"][data-ui="field-control"] {
434
+ width: 1rem;
435
+ min-height: 1rem;
436
+ accent-color: var(--kv-color-accent);
437
+ }
438
+
439
+ :where([data-kv-design-system]) [data-ui="field"][data-invalid="true"] [data-ui="field-control"] {
440
+ border-color: var(--kv-color-danger);
441
+ }
442
+
443
+ :where([data-kv-design-system]) [data-ui="field-options"] {
444
+ display: flex;
445
+ flex-wrap: wrap;
446
+ gap: var(--kv-space-2);
447
+ }
448
+
449
+ :where([data-kv-design-system]) [data-ui="field-option"] {
450
+ display: inline-flex;
451
+ align-items: center;
452
+ gap: var(--kv-space-2);
453
+ color: var(--kv-color-ink-secondary);
454
+ font-size: var(--kv-text-sm);
455
+ }
456
+
457
+ :where([data-kv-design-system]) [data-ui="field-help"] {
458
+ color: var(--kv-color-ink-muted);
459
+ font-size: var(--kv-text-xs);
460
+ }
461
+
462
+ :where([data-kv-design-system]) [data-ui="field-error"] {
463
+ color: var(--kv-color-danger);
464
+ font-size: var(--kv-text-xs);
465
+ font-weight: 700;
466
+ }
467
+
468
+ @keyframes kv-spin {
469
+ to {
470
+ transform: rotate(360deg);
471
+ }
472
+ }
473
+
474
+ @keyframes kv-shimmer {
475
+ to {
476
+ background-position: -200% 0;
477
+ }
478
+ }
479
+
480
+ @media (max-width: 42rem) {
481
+ :where([data-kv-design-system]) [data-ui="notice"] {
482
+ grid-template-columns: auto minmax(0, 1fr);
483
+ }
484
+
485
+ :where([data-kv-design-system]) [data-ui="notice-actions"] {
486
+ grid-column: 1 / -1;
487
+ }
488
+ }
489
+ }
@@ -0,0 +1,46 @@
1
+ @layer ket.app {
2
+ :where([data-kv-design-system]) [data-ui="progress"] {
3
+ display: grid;
4
+ gap: var(--kv-space-2);
5
+ }
6
+
7
+ :where([data-kv-design-system]) [data-ui="progress-label"] {
8
+ display: flex;
9
+ align-items: center;
10
+ justify-content: space-between;
11
+ gap: var(--kv-space-3);
12
+ color: var(--kv-text-secondary);
13
+ font-size: var(--kv-text-sm);
14
+ }
15
+
16
+ :where([data-kv-design-system]) [data-ui="progress-value"] {
17
+ color: var(--kv-text-muted);
18
+ font-variant-numeric: tabular-nums;
19
+ }
20
+
21
+ :where([data-kv-design-system]) [data-ui="progress-track"] {
22
+ height: 4px;
23
+ overflow: hidden;
24
+ border-radius: var(--kv-radius-full);
25
+ background: color-mix(in srgb, var(--kv-text-main) 9%, transparent);
26
+ }
27
+
28
+ :where([data-kv-design-system]) [data-ui="progress-bar"] {
29
+ display: block;
30
+ height: 100%;
31
+ border-radius: inherit;
32
+ background: var(--kv-accent);
33
+ }
34
+
35
+ :where([data-kv-design-system]) [data-ui="progress"][data-tone="positive"] [data-ui="progress-bar"] {
36
+ background: var(--kv-success);
37
+ }
38
+
39
+ :where([data-kv-design-system]) [data-ui="progress"][data-tone="warning"] [data-ui="progress-bar"] {
40
+ background: var(--kv-warning);
41
+ }
42
+
43
+ :where([data-kv-design-system]) [data-ui="progress"][data-tone="danger"] [data-ui="progress-bar"] {
44
+ background: var(--kv-danger);
45
+ }
46
+ }
@@ -0,0 +1,10 @@
1
+ import type { TemplateResult } from '@ketvietlab/ketjs-view';
2
+ export declare const HOOKS: readonly ['progress', 'progress-label', 'progress-value', 'progress-track', 'progress-bar'];
3
+ export type ProgressTone = 'primary' | 'positive' | 'warning' | 'danger';
4
+ export declare const Progress: (props: {
5
+ value: number;
6
+ label: string;
7
+ tone?: ProgressTone;
8
+ showValue?: boolean;
9
+ }) => TemplateResult;
10
+ //# sourceMappingURL=progress.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../../../../packages/design-system/src/primitives/progress.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAE5D,eAAO,MAAM,KAAK,YAChB,UAAU,EACV,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,CACN,CAAA;AAEV,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,CAAA;AAExE,eAAO,MAAM,QAAQ,UAAW;IAC9B,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,YAAY,CAAA;IACnB,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB,KAAG,cAsBH,CAAA"}
@@ -0,0 +1,13 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "@ketvietlab/ketjs-view/jsx-runtime";
2
+ export const HOOKS = [
3
+ 'progress',
4
+ 'progress-label',
5
+ 'progress-value',
6
+ 'progress-track',
7
+ 'progress-bar',
8
+ ];
9
+ export const Progress = (props) => {
10
+ const value = Math.max(0, Math.min(100, props.value));
11
+ return (_jsxs("div", { "data-ui": "progress", "data-tone": props.tone ?? 'primary', children: [(props.showValue ?? true) && (_jsxs("div", { "data-ui": "progress-label", children: [_jsx("span", { children: props.label }), _jsx("span", { "data-ui": "progress-value", children: `${value}%` })] })), _jsx("div", { "data-ui": "progress-track", role: "progressbar", "aria-label": props.label, "aria-valuemin": "0", "aria-valuemax": "100", "aria-valuenow": String(value), children: _jsx("span", { "data-ui": "progress-bar", style: `width: ${value}%` }) })] }));
12
+ };
13
+ //# sourceMappingURL=progress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress.js","sourceRoot":"","sources":["../../../../../../packages/design-system/src/primitives/progress.tsx"],"names":[],"mappings":";AAEA,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,UAAU;IACV,gBAAgB;IAChB,gBAAgB;IAChB,gBAAgB;IAChB,cAAc;CACN,CAAA;AAIV,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,KAKxB,EAAkB,EAAE;IACnB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAA;IACrD,OAAO,CACL,0BAAa,UAAU,eAAY,KAAK,CAAC,IAAI,IAAI,SAAS,aACvD,CAAC,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,IAAI,CAC5B,0BAAa,gBAAgB,aAC3B,yBAAO,KAAK,CAAC,KAAK,GAAQ,EAC1B,0BAAc,gBAAgB,YAAE,GAAG,KAAK,GAAG,GAAQ,IAC/C,CACP,EACD,yBACU,gBAAgB,EACxB,IAAI,EAAC,aAAa,gBACN,KAAK,CAAC,KAAK,mBACT,GAAG,mBACH,KAAK,mBACJ,MAAM,CAAC,KAAK,CAAC,YAE5B,0BAAc,cAAc,EAAC,KAAK,EAAE,UAAU,KAAK,GAAG,GAAI,GACtD,IACF,CACP,CAAA;AACH,CAAC,CAAA"}
@@ -0,0 +1,27 @@
1
+ import type { TemplateResult } from '@ketvietlab/ketjs-view';
2
+ export declare const HOOKS: readonly ['badge', 'tag', 'tag-remove', 'count-badge', 'avatar', 'code'];
3
+ export type Tone = 'neutral' | 'info' | 'positive' | 'warning' | 'danger';
4
+ export declare const Badge: (props: {
5
+ label: string;
6
+ tone?: Tone;
7
+ value?: string;
8
+ }) => TemplateResult;
9
+ export declare const Tag: (props: {
10
+ label: string;
11
+ removeHref?: string | null;
12
+ removeLabel?: string | null;
13
+ }) => TemplateResult;
14
+ export declare const CountBadge: (props: {
15
+ count: number;
16
+ label: string;
17
+ }) => TemplateResult;
18
+ export declare const initials: (name: string) => string;
19
+ export declare const Avatar: (props: {
20
+ name: string;
21
+ size?: 'small' | 'default' | 'large';
22
+ }) => TemplateResult;
23
+ export declare const Code: (props: {
24
+ value: string;
25
+ context?: string | null;
26
+ }) => TemplateResult;
27
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../../../packages/design-system/src/primitives/status.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAE5D,eAAO,MAAM,KAAK,YAAI,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,CAAU,CAAA;AAE7F,MAAM,MAAM,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,CAAA;AAEzE,eAAO,MAAM,KAAK,UAAW;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,IAAI,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,KAAG,cAI7E,CAAA;AAED,eAAO,MAAM,GAAG,UAAW;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAC5B,KAAG,cAaH,CAAA;AAED,eAAO,MAAM,UAAU,UAAW;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,KAAG,cAIpE,CAAA;AAED,eAAO,MAAM,QAAQ,SAAU,MAAM,KAAG,MAMvC,CAAA;AAED,eAAO,MAAM,MAAM,UAAW;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,CAAA;CAAE,KAAG,cAItF,CAAA;AAED,eAAO,MAAM,IAAI,UAAW;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,KAAG,cAIxE,CAAA"}
@@ -0,0 +1,16 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "@ketvietlab/ketjs-view/jsx-runtime";
2
+ export const HOOKS = ['badge', 'tag', 'tag-remove', 'count-badge', 'avatar', 'code'];
3
+ export const Badge = (props) => (_jsx("span", { "data-ui": "badge", "data-tone": props.tone ?? 'neutral', "data-value": props.value ?? '', children: props.label }));
4
+ export const Tag = (props) => (_jsxs("span", { "data-ui": "tag", children: [props.label, !!props.removeHref && (_jsx("a", { "data-ui": "tag-remove", href: props.removeHref, "aria-label": props.removeLabel ?? `Remove ${props.label}`, children: "\u00D7" }))] }));
5
+ export const CountBadge = (props) => (_jsx("span", { "data-ui": "count-badge", role: "status", "aria-label": props.label, children: String(props.count) }));
6
+ export const initials = (name) => {
7
+ const parts = name.trim().split(/\s+/).filter(Boolean);
8
+ if (!parts.length)
9
+ return '?';
10
+ const first = parts.length > 1 ? parts[parts.length - 1] : parts[0];
11
+ const second = parts.length > 2 ? parts[parts.length - 2] : '';
12
+ return (second.slice(0, 1) + first.slice(0, 1)).toLocaleUpperCase('vi');
13
+ };
14
+ export const Avatar = (props) => (_jsx("span", { "data-ui": "avatar", "data-size": props.size ?? 'default', title: props.name, "aria-hidden": "true", children: initials(props.name) }));
15
+ export const Code = (props) => (_jsx("code", { "data-ui": "code", "data-context": props.context ?? null, children: props.value }));
16
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../../../../packages/design-system/src/primitives/status.tsx"],"names":[],"mappings":";AAEA,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,CAAU,CAAA;AAI7F,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,KAAqD,EAAkB,EAAE,CAAC,CAC9F,0BAAc,OAAO,eAAY,KAAK,CAAC,IAAI,IAAI,SAAS,gBAAc,KAAK,CAAC,KAAK,IAAI,EAAE,YACpF,KAAK,CAAC,KAAK,GACP,CACR,CAAA;AAED,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,KAInB,EAAkB,EAAE,CAAC,CACpB,2BAAc,KAAK,aAChB,KAAK,CAAC,KAAK,EACX,CAAC,CAAC,KAAK,CAAC,UAAU,IAAI,CACrB,uBACU,YAAY,EACpB,IAAI,EAAE,KAAK,CAAC,UAAU,gBACV,KAAK,CAAC,WAAW,IAAI,UAAU,KAAK,CAAC,KAAK,EAAE,uBAGtD,CACL,IACI,CACR,CAAA;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,KAAuC,EAAkB,EAAE,CAAC,CACrF,0BAAc,aAAa,EAAC,IAAI,EAAC,QAAQ,gBAAa,KAAK,CAAC,KAAK,YAC9D,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GACf,CACR,CAAA;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAU,EAAE;IAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IACtD,IAAI,CAAC,KAAK,CAAC,MAAM;QAAE,OAAO,GAAG,CAAA;IAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAE,CAAA;IACrE,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,CAAC,CAAC,EAAE,CAAA;IAC/D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAA;AACzE,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,KAA6D,EAAkB,EAAE,CAAC,CACvG,0BAAc,QAAQ,eAAY,KAAK,CAAC,IAAI,IAAI,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,iBAAc,MAAM,YAC7F,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,GAChB,CACR,CAAA;AAED,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,KAAiD,EAAkB,EAAE,CAAC,CACzF,0BAAc,MAAM,kBAAe,KAAK,CAAC,OAAO,IAAI,IAAI,YACrD,KAAK,CAAC,KAAK,GACP,CACR,CAAA"}
@@ -0,0 +1,9 @@
1
+ @import "./foundations/tokens.css";
2
+ @import "./foundations/reset.css";
3
+ @import "./primitives/primitives.css";
4
+ @import "./primitives/navigation.css";
5
+ @import "./primitives/progress.css";
6
+ @import "./layouts/layouts.css";
7
+ @import "./layouts/shell.css";
8
+ /* FormPage rail contract: desktop content is 2:1; narrow screens stack. */
9
+ @import "./patterns/patterns.css";