@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.
Files changed (58) hide show
  1. package/base.css +4 -0
  2. package/contracts/structures.json +509 -223
  3. package/dist/config.js +5 -5
  4. package/dist/config.js.map +1 -1
  5. package/dist/presets/tideline.d.ts.map +1 -1
  6. package/dist/presets/tideline.js +0 -14
  7. package/dist/presets/tideline.js.map +1 -1
  8. package/dist/tokens.d.ts.map +1 -1
  9. package/dist/tokens.js +20 -23
  10. package/dist/tokens.js.map +1 -1
  11. package/index.css +5 -1
  12. package/package.json +4 -4
  13. package/styles/base/attributes.css +9 -0
  14. package/styles/dimensions/cover.css +140 -0
  15. package/styles/dimensions/frame.css +54 -0
  16. package/styles/dimensions/guest-posture.css +27 -0
  17. package/styles/dimensions/media.css +1 -1
  18. package/styles/dimensions/sections.css +4 -1
  19. package/styles/dimensions/sequence.css +1 -1
  20. package/styles/dimensions/state.css +1 -1
  21. package/styles/dimensions/substrate.css +101 -0
  22. package/styles/dimensions/surfaces.css +35 -2
  23. package/styles/global.css +68 -0
  24. package/styles/layouts/on-this-page.css +2 -2
  25. package/styles/layouts/search.css +2 -2
  26. package/styles/layouts/split.css +134 -183
  27. package/styles/layouts/version-switcher.css +1 -1
  28. package/styles/runes/audio.css +1 -1
  29. package/styles/runes/bento.css +193 -99
  30. package/styles/runes/bg.css +24 -0
  31. package/styles/runes/bond.css +1 -1
  32. package/styles/runes/budget.css +1 -1
  33. package/styles/runes/card.css +77 -9
  34. package/styles/runes/character.css +1 -1
  35. package/styles/runes/chart.css +69 -0
  36. package/styles/runes/design-context.css +7 -5
  37. package/styles/runes/event.css +1 -1
  38. package/styles/runes/faction.css +32 -6
  39. package/styles/runes/feature.css +21 -16
  40. package/styles/runes/figure.css +1 -2
  41. package/styles/runes/gallery.css +39 -8
  42. package/styles/runes/itinerary.css +2 -2
  43. package/styles/runes/lore.css +1 -1
  44. package/styles/runes/palette.css +3 -3
  45. package/styles/runes/plan-progress.css +15 -62
  46. package/styles/runes/playlist.css +32 -0
  47. package/styles/runes/plot.css +2 -2
  48. package/styles/runes/realm.css +32 -6
  49. package/styles/runes/recipe.css +38 -2
  50. package/styles/runes/sandbox.css +1 -1
  51. package/styles/runes/showcase.css +7 -63
  52. package/styles/runes/spacing.css +4 -4
  53. package/styles/runes/swatch.css +1 -1
  54. package/styles/runes/tint.css +7 -7
  55. package/styles/runes/typography.css +7 -7
  56. package/styles/runes/xref.css +1 -1
  57. package/tokens/base.css +14 -14
  58. 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: 'var(--rf-color-primary-950)',
66
- text: 'var(--rf-color-primary-300)',
65
+ bg: '#1c1a17',
66
+ text: '#e2e0dd',
67
67
  primary: 'var(--rf-color-primary)',
68
- border: 'var(--rf-color-primary-700)',
68
+ border: '#5a564f',
69
69
  },
70
70
  },
71
71
  dark: {
72
72
  lockMode: 'dark',
73
73
  dark: {
74
- bg: 'var(--rf-color-primary-700)',
75
- text: 'var(--rf-color-primary-50)',
74
+ bg: '#5a564f',
75
+ text: '#fbfaf7',
76
76
  primary: 'var(--rf-color-danger)',
77
77
  },
78
78
  },
@@ -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,6BAA6B;gBACjC,IAAI,EAAE,6BAA6B;gBACnC,OAAO,EAAE,yBAAyB;gBAClC,MAAM,EAAE,6BAA6B;aACrC;SACD;QACD,IAAI,EAAE;YACL,QAAQ,EAAE,MAAM;YAChB,IAAI,EAAE;gBACL,EAAE,EAAE,6BAA6B;gBACjC,IAAI,EAAE,4BAA4B;gBAClC,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
+ {"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,iBAyHf,CAAC;AAEF,eAAe,QAAQ,CAAC"}
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"}
@@ -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":"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"}
1
+ {"version":3,"file":"tideline.js","sourceRoot":"","sources":["../../src/presets/tideline.ts"],"names":[],"mappings":"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"}
@@ -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,iBA6L1B,CAAC"}
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
- // Warm-neutral axis from near-bg to near-text, eleven hand-picked stops.
31
- // Several stops intentionally overlap with semantic tokens (surface.base,
32
- // border, primary-hover, text) that's normal; palette steps double as
33
- // the implementations of the named tokens at their lightness level.
34
- 'primary-scale': {
35
- '50': '#fbfaf7',
36
- '100': '#f5f4f1',
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: '#2a2825',
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: '#211f1c',
135
- hover: '#2a2825',
136
- active: '#353330',
137
- raised: '#292723',
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: '#222220',
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
@@ -1 +1 @@
1
- {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"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"}
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.18.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.18.0",
87
- "@refrakt-md/transform": "0.18.0",
88
- "@refrakt-md/types": "0.18.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
+ }
@@ -20,7 +20,7 @@
20
20
  [data-media="cover"] {
21
21
  width: 100%;
22
22
  object-fit: cover;
23
- border-radius: var(--rf-radius-md) var(--rf-radius-md) 0 0;
23
+ border-radius: var(--rf-radius-md);
24
24
  }
25
25
 
26
26
  /* ─── Thumbnail: small fixed preview ──────────────────────────────── */
@@ -73,5 +73,8 @@
73
73
  /* ─── Media: visual content ───────────────────────────────────────── */
74
74
 
75
75
  [data-section="media"] {
76
- margin: var(--rf-spacing-sm) 0;
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
  }
@@ -63,7 +63,7 @@
63
63
  height: 0.75rem;
64
64
  border-radius: 50%;
65
65
  background: var(--rf-color-primary);
66
- border: 2px solid var(--rf-color-background);
66
+ border: 2px solid var(--rf-color-bg);
67
67
  box-shadow: 0 0 0 2px var(--rf-color-primary);
68
68
  }
69
69
 
@@ -45,7 +45,7 @@ button[data-state="inactive"] {
45
45
  /* ─── Selected: user selection highlight ──────────────────────────── */
46
46
 
47
47
  [data-state="selected"] {
48
- background: color-mix(in oklch, var(--rf-color-primary) 10%, transparent);
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
+ }