ui-foundations 0.3.1 → 0.4.1

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 (69) hide show
  1. package/README.md +179 -36
  2. package/dist/assets/icons/checkmark.svg +1 -0
  3. package/dist/core/index.css +7 -7
  4. package/dist/macros/ui.njk +142 -0
  5. package/dist/main.css +465 -173
  6. package/dist/react/badge.js +41 -0
  7. package/dist/react/button.js +15 -6
  8. package/dist/react/checkbox.js +30 -0
  9. package/dist/react/icon.js +19 -1
  10. package/dist/react/index.js +2 -0
  11. package/dist/react/label.js +1 -1
  12. package/dist/react/radio.js +62 -0
  13. package/dist/react/switch.js +18 -0
  14. package/dist/tokens/css/{appearance-(modes).tokens.mode-dark.css → appearance-modes.tokens.mode-dark.css} +1 -1
  15. package/dist/tokens/css/{appearance-(modes).tokens.mode-light.css → appearance-modes.tokens.mode-light.css} +1 -1
  16. package/dist/tokens/css/{components-(ui).tokens.css → components-ui.tokens.css} +46 -3
  17. package/dist/tokens/css/{core-(primitives).tokens.css → core-primitives.tokens.css} +61 -19
  18. package/dist/tokens/css/{semantics-(roles).tokens.css → semantics-roles.tokens.css} +1 -1
  19. package/dist/tokens/css/themes-brands.tokens.brand-a.css +22 -0
  20. package/dist/tokens/css/{themes-(brands).tokens.brand-b.css → themes-brands.tokens.brand-b.css} +9 -9
  21. package/dist/tokens/json/appearance-modes.tokens.mode-dark.json +121 -0
  22. package/dist/tokens/json/appearance-modes.tokens.mode-light.json +121 -0
  23. package/dist/tokens/json/components-ui.tokens.json +715 -0
  24. package/dist/tokens/json/{core-(primitives).tokens.json → core-primitives.tokens.json} +227 -413
  25. package/dist/tokens/json/semantics-roles.tokens.json +141 -0
  26. package/dist/tokens/json/themes-brands.tokens.brand-a.json +81 -0
  27. package/dist/tokens/json/themes-brands.tokens.brand-b.json +81 -0
  28. package/dist/tokens/missing-tokens.json +43 -0
  29. package/dist/tokens/tokens.yaml +1254 -149
  30. package/dist/tokens/ts/{appearance-(modes).tokens.mode-dark.ts → appearance-modes.tokens.mode-dark.ts} +1 -1
  31. package/dist/tokens/ts/{appearance-(modes).tokens.mode-light.ts → appearance-modes.tokens.mode-light.ts} +1 -1
  32. package/dist/tokens/ts/{components-(ui).tokens.ts → components-ui.tokens.ts} +47 -4
  33. package/dist/tokens/ts/{core-(primitives).tokens.ts → core-primitives.tokens.ts} +62 -20
  34. package/dist/tokens/ts/{semantics-(roles).tokens.ts → semantics-roles.tokens.ts} +1 -1
  35. package/dist/tokens/ts/{themes-(brands).tokens.brand-a.ts → themes-brands.tokens.brand-a.ts} +9 -9
  36. package/dist/tokens/ts/{themes-(brands).tokens.brand-b.ts → themes-brands.tokens.brand-b.ts} +9 -9
  37. package/dist/ui/index.css +2 -0
  38. package/dist/ui/patterns/badge.css +49 -0
  39. package/dist/ui/patterns/checkbox.css +71 -22
  40. package/dist/ui/patterns/radio.css +109 -0
  41. package/docs/README.md +38 -0
  42. package/docs/agentic/README.md +34 -0
  43. package/docs/agentic/assistant-behavior-rules.md +48 -0
  44. package/docs/agentic/skills/ux-writing-coach.md +116 -0
  45. package/docs/foundations/README.md +31 -0
  46. package/docs/foundations/foundation-001-token-layering.md +6 -0
  47. package/docs/foundations/foundation-002-naming-and-grouping.md +6 -0
  48. package/docs/foundations/foundation-003-color-semantics-and-status.md +6 -0
  49. package/docs/foundations/foundation-004-typography-scale-and-line-height.md +6 -0
  50. package/docs/foundations/foundation-005-responsive-breakpoints-and-containers.md +6 -0
  51. package/docs/foundations/foundation-006-z-index-layering.md +6 -0
  52. package/docs/foundations/foundation-007-typography-selectors-and-specificity.md +6 -0
  53. package/docs/foundations/foundation-008-mode-activation-and-consumer-control.md +6 -0
  54. package/docs/foundations/foundation-009-component-boundaries-and-utility.md +6 -0
  55. package/docs/foundations/foundation-010-implementation-and-pipeline-workflow.md +6 -0
  56. package/docs/foundations/foundation-011-branching-and-release-governance.md +6 -0
  57. package/docs/foundations/foundation-012-minimal-markup-and-composition.md +6 -0
  58. package/package.json +16 -14
  59. package/dist/tokens/css/themes-(brands).tokens.brand-a.css +0 -22
  60. package/dist/tokens/json/appearance-(modes).tokens.mode-dark.json +0 -182
  61. package/dist/tokens/json/appearance-(modes).tokens.mode-light.json +0 -182
  62. package/dist/tokens/json/components-(ui).tokens.json +0 -739
  63. package/dist/tokens/json/semantics-(roles).tokens.json +0 -203
  64. package/dist/tokens/json/themes-(brands).tokens.brand-a.json +0 -115
  65. package/dist/tokens/json/themes-(brands).tokens.brand-b.json +0 -115
  66. package/docs/agentic/skills/README.md +0 -51
  67. package/docs/agentic/skills/design-ops-specialist/SKILL.md +0 -60
  68. package/docs/agentic/skills/design-system-architect/SKILL.md +0 -106
  69. package/docs/agentic/team-ai-playbook.md +0 -226
