@refrakt-md/lumina 0.22.0 → 0.23.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 (130) hide show
  1. package/base.css +2 -1
  2. package/dist/config.d.ts.map +1 -1
  3. package/dist/config.js +7 -0
  4. package/dist/config.js.map +1 -1
  5. package/dist/tokens.d.ts.map +1 -1
  6. package/dist/tokens.js +2 -0
  7. package/dist/tokens.js.map +1 -1
  8. package/index.css +10 -1
  9. package/package.json +5 -4
  10. package/styles/base/attributes.css +6 -7
  11. package/styles/dimensions/checklist.css +6 -35
  12. package/styles/dimensions/cover.css +13 -95
  13. package/styles/dimensions/density.css +3 -0
  14. package/styles/dimensions/frame.css +3 -0
  15. package/styles/dimensions/media.css +14 -61
  16. package/styles/dimensions/metadata.css +24 -74
  17. package/styles/dimensions/sections.css +10 -24
  18. package/styles/dimensions/sequence.css +14 -79
  19. package/styles/dimensions/state.css +39 -56
  20. package/styles/dimensions/substrate.css +3 -0
  21. package/styles/dimensions/surfaces.css +73 -113
  22. package/styles/elements/blockquote.css +3 -2
  23. package/styles/elements/code.css +3 -0
  24. package/styles/elements/table.css +3 -0
  25. package/styles/global.css +9 -48
  26. package/styles/layouts/blog.css +3 -64
  27. package/styles/layouts/default.css +3 -77
  28. package/styles/layouts/docs.css +3 -153
  29. package/styles/layouts/mobile.css +1 -50
  30. package/styles/layouts/on-this-page.css +3 -2
  31. package/styles/layouts/plan.css +3 -134
  32. package/styles/layouts/search.css +3 -68
  33. package/styles/layouts/split.css +24 -169
  34. package/styles/layouts/theme-toggle.css +3 -29
  35. package/styles/layouts/version-switcher.css +3 -4
  36. package/styles/runes/accordion.css +15 -58
  37. package/styles/runes/aggregate.css +3 -12
  38. package/styles/runes/annotate.css +6 -35
  39. package/styles/runes/api.css +3 -0
  40. package/styles/runes/audio.css +3 -41
  41. package/styles/runes/badge.css +3 -0
  42. package/styles/runes/bar.css +3 -0
  43. package/styles/runes/bento.css +16 -159
  44. package/styles/runes/bg.css +3 -37
  45. package/styles/runes/blog.css +3 -5
  46. package/styles/runes/bond.css +3 -23
  47. package/styles/runes/breadcrumb.css +5 -13
  48. package/styles/runes/budget.css +3 -25
  49. package/styles/runes/bug.css +3 -0
  50. package/styles/runes/card.css +24 -92
  51. package/styles/runes/cast.css +5 -22
  52. package/styles/runes/changelog.css +5 -9
  53. package/styles/runes/character.css +3 -17
  54. package/styles/runes/chart.css +10 -52
  55. package/styles/runes/codegroup.css +15 -23
  56. package/styles/runes/collection.css +5 -82
  57. package/styles/runes/compare.css +3 -14
  58. package/styles/runes/comparison.css +7 -34
  59. package/styles/runes/conversation.css +5 -27
  60. package/styles/runes/cta.css +3 -26
  61. package/styles/runes/datatable.css +25 -40
  62. package/styles/runes/decision.css +3 -0
  63. package/styles/runes/design-context.css +3 -2
  64. package/styles/runes/details.css +5 -13
  65. package/styles/runes/diagram.css +5 -13
  66. package/styles/runes/diff.css +5 -88
  67. package/styles/runes/drawer.css +1 -105
  68. package/styles/runes/embed.css +4 -12
  69. package/styles/runes/event.css +3 -1
  70. package/styles/runes/expand.css +5 -40
  71. package/styles/runes/faction.css +3 -9
  72. package/styles/runes/feature.css +4 -32
  73. package/styles/runes/figure.css +5 -24
  74. package/styles/runes/file-ref.css +3 -18
  75. package/styles/runes/form.css +3 -32
  76. package/styles/runes/gallery.css +3 -135
  77. package/styles/runes/grid.css +4 -56
  78. package/styles/runes/hero.css +13 -126
  79. package/styles/runes/hint.css +16 -41
  80. package/styles/runes/howto.css +3 -25
  81. package/styles/runes/itinerary.css +3 -32
  82. package/styles/runes/juxtapose.css +12 -87
  83. package/styles/runes/lore.css +3 -10
  84. package/styles/runes/map.css +3 -36
  85. package/styles/runes/mediatext.css +3 -44
  86. package/styles/runes/milestone.css +3 -16
  87. package/styles/runes/mockup.css +3 -108
  88. package/styles/runes/nav.css +3 -178
  89. package/styles/runes/organization.css +3 -2
  90. package/styles/runes/page-section.css +3 -4
  91. package/styles/runes/pagination.css +5 -37
  92. package/styles/runes/palette.css +3 -22
  93. package/styles/runes/placeholder.css +3 -3
  94. package/styles/runes/plan-history.css +3 -23
  95. package/styles/runes/plan-progress.css +3 -4
  96. package/styles/runes/plan-ref.css +3 -0
  97. package/styles/runes/playlist.css +2 -36
  98. package/styles/runes/plot.css +3 -19
  99. package/styles/runes/preview.css +3 -28
  100. package/styles/runes/pricing.css +7 -25
  101. package/styles/runes/progress.css +6 -25
  102. package/styles/runes/pullquote.css +3 -26
  103. package/styles/runes/realm.css +3 -9
  104. package/styles/runes/recipe.css +3 -27
  105. package/styles/runes/relationships.css +3 -34
  106. package/styles/runes/reveal.css +7 -12
  107. package/styles/runes/sandbox.css +6 -36
  108. package/styles/runes/section.css +4 -18
  109. package/styles/runes/showcase.css +3 -20
  110. package/styles/runes/sidenote.css +3 -2
  111. package/styles/runes/snippet.css +3 -0
  112. package/styles/runes/spacing.css +3 -22
  113. package/styles/runes/spec.css +3 -0
  114. package/styles/runes/steps.css +4 -36
  115. package/styles/runes/storyboard.css +2 -17
  116. package/styles/runes/swatch.css +3 -6
  117. package/styles/runes/symbol.css +6 -4
  118. package/styles/runes/tabs.css +6 -9
  119. package/styles/runes/testimonial.css +5 -6
  120. package/styles/runes/textblock.css +2 -20
  121. package/styles/runes/timeline.css +3 -21
  122. package/styles/runes/tint.css +3 -0
  123. package/styles/runes/toc.css +5 -3
  124. package/styles/runes/track.css +2 -31
  125. package/styles/runes/typography.css +3 -15
  126. package/styles/runes/work.css +3 -0
  127. package/styles/runes/xref.css +3 -1
  128. package/tokens/base.css +13 -0
  129. package/tokens/dark.css +3 -0
  130. package/styles/dimensions/guest-posture.css +0 -27
