@refrakt-md/lumina 0.18.0 → 0.20.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/base.css +4 -0
- package/contracts/structures.json +509 -223
- package/dist/config.js +5 -5
- package/dist/config.js.map +1 -1
- package/dist/presets/tideline.d.ts.map +1 -1
- package/dist/presets/tideline.js +0 -14
- package/dist/presets/tideline.js.map +1 -1
- package/dist/tokens.d.ts.map +1 -1
- package/dist/tokens.js +20 -23
- package/dist/tokens.js.map +1 -1
- package/index.css +5 -1
- package/package.json +4 -4
- package/styles/base/attributes.css +9 -0
- package/styles/dimensions/cover.css +140 -0
- package/styles/dimensions/frame.css +54 -0
- package/styles/dimensions/guest-posture.css +27 -0
- package/styles/dimensions/media.css +1 -1
- package/styles/dimensions/sections.css +4 -1
- package/styles/dimensions/sequence.css +1 -1
- package/styles/dimensions/state.css +1 -1
- package/styles/dimensions/substrate.css +101 -0
- package/styles/dimensions/surfaces.css +35 -2
- package/styles/global.css +68 -0
- package/styles/layouts/on-this-page.css +2 -2
- package/styles/layouts/search.css +2 -2
- package/styles/layouts/split.css +134 -183
- package/styles/layouts/version-switcher.css +1 -1
- package/styles/runes/audio.css +1 -1
- package/styles/runes/bento.css +193 -99
- package/styles/runes/bg.css +24 -0
- package/styles/runes/bond.css +1 -1
- package/styles/runes/budget.css +1 -1
- package/styles/runes/card.css +77 -9
- package/styles/runes/character.css +1 -1
- package/styles/runes/chart.css +69 -0
- package/styles/runes/design-context.css +7 -5
- package/styles/runes/event.css +1 -1
- package/styles/runes/faction.css +32 -6
- package/styles/runes/feature.css +21 -16
- package/styles/runes/figure.css +1 -2
- package/styles/runes/gallery.css +39 -8
- package/styles/runes/itinerary.css +2 -2
- package/styles/runes/lore.css +1 -1
- package/styles/runes/palette.css +3 -3
- package/styles/runes/plan-progress.css +15 -62
- package/styles/runes/playlist.css +32 -0
- package/styles/runes/plot.css +2 -2
- package/styles/runes/realm.css +32 -6
- package/styles/runes/recipe.css +38 -2
- package/styles/runes/sandbox.css +1 -1
- package/styles/runes/showcase.css +7 -63
- package/styles/runes/spacing.css +4 -4
- package/styles/runes/swatch.css +1 -1
- package/styles/runes/tint.css +7 -7
- package/styles/runes/typography.css +7 -7
- package/styles/runes/xref.css +1 -1
- package/tokens/base.css +14 -14
- package/tokens/dark.css +18 -14
package/dist/config.js
CHANGED
|
@@ -62,17 +62,17 @@ export const luminaConfig = mergeThemeConfig(baseConfig, {
|
|
|
62
62
|
border: 'var(--rf-color-info-border)',
|
|
63
63
|
},
|
|
64
64
|
dark: {
|
|
65
|
-
bg: '
|
|
66
|
-
text: '
|
|
65
|
+
bg: '#1c1a17',
|
|
66
|
+
text: '#e2e0dd',
|
|
67
67
|
primary: 'var(--rf-color-primary)',
|
|
68
|
-
border: '
|
|
68
|
+
border: '#5a564f',
|
|
69
69
|
},
|
|
70
70
|
},
|
|
71
71
|
dark: {
|
|
72
72
|
lockMode: 'dark',
|
|
73
73
|
dark: {
|
|
74
|
-
bg: '
|
|
75
|
-
text: '
|
|
74
|
+
bg: '#5a564f',
|
|
75
|
+
text: '#fbfaf7',
|
|
76
76
|
primary: 'var(--rf-color-danger)',
|
|
77
77
|
},
|
|
78
78
|
},
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,KAAK,IAAI,WAAW,EAAE,MAAM,YAAY,CAAC;AAElD,gFAAgF;AAChF,MAAM,CAAC,MAAM,YAAY,GAAG,gBAAgB,CAAC,UAAU,EAAE;IACxD,KAAK,EAAE;QACN,IAAI,EAAE;YACL,KAAK,EAAE;gBACN,EAAE,EAAE,oBAAoB;gBACxB,OAAO,EAAE,yBAAyB;gBAClC,IAAI,EAAE,sBAAsB;gBAC5B,KAAK,EAAE,uBAAuB;gBAC9B,OAAO,EAAE,yBAAyB;gBAClC,MAAM,EAAE,wBAAwB;aAChC;YACD,IAAI,EAAE;gBACL,EAAE,EAAE,oBAAoB;gBACxB,OAAO,EAAE,yBAAyB;gBAClC,IAAI,EAAE,sBAAsB;gBAC5B,KAAK,EAAE,uBAAuB;gBAC9B,OAAO,EAAE,yBAAyB;gBAClC,MAAM,EAAE,wBAAwB;aAChC;SACD;QACD,MAAM,EAAE;YACP,KAAK,EAAE;gBACN,EAAE,EAAE,yBAAyB;gBAC7B,OAAO,EAAE,+BAA+B;gBACxC,IAAI,EAAE,sBAAsB;gBAC5B,KAAK,EAAE,uBAAuB;gBAC9B,OAAO,EAAE,yBAAyB;gBAClC,MAAM,EAAE,wBAAwB;aAChC;YACD,IAAI,EAAE;gBACL,EAAE,EAAE,yBAAyB;gBAC7B,OAAO,EAAE,+BAA+B;gBACxC,IAAI,EAAE,sBAAsB;gBAC5B,KAAK,EAAE,uBAAuB;gBAC9B,OAAO,EAAE,yBAAyB;gBAClC,MAAM,EAAE,wBAAwB;aAChC;SACD;QACD,IAAI,EAAE;YACL,KAAK,EAAE;gBACN,EAAE,EAAE,gCAAgC;gBACpC,IAAI,EAAE,sBAAsB;gBAC5B,OAAO,EAAE,yBAAyB;gBAClC,MAAM,EAAE,wBAAwB;aAChC;YACD,IAAI,EAAE;gBACL,EAAE,EAAE,SAAS;gBACb,IAAI,EAAE,sBAAsB;gBAC5B,OAAO,EAAE,yBAAyB;gBAClC,MAAM,EAAE,SAAS;aACjB;SACD;QACD,IAAI,EAAE;YACL,KAAK,EAAE;gBACN,EAAE,EAAE,yBAAyB;gBAC7B,IAAI,EAAE,sBAAsB;gBAC5B,OAAO,EAAE,yBAAyB;gBAClC,MAAM,EAAE,6BAA6B;aACrC;YACD,IAAI,EAAE;gBACL,EAAE,EAAE,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,KAAK,IAAI,WAAW,EAAE,MAAM,YAAY,CAAC;AAElD,gFAAgF;AAChF,MAAM,CAAC,MAAM,YAAY,GAAG,gBAAgB,CAAC,UAAU,EAAE;IACxD,KAAK,EAAE;QACN,IAAI,EAAE;YACL,KAAK,EAAE;gBACN,EAAE,EAAE,oBAAoB;gBACxB,OAAO,EAAE,yBAAyB;gBAClC,IAAI,EAAE,sBAAsB;gBAC5B,KAAK,EAAE,uBAAuB;gBAC9B,OAAO,EAAE,yBAAyB;gBAClC,MAAM,EAAE,wBAAwB;aAChC;YACD,IAAI,EAAE;gBACL,EAAE,EAAE,oBAAoB;gBACxB,OAAO,EAAE,yBAAyB;gBAClC,IAAI,EAAE,sBAAsB;gBAC5B,KAAK,EAAE,uBAAuB;gBAC9B,OAAO,EAAE,yBAAyB;gBAClC,MAAM,EAAE,wBAAwB;aAChC;SACD;QACD,MAAM,EAAE;YACP,KAAK,EAAE;gBACN,EAAE,EAAE,yBAAyB;gBAC7B,OAAO,EAAE,+BAA+B;gBACxC,IAAI,EAAE,sBAAsB;gBAC5B,KAAK,EAAE,uBAAuB;gBAC9B,OAAO,EAAE,yBAAyB;gBAClC,MAAM,EAAE,wBAAwB;aAChC;YACD,IAAI,EAAE;gBACL,EAAE,EAAE,yBAAyB;gBAC7B,OAAO,EAAE,+BAA+B;gBACxC,IAAI,EAAE,sBAAsB;gBAC5B,KAAK,EAAE,uBAAuB;gBAC9B,OAAO,EAAE,yBAAyB;gBAClC,MAAM,EAAE,wBAAwB;aAChC;SACD;QACD,IAAI,EAAE;YACL,KAAK,EAAE;gBACN,EAAE,EAAE,gCAAgC;gBACpC,IAAI,EAAE,sBAAsB;gBAC5B,OAAO,EAAE,yBAAyB;gBAClC,MAAM,EAAE,wBAAwB;aAChC;YACD,IAAI,EAAE;gBACL,EAAE,EAAE,SAAS;gBACb,IAAI,EAAE,sBAAsB;gBAC5B,OAAO,EAAE,yBAAyB;gBAClC,MAAM,EAAE,SAAS;aACjB;SACD;QACD,IAAI,EAAE;YACL,KAAK,EAAE;gBACN,EAAE,EAAE,yBAAyB;gBAC7B,IAAI,EAAE,sBAAsB;gBAC5B,OAAO,EAAE,yBAAyB;gBAClC,MAAM,EAAE,6BAA6B;aACrC;YACD,IAAI,EAAE;gBACL,EAAE,EAAE,SAAS;gBACb,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,yBAAyB;gBAClC,MAAM,EAAE,SAAS;aACjB;SACD;QACD,IAAI,EAAE;YACL,QAAQ,EAAE,MAAM;YAChB,IAAI,EAAE;gBACL,EAAE,EAAE,SAAS;gBACb,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,wBAAwB;aACjC;SACD;KACD;IACD,KAAK,EAAE;QACN,IAAI,EAAE;YACL,IAAI,EAAE,4SAA4S;YAClT,OAAO,EAAE,iXAAiX;YAC1X,OAAO,EAAE,uSAAuS;YAChT,KAAK,EAAE,qRAAqR;SAC5R;QACD,MAAM,EAAE,WAAW;KACnB;CACD,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tideline.d.ts","sourceRoot":"","sources":["../../src/presets/tideline.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAE3D;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,QAAA,MAAM,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"tideline.d.ts","sourceRoot":"","sources":["../../src/presets/tideline.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAE3D;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,QAAA,MAAM,QAAQ,EAAE,iBA0Gf,CAAC;AAEF,eAAe,QAAQ,CAAC"}
|
package/dist/presets/tideline.js
CHANGED
|
@@ -32,20 +32,6 @@ const tideline = {
|
|
|
32
32
|
bg: '#faf5eb',
|
|
33
33
|
primary: '#457b9d',
|
|
34
34
|
'primary-hover': '#376585',
|
|
35
|
-
// Cerulean → frosted blue scale, preserved from pre-v0.14.0 Lumina.
|
|
36
|
-
'primary-scale': {
|
|
37
|
-
'50': '#f0f6f9',
|
|
38
|
-
'100': '#dcebf0',
|
|
39
|
-
'200': '#b8d6e2',
|
|
40
|
-
'300': '#a8dadc',
|
|
41
|
-
'400': '#70b4c0',
|
|
42
|
-
'500': '#457b9d',
|
|
43
|
-
'600': '#376585',
|
|
44
|
-
'700': '#1d3557',
|
|
45
|
-
'800': '#182c4a',
|
|
46
|
-
'900': '#12213a',
|
|
47
|
-
'950': '#0c162a',
|
|
48
|
-
},
|
|
49
35
|
surface: {
|
|
50
36
|
base: '#fffbf2',
|
|
51
37
|
hover: '#fdf0d5',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tideline.js","sourceRoot":"","sources":["../../src/presets/tideline.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,QAAQ,GAAsB;IACnC,IAAI,EAAE;QACL,IAAI,EAAE,uDAAuD;QAC7D,IAAI,EAAE,4DAA4D;KAClE;IAED,KAAK,EAAE;QACN,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,SAAS;QAChB,MAAM,EAAE,SAAS;QACjB,EAAE,EAAE,SAAS;QACb,OAAO,EAAE,SAAS;QAClB,eAAe,EAAE,SAAS;QAE1B,
|
|
1
|
+
{"version":3,"file":"tideline.js","sourceRoot":"","sources":["../../src/presets/tideline.ts"],"names":[],"mappings":"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"}
|
package/dist/tokens.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAE3D;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAE3D;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,YAAY,EAAE,iBAyL1B,CAAC"}
|
package/dist/tokens.js
CHANGED
|
@@ -27,23 +27,13 @@ export const luminaTokens = {
|
|
|
27
27
|
bg: '#f5f4f1',
|
|
28
28
|
primary: '#1c1a17',
|
|
29
29
|
'primary-hover': '#3a342d',
|
|
30
|
-
//
|
|
31
|
-
//
|
|
32
|
-
//
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
'200': '#ecebe8',
|
|
38
|
-
'300': '#e2e0dd',
|
|
39
|
-
'400': '#bfbab2',
|
|
40
|
-
'500': '#94908a',
|
|
41
|
-
'600': '#76716a',
|
|
42
|
-
'700': '#5a564f',
|
|
43
|
-
'800': '#3a342d',
|
|
44
|
-
'900': '#2a2622',
|
|
45
|
-
'950': '#1c1a17',
|
|
46
|
-
},
|
|
30
|
+
// Derived subtle primary wash — completes the {semantic}-bg family.
|
|
31
|
+
// color-mix off `primary` so it tracks any preset/config override in
|
|
32
|
+
// both modes (no per-preset value, no dark override needed).
|
|
33
|
+
'primary-bg': 'color-mix(in oklch, var(--rf-color-primary) 10%, transparent)',
|
|
34
|
+
// Foreground for text/icons sitting on a `primary` fill. Flips per mode
|
|
35
|
+
// because base `primary` is dark in light mode and light in dark mode.
|
|
36
|
+
'on-primary': '#ffffff',
|
|
47
37
|
surface: {
|
|
48
38
|
base: '#fbfaf7',
|
|
49
39
|
hover: '#ecebe8',
|
|
@@ -103,6 +93,7 @@ export const luminaTokens = {
|
|
|
103
93
|
breathe: '8rem',
|
|
104
94
|
},
|
|
105
95
|
shadow: {
|
|
96
|
+
none: 'none',
|
|
106
97
|
xs: '0 1px 2px rgba(0,0,0,0.04)',
|
|
107
98
|
sm: '0 1px 3px rgba(0,0,0,0.06), 0 1px 2px rgba(0,0,0,0.04)',
|
|
108
99
|
md: '0 4px 12px rgba(0,0,0,0.07), 0 1px 3px rgba(0,0,0,0.04)',
|
|
@@ -126,22 +117,23 @@ export const luminaTokens = {
|
|
|
126
117
|
color: {
|
|
127
118
|
text: '#f6f4ef',
|
|
128
119
|
muted: '#94908a',
|
|
129
|
-
border: '#
|
|
120
|
+
border: '#282825',
|
|
130
121
|
bg: '#1a1a17',
|
|
131
122
|
primary: '#f6f4ef',
|
|
132
123
|
'primary-hover': '#d4cfc5',
|
|
124
|
+
'on-primary': '#1a1a17',
|
|
133
125
|
surface: {
|
|
134
|
-
base: '#
|
|
135
|
-
hover: '#
|
|
136
|
-
active: '#
|
|
137
|
-
raised: '#
|
|
126
|
+
base: '#1f1f1c',
|
|
127
|
+
hover: '#282825',
|
|
128
|
+
active: '#333330',
|
|
129
|
+
raised: '#272723',
|
|
138
130
|
},
|
|
139
131
|
info: { base: '#9bb4c7', bg: '#1f2530', border: '#3d4655' },
|
|
140
132
|
warning: { base: '#d4a868', bg: '#2a2519', border: '#4a3f2a' },
|
|
141
133
|
danger: { base: '#d48888', bg: '#2a1818', border: '#4a2a2a' },
|
|
142
134
|
success: { base: '#7eb398', bg: '#1a2a1f', border: '#2a4a35' },
|
|
143
135
|
code: {
|
|
144
|
-
bg: '#
|
|
136
|
+
bg: '#1c1c19',
|
|
145
137
|
text: '#f6f4ef',
|
|
146
138
|
'inline-bg': '#2b2b29',
|
|
147
139
|
},
|
|
@@ -169,6 +161,8 @@ export const luminaTokens = {
|
|
|
169
161
|
// above by the generator.
|
|
170
162
|
extra: {
|
|
171
163
|
'rf-color-inline-code-bg': '#2b2b29',
|
|
164
|
+
// SPEC-087 — inset surfaces dip a touch deeper in dark mode.
|
|
165
|
+
'rf-surface-inset-shift': '0.06',
|
|
172
166
|
},
|
|
173
167
|
},
|
|
174
168
|
},
|
|
@@ -184,6 +178,9 @@ export const luminaTokens = {
|
|
|
184
178
|
* them here. */
|
|
185
179
|
extra: {
|
|
186
180
|
'rf-color-inline-code-bg': '#e6e5e3',
|
|
181
|
+
// SPEC-087 — lightness delta for the derived inset surface (a tint-tracking
|
|
182
|
+
// recessed fill applied at use-site via relative-color). Per-mode tunable.
|
|
183
|
+
'rf-surface-inset-shift': '0.04',
|
|
187
184
|
},
|
|
188
185
|
};
|
|
189
186
|
//# sourceMappingURL=tokens.js.map
|
package/dist/tokens.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokens.js","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,YAAY,GAAsB;IAC9C,IAAI,EAAE;QACL,IAAI,EAAE,mEAAmE;QACzE,IAAI,EAAE,yEAAyE;KAC/E;IAED,KAAK,EAAE;QACN,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,SAAS;QAChB,MAAM,EAAE,SAAS;QACjB,EAAE,EAAE,SAAS;QACb,OAAO,EAAE,SAAS;QAClB,eAAe,EAAE,SAAS;
|
|
1
|
+
{"version":3,"file":"tokens.js","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"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"}
|
package/index.css
CHANGED
|
@@ -34,6 +34,10 @@
|
|
|
34
34
|
@import './styles/dimensions/state.css';
|
|
35
35
|
@import './styles/dimensions/media.css';
|
|
36
36
|
@import './styles/dimensions/surfaces.css';
|
|
37
|
+
@import './styles/dimensions/frame.css';
|
|
38
|
+
@import './styles/dimensions/substrate.css';
|
|
39
|
+
@import './styles/dimensions/cover.css';
|
|
40
|
+
@import './styles/dimensions/guest-posture.css';
|
|
37
41
|
@import './styles/dimensions/checklist.css';
|
|
38
42
|
@import './styles/dimensions/sequence.css';
|
|
39
43
|
|
|
@@ -125,6 +129,6 @@
|
|
|
125
129
|
@import './styles/runes/bug.css';
|
|
126
130
|
@import './styles/runes/decision.css';
|
|
127
131
|
@import './styles/runes/milestone.css';
|
|
128
|
-
@import './styles/runes/plan-progress.css';
|
|
129
132
|
@import './styles/runes/plan-ref.css';
|
|
130
133
|
@import './styles/runes/plan-history.css';
|
|
134
|
+
@import './styles/runes/plan-progress.css';
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@refrakt-md/lumina",
|
|
3
3
|
"description": "Lumina theme for refrakt.md — design tokens, CSS, identity transform, and layout configs",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.20.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"repository": {
|
|
@@ -83,9 +83,9 @@
|
|
|
83
83
|
"build": "tsc"
|
|
84
84
|
},
|
|
85
85
|
"dependencies": {
|
|
86
|
-
"@refrakt-md/runes": "0.
|
|
87
|
-
"@refrakt-md/transform": "0.
|
|
88
|
-
"@refrakt-md/types": "0.
|
|
86
|
+
"@refrakt-md/runes": "0.20.0",
|
|
87
|
+
"@refrakt-md/transform": "0.20.0",
|
|
88
|
+
"@refrakt-md/types": "0.20.0"
|
|
89
89
|
},
|
|
90
90
|
"devDependencies": {
|
|
91
91
|
"postcss": "^8.4.0"
|
|
@@ -18,3 +18,12 @@
|
|
|
18
18
|
[data-rune][data-inset="tight"] { padding-inline: var(--rf-inset-tight, 1rem); }
|
|
19
19
|
[data-rune][data-inset="loose"] { padding-inline: var(--rf-inset-loose, 4rem); }
|
|
20
20
|
[data-rune][data-inset="breathe"] { padding-inline: var(--rf-inset-breathe, 8rem); }
|
|
21
|
+
|
|
22
|
+
/* ── Elevation — drop shadow (box-shadow) ──────────────────────────────
|
|
23
|
+
* Universal `elevation` attribute (SPEC-086). Maps to the shared --rf-shadow-*
|
|
24
|
+
* token scale; `none` explicitly flattens a rune's default shadow. */
|
|
25
|
+
|
|
26
|
+
[data-rune][data-elevation="none"] { box-shadow: var(--rf-shadow-none); }
|
|
27
|
+
[data-rune][data-elevation="sm"] { box-shadow: var(--rf-shadow-sm); }
|
|
28
|
+
[data-rune][data-elevation="md"] { box-shadow: var(--rf-shadow-md); }
|
|
29
|
+
[data-rune][data-elevation="lg"] { box-shadow: var(--rf-shadow-lg); }
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/* Cover layout (SPEC-089) — `media-position="cover"`.
|
|
2
|
+
*
|
|
3
|
+
* The media well fills the rune interior and the content overlays it (the poster
|
|
4
|
+
* / cover card). The media stays a media guest — the thin-edge frame and
|
|
5
|
+
* `--rf-radius-media` are preserved — with content floated on top via grid
|
|
6
|
+
* stacking (media + content share one grid cell). No overlay primitive in the
|
|
7
|
+
* layout config; the variant supplies the structure (SPEC-091), CSS positions.
|
|
8
|
+
*
|
|
9
|
+
* Height authority: an external grid track (bento) wins; else the media aspect
|
|
10
|
+
* (`frame-aspect`, default portrait); a card height/aspect knob overrides via the
|
|
11
|
+
* cascade. Cover supersedes the media-vs-content split knobs (content-height /
|
|
12
|
+
* media-ratio), which have no meaning when there is no split. */
|
|
13
|
+
|
|
14
|
+
/* ── full scope — the whole content overlays the media well ──────────── */
|
|
15
|
+
[data-media-position="cover"]:not([data-cover-scope="header"]) {
|
|
16
|
+
display: grid;
|
|
17
|
+
grid-template: minmax(0, 1fr) / minmax(0, 1fr);
|
|
18
|
+
aspect-ratio: var(--frame-aspect, var(--cover-aspect, 3 / 4));
|
|
19
|
+
container-type: size;
|
|
20
|
+
overflow: hidden;
|
|
21
|
+
isolation: isolate;
|
|
22
|
+
}
|
|
23
|
+
[data-media-position="cover"]:not([data-cover-scope="header"]) > [data-section="media"],
|
|
24
|
+
[data-media-position="cover"]:not([data-cover-scope="header"]) > [data-name="content"] {
|
|
25
|
+
grid-area: 1 / 1;
|
|
26
|
+
margin: 0;
|
|
27
|
+
min-width: 0;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/* ── header scope — only the cover-band overlays; body flows below ────── */
|
|
31
|
+
[data-cover-scope="header"] > [data-name="cover-band"] {
|
|
32
|
+
display: grid;
|
|
33
|
+
grid-template: minmax(0, 1fr) / minmax(0, 1fr);
|
|
34
|
+
aspect-ratio: var(--frame-aspect, 16 / 9);
|
|
35
|
+
border-radius: var(--rf-radius-media);
|
|
36
|
+
overflow: hidden;
|
|
37
|
+
isolation: isolate;
|
|
38
|
+
container-type: size;
|
|
39
|
+
}
|
|
40
|
+
/* On narrow screens a 16/9 band is too short to seat the preamble over the
|
|
41
|
+
* scrim, so default it to a taller (≥1:1) poster shape. An explicit
|
|
42
|
+
* `frame-aspect` still wins. */
|
|
43
|
+
@media (max-width: 40rem) {
|
|
44
|
+
[data-cover-scope="header"] > [data-name="cover-band"] {
|
|
45
|
+
aspect-ratio: var(--frame-aspect, 4 / 5);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
[data-cover-scope="header"] > [data-name="cover-band"] > [data-section="media"],
|
|
49
|
+
[data-cover-scope="header"] > [data-name="cover-band"] > [data-name="preamble"] {
|
|
50
|
+
grid-area: 1 / 1;
|
|
51
|
+
margin: 0;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/* ── shared: the media well fills, the overlaid box positions ─────────── */
|
|
55
|
+
[data-media-position="cover"] [data-section="media"] {
|
|
56
|
+
position: relative;
|
|
57
|
+
height: 100%;
|
|
58
|
+
border-radius: var(--rf-radius-media);
|
|
59
|
+
overflow: hidden;
|
|
60
|
+
}
|
|
61
|
+
[data-media-position="cover"] [data-section="media"] > :is(img, video) {
|
|
62
|
+
width: 100%;
|
|
63
|
+
height: 100%;
|
|
64
|
+
object-fit: cover;
|
|
65
|
+
}
|
|
66
|
+
/* The overlaid box (full: content; header: preamble) anchors via content-place. */
|
|
67
|
+
[data-media-position="cover"]:not([data-cover-scope="header"]) > [data-name="content"],
|
|
68
|
+
[data-cover-scope="header"] > [data-name="cover-band"] > [data-name="preamble"] {
|
|
69
|
+
position: relative;
|
|
70
|
+
z-index: 1;
|
|
71
|
+
align-self: var(--cover-place-block, end);
|
|
72
|
+
justify-self: var(--cover-place-inline, stretch);
|
|
73
|
+
padding: var(--rune-padding, var(--rf-spacing-md));
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/* ── auto / unset placement ───────────────────────────────────────────
|
|
77
|
+
* `auto` is the cover default, so an unset content-place behaves the same as an
|
|
78
|
+
* explicit `auto`. A header band is always a caption strip — the preamble sits at
|
|
79
|
+
* the block-end over the scrim regardless of the band's orientation. A full-scope
|
|
80
|
+
* overlay adapts to the cover region's orientation (portrait → block-end caption;
|
|
81
|
+
* landscape → inline-start side panel). An explicit value (e.g. "center center")
|
|
82
|
+
* sets the `--cover-place-*` vars on the base rule above and does NOT match here,
|
|
83
|
+
* so it pins regardless of orientation. */
|
|
84
|
+
[data-media-position="cover"]:not([data-cover-scope="header"]):is([data-content-place="auto"], :not([data-content-place])) > [data-name="content"],
|
|
85
|
+
[data-cover-scope="header"]:is([data-content-place="auto"], :not([data-content-place])) > [data-name="cover-band"] > [data-name="preamble"] {
|
|
86
|
+
align-self: end;
|
|
87
|
+
justify-self: stretch;
|
|
88
|
+
}
|
|
89
|
+
@container (min-aspect-ratio: 1 / 1) {
|
|
90
|
+
[data-media-position="cover"]:not([data-cover-scope="header"]):is([data-content-place="auto"], :not([data-content-place])) > [data-name="content"] {
|
|
91
|
+
align-self: center;
|
|
92
|
+
justify-self: start;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/* ── default cover scrim (SPEC-088 scrim, on the media surface) ────────
|
|
97
|
+
* Overlaying text on an arbitrary image without a scrim is a legibility footgun,
|
|
98
|
+
* so cover applies a default gradient scrim weighted toward the content edge.
|
|
99
|
+
* `scrim="none"` opts out. The overlaid foreground is set light by the engine
|
|
100
|
+
* (data-color-scheme) so text reads against the darkened media. */
|
|
101
|
+
[data-media-position="cover"]:not([data-scrim="none"]) [data-section="media"]::after {
|
|
102
|
+
content: "";
|
|
103
|
+
position: absolute;
|
|
104
|
+
inset: 0;
|
|
105
|
+
pointer-events: none;
|
|
106
|
+
background-image: linear-gradient(var(--cover-scrim-dir, to top), rgb(0 0 0 / 0.55), transparent 62%);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/* Frost treatment (`scrim-type="frost"`) — a frosted-glass blur over the media
|
|
110
|
+
* instead of a gradient. `scrim-blur` (named scale) sets the blur radius; the
|
|
111
|
+
* tint follows the cover scheme (a dark scheme → a dark frost for light text).
|
|
112
|
+
* The frost is masked to the content edge (following `--cover-scrim-dir`, default
|
|
113
|
+
* bottom) so it reads as a band behind the text, not a blur over the whole image. */
|
|
114
|
+
[data-media-position="cover"][data-scrim-blur="none"] { --cover-scrim-blur: 0px; }
|
|
115
|
+
[data-media-position="cover"][data-scrim-blur="sm"] { --cover-scrim-blur: 4px; }
|
|
116
|
+
[data-media-position="cover"][data-scrim-blur="md"] { --cover-scrim-blur: 8px; }
|
|
117
|
+
[data-media-position="cover"][data-scrim-blur="lg"] { --cover-scrim-blur: 16px; }
|
|
118
|
+
[data-media-position="cover"][data-scrim-type="frost"]:not([data-scrim="none"]) [data-section="media"]::after {
|
|
119
|
+
background-image: none;
|
|
120
|
+
background-color: rgb(0 0 0 / 0.18);
|
|
121
|
+
-webkit-backdrop-filter: blur(var(--cover-scrim-blur, 8px));
|
|
122
|
+
backdrop-filter: blur(var(--cover-scrim-blur, 8px));
|
|
123
|
+
-webkit-mask-image: linear-gradient(var(--cover-scrim-dir, to top), #000 30%, transparent 72%);
|
|
124
|
+
mask-image: linear-gradient(var(--cover-scrim-dir, to top), #000 30%, transparent 72%);
|
|
125
|
+
}
|
|
126
|
+
[data-media-position="cover"][data-scrim-type="frost"][data-color-scheme="light"]:not([data-scrim="none"]) [data-section="media"]::after {
|
|
127
|
+
background-color: rgb(255 255 255 / 0.25);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/* The overlay carries the cover colour-scheme (set by the engine) so its text
|
|
131
|
+
* reads against the darkened media. The standalone `[data-color-scheme]` rule
|
|
132
|
+
* also paints a `background-color`; null it out here so the overlay stays
|
|
133
|
+
* see-through over the media (the scrim, not a solid box, does the legibility). */
|
|
134
|
+
[data-media-position="cover"] [data-name="content"][data-color-scheme],
|
|
135
|
+
[data-cover-scope="header"] > [data-name="cover-band"][data-color-scheme] {
|
|
136
|
+
background-color: transparent;
|
|
137
|
+
/* Muted text (the blurb) is barely legible over a photo, so on the overlay it
|
|
138
|
+
* reads at full foreground strength — the same colour as the headline. */
|
|
139
|
+
--rf-color-muted: var(--rf-color-text);
|
|
140
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/* Frame chrome (SPEC-086) — media-surface presentation.
|
|
2
|
+
*
|
|
3
|
+
* The engine lands the frame contract on the frame-target element: a rune's
|
|
4
|
+
* `[data-section="media"]` zone (frameTarget: 'media') or the rune's own root
|
|
5
|
+
* (frameTarget: 'self', e.g. figure/showcase). These selectors are intentionally
|
|
6
|
+
* surface-agnostic — they match wherever the chrome is emitted.
|
|
7
|
+
*
|
|
8
|
+
* data-frame — applied preset name (marker)
|
|
9
|
+
* data-frame-shadow — silhouette drop-shadow (none|sm|md|lg)
|
|
10
|
+
* data-displace — edge/corner the guest moves toward
|
|
11
|
+
* --frame-aspect — aspect-ratio of the framed media
|
|
12
|
+
* --frame-offset — displacement distance (resolved spacing token)
|
|
13
|
+
* --frame-oversize — scale factor by which the guest exceeds its slot
|
|
14
|
+
* --frame-anchor — crop focal point (object-position)
|
|
15
|
+
* --frame-place-x / -y — guest-box alignment within its slot
|
|
16
|
+
*
|
|
17
|
+
* Clip is host-owned: a clipping host (card/bento-cell/figure media well) crops a
|
|
18
|
+
* displaced/oversized guest into a *peek*; a breakout host (showcase-self, a
|
|
19
|
+
* section/page) lets it *spill*. `elevation` (box-shadow on the self surface) and
|
|
20
|
+
* `frame-shadow` (drop-shadow silhouette here) never collide — different property,
|
|
21
|
+
* different surface. */
|
|
22
|
+
|
|
23
|
+
/* ── Silhouette drop-shadow ──────────────────────────────────────────── */
|
|
24
|
+
[data-frame-shadow="none"] { filter: none; }
|
|
25
|
+
[data-frame-shadow="sm"] { filter: drop-shadow(0 4px 12px rgba(0, 0, 0, 0.10)); }
|
|
26
|
+
[data-frame-shadow="md"] { filter: drop-shadow(0 2px 8px rgba(0, 0, 0, 0.25)); }
|
|
27
|
+
[data-frame-shadow="lg"] { filter: drop-shadow(0 12px 40px rgba(0, 0, 0, 0.20)); }
|
|
28
|
+
|
|
29
|
+
/* ── Aspect ratio ────────────────────────────────────────────────────── */
|
|
30
|
+
[style*="--frame-aspect"] { aspect-ratio: var(--frame-aspect); }
|
|
31
|
+
|
|
32
|
+
/* ── Crop anchor — focal point when the guest is cut ─────────────────── */
|
|
33
|
+
[style*="--frame-anchor"] > :is(img, video) { object-position: var(--frame-anchor); }
|
|
34
|
+
|
|
35
|
+
/* ── Placement of the framed box within its slot ─────────────────────── */
|
|
36
|
+
[style*="--frame-place-x"] { justify-self: var(--frame-place-x, auto); align-self: var(--frame-place-y, auto); }
|
|
37
|
+
|
|
38
|
+
/* ── Oversize — guest exceeds its slot (clipping hosts crop it) ──────── */
|
|
39
|
+
[style*="--frame-oversize"] > :is(img, video) { width: calc(100% * var(--frame-oversize, 1)); max-width: none; }
|
|
40
|
+
|
|
41
|
+
/* ── Displacement (bleed / peek) — move the guest toward an edge/corner.
|
|
42
|
+
* The host decides whether it spills or is cropped; this only moves it. ─ */
|
|
43
|
+
[data-displace] { position: relative; z-index: 1; }
|
|
44
|
+
[data-displace="top"] { margin-top: calc(-1 * var(--frame-offset, var(--rf-spacing-lg))); }
|
|
45
|
+
[data-displace="bottom"] { margin-bottom: calc(-1 * var(--frame-offset, var(--rf-spacing-lg))); }
|
|
46
|
+
[data-displace="both"] { margin-block: calc(-1 * var(--frame-offset, var(--rf-spacing-lg))); }
|
|
47
|
+
[data-displace="end"] { margin-inline-end: calc(-1 * var(--frame-offset, var(--rf-spacing-lg))); }
|
|
48
|
+
[data-displace="bottom-end"] { margin-bottom: calc(-1 * var(--frame-offset, var(--rf-spacing-lg))); margin-inline-end: calc(-1 * var(--frame-offset, var(--rf-spacing-lg))); }
|
|
49
|
+
[data-displace="top-end"] { margin-top: calc(-1 * var(--frame-offset, var(--rf-spacing-lg))); margin-inline-end: calc(-1 * var(--frame-offset, var(--rf-spacing-lg))); }
|
|
50
|
+
|
|
51
|
+
/* Collapse displacement on mobile, regardless of host. */
|
|
52
|
+
@media (max-width: 768px) {
|
|
53
|
+
[data-displace] { margin: 0; }
|
|
54
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/* Media-guest interaction posture (SPEC-090).
|
|
2
|
+
*
|
|
3
|
+
* A media-slot guest is presentational by default. When its container is itself
|
|
4
|
+
* an interaction target — a `card` / `bento-cell` with a stretched whole-tile
|
|
5
|
+
* `href` link — or the guest is a `cover` backdrop (SPEC-089), the engine marks
|
|
6
|
+
* the media zone `data-guest-posture="presentational"`. That makes the guest
|
|
7
|
+
* non-interactive at the pointer level, so:
|
|
8
|
+
* • a linked tile links reliably — clicks over the media fall through to the
|
|
9
|
+
* stretched link beneath it instead of being eaten by the guest's controls;
|
|
10
|
+
* • a cover backdrop never steals interaction from the overlaid content.
|
|
11
|
+
*
|
|
12
|
+
* The behaviours layer additionally skips JS enhancement for a presentational
|
|
13
|
+
* guest (see @refrakt-md/behaviors), so it renders its static fallback. The
|
|
14
|
+
* posture is scoped to the media zone only — content-overlay controls
|
|
15
|
+
* (body/footer links & buttons) are outside it and stay fully interactive. */
|
|
16
|
+
[data-section="media"][data-guest-posture="presentational"] {
|
|
17
|
+
pointer-events: none;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/* Static fallback for demoted tabbed guests (`codegroup`, `tabs`): their tab
|
|
21
|
+
* strip is rendered statically but the behaviour that wires it is skipped, so
|
|
22
|
+
* it would sit there inert. Hide it and let the panels read as plain stacked
|
|
23
|
+
* content — the non-enhanced render is the fallback. (Guests whose chrome is
|
|
24
|
+
* JS-injected — datatable toolbars, map controls — simply never appear.) */
|
|
25
|
+
[data-section="media"][data-guest-posture="presentational"] :is(.rf-tabs__tabs, .rf-codegroup__tabs) {
|
|
26
|
+
display: none;
|
|
27
|
+
}
|
|
@@ -73,5 +73,8 @@
|
|
|
73
73
|
/* ─── Media: visual content ───────────────────────────────────────── */
|
|
74
74
|
|
|
75
75
|
[data-section="media"] {
|
|
76
|
-
|
|
76
|
+
/* Media zones manage their own spacing via their layout (split gap, cell
|
|
77
|
+
* padding, flow margins); a blanket block margin here misaligns media in
|
|
78
|
+
* flex/beside layouts, so keep it neutral. */
|
|
79
|
+
margin: 0;
|
|
77
80
|
}
|
|
@@ -45,7 +45,7 @@ button[data-state="inactive"] {
|
|
|
45
45
|
/* ─── Selected: user selection highlight ──────────────────────────── */
|
|
46
46
|
|
|
47
47
|
[data-state="selected"] {
|
|
48
|
-
background:
|
|
48
|
+
background: var(--rf-color-primary-bg);
|
|
49
49
|
outline: 2px solid var(--rf-color-primary);
|
|
50
50
|
}
|
|
51
51
|
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/* Substrate (SPEC-087) — generated surface pattern.
|
|
2
|
+
*
|
|
3
|
+
* The token-driven gradient recipes that realise each pattern ship here in the
|
|
4
|
+
* always-included base layer (not a theme's swappable CSS), so "dots = dots on
|
|
5
|
+
* every theme" is a guarantee: themes retune the `--substrate-*` token hooks
|
|
6
|
+
* (ink colour, cell size), they don't redefine a pattern's geometry. Patterns
|
|
7
|
+
* are pure CSS — no image assets, crisp at any zoom. The engine emits markers
|
|
8
|
+
* only (`data-substrate` + `--substrate-*`); CSS does the drawing.
|
|
9
|
+
*
|
|
10
|
+
* The pattern is a `background-image` over the surface `background-color`; the
|
|
11
|
+
* gradient's `transparent` gaps reveal whatever fill sits beneath (tint/inset).
|
|
12
|
+
* `--substrate-ink` resolves from `--rf-color-border` (tint-bridged), so the
|
|
13
|
+
* pattern recolours with the surface.
|
|
14
|
+
*
|
|
15
|
+
* Runes set their surface with the `background` *shorthand* (e.g.
|
|
16
|
+
* `.rf-card { background: var(--rf-color-surface) }`), which resets
|
|
17
|
+
* `background-image`/`-size`/`-position` and loads *after* this base layer. So
|
|
18
|
+
* the actual `background-*` longhands live here on the higher-specificity
|
|
19
|
+
* `[data-substrate]:not(…)` selector (0,2,0 — beats a rune's `.rf-*`, 0,1,0),
|
|
20
|
+
* and each pattern only feeds custom properties (which never collide with a
|
|
21
|
+
* rune's background). The rune's `background-color` still shows through. */
|
|
22
|
+
|
|
23
|
+
[data-substrate]:not([data-substrate="none"]) {
|
|
24
|
+
--substrate-cell: 16px;
|
|
25
|
+
--substrate-opacity: 0.5;
|
|
26
|
+
/* `--substrate-boost` (per-pattern) and `--substrate-mode-boost` (light/dark)
|
|
27
|
+
* are intentionally NOT set here — only referenced with a `1` fallback — so a
|
|
28
|
+
* lower-specificity pattern rule or an inherited dark-mode rule can drive them
|
|
29
|
+
* without losing to this (0,2,0) base. The product is clamped to 100% by
|
|
30
|
+
* color-mix. */
|
|
31
|
+
--substrate-ink: color-mix(in oklab, var(--rf-color-border) calc(var(--substrate-opacity) * var(--substrate-boost, 1) * var(--substrate-mode-boost, 1) * 100%), transparent);
|
|
32
|
+
background-image: var(--substrate-image);
|
|
33
|
+
background-size: var(--substrate-tile, var(--substrate-cell) var(--substrate-cell));
|
|
34
|
+
background-position: var(--substrate-pos, 0 0);
|
|
35
|
+
background-repeat: repeat;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/* dots — one tiled radial-gradient. A small dot reads fainter than a 1px line,
|
|
39
|
+
* so dots get a per-pattern ink boost. */
|
|
40
|
+
[data-substrate="dots"] {
|
|
41
|
+
--substrate-image: radial-gradient(var(--substrate-ink) var(--substrate-dot, 1.5px), transparent 0);
|
|
42
|
+
--substrate-boost: 1.4;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/* grid — two tiled linear-gradients */
|
|
46
|
+
[data-substrate="grid"] {
|
|
47
|
+
--substrate-image:
|
|
48
|
+
linear-gradient(var(--substrate-ink) 1px, transparent 1px),
|
|
49
|
+
linear-gradient(90deg, var(--substrate-ink) 1px, transparent 1px);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/* lines — diagonal hatching (the repeating gradient owns its own spacing) */
|
|
53
|
+
[data-substrate="lines"] {
|
|
54
|
+
--substrate-image: repeating-linear-gradient(45deg, var(--substrate-ink) 0 1px, transparent 1px var(--substrate-cell));
|
|
55
|
+
--substrate-tile: auto;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/* cross — plus marks on a grid (a grid masked down to short ticks at each node) */
|
|
59
|
+
[data-substrate="cross"] {
|
|
60
|
+
--substrate-image:
|
|
61
|
+
linear-gradient(var(--substrate-ink) 1px, transparent 1px),
|
|
62
|
+
linear-gradient(90deg, var(--substrate-ink) 1px, transparent 1px);
|
|
63
|
+
--substrate-pos: center;
|
|
64
|
+
-webkit-mask-image: radial-gradient(circle at center, #000 0 2px, transparent 2px);
|
|
65
|
+
-webkit-mask-size: var(--substrate-cell) var(--substrate-cell);
|
|
66
|
+
mask-image: radial-gradient(circle at center, #000 0 2px, transparent 2px);
|
|
67
|
+
mask-size: var(--substrate-cell) var(--substrate-cell);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/* checker — alternating filled cells */
|
|
71
|
+
[data-substrate="checker"] {
|
|
72
|
+
--substrate-image:
|
|
73
|
+
conic-gradient(var(--substrate-ink) 0 25%, transparent 0 50%, var(--substrate-ink) 0 75%, transparent 0);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
[data-substrate="none"] { background-image: none; }
|
|
77
|
+
|
|
78
|
+
/* substrate-fill="inset" — paint the pattern over the recessed inset fill
|
|
79
|
+
* (SPEC-087 inset surface) instead of the inherited surface colour. */
|
|
80
|
+
[data-substrate][data-substrate-fill="inset"] {
|
|
81
|
+
background-color: oklch(from var(--rf-color-surface) calc(l - var(--rf-surface-inset-shift)) c h);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/* Dark mode — the border ink sits close to the dark surface, so patterns need
|
|
85
|
+
* more presence across the board (dots compound their per-pattern boost on top,
|
|
86
|
+
* landing near full strength). Set the multiplier on the dark root so it
|
|
87
|
+
* inherits into every substrate element; mirrors how dark.css triggers dark. */
|
|
88
|
+
[data-theme="dark"],
|
|
89
|
+
[data-color-scheme="dark"] {
|
|
90
|
+
--substrate-mode-boost: 1.6;
|
|
91
|
+
}
|
|
92
|
+
@media (prefers-color-scheme: dark) {
|
|
93
|
+
:root:not([data-theme="light"]) {
|
|
94
|
+
--substrate-mode-boost: 1.6;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/* A tint-locked light subtree resets to the light intensity (nearest ancestor
|
|
98
|
+
* wins via inheritance), even when nested inside dark mode. */
|
|
99
|
+
[data-color-scheme="light"] {
|
|
100
|
+
--substrate-mode-boost: 1;
|
|
101
|
+
}
|