ds-tis 1.0.0-beta.10

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 (79) hide show
  1. package/LICENSE +49 -0
  2. package/README.md +125 -0
  3. package/css/base/forced-colors.css +62 -0
  4. package/css/base/icons.css +73 -0
  5. package/css/base/index.css +4 -0
  6. package/css/base/reset.css +80 -0
  7. package/css/base/typography.css +211 -0
  8. package/css/components/accordion.css +153 -0
  9. package/css/components/alert.css +161 -0
  10. package/css/components/avatar.css +76 -0
  11. package/css/components/badge.css +83 -0
  12. package/css/components/breadcrumb.css +58 -0
  13. package/css/components/button.css +364 -0
  14. package/css/components/card.css +159 -0
  15. package/css/components/checkbox.css +296 -0
  16. package/css/components/combobox.css +330 -0
  17. package/css/components/divider.css +20 -0
  18. package/css/components/form-field.css +137 -0
  19. package/css/components/index.css +28 -0
  20. package/css/components/input.css +356 -0
  21. package/css/components/link.css +67 -0
  22. package/css/components/menu.css +246 -0
  23. package/css/components/modal.css +236 -0
  24. package/css/components/pagination.css +132 -0
  25. package/css/components/radio.css +280 -0
  26. package/css/components/select.css +399 -0
  27. package/css/components/skeleton.css +52 -0
  28. package/css/components/spinner.css +59 -0
  29. package/css/components/tabs.css +79 -0
  30. package/css/components/textarea.css +218 -0
  31. package/css/components/toggle.css +202 -0
  32. package/css/components/tooltip.css +116 -0
  33. package/css/design-system.css +13 -0
  34. package/css/tokens/generated/component.css +720 -0
  35. package/css/tokens/generated/foundation.css +282 -0
  36. package/css/tokens/generated/index.css +5 -0
  37. package/css/tokens/generated/theme-dark.css +243 -0
  38. package/css/tokens/generated/theme-light.css +244 -0
  39. package/css/tokens/index.css +6 -0
  40. package/css/utilities/elevation.css +24 -0
  41. package/css/utilities/index.css +2 -0
  42. package/css/utilities/layout.css +132 -0
  43. package/docs/agent-consumer-usage.en.md +322 -0
  44. package/docs/agent-consumer-usage.md +294 -0
  45. package/docs/api/adrs.json +186 -0
  46. package/docs/api/components.json +2071 -0
  47. package/docs/api/consumer-context.json +66 -0
  48. package/docs/api/foundations.json +94 -0
  49. package/docs/api/tokens.json +6839 -0
  50. package/docs/llms-full.txt +23699 -0
  51. package/docs/llms.txt +109 -0
  52. package/docs/templates/contact.html +364 -0
  53. package/docs/templates/dashboard.html +318 -0
  54. package/docs/templates/index.html +232 -0
  55. package/docs/templates/login.html +286 -0
  56. package/docs/templates/settings.html +365 -0
  57. package/docs/templates/signup.html +350 -0
  58. package/js/accordion.js +192 -0
  59. package/js/combobox.js +263 -0
  60. package/js/menu.js +301 -0
  61. package/js/modal.js +256 -0
  62. package/js/package.json +3 -0
  63. package/js/tabs.js +200 -0
  64. package/js/theme/apply.js +75 -0
  65. package/js/theme/brand-contrast-audit.js +133 -0
  66. package/js/theme/color.js +149 -0
  67. package/js/theme/config-schema.js +40 -0
  68. package/js/theme/contrast.js +76 -0
  69. package/js/theme/export.js +118 -0
  70. package/js/theme/index.js +21 -0
  71. package/js/theme/overlay.js +29 -0
  72. package/js/theme/package.json +3 -0
  73. package/js/theme/palette.js +103 -0
  74. package/js/theme/radius.js +76 -0
  75. package/js/theme/semantic-mapper.js +138 -0
  76. package/js/theme/typography.js +33 -0
  77. package/js/theme/url-state.js +52 -0
  78. package/js/tooltip.js +227 -0
  79. package/package.json +139 -0