@@ -1,36 +1,26 @@
1
- /* ─── Section Anatomy Dimension ─────────────────────────────────────────
2
- * Generic layout and typography for the 6 standard section roles.
3
- * Every rune that declares `sections` in its config gets these for free.
4
- *
5
- * Includes density × section interactions (title scaling, hiding).
1
+ @layer skin {
2
+ /* ─── Section Anatomy Dimension skin ──────────────────────────────────
3
+ * Zone rhythm (margins, gaps, padding), typography, and borders for the 6
4
+ * standard section roles. The flex zone *containers* (header / preamble /
5
+ * footer) live in @refrakt-md/skeleton (dimensions/sections.css). Rhythm stays
6
+ * here so rune zone overrides resolve against it by source order.
6
7
  * ────────────────────────────────────────────────────────────────────── */
7
8
 
8
9
  /* ─── Header: chrome metadata row (badges, status, icons) ────────── */
9
-
10
10
  [data-section="header"] {
11
- display: flex;
12
- flex-wrap: wrap;
13
- align-items: center;
14
11
  gap: 0.5rem;
15
12
  margin-bottom: 3rem;
16
13
  }
17
14
 
18
15
  /* ─── Preamble: intro section (eyebrow, headline, blurb) ─────────── */
19
-
20
16
  [data-section="preamble"] {
21
- display: flex;
22
- flex-direction: column;
23
17
  gap: 0.25rem;
24
18
  }
