@skra/tokens 0.2.0 → 0.3.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.
- package/LICENSE +201 -201
- package/NOTICE +7 -7
- package/README.md +99 -64
- package/brutal/_theme.scoped.scss +18 -18
- package/brutal/_theme.scss +60 -12
- package/brutal/skin.config.json +40 -40
- package/manifests/accordion.json +52 -52
- package/manifests/alert.json +107 -107
- package/manifests/avatar.json +78 -78
- package/manifests/badge.json +63 -63
- package/manifests/box.json +34 -34
- package/manifests/button.json +133 -133
- package/manifests/chip.json +116 -116
- package/manifests/combobox.json +141 -141
- package/manifests/datepicker.json +159 -159
- package/manifests/dialog.json +104 -104
- package/manifests/field.json +267 -267
- package/manifests/grid.json +61 -61
- package/manifests/icon.json +43 -43
- package/manifests/kbd.json +68 -68
- package/manifests/link.json +107 -107
- package/manifests/menu.json +122 -122
- package/manifests/popover.json +104 -104
- package/manifests/progress.json +69 -69
- package/manifests/select.json +177 -177
- package/manifests/skeleton.json +43 -43
- package/manifests/stack.json +34 -34
- package/manifests/star-rating.json +96 -96
- package/manifests/status-dot.json +69 -69
- package/manifests/tabs.json +52 -52
- package/manifests/toast.json +133 -133
- package/manifests/tooltip.json +113 -113
- package/manifests/typography.json +169 -169
- package/package.json +1 -1
- package/skra/_form-controls.scss +74 -74
- package/skra/_overlay.scss +42 -42
- package/skra/_theme.dark.scss +3 -0
- package/skra/_theme.scss +61 -10
- package/skra/skin.config.json +37 -37
- package/skra/utilities.scss +38 -38
|
@@ -1,169 +1,169 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "https://skra-ds/schemas/skin-surface.v1.json",
|
|
3
|
-
"component": "typography",
|
|
4
|
-
"skraVersion": ">=1.0.0",
|
|
5
|
-
"axes": [
|
|
6
|
-
{
|
|
7
|
-
"token": "--skra-comp-typography-display-large-foreground",
|
|
8
|
-
"label": "Display Large — text colour",
|
|
9
|
-
"group": "Surface",
|
|
10
|
-
"type": "color",
|
|
11
|
-
"states": ["default"],
|
|
12
|
-
"constraint": { "oklch": true },
|
|
13
|
-
"overridable": ["overlay"]
|
|
14
|
-
},
|
|
15
|
-
{
|
|
16
|
-
"token": "--skra-comp-typography-display-medium-foreground",
|
|
17
|
-
"label": "Display Medium — text colour",
|
|
18
|
-
"group": "Surface",
|
|
19
|
-
"type": "color",
|
|
20
|
-
"states": ["default"],
|
|
21
|
-
"constraint": { "oklch": true },
|
|
22
|
-
"overridable": ["overlay"]
|
|
23
|
-
},
|
|
24
|
-
{
|
|
25
|
-
"token": "--skra-comp-typography-display-small-foreground",
|
|
26
|
-
"label": "Display Small — text colour",
|
|
27
|
-
"group": "Surface",
|
|
28
|
-
"type": "color",
|
|
29
|
-
"states": ["default"],
|
|
30
|
-
"constraint": { "oklch": true },
|
|
31
|
-
"overridable": ["overlay"]
|
|
32
|
-
},
|
|
33
|
-
{
|
|
34
|
-
"token": "--skra-comp-typography-headline-large-foreground",
|
|
35
|
-
"label": "Headline Large — text colour",
|
|
36
|
-
"group": "Surface",
|
|
37
|
-
"type": "color",
|
|
38
|
-
"states": ["default"],
|
|
39
|
-
"constraint": { "oklch": true },
|
|
40
|
-
"overridable": ["overlay"]
|
|
41
|
-
},
|
|
42
|
-
{
|
|
43
|
-
"token": "--skra-comp-typography-headline-medium-foreground",
|
|
44
|
-
"label": "Headline Medium — text colour",
|
|
45
|
-
"group": "Surface",
|
|
46
|
-
"type": "color",
|
|
47
|
-
"states": ["default"],
|
|
48
|
-
"constraint": { "oklch": true },
|
|
49
|
-
"overridable": ["overlay"]
|
|
50
|
-
},
|
|
51
|
-
{
|
|
52
|
-
"token": "--skra-comp-typography-headline-small-foreground",
|
|
53
|
-
"label": "Headline Small — text colour",
|
|
54
|
-
"group": "Surface",
|
|
55
|
-
"type": "color",
|
|
56
|
-
"states": ["default"],
|
|
57
|
-
"constraint": { "oklch": true },
|
|
58
|
-
"overridable": ["overlay"]
|
|
59
|
-
},
|
|
60
|
-
{
|
|
61
|
-
"token": "--skra-comp-typography-title-large-foreground",
|
|
62
|
-
"label": "Title Large — text colour",
|
|
63
|
-
"group": "Surface",
|
|
64
|
-
"type": "color",
|
|
65
|
-
"states": ["default"],
|
|
66
|
-
"constraint": { "oklch": true },
|
|
67
|
-
"overridable": ["overlay"]
|
|
68
|
-
},
|
|
69
|
-
{
|
|
70
|
-
"token": "--skra-comp-typography-title-medium-foreground",
|
|
71
|
-
"label": "Title Medium — text colour",
|
|
72
|
-
"group": "Surface",
|
|
73
|
-
"type": "color",
|
|
74
|
-
"states": ["default"],
|
|
75
|
-
"constraint": { "oklch": true },
|
|
76
|
-
"overridable": ["overlay"]
|
|
77
|
-
},
|
|
78
|
-
{
|
|
79
|
-
"token": "--skra-comp-typography-title-small-foreground",
|
|
80
|
-
"label": "Title Small — text colour",
|
|
81
|
-
"group": "Surface",
|
|
82
|
-
"type": "color",
|
|
83
|
-
"states": ["default"],
|
|
84
|
-
"constraint": { "oklch": true },
|
|
85
|
-
"overridable": ["overlay"]
|
|
86
|
-
},
|
|
87
|
-
{
|
|
88
|
-
"token": "--skra-comp-typography-body-large-foreground",
|
|
89
|
-
"label": "Body Large — text colour",
|
|
90
|
-
"group": "Surface",
|
|
91
|
-
"type": "color",
|
|
92
|
-
"states": ["default"],
|
|
93
|
-
"constraint": { "oklch": true },
|
|
94
|
-
"overridable": ["overlay", "subtree", "instance"]
|
|
95
|
-
},
|
|
96
|
-
{
|
|
97
|
-
"token": "--skra-comp-typography-body-medium-foreground",
|
|
98
|
-
"label": "Body Medium — text colour",
|
|
99
|
-
"group": "Surface",
|
|
100
|
-
"type": "color",
|
|
101
|
-
"states": ["default"],
|
|
102
|
-
"constraint": { "oklch": true },
|
|
103
|
-
"overridable": ["overlay", "subtree", "instance"]
|
|
104
|
-
},
|
|
105
|
-
{
|
|
106
|
-
"token": "--skra-comp-typography-body-small-foreground",
|
|
107
|
-
"label": "Body Small — text colour",
|
|
108
|
-
"group": "Surface",
|
|
109
|
-
"type": "color",
|
|
110
|
-
"states": ["default"],
|
|
111
|
-
"constraint": { "oklch": true },
|
|
112
|
-
"overridable": ["overlay", "subtree", "instance"]
|
|
113
|
-
},
|
|
114
|
-
{
|
|
115
|
-
"token": "--skra-comp-typography-label-large-foreground",
|
|
116
|
-
"label": "Label Large — text colour",
|
|
117
|
-
"group": "Surface",
|
|
118
|
-
"type": "color",
|
|
119
|
-
"states": ["default"],
|
|
120
|
-
"constraint": { "oklch": true },
|
|
121
|
-
"overridable": ["overlay", "subtree", "instance"]
|
|
122
|
-
},
|
|
123
|
-
{
|
|
124
|
-
"token": "--skra-comp-typography-label-medium-foreground",
|
|
125
|
-
"label": "Label Medium — text colour",
|
|
126
|
-
"group": "Surface",
|
|
127
|
-
"type": "color",
|
|
128
|
-
"states": ["default"],
|
|
129
|
-
"constraint": { "oklch": true },
|
|
130
|
-
"overridable": ["overlay", "subtree", "instance"]
|
|
131
|
-
},
|
|
132
|
-
{
|
|
133
|
-
"token": "--skra-comp-typography-label-small-foreground",
|
|
134
|
-
"label": "Label Small — text colour",
|
|
135
|
-
"group": "Surface",
|
|
136
|
-
"type": "color",
|
|
137
|
-
"states": ["default"],
|
|
138
|
-
"constraint": { "oklch": true },
|
|
139
|
-
"overridable": ["overlay", "subtree", "instance"]
|
|
140
|
-
},
|
|
141
|
-
{
|
|
142
|
-
"token": "--skra-comp-typography-foreground-error",
|
|
143
|
-
"label": "Severity Error — text colour",
|
|
144
|
-
"group": "Surface",
|
|
145
|
-
"type": "color",
|
|
146
|
-
"states": ["default"],
|
|
147
|
-
"constraint": { "oklch": true },
|
|
148
|
-
"overridable": ["overlay"]
|
|
149
|
-
},
|
|
150
|
-
{
|
|
151
|
-
"token": "--skra-comp-typography-foreground-warning",
|
|
152
|
-
"label": "Severity Warning — text colour",
|
|
153
|
-
"group": "Surface",
|
|
154
|
-
"type": "color",
|
|
155
|
-
"states": ["default"],
|
|
156
|
-
"constraint": { "oklch": true },
|
|
157
|
-
"overridable": ["overlay"]
|
|
158
|
-
},
|
|
159
|
-
{
|
|
160
|
-
"token": "--skra-comp-typography-foreground-success",
|
|
161
|
-
"label": "Severity Success — text colour",
|
|
162
|
-
"group": "Surface",
|
|
163
|
-
"type": "color",
|
|
164
|
-
"states": ["default"],
|
|
165
|
-
"constraint": { "oklch": true },
|
|
166
|
-
"overridable": ["overlay"]
|
|
167
|
-
}
|
|
168
|
-
]
|
|
169
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://skra-ds/schemas/skin-surface.v1.json",
|
|
3
|
+
"component": "typography",
|
|
4
|
+
"skraVersion": ">=1.0.0",
|
|
5
|
+
"axes": [
|
|
6
|
+
{
|
|
7
|
+
"token": "--skra-comp-typography-display-large-foreground",
|
|
8
|
+
"label": "Display Large — text colour",
|
|
9
|
+
"group": "Surface",
|
|
10
|
+
"type": "color",
|
|
11
|
+
"states": ["default"],
|
|
12
|
+
"constraint": { "oklch": true },
|
|
13
|
+
"overridable": ["overlay"]
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"token": "--skra-comp-typography-display-medium-foreground",
|
|
17
|
+
"label": "Display Medium — text colour",
|
|
18
|
+
"group": "Surface",
|
|
19
|
+
"type": "color",
|
|
20
|
+
"states": ["default"],
|
|
21
|
+
"constraint": { "oklch": true },
|
|
22
|
+
"overridable": ["overlay"]
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"token": "--skra-comp-typography-display-small-foreground",
|
|
26
|
+
"label": "Display Small — text colour",
|
|
27
|
+
"group": "Surface",
|
|
28
|
+
"type": "color",
|
|
29
|
+
"states": ["default"],
|
|
30
|
+
"constraint": { "oklch": true },
|
|
31
|
+
"overridable": ["overlay"]
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"token": "--skra-comp-typography-headline-large-foreground",
|
|
35
|
+
"label": "Headline Large — text colour",
|
|
36
|
+
"group": "Surface",
|
|
37
|
+
"type": "color",
|
|
38
|
+
"states": ["default"],
|
|
39
|
+
"constraint": { "oklch": true },
|
|
40
|
+
"overridable": ["overlay"]
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"token": "--skra-comp-typography-headline-medium-foreground",
|
|
44
|
+
"label": "Headline Medium — text colour",
|
|
45
|
+
"group": "Surface",
|
|
46
|
+
"type": "color",
|
|
47
|
+
"states": ["default"],
|
|
48
|
+
"constraint": { "oklch": true },
|
|
49
|
+
"overridable": ["overlay"]
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
"token": "--skra-comp-typography-headline-small-foreground",
|
|
53
|
+
"label": "Headline Small — text colour",
|
|
54
|
+
"group": "Surface",
|
|
55
|
+
"type": "color",
|
|
56
|
+
"states": ["default"],
|
|
57
|
+
"constraint": { "oklch": true },
|
|
58
|
+
"overridable": ["overlay"]
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
"token": "--skra-comp-typography-title-large-foreground",
|
|
62
|
+
"label": "Title Large — text colour",
|
|
63
|
+
"group": "Surface",
|
|
64
|
+
"type": "color",
|
|
65
|
+
"states": ["default"],
|
|
66
|
+
"constraint": { "oklch": true },
|
|
67
|
+
"overridable": ["overlay"]
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
"token": "--skra-comp-typography-title-medium-foreground",
|
|
71
|
+
"label": "Title Medium — text colour",
|
|
72
|
+
"group": "Surface",
|
|
73
|
+
"type": "color",
|
|
74
|
+
"states": ["default"],
|
|
75
|
+
"constraint": { "oklch": true },
|
|
76
|
+
"overridable": ["overlay"]
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
"token": "--skra-comp-typography-title-small-foreground",
|
|
80
|
+
"label": "Title Small — text colour",
|
|
81
|
+
"group": "Surface",
|
|
82
|
+
"type": "color",
|
|
83
|
+
"states": ["default"],
|
|
84
|
+
"constraint": { "oklch": true },
|
|
85
|
+
"overridable": ["overlay"]
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
"token": "--skra-comp-typography-body-large-foreground",
|
|
89
|
+
"label": "Body Large — text colour",
|
|
90
|
+
"group": "Surface",
|
|
91
|
+
"type": "color",
|
|
92
|
+
"states": ["default"],
|
|
93
|
+
"constraint": { "oklch": true },
|
|
94
|
+
"overridable": ["overlay", "subtree", "instance"]
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
"token": "--skra-comp-typography-body-medium-foreground",
|
|
98
|
+
"label": "Body Medium — text colour",
|
|
99
|
+
"group": "Surface",
|
|
100
|
+
"type": "color",
|
|
101
|
+
"states": ["default"],
|
|
102
|
+
"constraint": { "oklch": true },
|
|
103
|
+
"overridable": ["overlay", "subtree", "instance"]
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
"token": "--skra-comp-typography-body-small-foreground",
|
|
107
|
+
"label": "Body Small — text colour",
|
|
108
|
+
"group": "Surface",
|
|
109
|
+
"type": "color",
|
|
110
|
+
"states": ["default"],
|
|
111
|
+
"constraint": { "oklch": true },
|
|
112
|
+
"overridable": ["overlay", "subtree", "instance"]
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
"token": "--skra-comp-typography-label-large-foreground",
|
|
116
|
+
"label": "Label Large — text colour",
|
|
117
|
+
"group": "Surface",
|
|
118
|
+
"type": "color",
|
|
119
|
+
"states": ["default"],
|
|
120
|
+
"constraint": { "oklch": true },
|
|
121
|
+
"overridable": ["overlay", "subtree", "instance"]
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
"token": "--skra-comp-typography-label-medium-foreground",
|
|
125
|
+
"label": "Label Medium — text colour",
|
|
126
|
+
"group": "Surface",
|
|
127
|
+
"type": "color",
|
|
128
|
+
"states": ["default"],
|
|
129
|
+
"constraint": { "oklch": true },
|
|
130
|
+
"overridable": ["overlay", "subtree", "instance"]
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
"token": "--skra-comp-typography-label-small-foreground",
|
|
134
|
+
"label": "Label Small — text colour",
|
|
135
|
+
"group": "Surface",
|
|
136
|
+
"type": "color",
|
|
137
|
+
"states": ["default"],
|
|
138
|
+
"constraint": { "oklch": true },
|
|
139
|
+
"overridable": ["overlay", "subtree", "instance"]
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
"token": "--skra-comp-typography-foreground-error",
|
|
143
|
+
"label": "Severity Error — text colour",
|
|
144
|
+
"group": "Surface",
|
|
145
|
+
"type": "color",
|
|
146
|
+
"states": ["default"],
|
|
147
|
+
"constraint": { "oklch": true },
|
|
148
|
+
"overridable": ["overlay"]
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
"token": "--skra-comp-typography-foreground-warning",
|
|
152
|
+
"label": "Severity Warning — text colour",
|
|
153
|
+
"group": "Surface",
|
|
154
|
+
"type": "color",
|
|
155
|
+
"states": ["default"],
|
|
156
|
+
"constraint": { "oklch": true },
|
|
157
|
+
"overridable": ["overlay"]
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
"token": "--skra-comp-typography-foreground-success",
|
|
161
|
+
"label": "Severity Success — text colour",
|
|
162
|
+
"group": "Surface",
|
|
163
|
+
"type": "color",
|
|
164
|
+
"states": ["default"],
|
|
165
|
+
"constraint": { "oklch": true },
|
|
166
|
+
"overridable": ["overlay"]
|
|
167
|
+
}
|
|
168
|
+
]
|
|
169
|
+
}
|
package/package.json
CHANGED
package/skra/_form-controls.scss
CHANGED
|
@@ -1,74 +1,74 @@
|
|
|
1
|
-
// Forge Design System — residual form-control slice (ADR 040, supersedes ADR 038)
|
|
2
|
-
//
|
|
3
|
-
// Per ADR 040, every form atom (input / textarea / select / checkbox / radio /
|
|
4
|
-
// fieldset / legend / label) is now a Component-on-its-native-host carrying its
|
|
5
|
-
// own host-scoped CSS via Angular Emulated encapsulation (see each atom's
|
|
6
|
-
// `*.scss` in `libs/ui/forms/`). The bulk of the old ADR 038 slice moved there.
|
|
7
|
-
//
|
|
8
|
-
// This file retains ONLY the rules that genuinely cannot be encapsulated —
|
|
9
|
-
// rules that style content PROJECTED INTO one component from outside its
|
|
10
|
-
// stylesheet. Under Emulated encapsulation a component's selectors are rewritten
|
|
11
|
-
// to require that component's own `_ngcontent` attribute, but projected children
|
|
12
|
-
// carry the CONSUMER's attribute, so the selector silently misses (the same
|
|
13
|
-
// mechanism that created the ADR 038 slice in the first place — see ADR 020 v2.0).
|
|
14
|
-
//
|
|
15
|
-
// Two cross-encapsulation cases remain:
|
|
16
|
-
// 1. <select skraSelect> → its projected <option> / <optgroup> children.
|
|
17
|
-
// 2. <skra-field> → its projected <label> / <skra-hint> / <skra-error>
|
|
18
|
-
// when a sibling selection control (checkbox/radio) drives the layout.
|
|
19
|
-
//
|
|
20
|
-
// All values remain `var(--skra-comp-field-*)` / `var(--skra-sys-*)` references
|
|
21
|
-
// (ADR 025); zero hardcoded literals; zero `margin`/layout beyond the wrap rule
|
|
22
|
-
// intrinsic to the cross-projection case; zero `!important` / `::ng-deep` (ADR 024).
|
|
23
|
-
//
|
|
24
|
-
// Opt-in: import AFTER `_theme.scss` (the referenced variables must be defined
|
|
25
|
-
// first). Mirrors `_baseline.scss` (ADR 036).
|
|
26
|
-
|
|
27
|
-
// ─── 1. Select <option> / <optgroup> (projected into <select skraSelect>) ───
|
|
28
|
-
// `select.scss` cannot reach these: an `option { … }` rule there compiles to
|
|
29
|
-
// `option[_ngcontent-select-xxx]`, but the projected <option> carries the
|
|
30
|
-
// consumer's `_ngcontent`. Cross-browser <option> styling is platform-limited
|
|
31
|
-
// (Firefox full; Chromium partial; Safari very limited) — we ship the tokens,
|
|
32
|
-
// effectiveness varies by engine.
|
|
33
|
-
select[skraSelect] > option {
|
|
34
|
-
color: var(--skra-comp-field-select-option-foreground);
|
|
35
|
-
background-color: var(--skra-comp-field-select-option-background);
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
select[skraSelect] > optgroup {
|
|
39
|
-
color: var(--skra-comp-field-select-optgroup-foreground);
|
|
40
|
-
font-family: var(--skra-sys-typography-role-label-medium-font-family);
|
|
41
|
-
font-size: var(--skra-sys-typography-role-label-medium-font-size);
|
|
42
|
-
font-weight: var(--skra-sys-typography-role-label-medium-font-weight);
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
// ─── 2a. Touch target — label adjacent to a checkbox/radio inside Field ──────
|
|
46
|
-
// WCAG 2.5.8 minimum 24×24 CSS px. The native box itself is smaller; clicking
|
|
47
|
-
// the label fires the input, so expanding the label's clickable surface meets
|
|
48
|
-
// the criterion without enlarging the visible box. `inline-flex` (not `flex`)
|
|
49
|
-
// so the label sizes to its content in Field's flex-row selection layout — a
|
|
50
|
-
// block-level `flex` would consume remaining inline space and visually shift
|
|
51
|
-
// the text. This rule reaches Field's projected <label>, so it must live here.
|
|
52
|
-
skra-field:has(> input[type='checkbox'][skraCheckbox]) > label[skraLabelFor],
|
|
53
|
-
skra-field:has(> input[type='checkbox'][skraSwitch]) > label[skraLabelFor],
|
|
54
|
-
skra-field:has(> input[type='radio'][skraRadio]) > label[skraLabelFor] {
|
|
55
|
-
min-block-size: var(--skra-comp-field-checkbox-touch-target);
|
|
56
|
-
display: inline-flex;
|
|
57
|
-
align-items: center;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
// ─── 2b. Hint / Error wrap in selection-control flex layout ──────────────────
|
|
61
|
-
// Field turns `:host` into `display: flex` (row) when it contains a
|
|
62
|
-
// checkbox/radio (see field.component.scss). The rule that wraps hint/error onto
|
|
63
|
-
// their own full-width line targets Field's PROJECTED <skra-hint>/<skra-error>,
|
|
64
|
-
// so it cannot live in field.component.scss (Emulated encapsulation misses
|
|
65
|
-
// projected children). `flex: 0 0 100%` forces the wrap regardless of sibling
|
|
66
|
-
// sizing.
|
|
67
|
-
skra-field:has(> input[type='checkbox'][skraCheckbox]) > skra-hint,
|
|
68
|
-
skra-field:has(> input[type='checkbox'][skraCheckbox]) > skra-error,
|
|
69
|
-
skra-field:has(> input[type='checkbox'][skraSwitch]) > skra-hint,
|
|
70
|
-
skra-field:has(> input[type='checkbox'][skraSwitch]) > skra-error,
|
|
71
|
-
skra-field:has(> input[type='radio'][skraRadio]) > skra-hint,
|
|
72
|
-
skra-field:has(> input[type='radio'][skraRadio]) > skra-error {
|
|
73
|
-
flex: 0 0 100%;
|
|
74
|
-
}
|
|
1
|
+
// Forge Design System — residual form-control slice (ADR 040, supersedes ADR 038)
|
|
2
|
+
//
|
|
3
|
+
// Per ADR 040, every form atom (input / textarea / select / checkbox / radio /
|
|
4
|
+
// fieldset / legend / label) is now a Component-on-its-native-host carrying its
|
|
5
|
+
// own host-scoped CSS via Angular Emulated encapsulation (see each atom's
|
|
6
|
+
// `*.scss` in `libs/ui/forms/`). The bulk of the old ADR 038 slice moved there.
|
|
7
|
+
//
|
|
8
|
+
// This file retains ONLY the rules that genuinely cannot be encapsulated —
|
|
9
|
+
// rules that style content PROJECTED INTO one component from outside its
|
|
10
|
+
// stylesheet. Under Emulated encapsulation a component's selectors are rewritten
|
|
11
|
+
// to require that component's own `_ngcontent` attribute, but projected children
|
|
12
|
+
// carry the CONSUMER's attribute, so the selector silently misses (the same
|
|
13
|
+
// mechanism that created the ADR 038 slice in the first place — see ADR 020 v2.0).
|
|
14
|
+
//
|
|
15
|
+
// Two cross-encapsulation cases remain:
|
|
16
|
+
// 1. <select skraSelect> → its projected <option> / <optgroup> children.
|
|
17
|
+
// 2. <skra-field> → its projected <label> / <skra-hint> / <skra-error>
|
|
18
|
+
// when a sibling selection control (checkbox/radio) drives the layout.
|
|
19
|
+
//
|
|
20
|
+
// All values remain `var(--skra-comp-field-*)` / `var(--skra-sys-*)` references
|
|
21
|
+
// (ADR 025); zero hardcoded literals; zero `margin`/layout beyond the wrap rule
|
|
22
|
+
// intrinsic to the cross-projection case; zero `!important` / `::ng-deep` (ADR 024).
|
|
23
|
+
//
|
|
24
|
+
// Opt-in: import AFTER `_theme.scss` (the referenced variables must be defined
|
|
25
|
+
// first). Mirrors `_baseline.scss` (ADR 036).
|
|
26
|
+
|
|
27
|
+
// ─── 1. Select <option> / <optgroup> (projected into <select skraSelect>) ───
|
|
28
|
+
// `select.scss` cannot reach these: an `option { … }` rule there compiles to
|
|
29
|
+
// `option[_ngcontent-select-xxx]`, but the projected <option> carries the
|
|
30
|
+
// consumer's `_ngcontent`. Cross-browser <option> styling is platform-limited
|
|
31
|
+
// (Firefox full; Chromium partial; Safari very limited) — we ship the tokens,
|
|
32
|
+
// effectiveness varies by engine.
|
|
33
|
+
select[skraSelect] > option {
|
|
34
|
+
color: var(--skra-comp-field-select-option-foreground);
|
|
35
|
+
background-color: var(--skra-comp-field-select-option-background);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
select[skraSelect] > optgroup {
|
|
39
|
+
color: var(--skra-comp-field-select-optgroup-foreground);
|
|
40
|
+
font-family: var(--skra-sys-typography-role-label-medium-font-family);
|
|
41
|
+
font-size: var(--skra-sys-typography-role-label-medium-font-size);
|
|
42
|
+
font-weight: var(--skra-sys-typography-role-label-medium-font-weight);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// ─── 2a. Touch target — label adjacent to a checkbox/radio inside Field ──────
|
|
46
|
+
// WCAG 2.5.8 minimum 24×24 CSS px. The native box itself is smaller; clicking
|
|
47
|
+
// the label fires the input, so expanding the label's clickable surface meets
|
|
48
|
+
// the criterion without enlarging the visible box. `inline-flex` (not `flex`)
|
|
49
|
+
// so the label sizes to its content in Field's flex-row selection layout — a
|
|
50
|
+
// block-level `flex` would consume remaining inline space and visually shift
|
|
51
|
+
// the text. This rule reaches Field's projected <label>, so it must live here.
|
|
52
|
+
skra-field:has(> input[type='checkbox'][skraCheckbox]) > label[skraLabelFor],
|
|
53
|
+
skra-field:has(> input[type='checkbox'][skraSwitch]) > label[skraLabelFor],
|
|
54
|
+
skra-field:has(> input[type='radio'][skraRadio]) > label[skraLabelFor] {
|
|
55
|
+
min-block-size: var(--skra-comp-field-checkbox-touch-target);
|
|
56
|
+
display: inline-flex;
|
|
57
|
+
align-items: center;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// ─── 2b. Hint / Error wrap in selection-control flex layout ──────────────────
|
|
61
|
+
// Field turns `:host` into `display: flex` (row) when it contains a
|
|
62
|
+
// checkbox/radio (see field.component.scss). The rule that wraps hint/error onto
|
|
63
|
+
// their own full-width line targets Field's PROJECTED <skra-hint>/<skra-error>,
|
|
64
|
+
// so it cannot live in field.component.scss (Emulated encapsulation misses
|
|
65
|
+
// projected children). `flex: 0 0 100%` forces the wrap regardless of sibling
|
|
66
|
+
// sizing.
|
|
67
|
+
skra-field:has(> input[type='checkbox'][skraCheckbox]) > skra-hint,
|
|
68
|
+
skra-field:has(> input[type='checkbox'][skraCheckbox]) > skra-error,
|
|
69
|
+
skra-field:has(> input[type='checkbox'][skraSwitch]) > skra-hint,
|
|
70
|
+
skra-field:has(> input[type='checkbox'][skraSwitch]) > skra-error,
|
|
71
|
+
skra-field:has(> input[type='radio'][skraRadio]) > skra-hint,
|
|
72
|
+
skra-field:has(> input[type='radio'][skraRadio]) > skra-error {
|
|
73
|
+
flex: 0 0 100%;
|
|
74
|
+
}
|
package/skra/_overlay.scss
CHANGED
|
@@ -1,42 +1,42 @@
|
|
|
1
|
-
/* tokens/skins/skra/_overlay.scss — Tier-2 overlay top-layer slice (ADR 0044).
|
|
2
|
-
* --------------------------------------------------------------------------------
|
|
3
|
-
* Top-layer concerns that sit OUTSIDE component Emulated encapsulation and therefore
|
|
4
|
-
* cannot live in a component's own host-scoped CSS:
|
|
5
|
-
* - the native `<dialog>` `::backdrop` scrim (a pseudo-element of the dialog), and
|
|
6
|
-
* - the pure-CSS scroll-lock while a Forge modal dialog is open (`html:has(...)`).
|
|
7
|
-
*
|
|
8
|
-
* Opt-in: import AFTER `_theme.scss` + `_comp.scss`. Selectors are strictly Forge-attached
|
|
9
|
-
* natives (`dialog[skraDialog]`); every value is a `var(--skra-comp-dialog-*)` reference;
|
|
10
|
-
* zero z-index (top-layer stacking is invocation-order), zero `!important`, zero `::ng-deep`.
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
dialog[skraDialog]::backdrop {
|
|
14
|
-
background: var(--skra-comp-dialog-backdrop);
|
|
15
|
-
|
|
16
|
-
opacity: 1;
|
|
17
|
-
transition:
|
|
18
|
-
opacity var(--skra-comp-dialog-motion-duration)
|
|
19
|
-
var(--skra-comp-dialog-motion-easing),
|
|
20
|
-
display var(--skra-comp-dialog-motion-duration) allow-discrete,
|
|
21
|
-
overlay var(--skra-comp-dialog-motion-duration) allow-discrete;
|
|
22
|
-
|
|
23
|
-
@starting-style {
|
|
24
|
-
opacity: 0;
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
/* Scroll-lock: freeze the page behind an open modal dialog. Pure CSS, no JS.
|
|
29
|
-
* NOTE: `overflow: hidden` removes the scrollbar, which shifts content by the scrollbar width
|
|
30
|
-
* on pages that have one. For SHIFT-FREE modals the consumer reserves the gutter GLOBALLY
|
|
31
|
-
* (`html { scrollbar-gutter: stable }`) — a page-level layout choice the consumer owns, which
|
|
32
|
-
* this scoped slice deliberately does NOT impose (doing it only-while-modal would itself shift,
|
|
33
|
-
* just on open instead of close). The sandbox opts in; see apps/sandbox/src/styles.scss. */
|
|
34
|
-
html:has(dialog[skraDialog]:modal) {
|
|
35
|
-
overflow: hidden;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
@media (prefers-reduced-motion: reduce) {
|
|
39
|
-
dialog[skraDialog]::backdrop {
|
|
40
|
-
transition-duration: 0ms;
|
|
41
|
-
}
|
|
42
|
-
}
|
|
1
|
+
/* tokens/skins/skra/_overlay.scss — Tier-2 overlay top-layer slice (ADR 0044).
|
|
2
|
+
* --------------------------------------------------------------------------------
|
|
3
|
+
* Top-layer concerns that sit OUTSIDE component Emulated encapsulation and therefore
|
|
4
|
+
* cannot live in a component's own host-scoped CSS:
|
|
5
|
+
* - the native `<dialog>` `::backdrop` scrim (a pseudo-element of the dialog), and
|
|
6
|
+
* - the pure-CSS scroll-lock while a Forge modal dialog is open (`html:has(...)`).
|
|
7
|
+
*
|
|
8
|
+
* Opt-in: import AFTER `_theme.scss` + `_comp.scss`. Selectors are strictly Forge-attached
|
|
9
|
+
* natives (`dialog[skraDialog]`); every value is a `var(--skra-comp-dialog-*)` reference;
|
|
10
|
+
* zero z-index (top-layer stacking is invocation-order), zero `!important`, zero `::ng-deep`.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
dialog[skraDialog]::backdrop {
|
|
14
|
+
background: var(--skra-comp-dialog-backdrop);
|
|
15
|
+
|
|
16
|
+
opacity: 1;
|
|
17
|
+
transition:
|
|
18
|
+
opacity var(--skra-comp-dialog-motion-duration)
|
|
19
|
+
var(--skra-comp-dialog-motion-easing),
|
|
20
|
+
display var(--skra-comp-dialog-motion-duration) allow-discrete,
|
|
21
|
+
overlay var(--skra-comp-dialog-motion-duration) allow-discrete;
|
|
22
|
+
|
|
23
|
+
@starting-style {
|
|
24
|
+
opacity: 0;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/* Scroll-lock: freeze the page behind an open modal dialog. Pure CSS, no JS.
|
|
29
|
+
* NOTE: `overflow: hidden` removes the scrollbar, which shifts content by the scrollbar width
|
|
30
|
+
* on pages that have one. For SHIFT-FREE modals the consumer reserves the gutter GLOBALLY
|
|
31
|
+
* (`html { scrollbar-gutter: stable }`) — a page-level layout choice the consumer owns, which
|
|
32
|
+
* this scoped slice deliberately does NOT impose (doing it only-while-modal would itself shift,
|
|
33
|
+
* just on open instead of close). The sandbox opts in; see apps/sandbox/src/styles.scss. */
|
|
34
|
+
html:has(dialog[skraDialog]:modal) {
|
|
35
|
+
overflow: hidden;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
@media (prefers-reduced-motion: reduce) {
|
|
39
|
+
dialog[skraDialog]::backdrop {
|
|
40
|
+
transition-duration: 0ms;
|
|
41
|
+
}
|
|
42
|
+
}
|
package/skra/_theme.dark.scss
CHANGED
|
@@ -149,6 +149,7 @@
|
|
|
149
149
|
--skra-sys-color-link: oklch(67.0% 0.135 250);
|
|
150
150
|
--skra-sys-color-link-hover: oklch(58.0% 0.135 250);
|
|
151
151
|
--skra-sys-color-link-visited: oklch(60.0% 0.162 295);
|
|
152
|
+
--skra-sys-color-shadow-ink: oklch(0% 0 0);
|
|
152
153
|
--skra-sys-color-surface-active: oklch(25.5% 0 0);
|
|
153
154
|
--skra-sys-color-surface-raised-hover: oklch(26.0% 0 0);
|
|
154
155
|
--skra-sys-color-surface-raised-active: oklch(29.5% 0 0);
|
|
@@ -173,6 +174,8 @@
|
|
|
173
174
|
--skra-sys-color-focus-ring-hover: oklch(68.0% 0.135 250);
|
|
174
175
|
--skra-sys-color-focus-ring-active: oklch(64.5% 0.135 250);
|
|
175
176
|
--skra-sys-color-link-active: oklch(56.5% 0.135 250);
|
|
177
|
+
--skra-sys-color-shadow-ink-hover: oklch(7.0% 0 0);
|
|
178
|
+
--skra-sys-color-shadow-ink-active: oklch(10.5% 0 0);
|
|
176
179
|
--skra-comp-accordion-foreground-hover: oklch(85.0% 0 0);
|
|
177
180
|
--skra-comp-accordion-foreground-active: oklch(81.5% 0 0);
|
|
178
181
|
--skra-comp-accordion-focus-ring-color-hover: oklch(68.0% 0.135 250);
|