@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,20 +1,9 @@
1
- /* Diff */
1
+ @layer skin {
2
+ /* Diff — skin. The scroll container, sticky header, split grid, rows grid, line
3
+ * flex + gutter sizing live in @refrakt-md/skeleton (styles/runes/diff.css). */
2
4
  .rf-diff {
3
5
  border: 1px solid var(--rf-color-border);
4
6
  border-radius: var(--rf-radius-lg);
5
- /* WORK-304 — horizontal scroll lives on `.rf-diff` itself, not on
6
- * `.rf-diff__split-container`. On mobile the split-container's
7
- * `min-width: 40rem` makes it wider than the viewport; previously
8
- * `.rf-diff { overflow: hidden }` clipped the right panel and the
9
- * touch scroll had nowhere to land. Moving the scroll affordance
10
- * up one level lets users swipe the entire diff sideways to
11
- * reveal the off-screen panel; the border-radius still clips the
12
- * children at the rounded corners because `overflow-x: auto` is
13
- * non-visible. `overflow-y: hidden` keeps the vertical clip for
14
- * the rounded top/bottom. */
15
- overflow-x: auto;
16
- overflow-y: hidden;
17
- overscroll-behavior-x: contain;
18
7
  font-size: var(--rf-text-sm);
19
8
  background: var(--rf-color-code-bg);
20
9
  }
@@ -26,19 +15,6 @@
26
15
  color: var(--rf-color-muted);
27
16
  background: var(--rf-color-surface);
28
17
  border-bottom: 1px solid var(--rf-color-border);
29
- /* `.rf-diff` is the horizontal scroll container (so mobile users
30
- * can swipe to reveal the off-screen split panel). Without
31
- * sticky, the header would scroll horizontally along with the
32
- * content and the filename label would slide off-screen.
33
- * `position: sticky; left: 0` pins the header to the visible left
34
- * edge of the scroll viewport at all scroll positions. WORK-304. */
35
- position: sticky;
36
- left: 0;
37
- }
38
- .rf-diff__split-container {
39
- display: grid;
40
- grid-template-columns: 1fr 1fr;
41
- min-width: 40rem;
42
18
  }
43
19
  .rf-diff__split-container .rf-diff__panel:first-child {
44
20
  border-right: 1px solid var(--rf-color-border);
@@ -49,53 +25,11 @@
49
25
  border: none;
50
26
  border-radius: 0;
51
27
  background: var(--rf-color-code-bg);
52
- overflow-x: auto;
53
- overscroll-behavior-x: contain;
54
28
  font-family: var(--rf-font-mono);
55
29
  font-size: var(--rf-text-sm);
56
30
  line-height: var(--rf-leading-relaxed);
57
31
  }
58
-
59
- /* WORK-304 — inner rows wrapper, sized as `display: grid; min-width:
60
- * max-content` so every `.rf-diff__line` (grid item) spans the
61
- * widest line's intrinsic width. The pre is the scroll container
62
- * (`overflow-x: auto`); this wrapper is what actually expands past
63
- * the pre's visible width when a line overflows, triggering the
64
- * pre's scroll and keeping the row tint (+/-/highlight) contiguous
65
- * across the full scroll region. Mirrors the
66
- * `pre code { display: grid; min-width: max-content }` pattern in
67
- * the standalone codeblock at `elements/code.css`. */
68
- .rf-diff__rows {
69
- display: grid;
70
- min-width: max-content;
71
- }
72
- /* WORK-304 — annotated line primitive. Three states share one row
73
- * shape (`add`, `remove`, `highlight`); only the tint token and the
74
- * gutter rail colour change. The same selector form is reused by the
75
- * standalone code block for `data-line-status="highlight"` via the
76
- * `.rf-codeblock` rules below.
77
- *
78
- * `display: block` + inline-block children (not `display: flex`) for
79
- * the line container so the line's intrinsic max-content is the
80
- * unambiguous sum of children's intrinsic widths — flex container
81
- * max-content was being clipped by the flex-basis / flex-grow /
82
- * flex-shrink combination depending on browser, leaving the row
83
- * tint cut off at the text width when the user scrolled
84
- * horizontally. `white-space: nowrap` keeps the inline-block
85
- * children on a single row (the children themselves preserve their
86
- * own `white-space: pre` for the code). `min-width: max-content`
87
- * keeps the line at least as wide as its content (full row tint
88
- * when content overflows the visible viewport); default width =
89
- * 100% of pre keeps it filling the visible width on short rows. */
90
32
  .rf-diff__line {
91
- /* `display: flex` for internal layout (gutters + content side
92
- * by side). The line's WIDTH is determined by the parent grid
93
- * track (`.rf-diff__code`'s `grid-template-columns:
94
- * minmax(100%, max-content)`), not by the flex sizing here —
95
- * so the row tint covers the full grid column regardless of
96
- * how flex sizing would have resolved. */
97
- display: flex;
98
- min-height: 1.6em;
99
33
  border-left: 3px solid transparent;
100
34
  }