@@ -1,5 +1,5 @@
1
1
  // Auto-generated design tokens from Figma
2
- // Generated on 2026-03-31T20:27:09.721Z
2
+ // Generated on 2026-04-28T09:23:28.555Z
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-03-31T20:27:09.719Z
2
+ // Generated on 2026-04-28T09:23:28.553Z
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-03-31T20:27:09.724Z
2
+ // Generated on 2026-04-28T09:23:28.559Z
3
3
 
4
4
  export const tokens = {
5
5
  "components": {
@@ -93,18 +93,41 @@ export const tokens = {
93
93
  "--input-overlay-active": "var(--color-transparent)",
94
94
  "--input-height": "2.5rem",
95
95
  "--input-checkbox-text-color-default": "var(--color-text-default)",
96
- "--input-checkbox-text-color-hover": "var(--color-text-default)",
96
+ "--input-checkbox-text-color-hover": "var(--color-text-strong)",
97
97
  "--input-checkbox-text-color-active": "var(--color-text-inverse)",
98
98
  "--input-checkbox-border-color-default": "var(--color-border-subtle)",
99
- "--input-checkbox-border-color-hover": "var(--color-border-brand)",
99
+ "--input-checkbox-border-color-hover": "var(--color-border-strong)",
100
100
  "--input-checkbox-border-color-active": "var(--color-border-brand)",
101
101
  "--input-checkbox-border-color-focus": "var(--color-border-brand)",
102
102
  "--input-checkbox-border-color-invalid": "var(--color-border-danger)",
103
103
  "--input-checkbox-border-color-valid": "var(--color-border-strong)",
104
+ "--input-checkbox-border-color-disabled": "var(--color-border-disabled)",
104
105
  "--input-checkbox-container-background-default": "var(--color-fill-surface)",
105
106
  "--input-checkbox-container-background-hover": "var(--color-fill-surface)",
106
107
  "--input-checkbox-container-background-focus": "var(--color-fill-surface)",
107
108
  "--input-checkbox-container-background-active": "var(--color-fill-brand)",
109
+ "--input-checkbox-container-background-disabled": "var(--color-fill-disabled)",
110
+ "--input-checkbox-text-color-disabled": "var(--color-text-disabled)",
111
+ "--checkbox-border-size-hover": "var(--size-border-200)",
112
+ "--checkbox-border-size-disabled": "var(--size-border-000)",
113
+ "--checkbox-border-size-default": "var(--size-border-100)",
114
+ "--input-radio-text-color-default": "var(--color-text-default)",
115
+ "--input-radio-text-color-hover": "var(--color-text-strong)",
116
+ "--input-radio-text-color-active": "var(--color-text-inverse)",
117
+ "--input-radio-text-color-disabled": "var(--color-text-disabled)",
118
+ "--input-radio-border-color-default": "var(--color-border-subtle)",
119
+ "--input-radio-border-color-hover": "var(--color-border-strong)",
120
+ "--input-radio-border-color-active": "var(--color-border-brand)",
121
+ "--input-radio-border-color-focus": "var(--color-border-brand)",
122
+ "--input-radio-border-color-disabled": "var(--color-border-disabled)",
123
+ "--input-radio-container-background-default": "var(--color-fill-surface)",
124
+ "--input-radio-container-background-hover": "var(--color-fill-surface)",
125
+ "--input-radio-container-background-focus": "var(--color-fill-surface)",
126
+ "--input-radio-container-background-active": "var(--color-fill-brand)",
127
+ "--input-radio-container-background-disabled": "var(--color-fill-disabled)",
128
+ "--radio-border-size-default": "var(--size-border-100)",
129
+ "--radio-border-size-hover": "var(--size-border-200)",
130
+ "--radio-border-size-disabled": "var(--size-border-000)",
108
131
  "--form-group-gap": "var(--size-spacing-400)",
109
132
  "--form-group-title-color": "var(--color-text-default)",
110
133
  "--form-padding-inline": "var(--size-spacing-400)",
@@ -116,7 +139,27 @@ export const tokens = {
116
139
  "--form-field-helper-text-color-invalid": "var(--color-text-danger)",
117
140
  "--form-container-background": "var(--color-fill-surface)",
118
141
  "--form-container-border-color": "var(--color-border-subtle)",
119
- "--form-border-size": "var(--size-border-100)"
142
+ "--form-border-size": "var(--size-border-100)",
143
+ "--badge-default-container-background": "var(--color-fill-subtle)",
144
+ "--badge-default-text-color": "var(--color-text-default)",
145
+ "--badge-brand-container-background": "var(--color-fill-brand)",
146
+ "--badge-brand-text-color": "var(--color-text-inverse)",
147
+ "--badge-success-container-background": "var(--color-fill-success)",
148
+ "--badge-success-text-color": "var(--color-text-inverse)",
149
+ "--badge-danger-container-background": "var(--color-fill-danger)",
150
+ "--badge-danger-text-color": "var(--color-text-inverse)",
151
+ "--badge-border-radius": "var(--size-radius-full)",
152
+ "--badge-font-family": "var(--typography-label-font-family)",
153
+ "--badge-font-weight": "var(--font-weight-700)",
154
+ "--badge-font-size-sm": "var(--font-size-xs)",
155
+ "--badge-font-size-md": "var(--font-size-sm)",
156
+ "--badge-line-height-sm": "var(--line-height-xs)",
157
+ "--badge-line-height-md": "var(--line-height-sm)",
158
+ "--badge-padding-inline-sm": "var(--size-spacing-200)",
159
+ "--badge-padding-inline-md": "var(--size-spacing-300)",
160
+ "--badge-padding-block-sm": "var(--size-spacing-000)",
161
+ "--badge-padding-block-md": "var(--size-spacing-100)",
162
+ "--badge-gap": "var(--size-spacing-100)"
120
163
  }
121
164
  } as const;
122
165
 
@@ -1,5 +1,5 @@
1
1
  // Auto-generated design tokens from Figma
2
- // Generated on 2026-03-31T20:27:09.731Z
2
+ // Generated on 2026-04-28T09:23:28.563Z
3
3
 
4
4
  export const tokens = {
5
5
  "colors": {
@@ -24,25 +24,67 @@ export const tokens = {
24
24
  "--color-neutral-alpha-900": "rgba(0 0 0 / 0.9)",
25
25
  "--color-neutral-alpha-000": "rgba(0 0 0 / 0)",
26
26
  "--color-neutral-000": "rgb(255 255 255)",
27
- "--color-brand-a-purple-200": "rgb(222 192 255)",
28
- "--color-brand-a-purple-600": "rgb(151 71 255)",
29
- "--color-brand-a-purple-800": "rgb(85 26 139)",
30
- "--color-brand-a-blue-200": "rgb(226 244 253)",
31
- "--color-brand-a-blue-500": "rgb(112 203 244)",
32
- "--color-brand-a-blue-700": "rgb(12 75 243)",
33
- "--color-brand-a-blue-800": "rgb(27 17 92)",
34
- "--color-brand-a-green": "rgb(19 174 92)",
35
- "--color-brand-a-red": "rgb(255 0 0)",
36
- "--color-brand-b-purple-200": "rgb(196 143 255)",
37
- "--color-brand-b-purple-600": "rgb(122 20 255)",
38
- "--color-brand-b-purple-800": "rgb(58 18 95)",
39
- "--color-brand-b-blue-200": "rgb(179 226 250)",
40
- "--color-brand-b-blue-500": "rgb(66 186 240)",
41
- "--color-brand-b-blue-700": "rgb(10 60 194)",
42
- "--color-brand-b-blue-800": "rgb(14 9 47)",
43
- "--color-brand-b-red": "rgb(204 0 0)",
44
- "--color-brand-b-green": "rgb(14 129 68)",
45
- "--color-transparent": "rgba(0 0 0 / 0)"
27
+ "--color-brand-b-purple-200": "rgb(222 192 255)",
28
+ "--color-brand-b-purple-300": "rgb(196 143 255)",
29
+ "--color-brand-b-purple-600": "rgb(151 71 255)",
30
+ "--color-brand-b-purple-700": "rgb(122 20 255)",
31
+ "--color-brand-b-purple-800": "rgb(85 26 139)",
32
+ "--color-brand-b-purple-900": "rgb(58 18 95)",
33
+ "--color-brand-b-blue-100": "rgb(206 219 253)",
34
+ "--color-brand-b-blue-200": "rgb(158 183 250)",
35
+ "--color-brand-b-blue-300": "rgb(109 147 248)",
36
+ "--color-brand-b-blue-400": "rgb(61 111 245)",
37
+ "--color-brand-b-blue-500": "rgb(12 75 243)",
38
+ "--color-brand-b-blue-600": "rgb(10 60 194)",
39
+ "--color-brand-b-blue-700": "rgb(7 45 146)",
40
+ "--color-brand-b-blue-800": "rgb(5 30 97)",
41
+ "--color-brand-b-blue-900": "rgb(2 15 49)",
42
+ "--color-brand-b-red-100": "rgb(255 255 255)",
43
+ "--color-brand-b-red-200": "rgb(255 204 204)",
44
+ "--color-brand-b-red-300": "rgb(255 153 153)",
45
+ "--color-brand-b-red-400": "rgb(255 102 102)",
46
+ "--color-brand-b-red-500": "rgb(255 51 51)",
47
+ "--color-brand-b-red-600": "rgb(255 0 0)",
48
+ "--color-brand-b-red-700": "rgb(153 0 0)",
49
+ "--color-brand-b-red-800": "rgb(102 0 0)",
50
+ "--color-brand-b-red-900": "rgb(51 0 0)",
51
+ "--color-brand-b-green-100": "rgb(246 254 250)",
52
+ "--color-brand-b-green-200": "rgb(200 249 223)",
53
+ "--color-brand-b-green-300": "rgb(154 244 196)",
54
+ "--color-brand-b-green-400": "rgb(108 239 170)",
55
+ "--color-brand-b-green-500": "rgb(62 234 143)",
56
+ "--color-brand-b-green-600": "rgb(19 174 92)",
57
+ "--color-brand-b-green-700": "rgb(14 129 68)",
58
+ "--color-brand-b-green-800": "rgb(8 69 36)",
59
+ "--color-brand-b-green-900": "rgb(4 37 19)",
60
+ "--color-transparent": "rgba(0 0 0 / 0)",
61
+ "--color-brand-a-green-100": "rgb(243 246 233)",
62
+ "--color-brand-a-green-200": "rgb(223 231 197)",
63
+ "--color-brand-a-green-300": "rgb(207 219 169)",
64
+ "--color-brand-a-green-400": "rgb(191 207 140)",
65
+ "--color-brand-a-green-500": "rgb(175 195 111)",
66
+ "--color-brand-a-green-600": "rgb(159 183 82)",
67
+ "--color-brand-a-green-700": "rgb(137 158 66)",
68
+ "--color-brand-a-green-800": "rgb(112 129 54)",
69
+ "--color-brand-a-green-900": "rgb(81 93 39)",
70
+ "--color-brand-a-red-100": "rgb(254 251 251)",
71
+ "--color-brand-a-red-200": "rgb(250 224 230)",
72
+ "--color-brand-a-red-300": "rgb(244 179 195)",
73
+ "--color-brand-a-red-400": "rgb(238 135 160)",
74
+ "--color-brand-a-red-500": "rgb(231 90 124)",
75
+ "--color-brand-a-red-600": "rgb(225 46 89)",
76
+ "--color-brand-a-red-700": "rgb(191 28 67)",
77
+ "--color-brand-a-red-800": "rgb(147 21 52)",
78
+ "--color-brand-a-red-900": "rgb(102 15 36)",
79
+ "--color-brand-a-sand-100": "rgb(240 240 229)",
80
+ "--color-brand-a-sand-200": "rgb(221 222 197)",
81
+ "--color-brand-a-sand-300": "rgb(192 193 172)",
82
+ "--color-brand-a-sand-400": "rgb(164 165 147)",
83
+ "--color-brand-a-sand-500": "rgb(136 137 122)",
84
+ "--color-brand-a-sand-600": "rgb(108 109 97)",
85
+ "--color-brand-a-sand-700": "rgb(80 81 72)",
86
+ "--color-brand-a-sand-800": "rgb(52 52 47)",
87
+ "--color-brand-a-sand-900": "rgb(24 24 22)"
46
88
  },
47
89
  "typography": {
48
90
  "--font-size-md": "1rem",
@@ -1,5 +1,5 @@
1
1
  // Auto-generated design tokens from Figma
2
- // Generated on 2026-03-31T20:27:09.733Z
2
+ // Generated on 2026-04-28T09:23:28.564Z
3
3
 
4
4
  export const tokens = {
5
5
  "typography": {
@@ -1,16 +1,16 @@
1
1
  // Auto-generated design tokens from Figma
2
- // Generated on 2026-03-31T20:27:09.734Z
2
+ // Generated on 2026-04-28T09:23:28.565Z
3
3
 
4
4
  export const tokens = {
5
5
  "colors": {
6
- "--brand-color-functional-success": "var(--color-brand-a-green)",
7
- "--brand-color-functional-danger": "var(--color-brand-a-red)",
8
- "--brand-color-functional-base": "var(--color-brand-a-blue-700)",
9
- "--brand-color-functional-base-dark": "var(--color-brand-a-blue-800)",
10
- "--brand-color-primary": "var(--color-brand-a-purple-600)",
11
- "--brand-color-accent": "var(--color-brand-a-blue-500)",
12
- "--brand-color-primary-dark": "var(--color-brand-a-purple-800)",
13
- "--brand-color-accent-dark": "var(--color-brand-a-blue-700)",
6
+ "--brand-color-functional-success": "var(--color-brand-a-green-600)",
7
+ "--brand-color-functional-danger": "var(--color-brand-a-red-600)",
8
+ "--brand-color-functional-base": "var(--color-brand-a-green-700)",
9
+ "--brand-color-functional-base-dark": "var(--color-brand-a-green-900)",
10
+ "--brand-color-primary": "var(--color-brand-a-sand-700)",
11
+ "--brand-color-accent": "var(--color-brand-a-green-400)",
12
+ "--brand-color-primary-dark": "var(--color-brand-a-sand-900)",
13
+ "--brand-color-accent-dark": "var(--color-brand-a-green-600)",
14
14
  "--brand-color-subtle": "var(--color-neutral-500)",
15
15
  "--brand-color-subtle-dark": "var(--color-neutral-800)",
16
16
  "--brand-color-subtle-light": "var(--color-neutral-200)"
@@ -1,16 +1,16 @@
1
1
  // Auto-generated design tokens from Figma
2
- // Generated on 2026-03-31T20:27:09.734Z
2
+ // Generated on 2026-04-28T09:23:28.567Z
3
3
 
4
4
  export const tokens = {
5
5
  "colors": {
6
- "--brand-color-functional-success": "var(--color-brand-b-green)",
7
- "--brand-color-functional-danger": "var(--color-brand-b-red)",
8
- "--brand-color-functional-base": "var(--color-brand-b-purple-600)",
9
- "--brand-color-functional-base-dark": "var(--color-brand-b-purple-800)",
10
- "--brand-color-primary": "var(--color-brand-b-blue-500)",
11
- "--brand-color-accent": "var(--color-brand-b-purple-600)",
12
- "--brand-color-primary-dark": "var(--color-brand-b-blue-700)",
13
- "--brand-color-accent-dark": "var(--color-brand-b-purple-800)",
6
+ "--brand-color-functional-success": "var(--color-brand-b-green-600)",
7
+ "--brand-color-functional-danger": "var(--color-brand-b-red-600)",
8
+ "--brand-color-functional-base": "var(--color-brand-b-purple-700)",
9
+ "--brand-color-functional-base-dark": "var(--color-brand-b-purple-900)",
10
+ "--brand-color-primary": "var(--color-brand-b-purple-600)",
11
+ "--brand-color-accent": "var(--color-brand-b-green-400)",
12
+ "--brand-color-primary-dark": "var(--color-brand-b-purple-800)",
13
+ "--brand-color-accent-dark": "var(--color-brand-b-green-800)",
14
14
  "--brand-color-subtle": "var(--color-neutral-500)",
15
15
  "--brand-color-subtle-dark": "var(--color-neutral-800)",
16
16
  "--brand-color-subtle-light": "var(--color-neutral-200)"
package/dist/ui/index.css CHANGED
@@ -3,4 +3,6 @@
3
3
  @import url("./patterns/input.css") layer(components);
4
4
  @import url("./patterns/icon.css") layer(components);
5
5
  @import url("./patterns/checkbox.css") layer(components);
6
+ @import url("./patterns/radio.css") layer(components);
6
7
  @import url("./patterns/switch.css") layer(components);
8
+ @import url("./patterns/badge.css") layer(components);
@@ -0,0 +1,49 @@
1
+ @layer components {
2
+ .badge {
3
+ display: inline-flex;
4
+ align-items: center;
5
+ gap: var(--badge-gap, 0.25rem);
6
+ border-radius: var(--badge-border-radius, 625rem);
7
+ font-family: var(--badge-font-family, inherit);
8
+ font-weight: var(--badge-font-weight, 700);
9
+ white-space: nowrap;
10
+ background: var(--badge-default-container-background);
11
+ color: var(--badge-default-text-color);
12
+ font-size: var(--badge-font-size-md);
13
+ line-height: var(--badge-line-height-md);
14
+ padding-inline: var(--badge-padding-inline-md);
15
+ padding-block: var(--badge-padding-block-md);
16
+ }
17
+
18
+ /* ── Sizes ── */
19
+
20
+ .badge.sm {
21
+ font-size: var(--badge-font-size-sm);
22
+ line-height: var(--badge-line-height-sm);
23
+ padding-inline: var(--badge-padding-inline-sm);
24
+ padding-block: var(--badge-padding-block-sm);
25
+ }
26
+
27
+ /* ── Variants ── */
28
+
29
+ .badge.brand {
30
+ background: var(--badge-brand-container-background);
31
+ color: var(--badge-brand-text-color);
32
+ }
33
+
34
+ .badge.success {
35
+ background: var(--badge-success-container-background);
36
+ color: var(--badge-success-text-color);
37
+ }
38
+
39
+ .badge.danger {
40
+ background: var(--badge-danger-container-background);
41
+ color: var(--badge-danger-text-color);
42
+ }
43
+
44
+ /* ── Icon slot ── */
45
+
46
+ .badge > .icon {
47
+ flex: 0 0 auto;
48
+ }
49
+ }
@@ -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(--color-text-default);
10
+ color: var(--input-checkbox-text-color-default);
11
11
  cursor: pointer;
12
12
  }
13
13
 
14
14
  .checkbox-field.is-disabled {
15
- color: var(--color-text-disabled);
15
+ color: var(--input-checkbox-text-color-disabled);
16
16
  cursor: not-allowed;
17
17
  }
18
18
 
@@ -24,52 +24,91 @@
24
24
  display: inline-grid;
25
25
  place-content: center;
26
26
  border-style: solid;
27
- border-width: var(--size-border-100);
28
- border-color: var(--color-border-default);
29
- border-radius: var(--brand-corner-input);
30
- background: var(--color-fill-surface);
31
- color: var(--color-text-inverse);
27
+ border-width: var(--checkbox-border-size-default);
28
+ border-color: var(--input-checkbox-border-color-default);
29
+ border-radius: var(--corner-checkbox-radius);
30
+ background: var(--input-checkbox-container-background-default);
31
+ color: var(--input-checkbox-text-color-active);
32
32
  cursor: pointer;
33
33
  }
34
34
 
35
35
  .checkbox::after {
36
36
  content: "";
37
+ display: block;
37
38
  }
38
39
 
39
40
  .checkbox:checked,
40
41
  .checkbox.is-checked {
41
- border-color: var(--color-border-brand);
42
- background: var(--color-fill-brand);
42
+ border-color: var(--input-checkbox-border-color-active);
43
+ background: var(--input-checkbox-container-background-active);
43
44
  }
44
45
 
45
46
  .checkbox:checked::after,
46
47
  .checkbox.is-checked::after {
47
- content: "\2713";
48
- font-size: var(--typography-label-font-size);
49
- line-height: var(--typography-label-line-height);
48
+ content: "";
49
+ inline-size: 0.75em;
50
+ block-size: 0.75em;
51
+ background-color: currentColor;
52
+ -webkit-mask-image: url("/assets/icons/checkmark.svg");
53
+ mask-image: url("/assets/icons/checkmark.svg");
54
+ -webkit-mask-size: contain;
55
+ mask-size: contain;
56
+ -webkit-mask-repeat: no-repeat;
57
+ mask-repeat: no-repeat;
58
+ -webkit-mask-position: center;
59
+ mask-position: center;
60
+ }
61
+
62
+ .checkbox:indeterminate,
63
+ .checkbox.is-indeterminate {
64
+ border-color: var(--input-checkbox-border-color-active);
65
+ background: var(--input-checkbox-container-background-active);
66
+ }
67
+
68
+ .checkbox:indeterminate::after,
69
+ .checkbox.is-indeterminate::after {
70
+ inline-size: 0.75rem;
71
+ block-size: var(--size-border-200);
72
+ border-radius: 999px;
73
+ background: currentColor;
50
74
  }
51
75
 
52
76
  .checkbox:hover,
53
77
  .checkbox.is-hover {
54
78
  background:
55
79
  linear-gradient(0deg, var(--color-overlay-hover), var(--color-overlay-hover)),
56
- var(--color-fill-surface);
57
- border-color: var(--color-border-brand);
80
+ var(--input-checkbox-container-background-hover);
81
+ color: var(--input-checkbox-text-color-hover);
82
+ border-color: var(--input-checkbox-border-color-hover);
83
+ border-width: var(--checkbox-border-size-hover);
58
84
  }
59
85
 
60
86
  .checkbox:checked:hover,
61
87
  .checkbox.is-checked.is-hover {
62
88
  background:
63
89
  linear-gradient(0deg, var(--color-overlay-hover), var(--color-overlay-hover)),
64
- var(--color-fill-brand);
90
+ var(--input-checkbox-container-background-active);
91
+ color: var(--input-checkbox-text-color-hover);
92
+ border-color: var(--input-checkbox-border-color-hover);
93
+ border-width: var(--checkbox-border-size-hover);
94
+ }
95
+
96
+ .checkbox:indeterminate:hover,
97
+ .checkbox.is-indeterminate.is-hover {
98
+ background:
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);
103
+ border-width: var(--checkbox-border-size-hover);
65
104
  }
66
105
 
67
106
  .checkbox:active,
68
107
  .checkbox.is-active {
69
108
  background:
70
109
  linear-gradient(0deg, var(--color-overlay-active), var(--color-overlay-active)),
71
- var(--color-fill-surface);
72
- border-color: var(--color-border-brand);
110
+ var(--input-checkbox-container-background-default);
111
+ border-color: var(--input-checkbox-border-color-active);
73
112
  border-width: var(--size-border-200);
74
113
  }
75
114
 
@@ -77,21 +116,31 @@
77
116
  .checkbox.is-checked.is-active {
78
117
  background:
79
118
  linear-gradient(0deg, var(--color-overlay-active), var(--color-overlay-active)),
80
- var(--color-fill-brand);
119
+ var(--input-checkbox-container-background-active);
120
+ border-color: var(--input-checkbox-border-color-active);
121
+ }
122
+
123
+ .checkbox:indeterminate:active,
124
+ .checkbox.is-indeterminate.is-active {
125
+ background:
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);
81
129
  }
82
130
 
83
131
  .checkbox:focus-visible,
84
132
  .checkbox.is-focus-visible {
85
- border-color: var(--color-border-brand);
133
+ border-color: var(--input-checkbox-border-color-focus);
86
134
  outline: none;
87
135
  box-shadow: 0 0 0 var(--shadow-focus, 0) var(--color-focus, transparent);
88
136
  }
89
137
 
90
138
  .checkbox:disabled,
91
139
  .checkbox.is-disabled {
92
- border-color: var(--color-border-disabled);
93
- background: var(--color-fill-disabled);
94
- color: var(--color-text-disabled);
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);
95
144
  cursor: not-allowed;
96
145
  }
97
146
  }
@@ -0,0 +1,109 @@
1
+ @layer components {
2
+ .radio-field {
3
+ display: inline-flex;
4
+ align-items: center;
5
+ gap: var(--typography-label-gap);
6
+ font-family: var(--typography-label-font-family);
7
+ font-weight: var(--typography-label-font-weight);
8
+ font-size: var(--typography-label-font-size);
9
+ line-height: var(--typography-label-line-height);
10
+ color: var(--input-radio-text-color-default);
11
+ cursor: pointer;
12
+ }
13
+
14
+ .radio-field.is-disabled {
15
+ color: var(--input-radio-text-color-disabled);
16
+ cursor: not-allowed;
17
+ }
18
+
19
+ .radio {
20
+ inline-size: var(--size-spacing-600);
21
+ block-size: var(--size-spacing-600);
22
+ margin: 0;
23
+ appearance: none;
24
+ display: inline-grid;
25
+ place-content: center;
26
+ border-style: solid;
27
+ border-width: var(--radio-border-size-default);
28
+ border-color: var(--input-radio-border-color-default);
29
+ border-radius: var(--size-radius-full);
30
+ background: var(--input-radio-container-background-default);
31
+ cursor: pointer;
32
+ }
33
+
34
+ .radio::after {
35
+ content: "";
36
+ display: block;
37
+ inline-size: 0;
38
+ block-size: 0;
39
+ border-radius: var(--size-radius-full);
40
+ background: currentColor;
41
+ transition: all 120ms ease;
42
+ }
43
+
44
+ .radio:checked,
45
+ .radio.is-checked {
46
+ border-color: var(--input-radio-border-color-active);
47
+ background: var(--input-radio-container-background-default);
48
+ color: var(--input-radio-text-color-active);
49
+ }
50
+
51
+ .radio:checked::after,
52
+ .radio.is-checked::after {
53
+ inline-size: 0.5rem;
54
+ block-size: 0.5rem;
55
+ background: var(--input-radio-border-color-active);
56
+ }
57
+
58
+ .radio:hover,
59
+ .radio.is-hover {
60
+ background:
61
+ linear-gradient(0deg, var(--color-overlay-hover), var(--color-overlay-hover)),
62
+ var(--input-radio-container-background-hover);
63
+ color: var(--input-radio-text-color-hover);
64
+ border-color: var(--input-radio-border-color-hover);
65
+ border-width: var(--radio-border-size-hover);
66
+ }
67
+
68
+ .radio:checked:hover,
69
+ .radio.is-checked.is-hover {
70
+ background:
71
+ linear-gradient(0deg, var(--color-overlay-hover), var(--color-overlay-hover)),
72
+ var(--input-radio-container-background-default);
73
+ border-color: var(--input-radio-border-color-hover);
74
+ border-width: var(--radio-border-size-hover);
75
+ }
76
+
77
+ .radio:active,
78
+ .radio.is-active {
79
+ background:
80
+ linear-gradient(0deg, var(--color-overlay-active), var(--color-overlay-active)),
81
+ var(--input-radio-container-background-default);
82
+ border-color: var(--input-radio-border-color-active);
83
+ border-width: var(--size-border-200);
84
+ }
85
+
86
+ .radio:checked:active,
87
+ .radio.is-checked.is-active {
88
+ background:
89
+ linear-gradient(0deg, var(--color-overlay-active), var(--color-overlay-active)),
90
+ var(--input-radio-container-background-default);
91
+ border-color: var(--input-radio-border-color-active);
92
+ }
93
+
94
+ .radio:focus-visible,
95
+ .radio.is-focus-visible {
96
+ border-color: var(--input-radio-border-color-focus);
97
+ outline: none;
98
+ box-shadow: 0 0 0 var(--shadow-focus, 0) var(--color-focus, transparent);
99
+ }
100
+
101
+ .radio:disabled,
102
+ .radio.is-disabled {
103
+ border-width: var(--radio-border-size-disabled);
104
+ border-color: var(--input-radio-border-color-disabled);
105
+ background: var(--input-radio-container-background-disabled);
106
+ color: var(--input-radio-text-color-disabled);
107
+ cursor: not-allowed;
108
+ }
109
+ }
package/docs/README.md ADDED
@@ -0,0 +1,38 @@
1
+ # Documentation Map
2
+
3
+ ## Purpose
4
+
5
+ This directory is the human- and agent-readable map of UI Foundations.
6
+ Use it to find the right level of documentation before diving into implementation
7
+ details or local agent configuration.
8
+
9
+ ## Canonical sections
10
+
11
+ | Section | What belongs here | Start with |
12
+ |---|---|---|
13
+ | `playbook.md` | Reading order, operating model, and agent roles | `docs/playbook.md` |
14
+ | `foundations/` | Token architecture, naming, theming, parity, and format guidance | `docs/foundations/README.md` |
15
+ | `principles/` | Perception, heuristics, and accessibility intent | `docs/principles/README.md` |
16
+ | `patterns/` | Pattern-level composition guidance | `docs/patterns/README.md` |
17
+ | `components/` | Component-facing entry docs and TODO gaps | `docs/components/README.md` |
18
+ | `agentic/` | Agent behavior, workflows, prompts, and migration context | `docs/agentic/README.md` |
19
+ | `adr/` | Architecture decision records and documentation migration notes | `docs/adr/README.md` |
20
+ | `validation/` | Validation checklists, CI, token parity, and accessibility checks | `docs/validation/README.md` |
21
+
22
+ ## Legacy docs kept in place
23
+
24
+ - `docs/ui-foundations-rules.md`
25
+ - `docs/token-pipeline.md`
26
+ - `docs/working-context.md`
27
+ - `docs/context-manifest.json`
28
+ - `docs/foundations/foundation-*.md`
29
+
30
+ These remain valid source material. New docs should point to them rather than
31
+ rewriting them unless a targeted migration is clearly safe.
32
+
33
+ ## Related docs
34
+
35
+ - `AGENTS.md`
36
+ - `README.md`
37
+ - `IMPLEMENTATION.md`
38
+ - `DESIGN.md`
@@ -0,0 +1,34 @@
1
+ # Agentic Docs
2
+
3
+ ## Purpose
4
+
5
+ This section explains how different agents should read, plan, validate, and act
6
+ in the repository.
7
+
8
+ ## Canonical files
9
+
10
+ | File | Topic |
11
+ |---|---|
12
+ | `assistant-behavior-rules.md` | Detailed component and token checklist |
13
+ | `kiro-workflow.md` | Kiro steering, specs, and workflow guidance |
14
+ | `goose-workflow.md` | Goose audit and validation workflow guidance |
15
+ | `codex-workflow.md` | Codex execution workflow guidance |
16
+ | `rule-pipeline.md` | Principles -> Patterns -> Components -> Validation -> CI |
17
+
18
+ ## Supporting files
19
+
20
+ | File | Topic |
21
+ |---|---|
22
+ | `rule-pipeline-audit.md` | Audit findings, target architecture, and gap table |
23
+ | `MIGRATION.md` | Historical migration context |
24
+ | `prompts/` | Prompt templates and placeholders |
25
+ | `modes/` | Task-specific agent modes |
26
+
27
+ ## Who should read this
28
+
29
+ - Agents planning or executing repo work
30
+ - Engineers maintaining local agent workflows
31
+
32
+ ## Skills
33
+
34
+ - `skills/ux-writing-coach.md` — multilingual UX writing review skill for product copy