twntyx-css 1.0.3 → 1.0.5

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 (61) hide show
  1. package/llm/components/ai-perl.json +5 -12
  2. package/llm/components/all-components.json +13 -5
  3. package/llm/components/{banner-marketplace.json → banner-funding.json} +8 -8
  4. package/llm/components/breadcrumb.json +0 -1
  5. package/llm/components/button-container.json +1 -0
  6. package/llm/components/chat-ai.json +100 -6
  7. package/llm/components/chat-footer.json +24 -3
  8. package/llm/components/checkmark.json +0 -1
  9. package/llm/components/command-palette.json +0 -1
  10. package/llm/components/countdown.json +1 -1
  11. package/llm/components/divider.json +1 -1
  12. package/llm/components/kbd.json +1 -1
  13. package/llm/components/key-value.json +2 -10
  14. package/llm/components/loader-symbol.json +0 -4
  15. package/llm/components/loader-text.json +2 -20
  16. package/llm/components/progress-bullet.json +0 -1
  17. package/llm/components/state.json +2 -1
  18. package/llm/components/stepper.json +1 -1
  19. package/llm/components/steps.json +6 -95
  20. package/llm/components/surface.json +2 -0
  21. package/llm/components/tabs.json +1 -0
  22. package/llm/components/{empty-state.json → template-navbar.json} +26 -27
  23. package/llm/components/text-input.json +8 -169
  24. package/llm/components/toast.json +0 -2
  25. package/llm/components/tooltip.json +1 -1
  26. package/llm/examples/ai-perl.html +1 -1
  27. package/llm/examples/banner-funding.html +1 -0
  28. package/llm/examples/chat-ai.html +1 -1
  29. package/llm/examples/chat-footer.html +1 -1
  30. package/llm/examples/key-value.html +1 -1
  31. package/llm/examples/loader-text.html +1 -1
  32. package/llm/examples/steps.html +1 -1
  33. package/llm/examples/template-navbar.html +1 -0
  34. package/llm/index.json +24 -62
  35. package/llm/patterns.json +2 -2
  36. package/llm/tokens.json +30 -30
  37. package/package.json +1 -1
  38. package/styles/animation.css +69 -47
  39. package/styles/colors.css +306 -90
  40. package/styles/datepicker.css +8 -15
  41. package/styles/divider.css +1 -1
  42. package/styles/form.css +6 -8
  43. package/styles/globals.css +62 -64
  44. package/styles/key-value.css +4 -3
  45. package/styles/loader.css +0 -6
  46. package/styles/logotype.css +6 -6
  47. package/styles/scrollbar.css +2 -2
  48. package/styles/shared.css +17 -17
  49. package/styles/state.css +109 -97
  50. package/styles/steps.css +2 -2
  51. package/styles/surface.css +74 -90
  52. package/styles/table.css +3 -3
  53. package/styles/toast.css +3 -5
  54. package/llm/components/input-group.json +0 -94
  55. package/llm/components/navbar.json +0 -158
  56. package/llm/examples/banner-marketplace.html +0 -1
  57. package/llm/examples/empty-state.html +0 -1
  58. package/llm/examples/input-group.html +0 -1
  59. package/llm/examples/navbar.html +0 -1
  60. package/styles/empty-state.css +0 -48
  61. package/styles/navbar.css +0 -48
package/styles/state.css CHANGED
@@ -3,138 +3,150 @@
3
3
  /*----------------------------*/
4
4
 
5
5
  @property --state-progress {
6
- syntax: "<percentage>";
6
+ syntax: '<percentage>';
7
7
  inherits: false;
8
8
  initial-value: calc(0 * 1%);
9
9
  }
10
10
 
