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.
- package/README.md +181 -37
- package/dist/assets/icons/checkmark.svg +1 -0
- package/dist/core/index.css +8 -7
- package/dist/macros/ui.njk +203 -0
- package/dist/main.css +941 -210
- package/dist/react/accordion.js +36 -0
- package/dist/react/avatar.js +34 -0
- package/dist/react/badge.js +41 -0
- package/dist/react/button.js +4 -6
- package/dist/react/checkbox.js +21 -8
- package/dist/react/divider.js +31 -0
- package/dist/react/icon.js +8 -1
- package/dist/react/index.js +8 -0
- package/dist/react/label.js +1 -1
- package/dist/react/radio.js +45 -0
- package/dist/react/switch.js +9 -8
- package/dist/react/tabs.js +72 -0
- package/dist/react/textarea.js +38 -0
- package/dist/react/tooltip.js +25 -0
- package/dist/react/warn-dev.js +15 -0
- package/dist/tokens/css/{appearance-(modes).tokens.mode-dark.css → appearance-modes.tokens.mode-dark.css} +6 -6
- package/dist/tokens/css/{appearance-(modes).tokens.mode-light.css → appearance-modes.tokens.mode-light.css} +1 -1
- package/dist/tokens/css/{components-(ui).tokens.css → components-ui.tokens.css} +73 -32
- package/dist/tokens/css/core-primitives.tokens.css +240 -0
- package/dist/tokens/css/{semantics-(roles).tokens.css → semantics-roles.tokens.css} +1 -1
- package/dist/tokens/css/themes-brands.tokens.brand-a.css +22 -0
- package/dist/tokens/css/{themes-(brands).tokens.brand-b.css → themes-brands.tokens.brand-b.css} +9 -9
- package/dist/tokens/css/themes-brands.tokens.brand-c.css +22 -0
- package/dist/tokens/json/appearance-modes.tokens.mode-dark.json +121 -0
- package/dist/tokens/json/appearance-modes.tokens.mode-light.json +121 -0
- package/dist/tokens/json/components-ui.tokens.json +713 -0
- package/dist/tokens/json/{core-(primitives).tokens.json → core-primitives.tokens.json} +526 -410
- package/dist/tokens/json/semantics-roles.tokens.json +141 -0
- package/dist/tokens/json/themes-brands.tokens.brand-a.json +81 -0
- package/dist/tokens/json/themes-brands.tokens.brand-b.json +81 -0
- package/dist/tokens/json/themes-brands.tokens.brand-c.json +81 -0
- package/dist/tokens/tokens.yaml +2722 -499
- package/dist/tokens/ts/{appearance-(modes).tokens.mode-dark.ts → appearance-modes.tokens.mode-dark.ts} +6 -6
- package/dist/tokens/ts/{appearance-(modes).tokens.mode-light.ts → appearance-modes.tokens.mode-light.ts} +1 -1
- package/dist/tokens/ts/{components-(ui).tokens.ts → components-ui.tokens.ts} +74 -33
- package/dist/tokens/ts/core-primitives.tokens.ts +265 -0
- package/dist/tokens/ts/{semantics-(roles).tokens.ts → semantics-roles.tokens.ts} +1 -1
- package/dist/tokens/ts/themes-brands.tokens.brand-a.ts +32 -0
- package/dist/tokens/ts/{themes-(brands).tokens.brand-b.ts → themes-brands.tokens.brand-b.ts} +9 -9
- package/dist/tokens/ts/{themes-(brands).tokens.brand-a.ts → themes-brands.tokens.brand-c.ts} +9 -9
- package/dist/ui/index.css +8 -0
- package/dist/ui/patterns/accordion.css +81 -0
- package/dist/ui/patterns/avatar.css +57 -0
- package/dist/ui/patterns/badge.css +49 -0
- package/dist/ui/patterns/checkbox.css +71 -22
- package/dist/ui/patterns/divider.css +25 -0
- package/dist/ui/patterns/radio.css +109 -0
- package/dist/ui/patterns/tabs.css +71 -0
- package/dist/ui/patterns/textarea.css +50 -0
- package/dist/ui/patterns/tooltip.css +64 -0
- package/docs/README.md +38 -0
- package/docs/agentic/README.md +35 -0
- package/docs/agentic/assistant-behavior-rules.md +48 -0
- package/docs/agentic/skills/component-accessibility-audit.md +132 -0
- package/docs/agentic/skills/ux-writing-coach.md +116 -0
- package/docs/foundations/README.md +31 -0
- package/docs/foundations/foundation-001-token-layering.md +6 -0
- package/docs/foundations/foundation-002-naming-and-grouping.md +6 -0
- package/docs/foundations/foundation-003-color-semantics-and-status.md +6 -0
- package/docs/foundations/foundation-004-typography-scale-and-line-height.md +6 -0
- package/docs/foundations/foundation-005-responsive-breakpoints-and-containers.md +6 -0
- package/docs/foundations/foundation-006-z-index-layering.md +6 -0
- package/docs/foundations/foundation-007-typography-selectors-and-specificity.md +7 -1
- package/docs/foundations/foundation-008-mode-activation-and-consumer-control.md +6 -0
- package/docs/foundations/foundation-009-component-boundaries-and-utility.md +6 -0
- package/docs/foundations/foundation-010-implementation-and-pipeline-workflow.md +6 -0
- package/docs/foundations/foundation-011-branching-and-release-governance.md +6 -0
- package/docs/foundations/foundation-012-minimal-markup-and-composition.md +6 -0
- package/package.json +16 -11
- package/dist/tokens/css/core-(primitives).tokens.css +0 -127
- package/dist/tokens/css/themes-(brands).tokens.brand-a.css +0 -22
- package/dist/tokens/json/appearance-(modes).tokens.mode-dark.json +0 -182
- package/dist/tokens/json/appearance-(modes).tokens.mode-light.json +0 -182
- package/dist/tokens/json/components-(ui).tokens.json +0 -739
- package/dist/tokens/json/semantics-(roles).tokens.json +0 -203
- package/dist/tokens/json/themes-(brands).tokens.brand-a.json +0 -115
- package/dist/tokens/json/themes-(brands).tokens.brand-b.json +0 -115
- package/dist/tokens/ts/core-(primitives).tokens.ts +0 -152
- package/docs/agentic/skills/README.md +0 -51
- package/docs/agentic/skills/design-ops-specialist/SKILL.md +0 -60
- package/docs/agentic/skills/design-system-architect/SKILL.md +0 -106
- 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(--
|
|
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(--
|
|
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(--
|
|
28
|
-
border-color: var(--
|
|
29
|
-
border-radius: var(--
|
|
30
|
-
background: var(--
|
|
31
|
-
color: var(--
|
|
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(--
|
|
42
|
-
background: var(--
|
|
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: "
|
|
48
|
-
|
|
49
|
-
|
|
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(--
|
|
57
|
-
|
|
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(--
|
|
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(--
|
|
72
|
-
border-color: var(--
|
|
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(--
|
|
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(--
|
|
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-
|
|
93
|
-
|
|
94
|
-
|
|
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
|