101
35
  .rf-diff__line[data-line-status="equal"] { background: transparent; }
@@ -113,20 +47,13 @@
113
47
  }
114
48
  .rf-diff__line[data-line-status="empty"] { background: transparent; }
115
49
  .rf-diff__gutter-num {
116
- flex-shrink: 0;
117
50
  padding: 0 0.5rem;
118
- width: 2.5em;
119
- min-height: 1.6em;
120
51
  text-align: right;
121
52
  font-size: var(--rf-text-xs);
122
53
  font-variant-numeric: tabular-nums;
123
54
  user-select: none;
124
55
  color: var(--rf-color-muted);
125
56
  }
126
- /* Change-type colour drives the directional cue — no more +/- prefix.
127
- * Remove lines colour the before-number; add lines colour the after-number.
128
- * The opposite side renders empty (no number) which itself signals "nothing
129
- * here on this side". */
130
57
  .rf-diff__line[data-line-status="remove"] .rf-diff__gutter-num[data-side="before"] {
131
58
  color: var(--rf-color-danger);
132
59
  }
@@ -137,18 +64,8 @@
137
64
  margin: 0;
138
65
  }
139
66
  .rf-diff__line-content {
140
- /* `flex: 1 0 auto` so line-content contributes its
141
- * `white-space: pre` text width to the line's intrinsic
142
- * max-content (which the parent grid track reads from); grow:1
143
- * lets it fill any free space in the row beyond the gutters
144
- * when the grid track is wider than the line's natural size
145
- * (short content / wide visible viewport). WORK-304. */
146
- flex: 1 0 auto;
147
67
  white-space: pre;
148
68
  padding-right: 1rem;
149
- /* Pin the row to 1.6em even when the text is empty — the highlighted
150
- * span for an empty input has no inline content to establish a line
151
- * box, so without this the flex item collapses below the parent's
152
- * min-height and rows visually drift in the split-mode grid. */
153
- min-height: 1.6em;
69
+ }
70
+
154
71
  }
