ui-foundations 0.6.0 → 0.7.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 (35) hide show
  1. package/LICENSE +73 -0
  2. package/README.md +43 -8
  3. package/dist/macros/ui.njk +33 -0
  4. package/dist/main.css +230 -84
  5. package/dist/react/form.js +111 -0
  6. package/dist/react/index.js +1 -0
  7. package/dist/react/input.js +7 -0
  8. package/dist/react/textarea.js +7 -0
  9. package/dist/tokens/css/appearance-modes.tokens.mode-dark.css +7 -1
  10. package/dist/tokens/css/appearance-modes.tokens.mode-light.css +7 -1
  11. package/dist/tokens/css/components-ui.tokens.css +55 -33
  12. package/dist/tokens/css/core-primitives.tokens.css +1 -1
  13. package/dist/tokens/css/semantics-roles.tokens.css +1 -1
  14. package/dist/tokens/css/themes-brands.tokens.brand-a.css +1 -1
  15. package/dist/tokens/css/themes-brands.tokens.brand-b.css +1 -1
  16. package/dist/tokens/css/themes-brands.tokens.brand-c.css +1 -1
  17. package/dist/tokens/json/appearance-modes.tokens.mode-dark.json +24 -0
  18. package/dist/tokens/json/appearance-modes.tokens.mode-light.json +24 -0
  19. package/dist/tokens/json/components-ui.tokens.json +161 -25
  20. package/dist/tokens/tokens.yaml +509 -67
  21. package/dist/tokens/ts/appearance-modes.tokens.mode-dark.ts +7 -1
  22. package/dist/tokens/ts/appearance-modes.tokens.mode-light.ts +7 -1
  23. package/dist/tokens/ts/components-ui.tokens.ts +55 -33
  24. package/dist/tokens/ts/core-primitives.tokens.ts +1 -1
  25. package/dist/tokens/ts/semantics-roles.tokens.ts +1 -1
  26. package/dist/tokens/ts/themes-brands.tokens.brand-a.ts +1 -1
  27. package/dist/tokens/ts/themes-brands.tokens.brand-b.ts +1 -1
  28. package/dist/tokens/ts/themes-brands.tokens.brand-c.ts +1 -1
  29. package/dist/ui/index.css +1 -0
  30. package/dist/ui/patterns/button.css +3 -3
  31. package/dist/ui/patterns/checkbox.css +28 -28
  32. package/dist/ui/patterns/form.css +112 -0
  33. package/dist/ui/patterns/input.css +12 -12
  34. package/dist/ui/patterns/label.css +1 -1
  35. package/package.json +14 -3
@@ -1,5 +1,5 @@
1
1
  // Auto-generated design tokens from Figma
2
- // Generated on 2026-05-22T09:23:10.604Z
2
+ // Generated on 2026-06-06T14:29:01.170Z
3
3
 