25
19
 
26
20
  /* ─── Title: primary heading ──────────────────────────────────────── */
27
-
28
21
  /* The size rides --rf-title-size (set per density root in density.css) so a
29
- * nested rune's own density re-declares it a full-density hero inside a
30
- * compact preview keeps its full-size title and a rune's own title CSS
31
- * (e.g. .rf-hero__headline) outranks the bare attribute selector. The old
32
- * `[data-density="compact"] [data-section="title"]` descendant rule leaked
33
- * through nested densities AND beat per-rune title sizes. */
22
+ * nested rune's own density re-declares it, and a rune's own title CSS
23
+ * (e.g. .rf-hero__headline) outranks the bare attribute selector. */
34
24
  [data-section="title"] {
35
25
  font-family: var(--rf-font-sans);
36
26
  font-size: var(--rf-title-size, var(--rf-text-2xl));
@@ -41,7 +31,6 @@
41
31
  }
42
32
 
43
33
  /* ─── Description: secondary text ─────────────────────────────────── */
44
-
45
34
  [data-section="description"] {
46
35
  font-size: var(--rf-text);
47
36
  line-height: var(--rf-leading-normal);
@@ -50,17 +39,13 @@
50
39
  }
51
40
 
52
41
  /* ─── Body: main content ──────────────────────────────────────────── */
53
-
54
42
  [data-section="body"] {
55
43
  line-height: var(--rf-leading-relaxed);
56
44
  color: var(--rf-color-text);
57
45
  }
58
46
 
59
47
  /* ─── Footer: actions and links ───────────────────────────────────── */
60
-
61
48
  [data-section="footer"] {
62
- display: flex;
63
- flex-wrap: wrap;
64
49
  gap: var(--rf-spacing-sm);
65
50
  margin-top: var(--rf-spacing-md);
66
51
  padding-top: var(--rf-spacing-sm);
@@ -68,10 +53,11 @@
68
53
  }
69
54
 
70
55
  /* ─── Media: visual content ───────────────────────────────────────── */
71
-
72
56
  [data-section="media"] {
73
57
  /* Media zones manage their own spacing via their layout (split gap, cell
74
58
  * padding, flow margins); a blanket block margin here misaligns media in
75
59
  * flex/beside layouts, so keep it neutral. */
76
60
  margin: 0;
77
61
  }