@@ -0,0 +1,364 @@
1
+ /* ============================================================
2
+ COMPONENT: Button — aligned with Figma specs
3
+ Sizes: sm=32px, md=40px, lg=48px
4
+ ============================================================ */
5
+
6
+ .ds-button {
7
+ --_ds-button-focus-ring-color: var(--ds-focus-ring-color-default);
8
+ display: inline-flex;
9
+ align-items: center;
10
+ justify-content: center;
11
+ gap: var(--ds-button-gap-md);
12
+ font-family: var(--ds-button-label-font-family-default);
13
+ font-weight: var(--ds-button-label-font-weight-default);
14
+ line-height: var(--ds-button-label-line-height-md);
15
+ letter-spacing: var(--ds-button-label-letter-spacing-default);
16
+ text-decoration: none;
17
+ border: var(--ds-button-border-width-default) solid transparent;
18
+ border-radius: var(--ds-button-radius-default);
19
+ cursor: pointer;
20
+ transition: background-color var(--ds-motion-duration-fast) var(--ds-motion-ease-default),
21
+ border-color var(--ds-motion-duration-fast) var(--ds-motion-ease-default),
22
+ color var(--ds-motion-duration-fast) var(--ds-motion-ease-default),
23
+ box-shadow var(--ds-motion-duration-fast) var(--ds-motion-ease-default);
24
+ white-space: nowrap;
25
+ user-select: none;
26
+
27
+ /* Default size: md (40px) */
28
+ height: var(--ds-button-height-md);
29
+ padding: var(--ds-button-padding-y-md) var(--ds-button-padding-x-md);
30
+ font-size: var(--ds-button-label-font-size-md);
31
+ min-width: var(--ds-button-min-width-md);
32
+ }
33
+
34
+ .ds-button:focus-visible {
35
+ outline: var(--ds-focus-ring-width) solid var(--_ds-button-focus-ring-color);
36
+ outline-offset: var(--ds-focus-ring-width);
37
+ }
38
+
39
+ .ds-button[disabled],
40
+ .ds-button--disabled {
41
+ cursor: not-allowed;
42
+ pointer-events: none;
43
+ }
44
+
45
+ .ds-button__icon {
46
+ width: var(--ds-button-icon-size-md);
47
+ height: var(--ds-button-icon-size-md);
48
+ flex-shrink: 0;
49
+ color: currentColor;
50
+ fill: none;
51
+ stroke: currentColor;
52
+ stroke-width: var(--ds-button-icon-stroke-width-md);
53
+ }
54
+
55
+ .ds-button__label {
56
+ padding-inline: var(--ds-button-label-frame-padding-x-default);
57
+ }
58
+
59
+ /* ---------------------------------------------------------
60
+ Sizes
61
+ --------------------------------------------------------- */
62
+ .ds-button--sm {
63
+ height: var(--ds-button-height-sm);
64
+ padding: var(--ds-button-padding-y-sm) var(--ds-button-padding-x-sm);
65
+ font-size: var(--ds-button-label-font-size-sm);
66
+ line-height: var(--ds-button-label-line-height-sm);
67
+ min-width: var(--ds-button-min-width-sm);
68
+ gap: var(--ds-button-gap-sm);
69
+ }
70
+
71
+ .ds-button--sm .ds-button__icon {
72
+ width: var(--ds-button-icon-size-sm);
73
+ height: var(--ds-button-icon-size-sm);
74
+ stroke-width: var(--ds-button-icon-stroke-width-sm);
75
+ }
76
+
77
+ .ds-button--lg {
78
+ height: var(--ds-button-height-lg);
79
+ padding: var(--ds-button-padding-y-lg) var(--ds-button-padding-x-lg);
80
+ font-size: var(--ds-button-label-font-size-lg);
81
+ line-height: var(--ds-button-label-line-height-lg);
82
+ min-width: var(--ds-button-min-width-lg);
83
+ gap: var(--ds-button-gap-lg);
84
+ }
85
+
86
+ .ds-button--lg .ds-button__icon {
87
+ width: var(--ds-button-icon-size-lg);
88
+ height: var(--ds-button-icon-size-lg);
89
+ stroke-width: var(--ds-button-icon-stroke-width-lg);
90
+ }
91
+
92
+ /* ---------------------------------------------------------
93
+ Variant: Brand (primary filled — action/primary/default)
94
+ --------------------------------------------------------- */
95
+ .ds-button--brand {
96
+ background-color: var(--ds-button-bg-brand-default);
97
+ color: var(--ds-button-content-color-brand-default);
98
+ border-color: transparent;
99
+ }
100
+
101
+ .ds-button--brand:focus-visible {
102
+ background-color: var(--ds-button-bg-brand-focus);
103
+ color: var(--ds-button-content-color-brand-focus);
104
+ }
105
+
106
+ .ds-button--brand:hover {
107
+ background-color: var(--ds-button-bg-brand-hover);
108
+ color: var(--ds-button-content-color-brand-hover);
109
+ }
110
+
111
+ .ds-button--brand:active {
112
+ background-color: var(--ds-button-bg-brand-pressed);
113
+ color: var(--ds-button-content-color-brand-pressed);
114
+ }
115
+
116
+ .ds-button--brand[disabled],
117
+ .ds-button--brand.ds-button--disabled {
118
+ background-color: var(--ds-button-bg-brand-disabled);
119
+ color: var(--ds-button-content-color-brand-disabled);
120
+ }
121
+
122
+ /* ---------------------------------------------------------
123
+ Variant: Toned (alpha-tinted primary — action/primary/toned)
124
+ --------------------------------------------------------- */
125
+ .ds-button--toned {
126
+ background-color: var(--ds-button-bg-toned-default);
127
+ color: var(--ds-button-content-color-toned-default);
128
+ border-color: transparent;
129
+ }
130
+
131
+ .ds-button--toned:focus-visible {
132
+ background-color: var(--ds-button-bg-toned-focus);
133
+ color: var(--ds-button-content-color-toned-focus);
134
+ }
135
+
136
+ .ds-button--toned:hover {
137
+ background-color: var(--ds-button-bg-toned-hover);
138
+ color: var(--ds-button-content-color-toned-hover);
139
+ }
140
+
141
+ .ds-button--toned:active {
142
+ background-color: var(--ds-button-bg-toned-pressed);
143
+ color: var(--ds-button-content-color-toned-pressed);
144
+ }
145
+
146
+ .ds-button--toned[disabled],
147
+ .ds-button--toned.ds-button--disabled {
148
+ background-color: var(--ds-button-bg-toned-disabled);
149
+ color: var(--ds-button-content-color-toned-disabled);
150
+ }
151
+
152
+ /* ---------------------------------------------------------
153
+ Variant: Outline (neutral — action/secondary/outline)
154
+ --------------------------------------------------------- */
155
+ .ds-button--outline {
156
+ background-color: transparent;
157
+ color: var(--ds-button-content-color-outline-default);
158
+ border-color: var(--ds-button-border-color-outline-default);
159
+ }
160
+
161
+ .ds-button--outline:focus-visible {
162
+ color: var(--ds-button-content-color-outline-focus);
163
+ border-color: var(--ds-button-border-color-outline-focus);
164
+ }
165
+
166
+ .ds-button--outline:hover {
167
+ background-color: var(--ds-button-bg-outline-hover);
168
+ color: var(--ds-button-content-color-outline-hover);
169
+ border-color: var(--ds-button-border-color-outline-hover);
170
+ }
171
+
172
+ .ds-button--outline:active {
173
+ background-color: var(--ds-button-bg-outline-pressed);
174
+ color: var(--ds-button-content-color-outline-pressed);
175
+ border-color: var(--ds-button-border-color-outline-pressed);
176
+ }
177
+
178
+ .ds-button--outline[disabled],
179
+ .ds-button--outline.ds-button--disabled {
180
+ background-color: transparent;
181
+ color: var(--ds-button-content-color-outline-disabled);
182
+ border-color: var(--ds-button-border-color-outline-disabled);
183
+ }
184
+
185
+ /* ---------------------------------------------------------
186
+ Variant: Ghost (primary color, no background — action/primary/ghost)
187
+ --------------------------------------------------------- */
188
+ .ds-button--ghost {
189
+ background-color: transparent;
190
+ color: var(--ds-button-content-color-ghost-default);
191
+ border-color: transparent;
192
+ }
193
+
194
+ .ds-button--ghost:focus-visible {
195
+ color: var(--ds-button-content-color-ghost-focus);
196
+ }
197
+
198
+ .ds-button--ghost:hover {
199
+ background-color: var(--ds-button-bg-ghost-hover);
200
+ color: var(--ds-button-content-color-ghost-hover);
201
+ }
202
+
203
+ .ds-button--ghost:active {
204
+ background-color: var(--ds-button-bg-ghost-pressed);
205
+ color: var(--ds-button-content-color-ghost-pressed);
206
+ }
207
+
208
+ .ds-button--ghost[disabled],
209
+ .ds-button--ghost.ds-button--disabled {
210
+ background-color: transparent;
211
+ color: var(--ds-button-content-color-ghost-disabled);
212
+ }
213
+
214
+ /* ---------------------------------------------------------
215
+ Variant: Success
216
+ --------------------------------------------------------- */
217
+ .ds-button--success {
218
+ --_ds-button-focus-ring-color: var(--ds-focus-ring-color-success);
219
+ background-color: var(--ds-button-bg-success-default);
220
+ color: var(--ds-button-content-color-success-default);
221
+ border-color: transparent;
222
+ }
223
+
224
+ .ds-button--success:focus-visible {
225
+ background-color: var(--ds-button-bg-success-focus);
226
+ color: var(--ds-button-content-color-success-focus);
227
+ }
228
+
229
+ .ds-button--success:hover {
230
+ background-color: var(--ds-button-bg-success-hover);
231
+ color: var(--ds-button-content-color-success-hover);
232
+ }
233
+
234
+ .ds-button--success:active {
235
+ background-color: var(--ds-button-bg-success-pressed);
236
+ color: var(--ds-button-content-color-success-pressed);
237
+ }
238
+
239
+ .ds-button--success[disabled],
240
+ .ds-button--success.ds-button--disabled {
241
+ background-color: var(--ds-button-bg-success-disabled);
242
+ color: var(--ds-button-content-color-success-disabled);
243
+ }
244
+
245
+ /* ---------------------------------------------------------
246
+ Variant: Danger (action/danger/default)
247
+ --------------------------------------------------------- */
248
+ .ds-button--danger {
249
+ --_ds-button-focus-ring-color: var(--ds-focus-ring-color-error);
250
+ background-color: var(--ds-button-bg-danger-default);
251
+ color: var(--ds-button-content-color-danger-default);
252
+ border-color: transparent;
253
+ }
254
+
255
+ .ds-button--danger:focus-visible {
256
+ background-color: var(--ds-button-bg-danger-focus);
257
+ color: var(--ds-button-content-color-danger-focus);
258
+ }
259
+
260
+ .ds-button--danger:hover {
261
+ background-color: var(--ds-button-bg-danger-hover);
262
+ color: var(--ds-button-content-color-danger-hover);
263
+ }
264
+
265
+ .ds-button--danger:active {
266
+ background-color: var(--ds-button-bg-danger-pressed);
267
+ color: var(--ds-button-content-color-danger-pressed);
268
+ }
269
+
270
+ .ds-button--danger[disabled],
271
+ .ds-button--danger.ds-button--disabled {
272
+ background-color: var(--ds-button-bg-danger-disabled);
273
+ color: var(--ds-button-content-color-danger-disabled);
274
+ }
275
+
276
+ /* ---------------------------------------------------------
277
+ Icon Only
278
+ --------------------------------------------------------- */
279
+ .ds-button--icon-only {
280
+ aspect-ratio: 1;
281
+ box-sizing: border-box;
282
+ min-width: 0;
283
+ }
284
+
285
+ .ds-button--icon-only.ds-button--sm {
286
+ width: var(--ds-button-icon-only-width-sm);
287
+ min-width: var(--ds-button-icon-only-width-sm);
288
+ padding: var(--ds-button-icon-only-padding-sm);
289
+ }
290
+
291
+ .ds-button--icon-only:not(.ds-button--sm):not(.ds-button--lg) {
292
+ width: var(--ds-button-icon-only-width-md);
293
+ min-width: var(--ds-button-icon-only-width-md);
294
+ padding: var(--ds-button-icon-only-padding-md);
295
+ }
296
+
297
+ .ds-button--icon-only.ds-button--lg {
298
+ width: var(--ds-button-icon-only-width-lg);
299
+ min-width: var(--ds-button-icon-only-width-lg);
300
+ padding: var(--ds-button-icon-only-padding-lg);
301
+ }
302
+
303
+ .ds-button .ds-icon {
304
+ width: var(--ds-button-icon-size-md);
305
+ height: var(--ds-button-icon-size-md);
306
+ color: currentColor;
307
+ fill: none;
308
+ stroke: currentColor;
309
+ stroke-width: var(--ds-button-icon-stroke-width-md);
310
+ }
311
+
312
+ .ds-button--sm .ds-icon {
313
+ width: var(--ds-button-icon-size-sm);
314
+ height: var(--ds-button-icon-size-sm);
315
+ stroke-width: var(--ds-button-icon-stroke-width-sm);
316
+ }
317
+
318
+ .ds-button--lg .ds-icon {
319
+ width: var(--ds-button-icon-size-lg);
320
+ height: var(--ds-button-icon-size-lg);
321
+ stroke-width: var(--ds-button-icon-stroke-width-lg);
322
+ }
323
+
324
+ /* ---------------------------------------------------------
325
+ Full Width
326
+ --------------------------------------------------------- */
327
+ .ds-button--full {
328
+ width: 100%;
329
+ }
330
+
331
+ /* ---------------------------------------------------------
332
+ Loading
333
+ --------------------------------------------------------- */
334
+ .ds-button--loading {
335
+ position: relative;
336
+ pointer-events: none;
337
+ }
338
+
339
+ .ds-button--loading .ds-button__label,
340
+ .ds-button--loading .ds-button__icon {
341
+ visibility: hidden;
342
+ }
343
+
344
+ .ds-button__spinner {
345
+ position: absolute;
346
+ inset: 0;
347
+ display: flex;
348
+ align-items: center;
349
+ justify-content: center;
350
+ }
351
+
352
+ .ds-button--brand .ds-spinner,
353
+ .ds-button--success .ds-spinner,
354
+ .ds-button--danger .ds-spinner {
355
+ border-color: var(--ds-spinner-track-border-color-on-color);
356
+ border-top-color: var(--ds-spinner-indicator-border-color-on-color);
357
+ }
358
+
359
+ /* ---------------------------------------------------------
360
+ Reduced motion
361
+ --------------------------------------------------------- */
362
+ @media (prefers-reduced-motion: reduce) {
363
+ .ds-button { transition: none; }
364
+ }
@@ -0,0 +1,159 @@
1
+ /* ============================================================
2
+ COMPONENT: Card
3
+ ============================================================ */
4
+
5
+ .ds-card {
6
+ background-color: var(--ds-card-bg-default);
7
+ border-radius: var(--ds-card-radius-default);
8
+ display: flex;
9
+ flex-direction: column;
10
+ overflow: hidden;
11
+ }
12
+
13
+ .ds-card__media {
14
+ width: 100%;
15
+ height: calc(var(--ds-size-layout-xs) / 2);
16
+ flex-shrink: 0;
17
+ overflow: hidden;
18
+ }
19
+
20
+ .ds-card__media img,
21
+ .ds-card__media > picture,
22
+ .ds-card__media > video {
23
+ width: 100%;
24
+ height: 100%;
25
+ object-fit: cover;
26
+ }
27
+
28
+ .ds-card__container {
29
+ display: flex;
30
+ flex-direction: column;
31
+ gap: var(--ds-card-container-gap-default);
32
+ padding: var(--ds-card-container-padding-default);
33
+ width: 100%;
34
+ }
35
+
36
+ .ds-card:not(:has(.ds-card__container)) {
37
+ gap: var(--ds-card-container-gap-default);
38
+ padding: var(--ds-card-container-padding-default);
39
+ }
40
+
41
+ .ds-card__header {
42
+ display: flex;
43
+ flex-direction: column;
44
+ gap: var(--ds-card-header-gap-default);
45
+ min-width: 0;
46
+ }
47
+
48
+ /* Title — body/xl semibold in Figma */
49
+ .ds-card__title {
50
+ margin: 0;
51
+ font-size: var(--ds-card-title-font-size-default);
52
+ font-weight: var(--ds-card-title-font-weight-default);
53
+ color: var(--ds-card-title-color-default);
54
+ line-height: var(--ds-card-title-line-height-default);
55
+ overflow-wrap: anywhere;
56
+ }
57
+
58
+ /* Description — body/sm bold in Figma */
59
+ .ds-card__subtitle,
60
+ .ds-card__description {
61
+ margin: 0;
62
+ font-size: var(--ds-card-subtitle-font-size-default);
63
+ font-weight: var(--ds-card-subtitle-font-weight-default);
64
+ line-height: var(--ds-card-subtitle-line-height-default);
65
+ color: var(--ds-card-subtitle-color-default);
66
+ overflow-wrap: anywhere;
67
+ }
68
+
69
+ /* Body — body/sm in Figma */
70
+ .ds-card__body {
71
+ display: flex;
72
+ flex-direction: column;
73
+ gap: var(--ds-card-container-gap-default);
74
+ min-width: 0;
75
+ font-size: var(--ds-card-body-font-size-default);
76
+ font-weight: var(--ds-card-body-font-weight-default);
77
+ color: var(--ds-card-body-color-default);
78
+ line-height: var(--ds-card-body-line-height-default);
79
+ overflow-wrap: anywhere;
80
+ }
81
+
82
+ .ds-card__body > :where(p, ul, ol, dl, blockquote, figure) {
83
+ margin: 0;
84
+ }
85
+
86
+ .ds-card__footer {
87
+ display: flex;
88
+ justify-content: flex-end;
89
+ gap: var(--ds-card-footer-gap-default);
90
+ min-width: 0;
91
+ }
92
+
93
+ /* ---------------------------------------------------------
94
+ Variants
95
+ --------------------------------------------------------- */
96
+
97
+ /* Default — subtle border */
98
+ .ds-card--default {
99
+ border: var(--ds-card-border-width-default) solid var(--ds-card-border-color-outlined);
100
+ }
101
+
102
+ /* Outlined — stronger border */
103
+ .ds-card--outlined {
104
+ border: var(--ds-card-border-width-default) solid var(--ds-card-border-color-outlined);
105
+ }
106
+
107
+ /* Elevated — raised surface + semantic card shadow, no stroke in Figma. */
108
+ .ds-card--elevated {
109
+ background-color: var(--ds-card-bg-elevated);
110
+ box-shadow: var(--ds-shadow-card);
111
+ }
112
+
113
+ /* Interactive Card — mirrors the Figma Card Interactive set. */
114
+ .ds-card--interactive {
115
+ position: relative;
116
+ border: var(--ds-card-interactive-border-width-default) solid var(--ds-card-interactive-border-color-default);
117
+ cursor: pointer;
118
+ transition:
119
+ border-color var(--ds-motion-duration-fast) var(--ds-motion-ease-default),
120
+ box-shadow var(--ds-motion-duration-fast) var(--ds-motion-ease-default);
121
+ }
122
+
123
+ .ds-card--interactive::after {
124
+ content: "";
125
+ position: absolute;
126
+ inset: calc(var(--ds-focus-ring-width) * -2);
127
+ border: var(--ds-focus-ring-width) solid var(--ds-focus-ring-color-default);
128
+ border-radius: var(--ds-card-interactive-focus-ring-radius-default);
129
+ pointer-events: none;
130
+ opacity: 0;
131
+ }
132
+
133
+ .ds-card--interactive:hover,
134
+ .ds-card--interactive.ds-card--hover {
135
+ border-color: var(--ds-card-interactive-border-color-hover);
136
+ }
137
+
138
+ .ds-card--interactive:focus-visible,
139
+ .ds-card--interactive.ds-card--focus {
140
+ outline: none;
141
+ border-color: var(--ds-card-interactive-border-color-default);
142
+ }
143
+
144
+ .ds-card--interactive:focus-visible::after,
145
+ .ds-card--interactive.ds-card--focus::after {
146
+ opacity: 1;
147
+ }
148
+
149
+ .ds-card--interactive.ds-card--selected,
150
+ .ds-card--interactive[aria-selected="true"] {
151
+ border-color: var(--ds-card-interactive-border-color-selected);
152
+ border-width: var(--ds-card-interactive-border-width-selected);
153
+ }
154
+
155
+ @media (prefers-reduced-motion: reduce) {
156
+ .ds-card--interactive {
157
+ transition: none;
158
+ }
159
+ }