4
4
  export const tokens = {
5
5
  "colors": {
@@ -11,6 +11,12 @@ export const tokens = {
11
11
  "--color-text-strong": "var(--color-neutral-1000)",
12
12
  "--color-text-danger": "var(--brand-color-functional-danger)",
13
13
  "--color-text-success": "var(--brand-color-functional-success)",
14
+ "--color-text-on-brand": "var(--color-neutral-000)",
15
+ "--color-text-on-danger": "var(--color-neutral-000)",
16
+ "--color-text-on-success": "var(--color-neutral-000)",
17
+ "--color-text-on-subtle": "var(--brand-color-primary-dark)",
18
+ "--color-text-on-active": "var(--color-neutral-000)",
19
+ "--color-text-on-disabled": "var(--color-neutral-800)",
14
20
  "--color-fill-surface": "var(--color-neutral-1000)",
15
21
  "--color-fill-disabled": "var(--color-neutral-300)",
16
22
  "--color-fill-hover": "var(--color-neutral-alpha-inverse-100)",
@@ -1,5 +1,5 @@
1
1
  // Auto-generated design tokens from Figma
2
- // Generated on 2026-05-22T09:23:10.601Z
2
+ // Generated on 2026-06-06T14:29:01.166Z
3
3
 
4
4
  export const tokens = {
5
5
  "colors": {
@@ -11,6 +11,12 @@ export const tokens = {
11
11
  "--color-text-strong": "var(--color-neutral-1000)",
12
12
  "--color-text-danger": "var(--brand-color-functional-danger)",
13
13
  "--color-text-success": "var(--brand-color-functional-success)",
14
+ "--color-text-on-brand": "var(--color-neutral-000)",
15
+ "--color-text-on-danger": "var(--color-neutral-000)",
16
+ "--color-text-on-success": "var(--color-neutral-000)",
17
+ "--color-text-on-subtle": "var(--brand-color-primary)",
18
+ "--color-text-on-active": "var(--color-neutral-000)",
19
+ "--color-text-on-disabled": "var(--color-neutral-800)",
14
20
  "--color-fill-surface": "var(--color-neutral-000)",
15
21
  "--color-fill-disabled": "var(--color-neutral-300)",
16
22
  "--color-fill-hover": "var(--color-neutral-alpha-500)",
@@ -1,5 +1,5 @@
1
1
  // Auto-generated design tokens from Figma
2
- // Generated on 2026-05-22T09:23:10.611Z
2
+ // Generated on 2026-06-06T14:29:01.180Z
3
3
 
4
4
  export const tokens = {
5
5
  "components": {
@@ -8,13 +8,13 @@ export const tokens = {
8
8
  "--button-solid-border-color-hover": "var(--color-border-brand)",
9
9
  "--button-solid-border-color-active": "var(--color-border-brand)",
10
10
  "--button-solid-border-color-focus": "var(--color-border-brand)",
11
- "--button-solid-text-color-default": "var(--color-text-inverse)",
11
+ "--button-solid-text-color-default": "var(--color-text-on-brand)",
12
12
  "--button-solid-container-background-default": "var(--color-fill-brand)",
13
13
  "--button-solid-container-background-hover": "var(--color-fill-brand)",
14
14
  "--button-solid-container-background-active": "var(--color-fill-brand)",
15
15
  "--button-solid-container-background-focus": "var(--color-fill-brand)",
16
- "--button-solid-text-color-hover": "var(--color-text-inverse)",
17
- "--button-solid-text-color-active": "var(--color-text-inverse)",
16
+ "--button-solid-text-color-hover": "var(--color-text-on-brand)",
17
+ "--button-solid-text-color-active": "var(--color-text-on-brand)",
18
18
  "--button-outline-border-color-default": "var(--color-border-brand)",
19
19
  "--button-outline-border-color-hover": "var(--color-border-brand)",
20
20
  "--button-outline-border-color-active": "var(--color-border-brand)",
@@ -59,22 +59,22 @@ export const tokens = {
59
59
  "--modal-backdrop-color": "var(--color-overlay-backdrop)",
60
60
  "--modal-surface-color": "var(--color-fill-surface)",
61
61
  "--modal-surface-border-radius": "var(--brand-corner-modal)",
62
- "--input-text-text-color-default": "var(--color-text-default)",
63
- "--input-text-text-color-hover": "var(--color-text-default)",
64
- "--input-text-text-color-active": "var(--color-text-default)",
65
- "--input-text-text-color-disabled": "var(--color-text-disabled)",
66
- "--input-text-text-color-placeholder": "var(--color-text-subtle)",
67
- "--input-border-border-color-default": "var(--color-border-default)",
68
- "--input-border-border-color-hover": "var(--color-border-brand)",
69
- "--input-border-border-color-active": "var(--color-border-brand)",
70
- "--input-border-border-color-focus": "var(--color-border-brand)",
71
- "--input-border-border-size-default": "var(--size-border-100)",
72
- "--input-border-border-size-hover": "var(--size-border-100)",
73
- "--input-border-border-size-active": "var(--size-border-200)",
74
- "--input-border-border-radius": "var(--brand-corner-input)",
75
- "--input-border-border-color-disabled": "var(--color-border-disabled)",
76
- "--input-border-border-color-invalid": "var(--color-border-danger)",
77
- "--input-border-border-color-valid": "var(--color-border-strong)",
62
+ "--input-text-color-default": "var(--color-text-default)",
63
+ "--input-text-color-hover": "var(--color-text-brand)",
64
+ "--input-text-color-active": "var(--color-text-default)",
65
+ "--input-text-color-disabled": "var(--color-text-disabled)",
66
+ "--input-text-color-placeholder": "var(--color-text-subtle)",
67
+ "--input-border-color-default": "var(--color-border-default)",
68
+ "--input-border-color-hover": "var(--color-border-brand)",
69
+ "--input-border-color-active": "var(--color-border-brand)",
70
+ "--input-border-color-focus": "var(--color-border-brand)",
71
+ "--input-border-size-default": "var(--size-border-100)",
72
+ "--input-border-size-hover": "var(--size-border-100)",
73
+ "--input-border-size-active": "var(--size-border-200)",
74
+ "--input-border-radius": "var(--brand-corner-input)",
75
+ "--input-border-color-disabled": "var(--color-border-disabled)",
76
+ "--input-border-color-invalid": "var(--color-border-danger)",
77
+ "--input-border-color-valid": "var(--color-border-strong)",
78
78
  "--input-font-family": "var(--brand-font-base)",
79
79
  "--input-font-weight": "var(--typography-body-font-weight)",
80
80
  "--input-font-size": "var(--typography-label-font-size)",
@@ -92,6 +92,10 @@ export const tokens = {
92
92
  "--input-overlay-active": "var(--color-transparent)",
93
93
  "--input-height": "2.5rem",
94
94
  "--input-height-min": "2.5rem",
95
+ "--input-radio-text-color-active": "var(--color-text-default)",
96
+ "--input-radio-text-color-hover": "var(--color-text-strong)",
97
+ "--input-radio-container-background-hover": "var(--color-fill-surface)",
98
+ "--input-radio-border-color-focus": "var(--color-border-brand)",
95
99
  "--form-group-gap": "var(--size-spacing-400)",
96
100
  "--form-group-title-color": "var(--color-text-default)",
97
101
  "--form-padding-inline": "var(--size-spacing-400)",
@@ -105,10 +109,10 @@ export const tokens = {
105
109
  "--form-container-border-color": "var(--color-border-subtle)",
106
110
  "--form-border-size": "var(--size-border-100)",
107
111
  "--checkbox-text-color-default": "var(--color-text-default)",
108
- "--checkbox-text-color-hover": "var(--color-text-strong)",
109
- "--checkbox-text-color-active": "var(--color-text-inverse)",
112
+ "--checkbox-text-color-hover": "var(--color-text-brand)",
113
+ "--checkbox-text-color-active": "var(--color-text-on-brand)",
110
114
  "--checkbox-border-color-default": "var(--color-border-subtle)",
111
- "--checkbox-border-color-hover": "var(--color-border-strong)",
115
+ "--checkbox-border-color-hover": "var(--color-border-brand)",
112
116
  "--checkbox-border-color-active": "var(--color-border-brand)",
113
117
  "--checkbox-border-color-focus": "var(--color-border-brand)",
114
118
  "--checkbox-border-color-invalid": "var(--color-border-danger)",
@@ -126,7 +130,7 @@ export const tokens = {
126
130
  "--input-radio-text-color-default": "var(--color-text-default)",
127
131
  "--input-radio-text-color-disabled": "var(--color-text-disabled)",
128
132
  "--input-radio-border-color-default": "var(--color-border-subtle)",
129
- "--input-radio-border-color-hover": "var(--color-border-strong)",
133
+ "--input-radio-border-color-hover": "var(--color-border-brand)",
130
134
  "--input-radio-border-color-active": "var(--color-border-brand)",
131
135
  "--input-radio-border-color-disabled": "var(--color-border-disabled)",
132
136
  "--input-radio-container-background-default": "var(--color-fill-surface)",
@@ -137,27 +141,45 @@ export const tokens = {
137
141
  "--badge-default-text-color": "var(--color-text-default)",
138
142
  "--badge-default-border-color": "var(--color-transparent)",
139
143
  "--badge-default-container-background": "var(--color-fill-subtle)",
140
- "--badge-brand-text-color": "var(--color-text-inverse)",
144
+ "--badge-brand-text-color": "var(--color-text-on-brand)",
141
145
  "--badge-brand-border-color": "var(--color-transparent)",
142
146
  "--badge-brand-container-background": "var(--color-fill-brand)",
143
- "--badge-success-text-color": "var(--color-text-inverse)",
147
+ "--badge-success-text-color": "var(--color-text-on-success)",
144
148
  "--badge-success-border-color": "var(--color-transparent)",
145
149
  "--badge-success-container-background": "var(--color-fill-success)",
146
150
  "--badge-font-family": "var(--brand-font-lead)",
147
151
  "--badge-font-weight": "var(--typography-label-font-weight)",
148
- "--badge-font-size": "var(--typography-label-font-size)",
149
- "--badge-line-height": "var(--typography-label-line-height)",
150
152
  "--badge-border-size-default": "var(--size-border-100)",
151
- "--badge-border-radius": "var(--brand-corner-input)",
152
- "--badge-padding-inline": "var(--size-spacing-400)",
153
+ "--badge-border-radius": "var(--size-radius-full)",
154
+ "--badge-padding-inline-md": "var(--size-spacing-300)",
153
155
  "--badge-padding-inline-icon-only": "var(--size-spacing-200)",
154
- "--badge-padding-block": "var(--size-spacing-200)",
155
- "--badge-gap": "var(--size-spacing-200)",
156
+ "--badge-padding-block-md": "var(--size-spacing-100)",
157
+ "--badge-gap": "var(--size-spacing-100)",
156
158
  "--badge-height-min": "2.5rem",
157
159
  "--badge-width-min": "2.5rem",
158
160
  "--badge-danger-container-background": "var(--color-fill-danger)",
159
161
  "--badge-danger-border-color": "var(--color-transparent)",
160
- "--badge-danger-text-color": "var(--color-text-inverse)"
162
+ "--badge-danger-text-color": "var(--color-text-on-danger)",
163
+ "--badge-font-size-sm": ".75rem",
164
+ "--badge-font-size-md": ".875rem",
165
+ "--badge-line-height-sm": "1rem",
166
+ "--badge-line-height-md": "1.25rem",
167
+ "--badge-padding-inline-sm": ".5rem",
168
+ "--badge-padding-block-sm": ".125rem",
169
+ "--switch-track-background-default": "var(--color-fill-surface)",
170
+ "--switch-track-background-hover": "var(--color-fill-surface)",
171
+ "--switch-track-background-active": "var(--color-fill-brand)",
172
+ "--switch-track-background-disabled": "var(--color-fill-disabled)",
173
+ "--switch-track-border-color-default": "var(--color-border-default)",
174
+ "--switch-track-border-color-hover": "var(--color-border-brand)",
175
+ "--switch-track-border-color-active": "var(--color-border-brand)",
176
+ "--switch-track-border-color-disabled": "var(--color-border-disabled)",
177
+ "--switch-thumb-background-default": "var(--color-border-default)",
178
+ "--switch-thumb-background-hover": "var(--color-border-brand)",
179
+ "--switch-thumb-background-active": "var(--color-fill-surface)",
180
+ "--switch-thumb-background-disabled": "var(--color-fill-surface)",
181
+ "--switch-text-color-default": "var(--color-text-default)",
182
+ "--switch-text-color-disabled": "var(--color-text-disabled)"
161
183
  }
162
184
  } as const;
163
185
 
@@ -1,5 +1,5 @@
1
1
  // Auto-generated design tokens from Figma
2
- // Generated on 2026-05-22T09:23:10.621Z
2
+ // Generated on 2026-06-06T14:29:01.195Z
3
3
 
4
4
  export const tokens = {
5
5
  "colors": {
@@ -1,5 +1,5 @@
1
1
  // Auto-generated design tokens from Figma
2
- // Generated on 2026-05-22T09:23:10.624Z
2
+ // Generated on 2026-06-06T14:29:01.200Z
3
3
 
4
4
  export const tokens = {
5
5
  "typography": {
@@ -1,5 +1,5 @@
1
1
  // Auto-generated design tokens from Figma
2
- // Generated on 2026-05-22T09:23:10.626Z
2
+ // Generated on 2026-06-06T14:29:01.202Z
3
3
 
4
4
  export const tokens = {
5
5
  "colors": {
@@ -1,5 +1,5 @@
1
1
  // Auto-generated design tokens from Figma
2
- // Generated on 2026-05-22T09:23:10.628Z
2
+ // Generated on 2026-06-06T14:29:01.203Z
3
3
 
4
4
  export const tokens = {
5
5
  "colors": {
@@ -1,5 +1,5 @@
1
1
  // Auto-generated design tokens from Figma
2
- // Generated on 2026-05-22T09:23:10.629Z
2
+ // Generated on 2026-06-06T14:29:01.205Z
3
3
 
4
4
  export const tokens = {
5
5
  "colors": {
package/dist/ui/index.css CHANGED
@@ -12,3 +12,4 @@
12
12
  @import url("./patterns/accordion.css") layer(components);
13
13
  @import url("./patterns/tabs.css") layer(components);
14
14
  @import url("./patterns/tooltip.css") layer(components);
15
+ @import url("./patterns/form.css") layer(components);
@@ -9,7 +9,7 @@
9
9
  min-height: var(--button-height-min);
10
10
  background: var(--button-solid-container-background-default);
11
11
  border-color: var(--button-solid-border-color-default);
12
- border-width: var(--button-solid-border-size);
12
+ border-width: var(--button-border-size-default);
13
13
  border-style: solid;
14
14
  color: var(--button-solid-text-color-default);
15
15
  border-radius: var(--button-border-radius);
@@ -69,7 +69,7 @@
69
69
  .button.outline {
70
70
  background: var(--button-outline-container-background-default);
71
71
  border-color: var(--button-outline-border-color-default);
72
- border-width: var(--button-outline-border-size);
72
+ border-width: var(--button-border-size-default);
73
73
  border-style: solid;
74
74
  color: var(--button-outline-text-color-default);
75
75
  }
@@ -108,7 +108,7 @@
108
108
  .button.ghost {
109
109
  background: var(--button-ghost-container-background-default);
110
110
  border-color: var(--button-ghost-border-color-default);
111
- border-width: var(--button-ghost-border-size);
111
+ border-width: var(--button-border-size-default);
112
112
  border-style: solid;
113
113
  color: var(--button-ghost-text-color-default);
114
114
  }
@@ -7,12 +7,12 @@
7
7
  font-weight: var(--typography-label-font-weight);
8
8
  font-size: var(--typography-label-font-size);
9
9
  line-height: var(--typography-label-line-height);
10
- color: var(--input-checkbox-text-color-default);
10
+ color: var(--checkbox-text-color-default);
11
11
  cursor: pointer;
12
12
  }
13
13
 
14
14
  .checkbox-field.is-disabled {
15
- color: var(--input-checkbox-text-color-disabled);
15
+ color: var(--checkbox-text-color-disabled);
16
16
  cursor: not-allowed;
17
17
  }
18
18
 
@@ -25,10 +25,10 @@
25
25
  place-content: center;
26
26
  border-style: solid;
27
27
  border-width: var(--checkbox-border-size-default);
28
- border-color: var(--input-checkbox-border-color-default);
28
+ border-color: var(--checkbox-border-color-default);
29
29
  border-radius: var(--corner-checkbox-radius);
30
- background: var(--input-checkbox-container-background-default);
31
- color: var(--input-checkbox-text-color-active);
30
+ background: var(--checkbox-container-background-default);
31
+ color: var(--checkbox-text-color-active);
32
32
  cursor: pointer;
33
33
  }
34
34
 
@@ -39,8 +39,8 @@
39
39
 
40
40
  .checkbox:checked,
41
41
  .checkbox.is-checked {
42
- border-color: var(--input-checkbox-border-color-active);
43
- background: var(--input-checkbox-container-background-active);
42
+ border-color: var(--checkbox-border-color-active);
43
+ background: var(--checkbox-container-background-active);
44
44
  }
45
45
 
46
46
  .checkbox:checked::after,
@@ -61,8 +61,8 @@
61
61
 
62
62
  .checkbox:indeterminate,
63
63
  .checkbox.is-indeterminate {
64
- border-color: var(--input-checkbox-border-color-active);
65
- background: var(--input-checkbox-container-background-active);
64
+ border-color: var(--checkbox-border-color-active);
65
+ background: var(--checkbox-container-background-active);
66
66
  }
67
67
 
68
68
  .checkbox:indeterminate::after,
@@ -77,9 +77,9 @@
77
77
  .checkbox.is-hover {
78
78
  background:
79
79
  linear-gradient(0deg, var(--color-overlay-hover), var(--color-overlay-hover)),
80
- var(--input-checkbox-container-background-hover);
81
- color: var(--input-checkbox-text-color-hover);
82
- border-color: var(--input-checkbox-border-color-hover);
80
+ var(--checkbox-container-background-hover);
81
+ color: var(--checkbox-text-color-hover);
82
+ border-color: var(--checkbox-border-color-hover);
83
83
  border-width: var(--checkbox-border-size-hover);
84
84
  }
85
85
 
@@ -87,9 +87,9 @@
87
87
  .checkbox.is-checked.is-hover {
88
88
  background:
89
89
  linear-gradient(0deg, var(--color-overlay-hover), var(--color-overlay-hover)),
90
- var(--input-checkbox-container-background-active);
91
- color: var(--input-checkbox-text-color-hover);
92
- border-color: var(--input-checkbox-border-color-hover);
90
+ var(--checkbox-container-background-active);
91
+ color: var(--checkbox-text-color-hover);
92
+ border-color: var(--checkbox-border-color-hover);
93
93
  border-width: var(--checkbox-border-size-hover);
94
94
  }
95
95
 
@@ -97,9 +97,9 @@
97
97
  .checkbox.is-indeterminate.is-hover {
98
98
  background:
99
99
  linear-gradient(0deg, var(--color-overlay-hover), var(--color-overlay-hover)),
100
- var(--input-checkbox-container-background-active);
101
- color: var(--input-checkbox-text-color-hover);
102
- border-color: var(--input-checkbox-border-color-hover);
100
+ var(--checkbox-container-background-active);
101
+ color: var(--checkbox-text-color-hover);
102
+ border-color: var(--checkbox-border-color-hover);
103
103
  border-width: var(--checkbox-border-size-hover);
104
104
  }
105
105
 
@@ -107,8 +107,8 @@
107
107
  .checkbox.is-active {
108
108
  background:
109
109
  linear-gradient(0deg, var(--color-overlay-active), var(--color-overlay-active)),
110
- var(--input-checkbox-container-background-default);
111
- border-color: var(--input-checkbox-border-color-active);
110
+ var(--checkbox-container-background-default);
111
+ border-color: var(--checkbox-border-color-active);
112
112
  border-width: var(--size-border-200);
113
113
  }
114
114
 
@@ -116,21 +116,21 @@
116
116
  .checkbox.is-checked.is-active {
117
117
  background:
118
118
  linear-gradient(0deg, var(--color-overlay-active), var(--color-overlay-active)),
119
- var(--input-checkbox-container-background-active);
120
- border-color: var(--input-checkbox-border-color-active);
119
+ var(--checkbox-container-background-active);
120
+ border-color: var(--checkbox-border-color-active);
121
121
  }
122
122
 
123
123
  .checkbox:indeterminate:active,
124
124
  .checkbox.is-indeterminate.is-active {
125
125
  background:
126
126
  linear-gradient(0deg, var(--color-overlay-active), var(--color-overlay-active)),
127
- var(--input-checkbox-container-background-active);
128
- border-color: var(--input-checkbox-border-color-active);
127
+ var(--checkbox-container-background-active);
128
+ border-color: var(--checkbox-border-color-active);
129
129
  }
130
130
 
131
131
  .checkbox:focus-visible,
132
132
  .checkbox.is-focus-visible {
133
- border-color: var(--input-checkbox-border-color-focus);
133
+ border-color: var(--checkbox-border-color-focus);
134
134
  outline: none;
135
135
  box-shadow: 0 0 0 var(--shadow-focus, 0) var(--color-focus, transparent);
136
136
  }
@@ -138,9 +138,9 @@
138
138
  .checkbox:disabled,
139
139
  .checkbox.is-disabled {
140
140
  border-width: var(--checkbox-border-size-disabled);
141
- border-color: var(--input-checkbox-border-color-disabled);
142
- background: var(--input-checkbox-container-background-disabled);
143
- color: var(--input-checkbox-text-color-disabled);
141
+ border-color: var(--checkbox-border-color-disabled);
142
+ background: var(--checkbox-container-background-disabled);
143
+ color: var(--checkbox-text-color-disabled);
144
144
  cursor: not-allowed;
145
145
  }
146
146
  }
@@ -0,0 +1,112 @@
1
+ @layer components {
2
+ /* ----------------------------------------------------------------
3
+ * Form — layout container for form fields
4
+ * ---------------------------------------------------------------- */
5
+
6
+ .form {
7
+ display: flex;
8
+ flex-direction: column;
9
+ gap: var(--form-gap);
10
+ padding-inline: var(--form-padding-inline);
11
+ padding-block: var(--form-padding-block);
12
+ background: var(--form-container-background);
13
+ border: var(--form-border-size) solid var(--form-container-border-color);
14
+ border-radius: var(--form-border-radius);
15
+ }
16
+
17
+ .form.borderless {
18
+ border: none;
19
+ padding: 0;
20
+ background: transparent;
21
+ }
22
+
23
+ /* ----------------------------------------------------------------
24
+ * Form Group — groups related fields with an optional title
25
+ * ---------------------------------------------------------------- */
26
+
27
+ .form-group {
28
+ display: flex;
29
+ flex-direction: column;
30
+ gap: var(--form-group-gap);
31
+ margin: 0;
32
+ padding: 0;
33
+ border: 0;
34
+ min-inline-size: 0;
35
+ }
36
+
37
+ .form-group__title {
38
+ font-family: var(--typography-heading-font-family);
39
+ font-weight: var(--typography-heading-font-weight);
40
+ font-size: var(--typography-heading-font-size-sm);
41
+ line-height: var(--typography-heading-line-height-sm);
42
+ color: var(--form-group-title-color);
43
+ margin: 0;
44
+ }
45
+
46
+ /* ----------------------------------------------------------------
47
+ * Form Field — single field with label, input, and helper/error
48
+ * ---------------------------------------------------------------- */
49
+
50
+ .form-field {
51
+ display: flex;
52
+ flex-direction: column;
53
+ gap: var(--form-field-gap);
54
+ }
55
+
56
+ .form-field[data-label-position="side"] {
57
+ flex-direction: row;
58
+ align-items: flex-start;
59
+ }
60
+
61
+ .form-field[data-label-position="side"] > .field-label {
62
+ flex-shrink: 0;
63
+ inline-size: 8rem;
64
+ padding-block-start: var(--size-spacing-200);
65
+ }
66
+
67
+ .form-field[data-label-position="side"] > .form-field__body {
68
+ flex: 1;
69
+ display: flex;
70
+ flex-direction: column;
71
+ gap: var(--form-field-gap);
72
+ }
73
+
74
+ /* ----------------------------------------------------------------
75
+ * Helper and error text
76
+ * ---------------------------------------------------------------- */
77
+
78
+ .form-field__helper {
79
+ font-family: var(--typography-body-font-family);
80
+ font-size: var(--font-size-sm);
81
+ line-height: var(--line-height-sm);
82
+ color: var(--form-field-helper-text-color-default);
83
+ margin: 0;
84
+ }
85
+
86
+ .form-field.is-invalid .form-field__helper {
87
+ color: var(--form-field-helper-text-color-invalid);
88
+ }
89
+
90
+ /* ----------------------------------------------------------------
91
+ * Form Actions — button area at the bottom
92
+ * ---------------------------------------------------------------- */
93
+
94
+ .form-actions {
95
+ display: flex;
96
+ gap: var(--size-spacing-200);
97
+ justify-content: flex-end;
98
+ padding-block-start: var(--size-spacing-200);
99
+ }
100
+
101
+ .form-actions[data-align="start"] {
102
+ justify-content: flex-start;
103
+ }
104
+
105
+ .form-actions[data-align="stretch"] {
106
+ flex-direction: column;
107
+ }
108
+
109
+ .form-actions[data-align="stretch"] > * {
110
+ inline-size: 100%;
111
+ }
112
+ }
@@ -7,25 +7,25 @@
7
7
  font-weight: var(--input-font-weight);
8
8
  font-size: var(--input-font-size);
9
9
  line-height: var(--input-line-height, var(--button-line-height, 1.5));
10
- color: var(--input-text-text-color-default);
11
- background: var(--input-text-container-background-default);
10
+ color: var(--input-text-color-default);
11
+ background: var(--input-container-background-default);
12
12
  border-style: solid;
13
13
  border-width: var(--input-border-size-default);
14
- border-color: var(--input-text-border-color-default);
14
+ border-color: var(--input-border-color-default);
15
15
  border-radius: var(--input-border-radius);
16
16
  padding-inline: var(--input-padding-inline);
17
17
  padding-block: var(--input-padding-block);
18
18
  }
19
19
 
20
20
  .input::placeholder {
21
- color: var(--input-text-text-color-placeholder);
21
+ color: var(--input-text-color-placeholder);
22
22
  }
23
23
 
24
24
  .input:hover,
25
25
  .input.is-hover {
26
26
  background:
27
27
  linear-gradient(0deg, var(--input-overlay-hover), var(--input-overlay-hover)),
28
- var(--input-text-container-background-default);
28
+ var(--input-container-background-default);
29
29
  border-width: var(--input-border-size-hover);
30
30
  padding-inline: calc(
31
31
  var(--input-padding-inline) + var(--input-border-size-default) -
@@ -35,15 +35,15 @@
35
35
  var(--input-padding-block) + var(--input-border-size-default) -
36
36
  var(--input-border-size-hover)
37
37
  );
38
- border-color: var(--input-text-border-color-hover);
39
- color: var(--input-text-text-color-hover);
38
+ border-color: var(--input-border-color-hover);
39
+ color: var(--input-text-color-hover);
40
40
  }
41
41
 
42
42
  .input:active,
43
43
  .input.is-active {
44
44
  background:
45
45
  linear-gradient(0deg, var(--input-overlay-active), var(--input-overlay-active)),
46
- var(--input-text-container-background-default);
46
+ var(--input-container-background-default);
47
47
  border-width: var(--input-border-size-active);
48
48
  padding-inline: calc(
49
49
  var(--input-padding-inline) + var(--input-border-size-default) -
@@ -53,14 +53,14 @@
53
53
  var(--input-padding-block) + var(--input-border-size-default) -
54
54
  var(--input-border-size-active)
55
55
  );
56
- border-color: var(--input-text-border-color-active);
57
- color: var(--input-text-text-color-active);
56
+ border-color: var(--input-border-color-active);
57
+ color: var(--input-text-color-active);
58
58
  }
59
59
 
60
60
  .input:focus-visible,
61
61
  .input.is-focus-visible {
62
- background: var(--input-text-container-background-focus);
63
- border-color: var(--input-text-border-color-focus);
62
+ background: var(--input-container-background-focus);
63
+ border-color: var(--input-border-color-focus);
64
64
  outline: none;
65
65
  box-shadow: 0 0 0 var(--shadow-focus, 0) var(--color-focus, transparent);
66
66
  }
@@ -2,7 +2,7 @@
2
2
  .label-content {
3
3
  display: inline-flex;
4
4
  align-items: center;
5
- gap: var(--label-gap, 0.5em);
5
+ gap: var(--typography-label-gap, 0.5em);
6
6
  line-height: inherit;
7
7
  }
8
8
 
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "ui-foundations",
3
- "version": "0.6.0",
3
+ "version": "0.7.0",
4
4
  "description": "Token-first UI foundations with CSS, tokens, and React exports.",
5
- "license": "MIT",
5
+ "license": "PolyForm-Noncommercial-1.0.0",
6
6
  "repository": {
7
7
  "type": "git",
8
8
  "url": "git@ssh.source.tui:Thomas.Bielich/ui-foundations.git"
@@ -24,10 +24,20 @@
24
24
  "./core.css": "./dist/core/index.css",
25
25
  "./ui.css": "./dist/ui/index.css",
26
26
  "./react": "./dist/react/index.js",
27
+ "./react/accordion": "./dist/react/accordion.js",
28
+ "./react/avatar": "./dist/react/avatar.js",
29
+ "./react/badge": "./dist/react/badge.js",
27
30
  "./react/button": "./dist/react/button.js",
31
+ "./react/checkbox": "./dist/react/checkbox.js",
32
+ "./react/divider": "./dist/react/divider.js",
28
33
  "./react/icon": "./dist/react/icon.js",
29
34
  "./react/input": "./dist/react/input.js",
30
35
  "./react/label": "./dist/react/label.js",
36
+ "./react/radio": "./dist/react/radio.js",
37
+ "./react/switch": "./dist/react/switch.js",
38
+ "./react/tabs": "./dist/react/tabs.js",
39
+ "./react/textarea": "./dist/react/textarea.js",
40
+ "./react/tooltip": "./dist/react/tooltip.js",
31
41
  "./assets/*": "./dist/assets/*",
32
42
  "./tokens/core.css": "./dist/tokens/css/core-primitives.tokens.css",
33
43
  "./tokens/primitives.css": "./dist/tokens/css/core-primitives.tokens.css",
@@ -53,6 +63,7 @@
53
63
  "rules:validate": "node scripts/validate-rule-pipeline.mjs",
54
64
  "tokens:generate": "node scripts/extract-tokens.js",
55
65
  "tokens:validate": "node scripts/validate-tokens.mjs",
66
+ "tokens:usage": "node scripts/validate-token-usage.mjs",
56
67
  "dtcg:validate": "node scripts/validate-dtcg.mjs",
57
68
  "tokens:build": "npm run tokens:generate",
58
69
  "build:css": "node scripts/build-css.mjs",
@@ -67,7 +78,7 @@
67
78
  "release:publish": "npm publish",
68
79
  "docs:build": "eleventy",
69
80
  "docs:site": "npm run build:all && npm run docs:build",
70
- "ci:check": "npm run lint && npm run test:unit && npm run build:all && npm run smoke:check && npm run tokens:validate && npm run dtcg:validate && npm run assets:check && npm run rules:validate && npm run docs:build",
81
+ "ci:check": "npm run lint && npm run test:unit && npm run build:all && npm run smoke:check && npm run tokens:validate && npm run tokens:usage && npm run dtcg:validate && npm run assets:check && npm run rules:validate && npm run docs:build",
71
82
  "docs:dev": "npm run build:all && eleventy --serve"
72
83
  },
73
84
  "devDependencies": {