@@ -1,3 +1,4 @@
1
+ @layer skin {
1
2
  /* Drawer — addressable modal panel (SPEC-060).
2
3
  *
3
4
  * Two visual modes ride on the same `.rf-drawer` element:
@@ -19,9 +20,6 @@
19
20
  */
20
21
 
21
22
  .rf-drawer {
22
- --rf-drawer-size-sm: 22rem;
23
- --rf-drawer-size-md: 36rem;
24
- --rf-drawer-size-lg: 52rem;
25
23
  --rf-drawer-bg: var(--rf-color-surface);
26
24
  --rf-drawer-fg: var(--rf-color-text);
27
25
  --rf-drawer-border: var(--rf-color-border);
@@ -32,13 +30,6 @@
32
30
  --rf-drawer-anim-ease: cubic-bezier(0.32, 0.72, 0, 1);
33
31
  }
34
32
 
35
- /* ─── Body-scroll lock while any drawer is open ────────────────── */
36
-
37
- html.rf-drawer-open,
38
- html.rf-drawer-open body {
39
- overflow: hidden;
40
- }
41
-
42
33
  /* ─── No-JS / in-flow mode ─────────────────────────────────────── */
43
34
 
44
35
  section.rf-drawer {
@@ -52,9 +43,6 @@ section.rf-drawer {
52
43
  }
53
44
 
54
45
  section.rf-drawer .rf-drawer__header {
55
- display: flex;
56
- align-items: baseline;
57
- justify-content: space-between;
58
46
  gap: var(--rf-spacing-sm);
59
47
  margin-bottom: var(--rf-spacing-sm);
60
48
  }
@@ -73,7 +61,6 @@ section.rf-drawer .rf-drawer__body > :last-child { margin-bottom: 0; }
73
61
  /* In-flow footer — small text, top divider, mirrors the dialog-mode look so
74
62
  * authors get the same chrome whether JS is enhancing or not. */
75
63
  section.rf-drawer .rf-drawer__footer {
76
- display: block;
77
64
  margin-top: var(--rf-spacing-md);
78
65
  padding-top: var(--rf-spacing-sm);
79
66
  border-top: 1px solid var(--rf-drawer-border);
@@ -91,7 +78,6 @@ section.rf-drawer .rf-drawer__footer > :last-child { margin-bottom: 0; }
91
78
  * closed dialogs, so the closed dialog renders visibly as an empty box
92
79
  * positioned by the side `inset` rules. */
93
80
  dialog.rf-drawer {
94
- box-sizing: border-box;
95
81
  background: var(--rf-drawer-bg);
96
82
  color: var(--rf-drawer-fg);
97
83
  border: 1px solid var(--rf-drawer-border);
@@ -99,18 +85,6 @@ dialog.rf-drawer {
99
85
  box-shadow: var(--rf-drawer-shadow);
100
86
  padding: 0;
101
87
  margin: 0;
102
- overflow: hidden;
103
- max-width: calc(100vw - 2 * var(--rf-drawer-gutter));
104
- max-height: calc(100vh - 2 * var(--rf-drawer-gutter));
105
- }
106
-
107
- /* Flex column layout only when the dialog is actually open. The header
108
- * and footer pin via `flex: 0 0 auto`; the body scrolls via `flex: 1 1
109
- * auto; overflow-y: auto`. The dialog's `max-height` cap on the dialog
110
- * provides the scroll context. */
111
- dialog.rf-drawer[open] {
112
- display: flex;
113
- flex-direction: column;
114
88
  }
115
89
 
116
90
  dialog.rf-drawer::backdrop {
@@ -119,10 +93,6 @@ dialog.rf-drawer::backdrop {
119
93
  }
120
94
 
121
95
  dialog.rf-drawer .rf-drawer__header {
122
- flex: 0 0 auto;
123
- display: flex;
124
- align-items: center;
125
- justify-content: space-between;
126
96
  gap: var(--rf-spacing-md);
127
97
  /* Reset the generous `[data-section="header"]` bottom margin (3rem) — the
128
98
  * dialog chrome spaces the header from the body via the body's own
@@ -148,7 +118,6 @@ dialog.rf-drawer .rf-drawer__close {
148
118
  font-size: var(--rf-text-xl);
149
119
  line-height: 1;
150
120
  border-radius: var(--rf-radius-sm);
151
- flex-shrink: 0;
152
121
  }
153
122
  dialog.rf-drawer .rf-drawer__close:hover {
154
123
  color: var(--rf-color-text);
@@ -156,17 +125,13 @@ dialog.rf-drawer .rf-drawer__close:hover {
156
125
  }
157
126
 
158
127
  dialog.rf-drawer .rf-drawer__body {
159
- flex: 1 1 auto;
160
- overflow-y: auto;
161
128
  padding: var(--rf-spacing-md) var(--rf-spacing-lg);
162
- min-height: 0;
163
129
  }
164
130
 
165
131
  /* Dialog footer — small text, top divider, pinned at bottom via flex.
166
132
  * Stays visible regardless of body scroll depth so links like "View
167
133
  * source on GitHub →" (the SPEC-078 use case) are always one tap away. */
168
134
  dialog.rf-drawer .rf-drawer__footer {
169
- flex: 0 0 auto;
170
135
  padding: var(--rf-spacing-sm) var(--rf-spacing-lg);
171
136
  border-top: 1px solid var(--rf-drawer-border);
172
137
  background: var(--rf-drawer-bg);
@@ -191,67 +156,24 @@ dialog.rf-drawer .rf-drawer__body > :last-child,
191
156
  dialog.rf-drawer .rf-drawer__body > :last-child > :last-child {
192
157
  margin-bottom: 0;
193
158
  }
194
-
195
- /* ─── Side modifiers ───────────────────────────────────────────────
196
- *
197
- * Each side anchors the dialog with `inset`. The slide-in animation is
198
- * a keyframes animation triggered by `[open]` — picked over
199
- * `@starting-style` because keyframes have broader browser support
200
- * (everywhere `<dialog>` works) and a clearer source-of-truth: the
201
- * starting/ending frames are spelled out, no cascade-interaction
202
- * footguns. The matching backdrop fade is a separate animation.
203
- */
204
-
205
- dialog.rf-drawer[data-side="right"] {
206
- inset:
207
- var(--rf-drawer-gutter)
208
- var(--rf-drawer-gutter)
209
- var(--rf-drawer-gutter)
210
- auto;
211
- height: auto;
212
- }
213
159
  dialog.rf-drawer[data-side="right"][open]:not([data-state="closing"]) {
214
160
  animation: rf-drawer-slide-in-right var(--rf-drawer-anim-duration) var(--rf-drawer-anim-ease);
215
161
  }
216
162
  dialog.rf-drawer[data-side="right"][data-state="closing"] {
217
163
  animation: rf-drawer-slide-out-right var(--rf-drawer-anim-duration) var(--rf-drawer-anim-ease) forwards;
218
164
  }
219
- dialog.rf-drawer[data-side="left"] {
220
- inset:
221
- var(--rf-drawer-gutter)
222
- auto
223
- var(--rf-drawer-gutter)
224
- var(--rf-drawer-gutter);
225
- height: auto;
226
- }
227
165
  dialog.rf-drawer[data-side="left"][open]:not([data-state="closing"]) {
228
166
  animation: rf-drawer-slide-in-left var(--rf-drawer-anim-duration) var(--rf-drawer-anim-ease);
229
167
  }
230
168
  dialog.rf-drawer[data-side="left"][data-state="closing"] {
231
169
  animation: rf-drawer-slide-out-left var(--rf-drawer-anim-duration) var(--rf-drawer-anim-ease) forwards;
232
170
  }
233
- dialog.rf-drawer[data-side="top"] {
234
- inset:
235
- var(--rf-drawer-gutter)
236
- var(--rf-drawer-gutter)
237
- auto
238
- var(--rf-drawer-gutter);
239
- width: auto;
240
- }
241
171
  dialog.rf-drawer[data-side="top"][open]:not([data-state="closing"]) {
242
172
  animation: rf-drawer-slide-in-top var(--rf-drawer-anim-duration) var(--rf-drawer-anim-ease);
243
173
  }
244
174
  dialog.rf-drawer[data-side="top"][data-state="closing"] {
245
175
  animation: rf-drawer-slide-out-top var(--rf-drawer-anim-duration) var(--rf-drawer-anim-ease) forwards;
246
176
  }
247
- dialog.rf-drawer[data-side="bottom"] {
248
- inset:
249
- auto
250
- var(--rf-drawer-gutter)
251
- var(--rf-drawer-gutter)
252
- var(--rf-drawer-gutter);
253
- width: auto;
254
- }
255
177
  dialog.rf-drawer[data-side="bottom"][open]:not([data-state="closing"]) {
256
178
  animation: rf-drawer-slide-in-bottom var(--rf-drawer-anim-duration) var(--rf-drawer-anim-ease);
257
179
  }
@@ -336,30 +258,4 @@ dialog.rf-drawer[data-state="closing"]::backdrop {
336
258
  }
337
259
  }
338
260
 
339
- /* ─── Size modifiers (only meaningful in dialog mode) ─────────── */
340
-
341
- dialog.rf-drawer[data-side="right"][data-size="sm"],
342
- dialog.rf-drawer[data-side="left"][data-size="sm"] {
343
- width: var(--rf-drawer-size-sm);
344
- }
345
- dialog.rf-drawer[data-side="right"][data-size="md"],
346
- dialog.rf-drawer[data-side="left"][data-size="md"] {
347
- width: var(--rf-drawer-size-md);
348
- }
349
- dialog.rf-drawer[data-side="right"][data-size="lg"],
350
- dialog.rf-drawer[data-side="left"][data-size="lg"] {
351
- width: var(--rf-drawer-size-lg);
352
- }
353
-
354
- dialog.rf-drawer[data-side="top"][data-size="sm"],
355
- dialog.rf-drawer[data-side="bottom"][data-size="sm"] {
356
- height: var(--rf-drawer-size-sm);
357
- }
358
- dialog.rf-drawer[data-side="top"][data-size="md"],
359
- dialog.rf-drawer[data-side="bottom"][data-size="md"] {
360
- height: var(--rf-drawer-size-md);
361
- }
362
- dialog.rf-drawer[data-side="top"][data-size="lg"],
363
- dialog.rf-drawer[data-side="bottom"][data-size="lg"] {
364
- height: var(--rf-drawer-size-lg);
365
261
  }
@@ -1,22 +1,15 @@
1
- /* Embed */
1
+ @layer skin {
2
+ /* Embed — skin. The responsive iframe wrapper + empty-fallback hide live in
3
+ * @refrakt-md/skeleton (styles/runes/embed.css). */
2
4
  .rf-embed {
3
5
  margin: 0;
4
6
  padding: 0;
5
7
  }
6
8
  .rf-embed__wrapper {
7
- position: relative;
8
- width: 100%;
9
- height: 0;
10
- overflow: hidden;
11
9
  border-radius: var(--rf-radius-md);
12
10
  background: var(--rf-color-surface);
13
11
  }
14
12
  .rf-embed__wrapper iframe {
15
- position: absolute;
16
- top: 0;
17
- left: 0;
18
- width: 100%;
19
- height: 100%;
20
13
  border: none;
21
14
  }
22
15
  .rf-embed__fallback {
@@ -27,6 +20,5 @@
27
20
  .rf-embed__fallback p:last-child {
28
21
  margin-bottom: 0;
29
22
  }
30
- .rf-embed__fallback:empty {
31
- display: none;
23
+
32
24
  }
@@ -1,3 +1,4 @@
1
+ @layer skin {
1
2
  /* Event */
2
3
 
3
4
  /* When/where def-list — geometry from the shared `[data-zone-layout=
@@ -11,7 +12,6 @@
11
12
  margin-top: 1.5rem;
12
13
  }
13
14
  .rf-event__register a {
14
- display: inline-block;
15
15
  padding: 0.5rem 1rem;
16
16
  background: var(--rf-color-primary);
17
17
  color: var(--rf-color-on-primary);
@@ -37,3 +37,5 @@
37
37
  .rf-event__body a:hover {
38
38
  color: var(--rf-color-primary-hover);
39
39
  }
40
+
41
+ }
@@ -1,53 +1,21 @@
1
- /* Expand — inline-substitution of a registered entity (SPEC-066).
2
- *
3
- * The wrapper is intentionally minimal — the embedded rune (plan rune,
4
- * character rune, etc.) renders itself standalone-style; expand just
5
- * provides the wrapper + canonical-link affordance. Themes that want
6
- * the embedded content visually distinguished from inline-authored
7
- * content target `.rf-expand .rf-spec`, `.rf-expand h1`, etc.
8
- *
9
- * Two visual treatments:
10
- *
11
- * 1. **Default (`level=` unset, peer-document mode)** — the embed reads
12
- * like a quoted document. A subtle border + indent treatment marks
13
- * it as set-aside material. Heading scale is dialed down slightly
14
- * so an H1 inside the embed doesn't compete with the host's H1.
15
- * 2. **Sub-section mode (`level=` set)** — the embed merges into the
16
- * host outline. The wrapper sheds the quoted treatment so it reads
17
- * as authored sub-content. Authors opt into this by setting
18
- * `level=`; CSS targets `.rf-expand:not([data-outline-scope])` to
19
- * pick the right treatment automatically.
20
- */
21
-
1
+ @layer skin {
2
+ /* Expand — skin. The inline-block canonical-link box lives in @refrakt-md/skeleton
3
+ * (styles/runes/expand.css). */
22
4
  .rf-expand {
23
5
  margin: var(--rf-spacing-md) 0;
24
6
  }
25
-
26
- /* Peer-document mode — no background, no rounded corners, no rules.
27
- * Reads as "set-aside material" through spacing alone, without competing
28
- * visually with the host content. Authors who want a stronger treatment
29
- * (rules, background, etc.) can override `.rf-expand[data-outline-scope]`
30
- * in their theme. */
31
7
  .rf-expand[data-outline-scope] {
32
8
  padding: var(--rf-spacing-md) 0;
33
9
  }
34
-
35
- /* Tone down embedded headings so the host outline keeps visual primacy.
36
- * The semantic levels are preserved (H1 stays H1 etc.); only the visual
37
- * scale is adjusted in the peer-document treatment. Authors using
38
- * `level=` for sub-section mode get the normal heading scale. */
39
10
  .rf-expand[data-outline-scope] :is(h1, h2, h3, h4, h5, h6):first-child {
40
11
  margin-top: 0;
41
12
  }
42
13
  .rf-expand[data-outline-scope] h1 { font-size: var(--rf-text-2xl); }
43
14
  .rf-expand[data-outline-scope] h2 { font-size: var(--rf-text-xl); }
44
15
  .rf-expand[data-outline-scope] h3 { font-size: var(--rf-text-lg); }
45
-
46
16
  .rf-expand > :first-child { margin-top: 0; }
47
17
  .rf-expand > :last-child { margin-bottom: 0; }
48
-
49
18
  .rf-expand__canonical-link {
50
- display: inline-block;
51
19
  margin-top: var(--rf-spacing-sm);
52
20
  font-size: var(--rf-text-sm);
53
21
  color: var(--rf-color-primary);
@@ -56,11 +24,6 @@
56
24
  .rf-expand__canonical-link:hover {
57
25
  text-decoration: underline;
58
26
  }
59
-
60
- /* Error-state placeholder rendered when resolution fails. The build
61
- * also surfaces the error through `ctx.error`; this is the user-facing
62
- * affordance so the failure isn't silent. Keyed off `[data-expand-error]`
63
- * which the resolver sets on the error wrapper. */
64
27
  .rf-expand[data-expand-error] {
65
28
  padding: var(--rf-spacing-sm) var(--rf-spacing-md);
66
29
  border-left: 3px solid var(--rf-color-danger);
@@ -70,3 +33,5 @@
70
33
  font-size: var(--rf-text-sm);
71
34
  border-radius: 0 var(--rf-radius-sm) var(--rf-radius-sm) 0;
72
35
  }
36
+
37
+ }
@@ -1,3 +1,4 @@
1
+ @layer skin {
1
2
  /* Faction — split/stacked geometry, the title, and the metadata def-list all
2
3
  * come from the shared layers: layouts/split.css ([data-layout] +
3
4
  * [data-section="media"]), dimensions/sections.css ([data-section="title"] /
@@ -28,12 +29,6 @@
28
29
  row-gap: var(--rf-faction-media-gap);
29
30
  }
30
31
 
31
- /* Stacked layouts — beside layouts handled by shared split.css */
32
- .rf-faction[data-media-position="top"] {
33
- display: flex;
34
- flex-direction: column;
35
- }
36
-
37
32
  .rf-faction[data-media-position="top"] > .rf-faction__scene {
38
33
  margin-bottom: var(--rf-faction-media-gap);
39
34
  }
@@ -43,8 +38,6 @@
43
38
 
44
39
  /* Content */
45
40
  .rf-faction__sections {
46
- display: flex;
47
- flex-direction: column;
48
41
  gap: 1rem;
49
42
  }
50
43
  .rf-faction__content ul,
@@ -58,7 +51,6 @@
58
51
  border-top: 1px solid var(--rf-color-border);
59
52
  }
60
53
  .rf-faction-section__name {
61
- display: block;
62
54
  font-size: var(--rf-text-xl);
63
55
  font-weight: var(--rf-weight-bold);
64
56
  line-height: var(--rf-leading-snug);
@@ -69,3 +61,5 @@
69
61
  .rf-faction-section__body ol {
70
62
  padding-left: 1.5rem;
71
63
  }
64
+
65
+ }
@@ -1,10 +1,10 @@
1
- /* Feature */
1
+ @layer skin {
2
+ /* Feature — skin. The preamble/eyebrow/content/definitions-grid/icon layout and
3
+ * the media-position flip live in @refrakt-md/skeleton (styles/runes/feature.css). */
2
4
  .rf-feature {
3
5
  padding: 2.5rem 0 2rem;
4
6
  }
5
7
  .rf-feature__preamble {
6
- flex-direction: column;
7
- align-items: flex-start;
8
8
  gap: 0.25rem;
9
9
  margin-bottom: 1.5rem;
10
10
  }
@@ -17,8 +17,6 @@
17
17
  margin: 0 0 0.5rem;
18
18
  }
19
19
  .rf-feature__eyebrow:has(a) {
20
- display: inline-block;
21
- position: relative;
22
20
  padding: 0.25rem 0.875rem;
23
21
  border: 1px solid var(--rf-color-border);
24
22
  border-radius: var(--rf-radius-full);
@@ -30,7 +28,7 @@
30
28
  }
31
29
  .rf-feature__eyebrow:has(a):hover { border-color: var(--rf-color-muted); }
32
30
  .rf-feature__eyebrow:has(a) a { color: var(--rf-color-primary); font-weight: var(--rf-weight-semibold); text-decoration: none; }
33
- .rf-feature__eyebrow:has(a) a::before { content: ''; position: absolute; inset: 0; border-radius: inherit; }
31
+ .rf-feature__eyebrow:has(a) a::before { border-radius: inherit; }
34
32
  .rf-feature__headline {
35
33
  margin-top: 0;
36
34
  }
@@ -42,9 +40,6 @@
42
40
  .rf-feature__image {
43
41
  margin-bottom: 1rem;
44
42
  }
45
- .rf-feature__content {
46
- display: contents;
47
- }
48
43
  .rf-feature h2 {
49
44
  margin-bottom: 2rem;
50
45
  }
@@ -63,20 +58,13 @@
63
58
  /* Definitions stack in a single column by default; the `--definitions-grid`
64
59
  * modifier (SPEC-091 media-position variant: top/bottom) tiles them as a grid. */
65
60
  .rf-feature__definitions {
66
- display: block;
67
61
  margin: 0;
68
62
  }
69
63
  .rf-feature--definitions-grid .rf-feature__definitions {
70
- display: grid;
71
- grid-template-columns: repeat(auto-fit, minmax(max(240px, calc((100% - 3rem) / 3)), 1fr));
72
64
  gap: 1.5rem;
73
65
  }
74
66
  /* Beside layouts (media on start/end): definitions stay stacked (no grid
75
67
  * modifier) inside the content track. */
76
- .rf-feature[data-media-position="start"] .rf-feature__content,
77
- .rf-feature[data-media-position="end"] .rf-feature__content {
78
- display: block;
79
- }
80
68
  .rf-feature[data-media-position="start"] .rf-feature__preamble,
81
69
  .rf-feature[data-media-position="end"] .rf-feature__preamble,
82
70
  .rf-feature[data-media-position="start"] h2,
@@ -103,13 +91,7 @@
103
91
  letter-spacing: var(--rf-tracking-tight);
104
92
  color: var(--rf-color-text);
105
93
  }
106
- .rf-feature__feature-item dt:has(> .rf-icon) {
107
- display: flex;
108
- flex-direction: column;
109
- }
110
94
  .rf-feature__feature-item dt > .rf-icon {
111
- width: 1.5rem;
112
- height: 1.5rem;
113
95
  margin-bottom: 0.5rem;
114
96
  color: var(--rf-color-primary);
115
97
  }
@@ -133,14 +115,4 @@
133
115
  padding: 0;
134
116
  }
135
117
 
136
- /* BUG-001 — content-first DOM inverts the shared media-first stacked contract
137
- * (layouts/split.css): counter it so the labels are truthful. `bottom` (the
138
- * default) is plain block flow — media after the content, the historical
139
- * look; an explicit `top` flips the visual order without touching the DOM. */
140
- .rf-feature[data-media-position="bottom"] {
141
- display: block;
142
- }
143
- .rf-feature[data-media-position="top"] {
144
- display: flex;
145
- flex-direction: column-reverse;
146
118
  }
@@ -1,23 +1,9 @@
1
- /* Figure */
1
+ @layer skin {
2
+ /* Figure — skin. The image box, frame-aspect fill, size max-widths, and alignment
3
+ * auto-margins live in @refrakt-md/skeleton (styles/runes/figure.css). */
2
4
  .rf-figure :is(img, .rf-placeholder) {
3
- display: block;
4
- max-width: 100%;
5
- height: auto;
6
- margin-inline: auto;
7
5
  border-radius: var(--rf-radius-media);
8
6
  }
9
-
10
- /* When `frame-aspect` sets an explicit surface shape, the image fills the
11
- * shape rather than sitting at its natural size with whitespace on the
12
- * inline-end. `object-fit: cover` crops only if the natural aspect doesn't
13
- * match — and `frame-anchor` already picks the focal point of that crop
14
- * (the same contract as a card's media slot). */
15
- .rf-figure[style*="--frame-aspect"] :is(img, .rf-placeholder) {
16
- width: 100%;
17
- height: 100%;
18
- object-fit: cover;
19
- margin: 0;
20
- }
21
7
  .rf-figure figcaption {
22
8
  margin-top: 0.625rem;
23
9
  font-size: var(--rf-text-sm);
@@ -25,10 +11,5 @@
25
11
  text-align: center;
26
12
  font-style: italic;
27
13
  }
28
- .rf-figure--small { max-width: 320px; }
29
- .rf-figure--medium { max-width: 640px; }
30
- .rf-figure--large { max-width: 960px; }
31
- .rf-figure--full { max-width: 100%; }
32
- .rf-figure--left { margin-right: auto; }
33
- .rf-figure--center { margin-left: auto; margin-right: auto; }
34
- .rf-figure--right { margin-left: auto; }
14
+
15
+ }
@@ -1,21 +1,4 @@
1
- /* file-ref — path-based inline reference to a project file (SPEC-078).
2
- *
3
- * Renders as `<span class="rf-file-ref"><a>label</a></span>` in prose
4
- * (plus an invisible hoist sentinel `<meta>` when preview="drawer").
5
- * The span carries the data-rune class; the inner `<a>` is the click
6
- * target with its own visual treatment.
7
- *
8
- * Without preview, the link points at the canonical GitHub URL — give
9
- * it a small external-link affordance so readers know they're about to
10
- * leave the page. With preview, it points at the hoisted drawer's
11
- * fragment id; visually the same inline-link affordance — what makes
12
- * it a "preview link" rather than a "navigate-away link" is the drawer
13
- * that opens on click, not extra inline chrome.
14
- */
15
-
16
- .rf-file-ref {
17
- display: inline;
18
- }
1
+ @layer skin {
19
2
 
20
3
  .rf-file-ref > a {
21
4
  color: var(--rf-color-primary);
@@ -29,3 +12,5 @@
29
12
  .rf-file-ref > a:hover {
30
13
  text-decoration-thickness: 2px;
31
14
  }
15
+
16
+ }