@skra/tokens 0.2.0 → 0.3.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 (40) hide show
  1. package/LICENSE +201 -201
  2. package/NOTICE +7 -7
  3. package/README.md +99 -64
  4. package/brutal/_theme.scoped.scss +18 -18
  5. package/brutal/_theme.scss +60 -12
  6. package/brutal/skin.config.json +40 -40
  7. package/manifests/accordion.json +52 -52
  8. package/manifests/alert.json +107 -107
  9. package/manifests/avatar.json +78 -78
  10. package/manifests/badge.json +63 -63
  11. package/manifests/box.json +34 -34
  12. package/manifests/button.json +133 -133
  13. package/manifests/chip.json +116 -116
  14. package/manifests/combobox.json +141 -141
  15. package/manifests/datepicker.json +159 -159
  16. package/manifests/dialog.json +104 -104
  17. package/manifests/field.json +267 -267
  18. package/manifests/grid.json +61 -61
  19. package/manifests/icon.json +43 -43
  20. package/manifests/kbd.json +68 -68
  21. package/manifests/link.json +107 -107
  22. package/manifests/menu.json +122 -122
  23. package/manifests/popover.json +104 -104
  24. package/manifests/progress.json +69 -69
  25. package/manifests/select.json +177 -177
  26. package/manifests/skeleton.json +43 -43
  27. package/manifests/stack.json +34 -34
  28. package/manifests/star-rating.json +96 -96
  29. package/manifests/status-dot.json +69 -69
  30. package/manifests/tabs.json +52 -52
  31. package/manifests/toast.json +133 -133
  32. package/manifests/tooltip.json +113 -113
  33. package/manifests/typography.json +169 -169
  34. package/package.json +1 -1
  35. package/skra/_form-controls.scss +74 -74
  36. package/skra/_overlay.scss +42 -42
  37. package/skra/_theme.dark.scss +3 -0
  38. package/skra/_theme.scss +61 -10
  39. package/skra/skin.config.json +37 -37
  40. 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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@skra/tokens",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "license": "Apache-2.0",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -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
+ }
@@ -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
+ }
@@ -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);