62
+
63
+ }
@@ -1,28 +1,12 @@
1
- /* === Sequential Items: universal ordered item styling === */
2
-
3
- /* Numbered counter circle to the left of each item */
4
- [data-sequence="numbered"] {
5
- counter-reset: sequence;
6
- list-style: none;
7
- padding-left: 0;
8
- }
9
-
10
- [data-sequence="numbered"] > li {
11
- counter-increment: sequence;
12
- position: relative;
13
- padding-left: 2.25rem;
14
- }
15
-
1
+ @layer skin {
2
+ /* === Sequential Items — skin ===
3
+ * The connector lines (borders), the marker chrome (fill, radius, shadow), the
4
+ * counter type, and the layout gaps. The counter mechanism, list resets, item
5
+ * geometry, and marker box placement live in @refrakt-md/skeleton
6
+ * (dimensions/sequence.css). */
7
+
8
+ /* Numbered — counter circle chrome + type. */
16
9
  [data-sequence="numbered"] > li::before {
17
- content: counter(sequence);
18
- position: absolute;
19
- left: 0;
20
- top: 0.625rem;
21
- width: 1.5rem;
22
- height: 1.5rem;
23
- display: flex;
24
- align-items: center;
25
- justify-content: center;
26
10
  font-size: var(--rf-text-xs);
27
11
  font-weight: var(--rf-weight-bold);
28
12
  font-variant-numeric: tabular-nums;
@@ -35,95 +19,46 @@
35
19
  border-top: 1px solid var(--rf-color-border);
36
20
  }
37
21
 
38
- /* Connected vertical — line with dots */
39
- [data-sequence="connected"] {
40
- list-style: none;
41
- padding-left: 0;
42
- }
43
-
22
+ /* Connected vertical — the line is a left border; the dot is the marker. */
44
23
  [data-sequence="connected"] > li {
45
- position: relative;
46
- padding-left: 2rem;
47
- padding-bottom: 2rem;
48
24
  border-left: 2px solid var(--rf-color-border);
49
- margin-left: 0.375rem;
50
25
  }
51
26
 
52
27
  [data-sequence="connected"] > li:last-child {
53
28
  border-left-color: transparent;
54
- padding-bottom: 0;
55
29
  }
56
30
 
57
31
  [data-sequence="connected"] > li::before {
58
- content: '';
59
- position: absolute;
60
- left: -0.4375rem;
61
- top: 0.25rem;
62
- width: 0.75rem;
63
- height: 0.75rem;
64
32
  border-radius: 50%;
65
33
  background: var(--rf-color-primary);
66
34
  border: 2px solid var(--rf-color-bg);
67
35
  box-shadow: 0 0 0 2px var(--rf-color-primary);
68
36
  }
69
37
 
70
- /* Connected horizontal — line with dots */
38
+ /* Connected horizontal — the line moves to the top border; gap spaces the items. */
71
39
  [data-sequence="connected"][data-sequence-direction="horizontal"] {
72
- display: flex;
73
40
  gap: 2rem;
74
- overflow-x: auto;
75
41
  }
76
42
 
77
43
  [data-sequence="connected"][data-sequence-direction="horizontal"] > li {
78
- position: relative;
79
- min-width: 12rem;
80
- padding-top: 1.5rem;
81
- padding-left: 0;
82
- padding-bottom: 0;
83
44
  border-left: none;
84
45
  border-top: 2px solid var(--rf-color-border);
85
- margin-left: 0;
86
46
  }
87
47
 
88
48
  [data-sequence="connected"][data-sequence-direction="horizontal"] > li:last-child {
89
49
  border-top-color: var(--rf-color-border);
90
50
  }
91
51
 
92
- [data-sequence="connected"][data-sequence-direction="horizontal"] > li::before {
93
- left: 0.5rem;
94
- top: -0.4375rem;
95
- }
96
-
97
- /* Plain — no indicators, just ordered semantics */
98
- [data-sequence="plain"] {
99
- list-style: none;
100
- padding-left: 0;
101
- }
102
-
103
52
  /* === Density interaction === */
104
53
 
105
- /* Compact: smaller circles, tighter spacing */
106
- [data-density="compact"] [data-sequence="numbered"] > li {
107
- padding-left: 1.75rem;
108
- }
109
-
54
+ /* Compact: smaller circle keeps the same type scale. */
110
55
  [data-density="compact"] [data-sequence="numbered"] > li::before {
111
- width: 1.25rem;
112
- height: 1.25rem;
113
56
  font-size: var(--rf-text-xs);
114
57
  }
115
58
 
116
- [data-density="compact"] [data-sequence="connected"] > li {
117
- padding-bottom: 1rem;
118
- }
119
-
120
- /* Minimal: no indicators, collapsed list */
121
- [data-density="minimal"] [data-sequence] > li::before {
122
- display: none;
123
- }
124
-
59
+ /* Minimal: drop the connector line on the collapsed list. */
125
60
  [data-density="minimal"] [data-sequence="connected"] > li {
126
61
  border-left: none;
127
- padding-left: 0;
128
- margin-left: 0;
62
+ }
63
+
129
64
  }
