ui-foundations 0.3.2 → 0.6.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 (87) hide show
  1. package/README.md +181 -37
  2. package/dist/assets/icons/checkmark.svg +1 -0
  3. package/dist/core/index.css +8 -7
  4. package/dist/macros/ui.njk +203 -0
  5. package/dist/main.css +941 -210
  6. package/dist/react/accordion.js +36 -0
  7. package/dist/react/avatar.js +34 -0
  8. package/dist/react/badge.js +41 -0
  9. package/dist/react/button.js +4 -6
  10. package/dist/react/checkbox.js +21 -8
  11. package/dist/react/divider.js +31 -0
  12. package/dist/react/icon.js +8 -1
  13. package/dist/react/index.js +8 -0
  14. package/dist/react/label.js +1 -1
  15. package/dist/react/radio.js +45 -0
  16. package/dist/react/switch.js +9 -8
  17. package/dist/react/tabs.js +72 -0
  18. package/dist/react/textarea.js +38 -0
  19. package/dist/react/tooltip.js +25 -0
  20. package/dist/react/warn-dev.js +15 -0
  21. package/dist/tokens/css/{appearance-(modes).tokens.mode-dark.css → appearance-modes.tokens.mode-dark.css} +6 -6
  22. package/dist/tokens/css/{appearance-(modes).tokens.mode-light.css → appearance-modes.tokens.mode-light.css} +1 -1
  23. package/dist/tokens/css/{components-(ui).tokens.css → components-ui.tokens.css} +73 -32
  24. package/dist/tokens/css/core-primitives.tokens.css +240 -0
  25. package/dist/tokens/css/{semantics-(roles).tokens.css → semantics-roles.tokens.css} +1 -1
  26. package/dist/tokens/css/themes-brands.tokens.brand-a.css +22 -0
  27. package/dist/tokens/css/{themes-(brands).tokens.brand-b.css → themes-brands.tokens.brand-b.css} +9 -9
  28. package/dist/tokens/css/themes-brands.tokens.brand-c.css +22 -0
  29. package/dist/tokens/json/appearance-modes.tokens.mode-dark.json +121 -0
  30. package/dist/tokens/json/appearance-modes.tokens.mode-light.json +121 -0
  31. package/dist/tokens/json/components-ui.tokens.json +713 -0
  32. package/dist/tokens/json/{core-(primitives).tokens.json → core-primitives.tokens.json} +526 -410
  33. package/dist/tokens/json/semantics-roles.tokens.json +141 -0
  34. package/dist/tokens/json/themes-brands.tokens.brand-a.json +81 -0
  35. package/dist/tokens/json/themes-brands.tokens.brand-b.json +81 -0
  36. package/dist/tokens/json/themes-brands.tokens.brand-c.json +81 -0
  37. package/dist/tokens/tokens.yaml +2722 -499
  38. package/dist/tokens/ts/{appearance-(modes).tokens.mode-dark.ts → appearance-modes.tokens.mode-dark.ts} +6 -6
  39. package/dist/tokens/ts/{appearance-(modes).tokens.mode-light.ts → appearance-modes.tokens.mode-light.ts} +1 -1
  40. package/dist/tokens/ts/{components-(ui).tokens.ts → components-ui.tokens.ts} +74 -33
  41. package/dist/tokens/ts/core-primitives.tokens.ts +265 -0
  42. package/dist/tokens/ts/{semantics-(roles).tokens.ts → semantics-roles.tokens.ts} +1 -1
  43. package/dist/tokens/ts/themes-brands.tokens.brand-a.ts +32 -0
  44. package/dist/tokens/ts/{themes-(brands).tokens.brand-b.ts → themes-brands.tokens.brand-b.ts} +9 -9
  45. package/dist/tokens/ts/{themes-(brands).tokens.brand-a.ts → themes-brands.tokens.brand-c.ts} +9 -9
  46. package/dist/ui/index.css +8 -0
  47. package/dist/ui/patterns/accordion.css +81 -0
  48. package/dist/ui/patterns/avatar.css +57 -0
  49. package/dist/ui/patterns/badge.css +49 -0
  50. package/dist/ui/patterns/checkbox.css +71 -22
  51. package/dist/ui/patterns/divider.css +25 -0
  52. package/dist/ui/patterns/radio.css +109 -0
  53. package/dist/ui/patterns/tabs.css +71 -0
  54. package/dist/ui/patterns/textarea.css +50 -0
  55. package/dist/ui/patterns/tooltip.css +64 -0
  56. package/docs/README.md +38 -0
  57. package/docs/agentic/README.md +35 -0
  58. package/docs/agentic/assistant-behavior-rules.md +48 -0
  59. package/docs/agentic/skills/component-accessibility-audit.md +132 -0
  60. package/docs/agentic/skills/ux-writing-coach.md +116 -0
  61. package/docs/foundations/README.md +31 -0
  62. package/docs/foundations/foundation-001-token-layering.md +6 -0
  63. package/docs/foundations/foundation-002-naming-and-grouping.md +6 -0
  64. package/docs/foundations/foundation-003-color-semantics-and-status.md +6 -0
  65. package/docs/foundations/foundation-004-typography-scale-and-line-height.md +6 -0
  66. package/docs/foundations/foundation-005-responsive-breakpoints-and-containers.md +6 -0
  67. package/docs/foundations/foundation-006-z-index-layering.md +6 -0
  68. package/docs/foundations/foundation-007-typography-selectors-and-specificity.md +7 -1
  69. package/docs/foundations/foundation-008-mode-activation-and-consumer-control.md +6 -0
  70. package/docs/foundations/foundation-009-component-boundaries-and-utility.md +6 -0
  71. package/docs/foundations/foundation-010-implementation-and-pipeline-workflow.md +6 -0
  72. package/docs/foundations/foundation-011-branching-and-release-governance.md +6 -0
  73. package/docs/foundations/foundation-012-minimal-markup-and-composition.md +6 -0
  74. package/package.json +16 -11
  75. package/dist/tokens/css/core-(primitives).tokens.css +0 -127
  76. package/dist/tokens/css/themes-(brands).tokens.brand-a.css +0 -22
  77. package/dist/tokens/json/appearance-(modes).tokens.mode-dark.json +0 -182
  78. package/dist/tokens/json/appearance-(modes).tokens.mode-light.json +0 -182
  79. package/dist/tokens/json/components-(ui).tokens.json +0 -739
  80. package/dist/tokens/json/semantics-(roles).tokens.json +0 -203
  81. package/dist/tokens/json/themes-(brands).tokens.brand-a.json +0 -115
  82. package/dist/tokens/json/themes-(brands).tokens.brand-b.json +0 -115
  83. package/dist/tokens/ts/core-(primitives).tokens.ts +0 -152
  84. package/docs/agentic/skills/README.md +0 -51
  85. package/docs/agentic/skills/design-ops-specialist/SKILL.md +0 -60
  86. package/docs/agentic/skills/design-system-architect/SKILL.md +0 -106
  87. package/docs/agentic/team-ai-playbook.md +0 -226