11
11
  @utility state {
12
- @apply py-12 mx-auto max-w-md text-center;
12
+ @apply py-12 mx-auto max-w-md text-center;
13
13
 
14
- /* Alignment variants */
15
- &.state-left {
16
- @apply text-left;
17
- .state-icon {
18
- @apply mx-0;
19
- }
20
- .state-actions {
21
- @apply justify-start mx-0;
22
- }
14
+ /* Alignment variants */
15
+ &.state-left {
16
+ @apply text-left;
17
+ .state-icon {
18
+ @apply mx-0;
23
19
  }
24
- &.state-right {
25
- @apply text-right;
26
- .state-icon {
27
- @apply mx-0;
28
- }
29
- .state-actions {
30
- @apply justify-end mx-0;
31
- }
20
+ .state-actions {
21
+ @apply justify-start mx-0;
32
22
  }
23
+ }
24
+ &.state-right {
25
+ @apply text-right;
26
+ .state-icon {
27
+ @apply mx-0;
28
+ }
29
+ .state-actions {
30
+ @apply justify-end mx-0;
31
+ }
32
+ }
33
+
34
+ /* Icon container */
35
+ .state-icon {
36
+ @apply inline-flex relative justify-center items-center mx-0 mb-4 rounded-full size-24;
37
+ @apply bg-background-brand/20 border border-line-brand/40;
33
38
 
34
- /* Icon container */
39
+ &::before {
40
+ @apply content-[''] absolute inset-0 rounded-full mask;
41
+ }
42
+
43
+ /* Center alignment */
44
+ .state-center & {
45
+ @apply mx-auto;
46
+ }
47
+ /* Icon image */
48
+ img {
49
+ @apply w-full aspect-square;
50
+ }
51
+
52
+ svg {
53
+ @apply w-1/2 h-auto size-fit;
54
+ }
55
+ }
56
+ /* Animated variant */
57
+ &.has-animation {
35
58
  .state-icon {
36
- @apply inline-flex relative justify-center items-center mx-0 mb-4 rounded-full size-24;
59
+ @apply border-none;
37
60
 
38
61
  &::before {
39
- @apply content-[''] absolute inset-0 rounded-full mask;
62
+ @apply content-[''] absolute z-10 inset-0 rounded-full;
63
+ background: conic-gradient(
64
+ currentColor var(--state-progress),
65
+ transparent 0
66
+ );
67
+ mask: radial-gradient(
68
+ farthest-side,
69
+ transparent calc(100% - 1.5px),
70
+ #fff 0
71
+ );
72
+ animation: circle-progress 1.2s cubic-bezier(0.86, 0, 0.07, 1) forwards;
40
73
  }
41
74
 
42
- /* Center alignment */
43
- .state-center & {
44
- @apply mx-auto;
45
- }
46
- /* Icon image */
47
75
  img {
48
- @apply w-full aspect-square;
76
+ @apply animate-fire-in;
77
+ animation-delay: 850ms;
49
78
  }
50
- }
51
- /* Animated variant */
52
- &.has-animation {
53
- .state-icon {
54
- @apply border-none;
55
-
56
- &::before {
57
- @apply content-[''] absolute z-10 inset-0 rounded-full;
58
- background: conic-gradient(currentColor var(--state-progress), transparent 0);
59
- mask: radial-gradient(farthest-side, transparent calc(100% - 1.5px), #fff 0);
60
- animation: circle-progress 1.2s cubic-bezier(0.86, 0, 0.07, 1) forwards;
61
- }
62
-
63
- img {
64
- @apply animate-fire-in;
65
- animation-delay: 850ms;
66
- }
67
- &::after {
68
- @apply content-[''] absolute z-0 inset-0 rounded-full border border-line-default animate-ripple-out;
69
- animation-delay: 1350ms;
70
- }
79
+ &::after {
80
+ @apply content-[''] absolute z-0 inset-0 rounded-full border border-line-default animate-ripple-out;
81
+ animation-delay: 1350ms;
71
82
  }
83
+ }
72
84
 
73
- > *:not(.state-icon) {
74
- @apply animate-success-in-top;
75
- &:nth-child(1) {
76
- animation-delay: 200ms;
77
- }
78
- &:nth-child(2) {
79
- animation-delay: 600ms;
80
- }
81
- &:nth-child(3) {
82
- animation-delay: 800ms;
83
- }
84
- &:nth-child(4) {
85
- animation-delay: 1000ms;
86
- }
85
+ > *:not(.state-icon) {
86
+ @apply animate-success-in-top;
87
+ &:nth-child(1) {
88
+ animation-delay: 200ms;
89
+ }
90
+ &:nth-child(2) {
91
+ animation-delay: 600ms;
92
+ }
93
+ &:nth-child(3) {
94
+ animation-delay: 800ms;
95
+ }
96
+ &:nth-child(4) {
97
+ animation-delay: 1000ms;
87
98
  }
88
99
  }
100
+ }
89
101
 
90
- /* Variants */
91
- &.state-success {
92
- .state-icon {
93
- @apply surface-success;
94
- &::before {
95
- @apply text-line-success;
96
- }
102
+ /* Variants */
103
+ &.state-success {
104
+ .state-icon {
105
+ @apply surface-success;
106
+ &::before {
107
+ @apply text-line-success;
97
108
  }
98
109
  }
110
+ }
99
111
 
100
- &.state-error {
101
- .state-icon {
102
- @apply surface-error;
103
- &::before {
104
- @apply text-line-error;
105
- }
112
+ &.state-error {
113
+ .state-icon {
114
+ @apply surface-error;
115
+ &::before {
116
+ @apply text-line-error;
106
117
  }
107
118
  }
119
+ }
108
120
 
109
- &.state-info {
110
- .state-icon {
111
- @apply bg-brand-soft;
112
- &::before {
113
- @apply text-brand-default;
114
- }
121
+ &.state-info {
122
+ .state-icon {
123
+ @apply surface-info;
124
+ &::before {
125
+ @apply text-brand-default;
115
126
  }
116
127
  }
128
+ }
117
129
 
118
- &.state-warning {
119
- .state-icon {
120
- @apply surface-warning;
121
- &::before {
122
- @apply text-line-warning;
123
- }
130
+ &.state-warning {
131
+ .state-icon {
132
+ @apply surface-warning;
133
+ &::before {
134
+ @apply text-line-warning;
124
135
  }
125
136
  }
137
+ }
126
138
 
127
- /* Title */
128
- .state-title {
129
- @apply mb-2 h3 text-balance font-heading font-bold;
130
- }
139
+ /* Title */
140
+ .state-title {
141
+ @apply mb-2 h3 text-balance font-heading font-bold;
142
+ }
131
143
 
132
- /* Description */
133
- .state-description {
134
- @apply mb-4 p2 text-balance;
135
- }
144
+ /* Description */
145
+ .state-description {
146
+ @apply mb-4 p2 text-balance;
147
+ }
136
148
 
137
- /* Actions */
149
+ /* Actions */
138
150
  .state-actions {
139
151
  @apply flex flex-col gap-2 justify-center mx-auto mt-4 md:flex-row;
140
152
  }
package/styles/steps.css CHANGED
@@ -10,7 +10,7 @@
10
10
  grid-auto-columns: 1fr;
11
11
 
12
12
  li {
13
- @apply grid grid-cols-1 grid-rows-2 place-items-center text-center gap-2 min-w-[4rem] relative text-text-default text-sm;
13
+ @apply grid grid-cols-1 grid-rows-2 place-items-center text-center gap-2 min-w-16 relative text-text-default text-sm;
14
14
 
15
15
  &,
16
16
  &::before,
@@ -44,7 +44,7 @@
44
44
  ~ li {
45
45
  @apply text-text-tertiary;
46
46
  &::before {
47
- @apply bg-line-default from-line-default to-line-default shadow-none border-line-default text-text-tertiary;
47
+ @apply bg-line-default from-line-default to-line-default shadow-none border-line-default text-text-tertiary text-shadow-white/50;
48
48
  }
49
49
  &::after {
50
50
  @apply bg-line-default;
@@ -4,16 +4,14 @@
4
4
 
5
5
  /* Base Surface */
6
6
  @utility surface {
7
- @apply
8
- border
7
+ @apply border
9
8
  bg-background-surface
10
9
  border-line-default;
11
10
  }
12
11
 
13
12
  /* Surface Variants */
14
13
  @utility surface-placeholder {
15
- @apply
16
- border
14
+ @apply border
17
15
  border-dashed
18
16
  bg-background-page
19
17
  border-line-highlight
@@ -21,11 +19,10 @@
21
19
  }
22
20
 
23
21
  @utility surface-elevated {
24
- @apply
25
- border
22
+ @apply border
26
23
  bg-background-surface-elevated
27
24
  border-line-hover/30
28
- shadow-[inset_0_-2px_2px_color-mix(in_srgb,var(--tw-inset-shadow-color)_100%,transparent),inset_0_-4px_4px_color-mix(in_srgb,var(--tw-inset-shadow-color)_25%,transparent)]
25
+ shadow-[inset_0_-1px_1px_color-mix(in_srgb,var(--tw-inset-shadow-color)_100%,transparent),inset_0_-2px_2px_color-mix(in_srgb,var(--tw-inset-shadow-color)_25%,transparent)]
29
26
  inset-shadow-white/80
30
27
  dark:inset-shadow-white/5;
31
28
  }
@@ -34,10 +31,9 @@
34
31
  @apply border
35
32
  bg-background-surface-sunken
36
33
  border-line-strong/35
37
- shadow-[inset_0_2px_2px_color-mix(in_srgb,var(--tw-inset-shadow-color)_100%,transparent),inset_0_4px_4px_color-mix(in_srgb,var(--tw-inset-shadow-color)_25%,transparent)]
34
+ shadow-[inset_0_1px_1px_color-mix(in_srgb,var(--tw-inset-shadow-color)_100%,transparent),inset_0_2px_2px_color-mix(in_srgb,var(--tw-inset-shadow-color)_25%,transparent)]
38
35
  inset-shadow-black/5
39
- dark:inset-shadow-black/40
40
- ;
36
+ dark:inset-shadow-black/40;
41
37
  }
42
38
 
43
39
  @utility surface-highlighted {
@@ -46,44 +42,36 @@
46
42
 
47
43
  /* Brand Surfaces */
48
44
  @utility surface-brand {
49
- @apply
50
- text-text-inverted
45
+ @apply text-text-inverted
51
46
  bg-linear-to-b
52
47
  via-75%
53
48
  from-[0.5rem]
54
49
  to-[calc(100%-0.5rem)]
55
50
  from-brand-default
56
51
  to-brand-moderate
57
- dark:from-brand-moderate
58
- dark:to-brand-default
59
- /* dark:from-brand-default
60
- dark:via-brand-moderate
61
- dark:to-brand-default */
52
+ /* dark:from-brand-moderate */
53
+ /* dark:to-brand-default */
62
54
  border
63
55
  border-brand-default
64
- /* bg-size-[100%_calc(100%+0.5rem)]
65
- bg-repeat
66
- bg-position-[50%_calc(50%-0.5rem)] */
67
-
68
- /* dark:*:drop-shadow-[0_-1px_0_color-mix(in_srgb,var(--tw-drop-shadow-color)_20%,transparent),0_-1px_1px_var(--tw-drop-shadow-color),0_-1px_2px_color-mix(in_srgb,var(--tw-drop-shadow-color)_20%,transparent)] */
69
-
70
- /* text-shadow-2xs
71
- text-shadow-brand-strong/50 */
72
56
  transition-[background-position,brightness]
73
- shadow-[inset_0_1px_0.5px_0_color-mix(in_srgb,var(--color-brand-moderate)_100%,transparent),inset_0_-2px_0.5px_0_color-mix(in_srgb,var(--color-brand-default)_50%,transparent)]
74
- dark:shadow-[inset_0_1px_0.5px_0_color-mix(in_srgb,var(--color-brand-soft)_100%,transparent),inset_0_-2px_0.5px_0_color-mix(in_srgb,var(--color-white)_50%,transparent)]
75
- /* dark:shadow-[inset_0_-1px_0.5px_0_color-mix(in_srgb,var(--color-brand-moderate)_100%,transparent),inset_0_-2px_0.5px_0_color-mix(in_srgb,var(--color-brand-default)_50%,transparent)] */
57
+ shadow-[inset_0_1px_0_0_color-mix(in_srgb,var(--color-brand-moderate)_100%,transparent),inset_0_-2px_0_0_color-mix(in_srgb,var(--color-brand-default)_50%,transparent)]
58
+ /* dark:shadow-[inset_0_1px_0.5px_0_color-mix(in_srgb,var(--color-brand-soft)_100%,transparent),inset_0_-2px_0.5px_0_color-mix(in_srgb,var(--color-white)_50%,transparent)] */
76
59
  duration-75
77
- ease-out-cubic
78
- ;
60
+ ease-out-cubic;
79
61
 
80
- > *, &::before, &::after {
81
- @apply
82
- drop-shadow-[0_1px_0_color-mix(in_srgb,var(--tw-drop-shadow-color)_20%,transparent),0_1px_1px_color-mix(in_srgb,var(--tw-drop-shadow-color)_100%,transparent),0_1px_2px_color-mix(in_srgb,var(--tw-drop-shadow-color)_20%,transparent)]
62
+ > *,
63
+ &::before,
64
+ &::after {
65
+ @apply drop-shadow-[0_1px_0_color-mix(in_srgb,var(--tw-drop-shadow-color)_20%,transparent),0_1px_1px_color-mix(in_srgb,var(--tw-drop-shadow-color)_100%,transparent),0_1px_2px_color-mix(in_srgb,var(--tw-drop-shadow-color)_20%,transparent)]
83
66
  dark:drop-shadow-[0_-1px_0_color-mix(in_srgb,var(--tw-drop-shadow-color)_10%,transparent)]
84
- drop-shadow-brand-strong/50
85
- ;
86
- }
67
+ drop-shadow-brand-strong/50;
68
+ }
69
+ }
70
+
71
+ @utility surface-brand-light {
72
+ @apply bg-background-brand/15
73
+ border
74
+ border-line-brand/15;
87
75
  }
88
76
 
89
77
  /* Status Surfaces */
@@ -136,61 +124,59 @@
136
124
  }
137
125
 
138
126
  @utility surface-interactive-brand {
139
- @apply
140
- surface-brand
127
+ @apply surface-brand
141
128
  hover:brightness-105
142
129
  hover:border-brand-strong
143
- active:border-brand-default
144
- ;
130
+ active:border-brand-default;
145
131
  }
146
132
 
147
133
  @utility surface-interactive {
148
- @apply cursor-pointer hover:transition-colors include-interactive;
149
-
150
- /* Interactive states for base surface */
151
- &.surface {
152
- @apply surface-interactive-neutral;
153
- }
154
-
155
- /* Interactive states for placeholder surface */
156
- &.surface-placeholder {
157
- @apply surface-interactive-placeholder;
158
- }
159
-
160
- /* Interactive states for elevated surface */
161
- &.surface-elevated {
162
- @apply hover:bg-background-surface-elevated/90 hover:border-line-hover active:bg-background-surface-elevated/75 active:border-line-strong;
163
- }
164
-
165
- /* Interactive states for sunken surface */
166
- &.surface-sunken {
167
- @apply hover:bg-background-surface hover:border-line-hover active:bg-background-page active:border-line-strong;
168
- }
169
-
170
- /* Interactive states for brand surface */
171
- &.surface-brand {
172
- @apply surface-interactive-brand;
173
- }
174
-
175
- /* Interactive states for success surface */
176
- &.surface-success {
177
- @apply surface-interactive-success;
178
- }
179
-
180
- /* Interactive states for error surface */
181
- &.surface-error {
182
- @apply surface-interactive-error;
183
- }
184
-
185
- /* Interactive states for warning surface */
186
- &.surface-warning {
187
- @apply surface-interactive-warning;
188
- }
189
-
190
- /* Interactive states for attention surface */
191
- &.surface-attention {
192
- @apply surface-interactive-attention;
193
- }
134
+ @apply cursor-pointer hover:transition-colors include-interactive;
135
+
136
+ /* Interactive states for base surface */
137
+ &.surface {
138
+ @apply surface-interactive-neutral;
139
+ }
140
+
141
+ /* Interactive states for placeholder surface */
142
+ &.surface-placeholder {
143
+ @apply surface-interactive-placeholder;
144
+ }
145
+
146
+ /* Interactive states for elevated surface */
147
+ &.surface-elevated {
148
+ @apply hover:bg-background-surface-elevated/90 hover:border-line-hover active:bg-background-surface-elevated/75 active:border-line-strong;
149
+ }
150
+
151
+ /* Interactive states for sunken surface */
152
+ &.surface-sunken {
153
+ @apply hover:bg-background-surface hover:border-line-hover active:bg-background-page active:border-line-strong;
154
+ }
155
+
156
+ /* Interactive states for brand surface */
157
+ &.surface-brand {
158
+ @apply surface-interactive-brand;
159
+ }
160
+
161
+ /* Interactive states for success surface */
162
+ &.surface-success {
163
+ @apply surface-interactive-success;
164
+ }
165
+
166
+ /* Interactive states for error surface */
167
+ &.surface-error {
168
+ @apply surface-interactive-error;
169
+ }
170
+
171
+ /* Interactive states for warning surface */
172
+ &.surface-warning {
173
+ @apply surface-interactive-warning;
174
+ }
175
+
176
+ /* Interactive states for attention surface */
177
+ &.surface-attention {
178
+ @apply surface-interactive-attention;
179
+ }
194
180
 
195
181
  /* Interactive states for info surface */
196
182
  &.surface-info {
@@ -199,8 +185,7 @@
199
185
  }
200
186
 
201
187
  @utility surface-claim {
202
- @apply
203
- relative
188
+ @apply relative
204
189
  overflow-clip
205
190
  rounded-full
206
191
  bg-brand-moderate!
@@ -217,8 +202,7 @@
217
202
  --claim-color-3: var(--color-text-inverted);
218
203
  --claim-color-4: var(--color-text-inverted);
219
204
 
220
- @apply
221
- absolute
205
+ @apply absolute
222
206
  z-0
223
207
  -inset-1.5
224
208
  rounded-full
package/styles/table.css CHANGED
@@ -100,7 +100,7 @@
100
100
  }
101
101
 
102
102
  th {
103
- @apply font-medium text-left whitespace-nowrap text-text-secondary;
103
+ @apply font-semibold text-left whitespace-nowrap text-text-secondary;
104
104
  }
105
105
 
106
106
  td {
@@ -157,8 +157,8 @@
157
157
  }
158
158
 
159
159
  /* Row selection styles */
160
- tr:has(input[type="checkbox"]:checked),
161
- tr:has(input[type="radio"]:checked) {
160
+ tr:has(input[type='checkbox']:checked),
161
+ tr:has(input[type='radio']:checked) {
162
162
  @apply bg-background-brand/5;
163
163
  .table-item-title {
164
164
  @apply font-medium text-text-default;
package/styles/toast.css CHANGED
@@ -10,7 +10,7 @@
10
10
  }
11
11
 
12
12
  @utility toast {
13
- @apply relative pt-0.5 mx-auto w-full max-w-lg overflow-clip rounded border shadow-xl duration-300 text-text-default bg-background-surface ease-snappy-out border-line-default;
13
+ @apply relative pt-0.5 mx-auto w-full max-w-lg overflow-clip rounded border shadow-xl duration-300 text-text-default surface-elevated ease-snappy-out;
14
14
 
15
15
  &::before {
16
16
  @apply content-[''] absolute inset-x-0 top-0 h-0.5 rounded-t-xl duration-200 ease-in-out-cubic origin-center;
@@ -71,12 +71,10 @@
71
71
  }
72
72
 
73
73
  @utility toast-action {
74
- @apply
75
- px-3
74
+ @apply px-3
76
75
  py-1
77
76
  ml-3
78
- rounded-2xl
79
- ;
77
+ rounded-2xl;
80
78
  }
81
79
 
82
80
  @utility toast-close {
@@ -1,94 +0,0 @@
1
- {
2
- "id": "input-group",
3
- "name": "Input group",
4
- "status": "stable",
5
- "summary": "Input group pattern for combining controls with prefixes, suffixes, and inline actions.",
6
- "keywords": [
7
- "addon",
8
- "composed input",
9
- "input group",
10
- "input-group",
11
- "prefix",
12
- "suffix"
13
- ],
14
- "sourcePaths": [
15
- "app/design-system/input-group/page.js",
16
- "assets/styles/form.css",
17
- "assets/styles/input-group.css"
18
- ],
19
- "apiModel": "html-class",
20
- "baseClass": "input-group",
21
- "variants": [],
22
- "sizes": [],
23
- "states": [],
24
- "structure": {
25
- "rootElement": "div",
26
- "requiredClasses": [
27
- "input-group"
28
- ],
29
- "optionalClasses": [],
30
- "requiredChildren": [],
31
- "optionalChildren": []
32
- },
33
- "attributes": {
34
- "allowed": [
35
- "class",
36
- "id",
37
- "tabindex"
38
- ],
39
- "required": [],
40
- "dataAttributes": [],
41
- "roles": [],
42
- "aria": []
43
- },
44
- "a11y": {
45
- "interactive": true,
46
- "requiredRoles": [],
47
- "requiredAria": [
48
- "aria-label (when no visible label)"
49
- ],
50
- "keyboardSupport": [
51
- "Tab",
52
- "Shift+Tab",
53
- "Enter",
54
- "Space"
55
- ],
56
- "focusBehavior": "Visible focus state is required when the component is focusable or clickable."
57
- },
58
- "dos": [
59
- "Apply the base class 'input-group' on the root element.",
60
- "Use documented modifiers for visual variants instead of ad-hoc custom classes.",
61
- "Keep semantic color usage aligned with token classes for light/dark support."
62
- ],
63
- "donts": [
64
- "Do not combine conflicting state classes on the same element.",
65
- "Do not rely on undocumented internal classes in production templates.",
66
- "Do not remove required accessibility attributes when component is interactive."
67
- ],
68
- "tokenUsage": [
69
- "background-surface",
70
- "background-surface-elevated",
71
- "line-brand",
72
- "line-default",
73
- "line-focus",
74
- "line-highlight",
75
- "line-strong",
76
- "text-tertiary"
77
- ],
78
- "examples": [
79
- {
80
- "id": "canonical",
81
- "file": "examples/input-group.html",
82
- "description": "Minimal canonical Input group usage."
83
- }
84
- ],
85
- "composition": {
86
- "patterns": [],
87
- "relatedComponents": [],
88
- "notes": []
89
- },
90
- "breakingChangePolicy": {
91
- "classContract": "Base class, documented modifiers, and state class names are semver-protected for consumer markup.",
92
- "a11yContract": "Documented role and aria requirements are semver-protected for generated markup."
93
- }
94
- }