@@ -1,57 +1,40 @@
1
- /* ─── Interactive State Dimension ───────────────────────────────────────
2
- * Generic styling for interactive rune states: open/closed, active/inactive,
3
- * selected, and disabled. Behaviours toggle data-state; themes read it here.
4
- * ────────────────────────────────────────────────────────────────────── */
5
-
6
- /* ─── Open/Closed: collapsible content ────────────────────────────── */
7
-
8
- [data-state="closed"] > [class*="__body"],
9
- [data-state="closed"] > [class*="__content"] {
10
- display: none;
11
- }
12
-
13
- [data-state="open"] > [class*="__body"],
14
- [data-state="open"] > [class*="__content"] {
15
- display: block;
16
- animation: rf-expand 0.2s ease-out;
17
- }
18
-
19
- @keyframes rf-expand {
20
- from { opacity: 0; transform: translateY(-0.5rem); }
21
- to { opacity: 1; transform: translateY(0); }
22
- }
23
-
24
- /* ─── Active/Inactive: selection indicators ───────────────────────── */
25
-
26
- button[data-state="active"] {
27
- border-bottom: 2px solid var(--rf-color-primary);
28
- color: var(--rf-color-primary);
29
- }
30
-
31
- button[data-state="inactive"] {
32
- border-bottom: 2px solid transparent;
33
- color: var(--rf-color-muted);
34
- }
35
-
36
- /* Panels controlled by tab/toggle state */
37
- [role="tabpanel"][data-state="inactive"] {
38
- display: none;
39
- }
40
-
41
- [role="tabpanel"][data-state="active"] {
42
- display: block;
43
- }
44
-
45
- /* ─── Selected: user selection highlight ──────────────────────────── */
46
-
47
- [data-state="selected"] {
48
- background: var(--rf-color-primary-bg);
49
- outline: 2px solid var(--rf-color-primary);
50
- }
51
-
52
- /* ─── Disabled: dimmed non-interactive ────────────────────────────── */
53
-
54
- [data-state="disabled"] {
55
- opacity: 0.4;
56
- pointer-events: none;
1
+ /* ─── Interactive State Dimension — skin ────────────────────────────────
2
+ * Aesthetic state treatments. The visibility/interaction mechanisms (collapse,
3
+ * panel switching, disabled pointer suppression) are structure and live in
4
+ * `@refrakt-md/skeleton` (styles/dimensions/state.css). Skin sits in @layer skin,
5
+ * ordered after skeleton, so these low-specificity rules win where they overlap. */
6
+
7
+ @layer skin {
8
+ /* Expand animation for opening collapsibles (decorative — the rune works
9
+ * without it; the skeleton supplies the display:block). */
10
+ [data-state="open"] > [class*="__body"],
11
+ [data-state="open"] > [class*="__content"] {
12
+ animation: rf-expand 0.2s ease-out;
13
+ }
14
+
15
+ @keyframes rf-expand {
16
+ from { opacity: 0; transform: translateY(-0.5rem); }
17
+ to { opacity: 1; transform: translateY(0); }
18
+ }
19
+
20
+ /* Active/inactive selection indicators */
21
+ button[data-state="active"] {
22
+ border-bottom: 2px solid var(--rf-color-primary);
23
+ color: var(--rf-color-primary);
24
+ }
25
+ button[data-state="inactive"] {
26
+ border-bottom: 2px solid transparent;
27
+ color: var(--rf-color-muted);
28
+ }
29
+
30
+ /* Selected highlight */
31
+ [data-state="selected"] {
32
+ background: var(--rf-color-primary-bg);
33
+ outline: 2px solid var(--rf-color-primary);
34
+ }
35
+
36
+ /* Disabled dim (the pointer-events:none is structure) */
37
+ [data-state="disabled"] {
38
+ opacity: 0.4;
39
+ }
57
40
  }
@@ -1,3 +1,4 @@
1
+ @layer skin {
1
2
  /* Substrate (SPEC-087) — generated surface pattern.
2
3
  *
3
4
  * The token-driven gradient recipes that realise each pattern ship here in the
@@ -106,3 +107,5 @@
106
107
  [data-color-scheme="light"] {
107
108
  --substrate-mode-boost: 1;
108
109
  }
110
+
111
+ }
@@ -1,7 +1,11 @@
1
- /* ─── Surface Assignments ──────────────────────────────────────────────
2
- * Groups runes into 4 surface types: card, inline, banner, inset.
3
- * Each surface defines container treatment (background, padding, radius).
4
- * Padding scales with density via --rune-padding custom property.
1
+ @layer skin {
2
+ /* ─── Surface Assignments (SPEC-107) ───────────────────────────────────
3
+ * Surface chrome is selected by the `data-elevation` depth-ladder axis, not by
4
+ * rune name. Each rung maps to a chrome bundle (fill / border / radius /
5
+ * padding / resting shadow); `data-prominence` maps the page-section-header
6
+ * family to a title type register. Per-rune defaults (`defaultElevation` /
7
+ * `defaultProminence`) live in each rune's config, so today's appearance is
8
+ * preserved while a theme can re-point any rune to a different rung.
5
9
  * ────────────────────────────────────────────────────────────────────── */
6
10
 
7
11
  /* Semantic surface/media aliases over the raw token scale (these reference
@@ -22,136 +26,92 @@
22
26
  so they sit flush with the surrounding header/footer container. */
23
27
 
24
28
  [data-rune]:not([data-rune] [data-rune]):not(:where([data-layout="menubar"], [data-layout="columns"])) {
25
- margin: 1.5rem 0;
29
+ margin: var(--rf-spacing-md) 0;
26
30
  }
27
31
 
28
- /* ─── Card: elevated container ────────────────────────────────────── */
29
-
30
- .rf-recipe,
31
- .rf-character,
32
- .rf-testimonial,
33
- .rf-event,
34
- .rf-realm,
35
- .rf-faction,
36
- .rf-lore,
37
- .rf-plot,
38
- .rf-bond,
39
- .rf-playlist,
40
- .rf-track,
41
- .rf-budget,
42
- .rf-organization,
43
- .rf-timeline,
44
- .rf-swatch,
45
- .rf-palette,
46
- .rf-typography,
47
- .rf-spacing,
48
- .rf-design-context,
49
- .rf-itinerary,
50
- .rf-symbol,
51
- .rf-changelog,
52
- .rf-api,
53
- .rf-howto,
54
- .rf-form {
32
+ /* ─── Elevation: depth-ladder chrome ──────────────────────────────────
33
+ * `flat` and the shadow rungs (`raised` / `floating` / `overlay`) carry a
34
+ * surface: fill, border, radius, and container padding. `sunken` adds the same
35
+ * chrome but recesses its fill below the page. `flush` has no surface boundary
36
+ * — it only reserves vertical rhythm. The shadow rungs layer a *resting*
37
+ * box-shadow on top of the flat chrome (kept distinct from `frame-shadow`'s
38
+ * per-guest drop-shadow, SPEC-107 §1). */
39
+
40
+ [data-elevation="flat"],
41
+ [data-elevation="sunken"],
42
+ [data-elevation="raised"],
43
+ [data-elevation="floating"],
44
+ [data-elevation="overlay"] {
55
45
  background: var(--rf-color-surface);
56
46
  border: 1px solid var(--rf-color-border);
57
47
  border-radius: var(--rf-radius-container);
58
48
  padding: var(--rune-padding, var(--rf-spacing-md));
59
49
  }
60
50
 
61
- /* ─── Inline: no visual boundary ──────────────────────────────────── */
62
-
63
- .rf-hint,
64
- .rf-details,
65
- .rf-sidenote,
66
- .rf-conversation,
67
- .rf-annotate,
68
- .rf-xref,
69
- .rf-pullquote,
70
- .rf-textblock,
71
- .rf-nav,
72
- .rf-breadcrumb,
73
- .rf-toc,
74
- .rf-datatable {
75
- padding: var(--rune-padding, var(--rf-spacing-sm)) 0;
51
+ /* Sunken the recessed "darker surface" (e.g. chart / diagram). Derived at
52
+ * use-site via relative-color (lower L, keep C+H) so it recomputes from a
53
+ * tinted `--rf-color-surface` automatically (a static inset-colour token would
54
+ * freeze to the untinted :root). Writes `background` only — never re-bases
55
+ * `--rf-color-surface` — so insets don't compound under nesting; depth is
56
+ * conveyed by border + the darker fill. `--rf-surface-inset-shift: 0` flushes
57
+ * it back to the surface colour. */
58
+ [data-elevation="sunken"] {
59
+ background: oklch(from var(--rf-color-surface) calc(l - var(--rf-surface-inset-shift)) c h);
76
60
  }
77
61
 
78
- /* ─── Banner: full-width strip ────────────────────────────────────── */
79
-
80
- .rf-hero,
81
- .rf-cta,
82
- .rf-feature,
83
- .rf-steps,
84
- .rf-bento,
85
- .rf-storyboard,
86
- .rf-map {
87
- padding: var(--rune-padding, var(--rf-spacing-xl)) 0;
62
+ /* Resting-shadow rungs depth above the flat surface. */
63
+ [data-elevation="raised"] {
64
+ box-shadow: var(--rf-shadow-sm);
88
65
  }
89
-
90
- /* ─── Inset: recessed container ───────────────────────────────────── */
91
-
92
- .rf-codegroup,
93
- .rf-mockup,
94
- .rf-diagram,
95
- .rf-chart,
96
- .rf-embed,
97
- .rf-gallery,
98
- .rf-figure,
99
- .rf-reveal {
100
- background: var(--rf-color-surface);
101
- border: 1px solid var(--rf-color-border);
102
- border-radius: var(--rf-radius-container);
103
- padding: var(--rune-padding, var(--rf-spacing-md));
66
+ [data-elevation="floating"] {
67
+ box-shadow: var(--rf-shadow-md);
104
68
  }
105
-
106
- /* ─── Media slot inherits the surface border ─────────────────────────
107
- * When a surface-bearing rune wraps a `[data-section="media"]` slot, the slot
108
- * shares the surface's 1px border so the framed media reads as part of the
109
- * same surface rather than a separate inner box. Scoped via `:where()` for
110
- * zero specificity — per-rune CSS can still override if a particular surface
111
- * wants a different chrome (e.g. character's circular portrait avoids this
112
- * because it's not a `[data-section="media"]` slot). */
113
- :where(.rf-card, .rf-bento-cell, .rf-recipe, .rf-realm, .rf-faction, .rf-playlist) [data-section="media"] {
114
- border: 1px solid var(--rf-color-border);
69
+ [data-elevation="overlay"] {
70
+ box-shadow: var(--rf-shadow-lg);
115
71
  }
116
72
 
117
- /* ─── Inset surface (SPEC-087) tint-tracking recessed fill ──────────
118
- * Derived at use-site via relative-color (lower L, keep C+H) so it recomputes from a tinted
119
- * `--rf-color-surface` automatically (a static inset-colour token would
120
- * freeze to the untinted :root). Writes `background` only — never re-bases
121
- * `--rf-color-surface` — so insets don't compound under nesting; depth is
122
- * conveyed by border/elevation. `--rf-surface-inset-shift: 0` flushes it. */
73
+ /* Flush no surface boundary; only vertical rhythm (density-aware via
74
+ * --rune-padding). Replaces the old inline/banner padding buckets; banner runes
75
+ * that want a more generous band declare their own `padding-block`. */
76
+ [data-elevation="flush"] {
77
+ padding-block: var(--rune-padding, var(--rf-spacing-sm));
78
+ }
123
79
 
124
- /* chart / diagram self surface: the standalone "darker surface". */
125
- .rf-chart,
126
- .rf-diagram {
127
- background: oklch(from var(--rf-color-surface) calc(l - var(--rf-surface-inset-shift)) c h);
80
+ /* ─── Prominence: page-section-header type register ───────────────────
81
+ * `data-prominence` re-points the section title size for page-section-header
82
+ * family runes (the engine only emits it where a header role exists). `normal`
83
+ * is the density default; the other steps layer on top, cascading down to
84
+ * [data-section="title"] via --rf-title-size — the same mechanism density uses,
85
+ * so a nested rune's own density/prominence re-declares it. */
86
+ [data-prominence="quiet"] {
87
+ --rf-title-size: var(--rf-text-xl);
88
+ }
89
+ [data-prominence="prominent"] {
90
+ --rf-title-size: var(--rf-text-3xl);
91
+ }
92
+ [data-prominence="display"] {
93
+ --rf-title-size: var(--rf-text-4xl);
128
94
  }
129
95
 
130
- /* …but when they're a media-zone guest the slot already provides the recessed
131
- * surface (border, radius, inset fill), so the inner chrome would just stack
132
- * as double-chrome. Drop it; keep padding so axis labels / SVG keep breathing
133
- * room. */
134
- [data-section="media"] > :is(.rf-chart, .rf-diagram) {
135
- background: transparent;
136
- border: 0;
96
+ /* ─── Media slot shares the surface chrome ───────────────────────────
97
+ * When a `flat` surface wraps a cover `[data-section="media"]` slot, the slot
98
+ * shares the surface's 1px border and a recessed well fill so the framed media
99
+ * reads as part of the same surface. Scoped via `:where()` for zero specificity
100
+ * so per-rune CSS can override. Floated-avatar portraits (`[data-media="portrait"]`,
101
+ * e.g. character / testimonial) opt out — they manage their own circular chrome.
102
+ * The hand-rolled `card` / `bento-cell` surfaces (which sit outside the
103
+ * elevation axis) carry the same media chrome from their own CSS files. */
104
+ :where([data-elevation="flat"]) [data-section="media"]:not([data-media="portrait"]) {
105
+ border: 1px solid var(--rf-color-border);
106
+ background: oklch(from var(--rf-color-surface) calc(l - var(--rf-surface-inset-shift)) c h);
137
107
  }
138
108
 
139
- /* Same treatment for `juxtapose` as a media guest its `__panels` container
140
- * has its own border + background + rounded corners (juxtapose stands alone
141
- * outside a card), but inside a card slot they double up with the slot's own
142
- * chrome. Drop the inner chrome; round to match the slot's media radius so the
143
- * comparison reads as part of the card surface. The slot's overflow:visible
144
- * and container-type:normal still come from `split.css` (juxtapose manages
145
- * its own clip inside `__panels`). */
146
- [data-section="media"] > .rf-juxtapose .rf-juxtapose__panels {
109
+ /* …but a sunken surface used as a media-zone guest already sits inside the
110
+ * slot's recessed well, so its own chrome would just double up. Drop it; keep
111
+ * padding so axis labels / SVG keep breathing room. */
112
+ [data-section="media"] > [data-elevation="sunken"] {
147
113
  background: transparent;
148
114
  border: 0;
149
- border-radius: var(--rf-radius-media);
150
115
  }
151
116
 
152
- /* Media wells of media-bearing runes: a recessed sub-surface that tracks the
153
- * (possibly tinted) container colour — invisible under a full-bleed guest,
154
- * visible in the gaps (transparent, displaced, or absent guest). */
155
- :is(.rf-card, .rf-bento-cell, .rf-recipe, .rf-realm, .rf-faction, .rf-playlist) [data-section="media"] {
156
- background: oklch(from var(--rf-color-surface) calc(l - var(--rf-surface-inset-shift)) c h);
157
117
  }
@@ -1,3 +1,4 @@
1
+ @layer skin {
1
2
  /* Blockquote */
2
3
  blockquote {
3
4
  position: relative;
@@ -5,8 +6,6 @@ blockquote {
5
6
  margin: 1.5rem 0;
6
7
  padding: 1rem 1.25rem 1rem 3.25rem;
7
8
  color: var(--rf-color-muted);
8
- background: var(--rf-color-surface);
9
- border-radius: 0 var(--rf-radius-md) var(--rf-radius-md) 0;
10
9
  }
11
10
  blockquote::before {
12
11
  content: '';
@@ -24,3 +23,5 @@ blockquote::before {
24
23
  blockquote p:last-child {
25
24
  margin-bottom: 0;
26
25
  }
26
+
27
+ }
@@ -1,3 +1,4 @@
1
+ @layer skin {
1
2
  /* Code block wrapper — the rf-codeblock div comes from the Markdoc fence node
2
3
  schema at build time. Inside codegroup the margin is removed by
3
4
  .rf-codegroup .rf-codeblock. */
@@ -114,3 +115,5 @@
114
115
  background: var(--rf-color-line-highlight);
115
116
  border-left-color: var(--rf-color-line-highlight-rail);
116
117
  }
118
+
119
+ }
@@ -1,3 +1,4 @@
1
+ @layer skin {
1
2
  /* Table wrapper */
2
3
  .rf-table-wrapper {
3
4
  overflow-x: auto;
@@ -34,3 +35,5 @@
34
35
  .rf-table-wrapper td code {
35
36
  font-size: 1em;
36
37
  }
38
+
39
+ }