@@ -0,0 +1,57 @@
1
+ @layer components {
2
+ .avatar {
3
+ display: inline-flex;
4
+ align-items: center;
5
+ justify-content: center;
6
+ border-radius: var(--size-radius-full);
7
+ overflow: hidden;
8
+ background: var(--color-fill-subtle);
9
+ color: var(--color-text-default);
10
+ font-family: var(--font-family-sans);
11
+ font-weight: var(--font-weight-600);
12
+ inline-size: 2.5rem;
13
+ block-size: 2.5rem;
14
+ font-size: var(--font-size-sm);
15
+ }
16
+
17
+ /* ── Sizes ── */
18
+
19
+ .avatar.xs {
20
+ inline-size: 1.5rem;
21
+ block-size: 1.5rem;
22
+ font-size: var(--font-size-xs);
23
+ }
24
+
25
+ .avatar.sm {
26
+ inline-size: 2rem;
27
+ block-size: 2rem;
28
+ font-size: var(--font-size-xs);
29
+ }
30
+
31
+ .avatar.lg {
32
+ inline-size: 3rem;
33
+ block-size: 3rem;
34
+ font-size: var(--font-size-md);
35
+ }
36
+
37
+ .avatar.xl {
38
+ inline-size: 4rem;
39
+ block-size: 4rem;
40
+ font-size: var(--font-size-lg);
41
+ }
42
+
43
+ /* ── Image ── */
44
+
45
+ .avatar > img {
46
+ inline-size: 100%;
47
+ block-size: 100%;
48
+ object-fit: cover;
49
+ }
50
+
51
+ /* ── Initials ── */
52
+
53
+ .avatar__initials {
54
+ user-select: none;
55
+ text-transform: uppercase;
56
+ }
57
+ }
@@ -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,25 @@
1
+ @layer components {
2
+ .divider {
3
+ border: none;
4
+ margin: 0;
5
+ padding: 0;
6
+ background: var(--divider-color, var(--color-border-default));
7
+ block-size: var(--size-border-100);
8
+ inline-size: 100%;
9
+ align-self: stretch;
10
+ }
11
+
12
+ /* ── Vertical orientation ── */
13
+
14
+ .divider[aria-orientation="vertical"] {
15
+ block-size: auto;
16
+ inline-size: var(--size-border-100);
17
+ align-self: stretch;
18
+ }
19
+
20
+ /* ── Subtle variant ── */
21
+
22
+ .divider.subtle {
23
+ --divider-color: var(--color-border-subtle);
24
+ }
25
+ }
@@ -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
+ }
@@ -0,0 +1,71 @@
1
+ @layer components {
2
+ .tabs {
3
+ display: flex;
4
+ flex-direction: column;
5
+ }
6
+
7
+ .tab-list {
8
+ display: flex;
9
+ gap: 0;
10
+ border-block-end: var(--size-border-100) solid var(--color-border-default);
11
+ }
12
+
13
+ .tab-list[aria-orientation="vertical"] {
14
+ flex-direction: column;
15
+ border-block-end: none;
16
+ border-inline-end: var(--size-border-100) solid var(--color-border-default);
17
+ }
18
+
19
+ .tab {
20
+ display: inline-flex;
21
+ align-items: center;
22
+ justify-content: center;
23
+ padding-inline: var(--size-spacing-400);
24
+ padding-block: var(--size-spacing-300);
25
+ font-family: var(--font-family-sans);
26
+ font-size: var(--font-size-md);
27
+ font-weight: var(--font-weight-500);
28
+ line-height: var(--line-height-md);
29
+ color: var(--color-text-default);
30
+ background: transparent;
31
+ border: none;
32
+ border-block-end: var(--size-border-200) solid transparent;
33
+ cursor: pointer;
34
+ white-space: nowrap;
35
+ transition: border-color 0.15s ease, color 0.15s ease;
36
+ }
37
+
38
+ .tab:hover,
39
+ .tab.is-hover {
40
+ color: var(--color-text-brand);
41
+ border-block-end-color: var(--color-border-subtle);
42
+ }
43
+
44
+ .tab[aria-selected="true"],
45
+ .tab.is-selected {
46
+ color: var(--color-text-brand);
47
+ font-weight: var(--font-weight-600);
48
+ border-block-end-color: var(--color-border-brand);
49
+ }
50
+
51
+ .tab:focus-visible,
52
+ .tab.is-focus-visible {
53
+ outline: none;
54
+ box-shadow: inset 0 0 0 var(--shadow-focus) var(--color-focus);
55
+ }
56
+
57
+ .tab:disabled,
58
+ .tab.is-disabled {
59
+ color: var(--color-text-disabled);
60
+ cursor: not-allowed;
61
+ border-block-end-color: transparent;
62
+ }
63
+
64
+ .tab-panel {
65
+ padding-block: var(--size-spacing-400);
66
+ }
67
+
68
+ .tab-panel[hidden] {
69
+ display: none;
70
+ }
71
+ }
@@ -0,0 +1,50 @@
1
+ @layer components {
2
+ .textarea {
3
+ display: block;
4
+ inline-size: 100%;
5
+ min-block-size: calc(var(--line-height-md) * 3 + var(--size-spacing-300) * 2);
6
+ padding-inline: var(--size-spacing-300);
7
+ padding-block: var(--size-spacing-300);
8
+ font-family: var(--font-family-sans);
9
+ font-size: var(--font-size-md);
10
+ line-height: var(--line-height-md);
11
+ color: var(--color-text-default);
12
+ background: var(--color-fill-surface);
13
+ border: var(--size-border-100) solid var(--color-border-default);
14
+ border-radius: var(--size-radius-300);
15
+ resize: vertical;
16
+ transition: border-color 0.15s ease;
17
+ }
18
+
19
+ .textarea::placeholder {
20
+ color: var(--color-text-disabled);
21
+ }
22
+
23
+ .textarea:hover,
24
+ .textarea.is-hover {
25
+ border-color: var(--color-border-strong);
26
+ }
27
+
28
+ .textarea:focus-visible,
29
+ .textarea.is-focus-visible {
30
+ border-color: var(--color-focus);
31
+ outline: none;
32
+ box-shadow: 0 0 0 var(--shadow-focus) var(--color-focus);
33
+ }
34
+
35
+ .textarea:disabled,
36
+ .textarea.is-disabled {
37
+ color: var(--color-text-disabled);
38
+ background: var(--color-fill-disabled);
39
+ border-color: var(--color-border-disabled);
40
+ cursor: not-allowed;
41
+ resize: none;
42
+ }
43
+
44
+ .textarea[readonly] {
45
+ background: var(--color-fill-surface);
46
+ border-color: var(--color-border-default);
47
+ cursor: default;
48
+ resize: none;
49
+ }
50
+ }
@@ -0,0 +1,64 @@
1
+ @layer components {
2
+ .tooltip {
3
+ position: absolute;
4
+ z-index: var(--zindex-tooltip);
5
+ max-inline-size: 15rem;
6
+ padding-inline: var(--size-spacing-300);
7
+ padding-block: var(--size-spacing-200);
8
+ font-family: var(--font-family-sans);
9
+ font-size: var(--font-size-sm);
10
+ line-height: var(--line-height-sm);
11
+ color: var(--color-text-inverse);
12
+ background: var(--color-neutral-900);
13
+ border-radius: var(--size-radius-300);
14
+ pointer-events: none;
15
+ opacity: 0;
16
+ transition: opacity 0.15s ease;
17
+ }
18
+
19
+ .tooltip.is-visible {
20
+ opacity: 1;
21
+ }
22
+
23
+ /* ── Placement ── */
24
+
25
+ .tooltip[data-placement="top"] {
26
+ inset-block-end: 100%;
27
+ inset-inline-start: 50%;
28
+ transform: translateX(-50%);
29
+ margin-block-end: var(--size-spacing-200);
30
+ }
31
+
32
+ .tooltip[data-placement="bottom"] {
33
+ inset-block-start: 100%;
34
+ inset-inline-start: 50%;
35
+ transform: translateX(-50%);
36
+ margin-block-start: var(--size-spacing-200);
37
+ }
38
+
39
+ .tooltip[data-placement="left"] {
40
+ inset-inline-end: 100%;
41
+ inset-block-start: 50%;
42
+ transform: translateY(-50%);
43
+ margin-inline-end: var(--size-spacing-200);
44
+ }
45
+
46
+ .tooltip[data-placement="right"] {
47
+ inset-inline-start: 100%;
48
+ inset-block-start: 50%;
49
+ transform: translateY(-50%);
50
+ margin-inline-start: var(--size-spacing-200);
51
+ }
52
+
53
+ /* ── Trigger wrapper ── */
54
+
55
+ .tooltip-trigger {
56
+ position: relative;
57
+ display: inline-flex;
58
+ }
59
+
60
+ .tooltip-trigger:hover > .tooltip,
61
+ .tooltip-trigger:focus-within > .tooltip {
62
+ opacity: 1;
63
+ }
64
+ }
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,35 @@
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
35
+ - `skills/component-accessibility-audit.md` — repeatable workflow and template for single-component accessibility audits