@refrakt-md/lumina 0.22.0 → 0.24.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 (132) hide show
  1. package/base.css +7 -1
  2. package/contracts/structures.json +537 -0
  3. package/dist/config.d.ts.map +1 -1
  4. package/dist/config.js +7 -0
  5. package/dist/config.js.map +1 -1
  6. package/dist/tokens.d.ts.map +1 -1
  7. package/dist/tokens.js +13 -0
  8. package/dist/tokens.js.map +1 -1
  9. package/index.css +11 -1
  10. package/package.json +5 -4
  11. package/styles/base/attributes.css +6 -7
  12. package/styles/dimensions/checklist.css +6 -35
  13. package/styles/dimensions/cover.css +13 -95
  14. package/styles/dimensions/density.css +3 -0
  15. package/styles/dimensions/frame.css +3 -0
  16. package/styles/dimensions/media.css +14 -61
  17. package/styles/dimensions/metadata.css +24 -74
  18. package/styles/dimensions/motion.css +102 -0
  19. package/styles/dimensions/sections.css +10 -24
  20. package/styles/dimensions/sequence.css +14 -79
  21. package/styles/dimensions/state.css +39 -56
  22. package/styles/dimensions/substrate.css +3 -0
  23. package/styles/dimensions/surfaces.css +73 -113
  24. package/styles/elements/blockquote.css +3 -2
  25. package/styles/elements/code.css +3 -0
  26. package/styles/elements/table.css +3 -0
  27. package/styles/global.css +9 -48
  28. package/styles/layouts/blog.css +3 -64
  29. package/styles/layouts/default.css +3 -77
  30. package/styles/layouts/docs.css +3 -153
  31. package/styles/layouts/mobile.css +1 -50
  32. package/styles/layouts/on-this-page.css +3 -2
  33. package/styles/layouts/plan.css +3 -134
  34. package/styles/layouts/search.css +3 -68
  35. package/styles/layouts/split.css +24 -169
  36. package/styles/layouts/theme-toggle.css +3 -29
  37. package/styles/layouts/version-switcher.css +3 -4
  38. package/styles/runes/accordion.css +15 -58
  39. package/styles/runes/aggregate.css +3 -12
  40. package/styles/runes/annotate.css +6 -35
  41. package/styles/runes/api.css +3 -0
  42. package/styles/runes/audio.css +3 -41
  43. package/styles/runes/badge.css +3 -0
  44. package/styles/runes/bar.css +3 -0
  45. package/styles/runes/bento.css +16 -159
  46. package/styles/runes/bg.css +3 -37
  47. package/styles/runes/blog.css +3 -5
  48. package/styles/runes/bond.css +3 -23
  49. package/styles/runes/breadcrumb.css +5 -13
  50. package/styles/runes/budget.css +3 -25
  51. package/styles/runes/bug.css +3 -0
  52. package/styles/runes/card.css +24 -92
  53. package/styles/runes/cast.css +5 -22
  54. package/styles/runes/changelog.css +5 -9
  55. package/styles/runes/character.css +3 -17
  56. package/styles/runes/chart.css +35 -53
  57. package/styles/runes/codegroup.css +15 -23
  58. package/styles/runes/collection.css +5 -82
  59. package/styles/runes/compare.css +3 -14
  60. package/styles/runes/comparison.css +7 -34
  61. package/styles/runes/conversation.css +5 -27
  62. package/styles/runes/cta.css +3 -26
  63. package/styles/runes/datatable.css +25 -40
  64. package/styles/runes/decision.css +3 -0
  65. package/styles/runes/design-context.css +3 -2
  66. package/styles/runes/details.css +5 -13
  67. package/styles/runes/diagram.css +5 -13
  68. package/styles/runes/diff.css +5 -88
  69. package/styles/runes/drawer.css +1 -105
  70. package/styles/runes/embed.css +4 -12
  71. package/styles/runes/event.css +3 -1
  72. package/styles/runes/expand.css +5 -40
  73. package/styles/runes/faction.css +3 -9
  74. package/styles/runes/feature.css +4 -32
  75. package/styles/runes/figure.css +5 -24
  76. package/styles/runes/file-ref.css +3 -18
  77. package/styles/runes/form.css +3 -32
  78. package/styles/runes/gallery.css +3 -135
  79. package/styles/runes/grid.css +4 -56
  80. package/styles/runes/hero.css +13 -126
  81. package/styles/runes/hint.css +16 -41
  82. package/styles/runes/howto.css +3 -25
  83. package/styles/runes/itinerary.css +3 -32
  84. package/styles/runes/juxtapose.css +12 -87
  85. package/styles/runes/lore.css +3 -10
  86. package/styles/runes/map.css +3 -36
  87. package/styles/runes/mediatext.css +3 -44
  88. package/styles/runes/milestone.css +3 -16
  89. package/styles/runes/mockup.css +15 -108
  90. package/styles/runes/nav.css +3 -178
  91. package/styles/runes/organization.css +3 -2
  92. package/styles/runes/page-section.css +3 -4
  93. package/styles/runes/pagination.css +5 -37
  94. package/styles/runes/palette.css +3 -22
  95. package/styles/runes/placeholder.css +3 -3
  96. package/styles/runes/plan-history.css +3 -23
  97. package/styles/runes/plan-progress.css +3 -4
  98. package/styles/runes/plan-ref.css +3 -0
  99. package/styles/runes/playlist.css +2 -36
  100. package/styles/runes/plot.css +3 -19
  101. package/styles/runes/preview.css +7 -25
  102. package/styles/runes/pricing.css +7 -25
  103. package/styles/runes/progress.css +6 -25
  104. package/styles/runes/pullquote.css +3 -26
  105. package/styles/runes/realm.css +3 -9
  106. package/styles/runes/recipe.css +3 -27
  107. package/styles/runes/relationships.css +3 -34
  108. package/styles/runes/reveal.css +7 -12
  109. package/styles/runes/sandbox.css +6 -36
  110. package/styles/runes/section.css +4 -18
  111. package/styles/runes/showcase.css +3 -20
  112. package/styles/runes/sidenote.css +3 -2
  113. package/styles/runes/snippet.css +3 -0
  114. package/styles/runes/spacing.css +3 -22
  115. package/styles/runes/spec.css +3 -0
  116. package/styles/runes/steps.css +4 -36
  117. package/styles/runes/storyboard.css +2 -17
  118. package/styles/runes/swatch.css +3 -6
  119. package/styles/runes/symbol.css +6 -4
  120. package/styles/runes/tabs.css +6 -9
  121. package/styles/runes/testimonial.css +5 -6
  122. package/styles/runes/textblock.css +2 -20
  123. package/styles/runes/timeline.css +3 -21
  124. package/styles/runes/tint.css +3 -0
  125. package/styles/runes/toc.css +5 -3
  126. package/styles/runes/track.css +2 -31
  127. package/styles/runes/typography.css +3 -15
  128. package/styles/runes/work.css +3 -0
  129. package/styles/runes/xref.css +3 -1
  130. package/tokens/base.css +19 -0
  131. package/tokens/dark.css +3 -0
  132. package/styles/dimensions/guest-posture.css +0 -27
@@ -1,38 +1,16 @@
1
+ @layer skin {
1
2
  /* Form */
2
3
  .rf-form {
3
- display: flex;
4
- flex-direction: column;
5
4
  gap: 1.25rem;
6
5
  max-width: none;
7
6
  }
8
7
  .rf-form__body {
9
- display: flex;
10
- flex-direction: column;
11
8
  gap: 1.25rem;
12
9
  }
13
- .rf-form meta { display: none; }
14
- /* Honeypot */
15
- .rf-form__hp {
16
- position: absolute;
17
- left: -9999px;
18
- opacity: 0;
19
- height: 0;
20
- overflow: hidden;
21
- }
22
10
  /* Inline variant */
23
11
  .rf-form--inline .rf-form__body {
24
- flex-direction: row;
25
- flex-wrap: wrap;
26
- align-items: flex-end;
27
12
  gap: 0.75rem;
28
13
  }
29
- .rf-form--inline .rf-form-field {
30
- flex: 1;
31
- min-width: 10rem;
32
- }
33
- .rf-form--inline .rf-form__submit {
34
- align-self: flex-end;
35
- }
36
14
  /* Compact variant */
37
15
  .rf-form--compact {
38
16
  gap: 0.75rem;
@@ -49,8 +27,6 @@
49
27
  }
50
28
  /* Field */
51
29
  .rf-form-field {
52
- display: flex;
53
- flex-direction: column;
54
30
  gap: 0.375rem;
55
31
  }
56
32
  .rf-form-field label {
@@ -73,8 +49,6 @@
73
49
  color: var(--rf-color-text);
74
50
  background: var(--rf-color-bg);
75
51
  transition: border-color 0.15s, box-shadow 0.15s;
76
- width: 100%;
77
- box-sizing: border-box;
78
52
  }
79
53
  .rf-form-field input:focus,
80
54
  .rf-form-field textarea:focus,
@@ -85,7 +59,6 @@
85
59
  }
86
60
  .rf-form-field textarea {
87
61
  resize: vertical;
88
- min-height: 6rem;
89
62
  }
90
63
  /* Fieldset */
91
64
  .rf-form-fieldset {
@@ -113,15 +86,12 @@
113
86
  margin-bottom: 0.5rem;
114
87
  }
115
88
  .rf-form-choice {
116
- display: flex;
117
- align-items: center;
118
89
  gap: 0.5rem;
119
90
  padding: 0.375rem 0;
120
91
  cursor: pointer;
121
92
  font-size: var(--rf-text);
122
93
  }
123
94
  .rf-form-choice input {
124
- width: auto;
125
95
  margin: 0;
126
96
  accent-color: var(--rf-color-primary);
127
97
  }
@@ -136,7 +106,6 @@
136
106
  font-weight: var(--rf-weight-semibold);
137
107
  cursor: pointer;
138
108
  transition: background 0.15s;
139
- align-self: flex-start;
140
109
  }
141
110
  .rf-form__submit:hover {
142
111
  background: color-mix(in srgb, var(--rf-color-primary) 85%, black);
@@ -183,3 +152,5 @@
183
152
  color: var(--rf-color-danger);
184
153
  border: 1px solid color-mix(in srgb, var(--rf-color-danger) 25%, transparent);
185
154
  }
155
+
156
+ }
@@ -1,57 +1,25 @@
1
- /* Gallery — Multi-image container with grid/carousel/masonry layout.
2
- *
3
- * Thin-edge tile mosaic: a gallery is media all the way down (every child is an
4
- * image), so the outer padding is treated as a frame margin and locked to the
5
- * same value as the inter-item gap — outer = inter = a single visual rhythm.
6
- * Both are theme tokens (`--rf-gallery-edge` / `--rf-gallery-gap`), not author
7
- * attributes; the `gap` attribute was removed because aesthetic spacing is the
8
- * theme's concern. `columns` stays an author attribute — that's content density,
9
- * not aesthetics. */
1
+ @layer skin {
2
+ /* Gallery — skin. The grid/carousel/masonry layouts, item/lightbox/nav positioning,
3
+ * and responsive columns live in @refrakt-md/skeleton (styles/runes/gallery.css). */
10
4
  .rf-gallery {
11
- position: relative;
12
5
  margin: 0;
13
6
  --rf-gallery-edge: 0.5rem;
14
7
  --rf-gallery-gap: 0.5rem;
15
8
  padding: var(--rf-gallery-edge);
16
9
  }
17
-
18
- /* Layout modifier classes */
19
- .rf-gallery--grid {}
20
- .rf-gallery--carousel {}
21
- .rf-gallery--masonry {}
22
-
23
- /* Items container — grid layout by default */
24
10
  .rf-gallery__items {
25
- display: grid;
26
- grid-template-columns: repeat(var(--gallery-columns, 3), 1fr);
27
11
  gap: var(--rf-gallery-gap);
28
12
  }
29
-
30
- /* Individual gallery items */
31
13
  .rf-gallery__item {
32
- position: relative;
33
- overflow: hidden;
34
14
  border-radius: var(--rf-radius-md);
35
15
  margin: 0;
36
16
  }
37
- .rf-gallery__item :is(img, .rf-placeholder) {
38
- width: 100%;
39
- height: 100%;
40
- object-fit: cover;
41
- display: block;
42
- }
43
17
  .rf-gallery__item figcaption {
44
- position: absolute;
45
- bottom: 0;
46
- left: 0;
47
- right: 0;
48
18
  padding: 0.5rem 0.75rem;
49
19
  background: linear-gradient(transparent, rgba(0, 0, 0, 0.6));
50
20
  color: white;
51
21
  font-size: var(--rf-text-sm);
52
22
  }
53
-
54
- /* Gallery caption */
55
23
  .rf-gallery > figcaption {
56
24
  margin-top: 0.625rem;
57
25
  font-size: var(--rf-text-sm);
@@ -59,36 +27,13 @@
59
27
  text-align: center;
60
28
  font-style: italic;
61
29
  }
62
-
63
- /* Carousel layout */
64
- .rf-gallery[data-layout="carousel"] .rf-gallery__items {
65
- display: flex;
66
- overflow-x: auto;
67
- scroll-snap-type: x mandatory;
68
- -webkit-overflow-scrolling: touch;
69
- }
70
- .rf-gallery[data-layout="carousel"] .rf-gallery__item {
71
- flex: 0 0 calc(100% / var(--gallery-columns, 3));
72
- scroll-snap-align: start;
73
- }
74
-
75
- /* Carousel nav buttons */
76
30
  .rf-gallery__nav {
77
- position: absolute;
78
- top: 50%;
79
- transform: translateY(-50%);
80
- z-index: 2;
81
- width: 2.5rem;
82
- height: 2.5rem;
83
31
  border-radius: 50%;
84
32
  border: none;
85
33
  background: var(--rf-color-surface);
86
34
  color: var(--rf-color-text);
87
35
  box-shadow: var(--rf-shadow-md);
88
36
  cursor: pointer;
89
- display: flex;
90
- align-items: center;
91
- justify-content: center;
92
37
  font-size: var(--rf-text-xl);
93
38
  opacity: 0.8;
94
39
  transition: opacity 0.2s;
@@ -96,113 +41,36 @@
96
41
  .rf-gallery__nav:hover {
97
42
  opacity: 1;
98
43
  }
99
- /* Inset the carousel nav buttons from the image edge by the same 0.5rem the
100
- * gallery uses as its thin-edge frame, so the buttons overlap onto the image
101
- * slightly rather than sitting flush against it. The gallery's outer padding
102
- * already inserts 0.5rem between gallery border and image, so the total offset
103
- * from the gallery border is `edge + 0.5rem` = 1rem. */
104
- .rf-gallery__nav--prev {
105
- left: calc(var(--rf-gallery-edge) + 0.5rem);
106
- }
107
- .rf-gallery__nav--next {
108
- right: calc(var(--rf-gallery-edge) + 0.5rem);
109
- }
110
-
111
- /* Masonry layout — CSS multi-column flow gives true variable-height masonry in
112
- * every browser. (`grid-template-rows: masonry` is Firefox-only behind a flag
113
- * and silently falls back to uniform-height grid rows everywhere else, which is
114
- * why heights used to only vary in the collapsed single-column case.) Items
115
- * flow top-to-bottom inside each column, then move to the next column. */
116
44
  .rf-gallery[data-layout="masonry"] .rf-gallery__items {
117
- display: block;
118
- column-count: var(--gallery-columns, 3);
119
45
  column-gap: var(--rf-gallery-gap);
120
46
  }
121
47
  .rf-gallery[data-layout="masonry"] .rf-gallery__item {
122
- break-inside: avoid;
123
48
  margin-bottom: var(--rf-gallery-gap);
124
49
  }
125
- /* In masonry the row height isn't pinned, so let each image take its natural
126
- * height (grid mode keeps `height: 100%` for uniform tiles). */
127
- .rf-gallery[data-layout="masonry"] .rf-gallery__item :is(img, .rf-placeholder) {
128
- height: auto;
129
- }
130
-
131
- /* Lightbox cursor hint */
132
50
  .rf-gallery[data-lightbox="true"] .rf-gallery__item {
133
51
  cursor: zoom-in;
134
52
  }
135
-
136
- /* Lightbox overlay */
137
53
  .rf-gallery__lightbox {
138
- position: fixed;
139
- inset: 0;
140
- z-index: 9999;
141
54
  background: rgba(0, 0, 0, 0.9);
142
- display: flex;
143
- align-items: center;
144
- justify-content: center;
145
55
  }
146
56
  .rf-gallery__lightbox img {
147
- max-width: 90vw;
148
- max-height: 90vh;
149
- object-fit: contain;
150
57
  border-radius: var(--rf-radius-md);
151
58
  }
152
59
  .rf-gallery__lightbox-close {
153
- position: absolute;
154
- top: 1rem;
155
- right: 1rem;
156
- width: 2.5rem;
157
- height: 2.5rem;
158
60
  border-radius: 50%;
159
61
  border: none;
160
62
  background: rgba(255, 255, 255, 0.15);
161
63
  color: white;
162
64
  font-size: var(--rf-text-2xl);
163
65
  cursor: pointer;
164
- display: flex;
165
- align-items: center;
166
- justify-content: center;
167
66
  }
168
67
  .rf-gallery__lightbox-nav {
169
- position: absolute;
170
- top: 50%;
171
- transform: translateY(-50%);
172
- width: 3rem;
173
- height: 3rem;
174
68
  border-radius: 50%;
175
69
  border: none;
176
70
  background: rgba(255, 255, 255, 0.15);
177
71
  color: white;
178
72
  font-size: var(--rf-text-2xl);
179
73
  cursor: pointer;
180
- display: flex;
181
- align-items: center;
182
- justify-content: center;
183
- }
184
- .rf-gallery__lightbox-nav--prev {
185
- left: 1rem;
186
- }
187
- .rf-gallery__lightbox-nav--next {
188
- right: 1rem;
189
74
  }
190
75
 
191
- /* Responsive: collapse columns on small screens. (Gap is theme-locked at all
192
- * widths — no override needed.) */
193
- @media (max-width: 768px) {
194
- .rf-gallery {
195
- --gallery-columns: 2 !important;
196
- }
197
- .rf-gallery[data-layout="carousel"] .rf-gallery__item {
198
- flex-basis: 80%;
199
- }
200
- }
201
- @media (max-width: 480px) {
202
- .rf-gallery {
203
- --gallery-columns: 1 !important;
204
- }
205
- .rf-gallery[data-layout="carousel"] .rf-gallery__item {
206
- flex-basis: 100%;
207
- }
208
76
  }
@@ -1,62 +1,10 @@
1
- /* Grid */
1
+ @layer skin {
2
+ /* Grid — skin. The grid system (tracks, columns, flow, spans, modes, aspect cells,
3
+ * collapse) lives in @refrakt-md/skeleton (styles/runes/grid.css). */
2
4
  .rf-grid [data-layout="grid"] {
3
- display: grid;
4
- grid-template-columns: var(--grid-ratio, repeat(auto-fit, minmax(250px, 1fr)));
5
- align-items: var(--grid-valign, stretch);
6
5
  gap: var(--grid-gap, 1.5rem);
7
6
  }
8
- /* Explicit column counts override auto-fit */
9
- .rf-grid [data-columns="1"] { grid-template-columns: 1fr; }
10
- .rf-grid [data-columns="2"] { grid-template-columns: repeat(2, 1fr); }
11
- .rf-grid [data-columns="3"] { grid-template-columns: repeat(3, 1fr); }
12
- .rf-grid [data-columns="4"] { grid-template-columns: repeat(4, 1fr); }
13
- .rf-grid [data-columns="5"] { grid-template-columns: repeat(5, 1fr); }
14
- .rf-grid [data-columns="6"] { grid-template-columns: repeat(6, 1fr); }
15
- /* Flow */
16
- .rf-grid [data-flow="column"] { grid-auto-flow: column; }
17
- .rf-grid [data-flow="dense"] { grid-auto-flow: dense; }
18
- .rf-grid [data-flow="row dense"] { grid-auto-flow: row dense; }
19
- .rf-grid [data-flow="column dense"] { grid-auto-flow: column dense; }
20
- /* Spans */
21
- .rf-grid [data-colspan="2"] { grid-column: span 2; }
22
- .rf-grid [data-colspan="3"] { grid-column: span 3; }
23
- .rf-grid [data-colspan="4"] { grid-column: span 4; }
24
- .rf-grid [data-rowspan="2"] { grid-row: span 2; }
25
- .rf-grid [data-rowspan="3"] { grid-row: span 3; }
26
- .rf-grid [data-rowspan="4"] { grid-row: span 4; }
27
- /* Cell styling */
28
7
  .rf-grid [data-name="cell"] p:first-child { margin-top: 0; }
29
8
  .rf-grid [data-name="cell"] p:last-child { margin-bottom: 0; }
30
- /* Auto mode — responsive auto-fill */
31
- .rf-grid[data-mode="auto"] [data-layout="grid"] {
32
- grid-template-columns: repeat(auto-fill, minmax(var(--grid-min, 250px), 1fr));
33
- }
34
- /* Masonry mode — progressive enhancement */
35
- .rf-grid[data-mode="masonry"] [data-layout="grid"] {
36
- grid-template-rows: masonry;
37
- }
38
- /* Aspect ratio enforcement on cells */
39
- .rf-grid[data-aspect] [data-name="cell"] {
40
- aspect-ratio: var(--grid-aspect);
41
- overflow: hidden;
42
- }
43
- .rf-grid[data-aspect] [data-name="cell"] > img,
44
- .rf-grid[data-aspect] [data-name="cell"] > video {
45
- width: 100%;
46
- height: 100%;
47
- object-fit: cover;
48
- }
49
- /* Stack order when collapsed */
50
- .rf-grid[data-stack="reverse"] [data-name="cell"]:last-child {
51
- order: -1;
52
- }
53
- /* Collapse breakpoints */
54
- @media (max-width: 640px) {
55
- .rf-grid[data-collapse="sm"] [data-layout="grid"] { grid-template-columns: 1fr; }
56
- }
57
- @media (max-width: 768px) {
58
- .rf-grid[data-collapse="md"] [data-layout="grid"] { grid-template-columns: 1fr; }
59
- }
60
- @media (max-width: 1024px) {
61
- .rf-grid[data-collapse="lg"] [data-layout="grid"] { grid-template-columns: 1fr; }
9
+
62
10
  }
@@ -1,13 +1,16 @@
1
- /* Hero */
1
+ @layer skin {
2
+ /* Hero — skin. The relative root, preamble/eyebrow/actions/button layout + their
3
+ * auto-margin alignment + mobile stack, the media-position flip, the responsive
4
+ * image box, and the cover-band height/containment authority live in
5
+ * @refrakt-md/skeleton (styles/runes/hero.css). What remains here is skin:
6
+ * spacing, type, the headline gradient, surface chrome, the scrim, radii, and
7
+ * text-align. */
2
8
  .rf-hero {
3
- position: relative;
4
9
  padding: 7rem 2rem 6.5rem;
5
10
  background-size: cover;
6
11
  background-position: center;
7
12
  }
8
13
  .rf-hero__preamble {
9
- flex-direction: column;
10
- align-items: center;
11
14
  gap: 0.25rem;
12
15
  margin-bottom: 2rem;
13
16
  }
@@ -23,8 +26,6 @@
23
26
  }
24
27
  /* Pill-badge variant when eyebrow contains a link */
25
28
  .rf-hero .rf-hero__eyebrow:has(a) {
26
- display: inline-block;
27
- position: relative;
28
29
  padding: 0.25rem 0.875rem;
29
30
  border: 1px solid var(--rf-color-border);
30
31
  border-radius: var(--rf-radius-full);
@@ -43,9 +44,6 @@
43
44
  text-decoration: none;
44
45
  }
45
46
  .rf-hero .rf-hero__eyebrow:has(a) a::before {
46
- content: '';
47
- position: absolute;
48
- inset: 0;
49
47
  border-radius: inherit;
50
48
  }
51
49
  .rf-hero__image {
@@ -53,43 +51,23 @@
53
51
  }
54
52
  .rf-hero__actions {
55
53
  max-width: 720px;
56
- margin: 0 auto;
57
- display: flex;
58
- align-items: center;
59
54
  gap: 0.75rem;
60
- flex-wrap: wrap;
61
55
  }
62
56
  .rf-hero[data-align="center"] .rf-hero__preamble,
63
57
  .rf-hero[data-align="center"] > h1,
64
58
  .rf-hero[data-align="center"] > p {
65
59
  text-align: center;
66
60
  }
67
- .rf-hero[data-align="center"] .rf-hero__actions {
68
- margin: 0 auto;
69
- justify-content: center;
70
- }
71
61
  .rf-hero[data-align="left"] .rf-hero__preamble,
72
62
  .rf-hero[data-align="left"] > h1,
73
63
  .rf-hero[data-align="left"] > p {
74
64
  text-align: left;
75
65
  }
76
- .rf-hero[data-align="left"] .rf-hero__preamble {
77
- align-items: flex-start;
78
- }
79
- .rf-hero[data-align="left"] .rf-hero__actions {
80
- margin: 0;
81
- }
82
66
  .rf-hero[data-align="right"] .rf-hero__preamble,
83
67
  .rf-hero[data-align="right"] > h1,
84
68
  .rf-hero[data-align="right"] > p {
85
69
  text-align: right;
86
70
  }
87
- .rf-hero[data-align="right"] .rf-hero__preamble {
88
- align-items: flex-end;
89
- }
90
- .rf-hero[data-align="right"] .rf-hero__actions {
91
- margin: 0 0 0 auto;
92
- }
93
71
  .rf-hero__actions pre {
94
72
  margin: 0;
95
73
  padding: 0.7rem 1.75rem;
@@ -125,31 +103,20 @@
125
103
  .rf-hero[data-align="center"] > p,
126
104
  .rf-hero[data-align="center"] .rf-hero__blurb {
127
105
  max-width: 560px;
128
- margin-left: auto;
129
- margin-right: auto;
130
106
  margin-bottom: 2rem;
131
107
  }
132
108
  .rf-hero ul,
133
109
  .rf-hero nav {
134
- display: flex;
135
110
  gap: 0.75rem;
136
- flex-wrap: wrap;
137
- list-style: none;
138
111
  padding: 0;
139
112
  margin: 0;
140
113
  }
141
- .rf-hero[data-align="center"] ul,
142
- .rf-hero[data-align="center"] nav {
143
- justify-content: center;
144
- }
145
114
  .rf-hero li {
146
115
  padding: 0;
147
116
  margin: 0;
148
117
  }
149
118
  .rf-hero li a,
150
119
  .rf-hero nav a {
151
- display: inline-flex;
152
- align-items: center;
153
120
  padding: 0.7rem 1.75rem;
154
121
  border-radius: var(--rf-radius-sm);
155
122
  text-decoration: none;
@@ -182,40 +149,17 @@
182
149
  margin-top: 3rem;
183
150
  border-radius: var(--rf-radius-lg);
184
151
  }
185
- /* BUG-001 — hero DOM is content-first (headline before media: the right
186
- * reading order for the classic hero), inverting the shared media-first
187
- * stacked contract in layouts/split.css. Counter it so the labels are
188
- * truthful: `bottom` (the hero default) is plain block flow — media renders
189
- * after the content, exactly the historical look — and an explicit `top`
190
- * flips the visual order without touching the DOM. */
191
- .rf-hero[data-media-position="bottom"] {
192
- display: block;
193
- }
194
- .rf-hero[data-media-position="top"] {
195
- display: flex;
196
- flex-direction: column-reverse;
197
- }
198
152
  .rf-hero[data-media-position="top"] > .rf-hero__media {
199
153
  margin-top: 0;
200
154
  margin-bottom: 3rem;
201
155
  }
202
- .rf-hero__media img {
203
- display: block;
204
- width: 100%;
205
- height: auto;
206
- }
207
156
  .rf-hero__media pre {
208
157
  margin: 0;
209
158
  }
210
159
 
211
- /* ── Cover mode (SPEC-101) — `media-position="cover"` ───────────────────
212
- * The shared cover layer (dimensions/cover.css) does the grid stacking, the
213
- * default scrim, and the overlay anchoring; these rules supply the hero-band
214
- * specifics. This file imports after cover.css, so equal-specificity rules
215
- * here win. */
216
-
217
- /* The section's generous padding moves to the overlaid content — on the root
218
- * it would inset the media well (the backdrop must be flush with the band). */
160
+ /* ── Cover mode (SPEC-101) — skin (the height/containment authority is skeleton).
161
+ * The section's generous padding moves to the overlaid content — on the root it
162
+ * would inset the media well (the backdrop must be flush with the band). */
219
163
  .rf-hero--cover {
220
164
  padding: 0;
221
165
  }
@@ -223,38 +167,6 @@
223
167
  --rune-padding: 7rem 2rem 6.5rem;
224
168
  }
225
169
 
226
- /* Band height authority: a hero is a full-width band, not a portrait tile.
227
- * Height comes from a viewport-aware floor — deliberately NOT a default
228
- * aspect-ratio: with `aspect-ratio` + `min-height`, the ratio transfers a
229
- * winning min-height back into *width* on narrow screens (a 22rem-tall 21/9
230
- * band computes ~820px wide on a 375px phone — the band marches off-screen).
231
- * `--cover-aspect: auto` releases the shared 3/4 tile default; an explicit
232
- * `aspect` knob still lands as an inline style and owns the shape. */
233
- .rf-hero--cover {
234
- --cover-aspect: auto;
235
- min-height: clamp(22rem, 55vh, 40rem);
236
- }
237
- /* An explicit aspect owns the shape — drop the floor so the same
238
- * ratio-vs-min-height transfer can't reintroduce the overflow. */
239
- .rf-hero--cover[data-aspect] {
240
- min-height: 0;
241
- }
242
-
243
- /* The shared cover layer applies `container-type: size` (size containment) for
244
- * its orientation query — under it the band cannot grow with its content, so
245
- * tall content clips at min-height. The hero band doesn't use the orientation
246
- * query (the centred-band default below covers `auto` placement), so release
247
- * the containment and let the band stretch to fit. */
248
- .rf-hero--cover[data-media-position="cover"][data-cover-scope="full"] {
249
- container-type: normal;
250
- }
251
-
252
- /* Named height scale (`height="sm…xl"`): an explicit band height. */
253
- .rf-hero--cover[data-height="sm"] { min-height: 20rem; }
254
- .rf-hero--cover[data-height="md"] { min-height: 28rem; }
255
- .rf-hero--cover[data-height="lg"] { min-height: 36rem; }
256
- .rf-hero--cover[data-height="xl"] { min-height: 44rem; }
257
-
258
170
  /* Mobile: the desktop overlay padding (7rem bands) would eat most of the well
259
171
  * on a phone — tighten it so the content fits the band. */
260
172
  @media (max-width: 640px) {
@@ -275,19 +187,9 @@
275
187
  color: var(--rf-color-on-accent, var(--rf-color-bg));
276
188
  }
277
189
 
278
- /* Centre-band default: a hero overlay reads as a centred band, not the
279
- * cover-card caption strip — seat it mid-well unless the author anchors it
280
- * with an explicit `content-place`. */
281
- .rf-hero--cover[data-media-position="cover"]:is([data-content-place="auto"], :not([data-content-place])) > [data-name="content"] {
282
- align-self: center;
283
- justify-self: stretch;
284
- }
285
-
286
190
  /* The default cover scrim is edge-weighted (a caption-strip treatment); under
287
191
  * the centred band it would leave the headline on undarkened media. With no
288
- * explicit `content-place`, darken the well evenly (slightly bottom-weighted).
289
- * An explicit `content-place` re-enters the shared content-edge scrim contract,
290
- * and `scrim="none"` still opts out. */
192
+ * explicit `content-place`, darken the well evenly (slightly bottom-weighted). */
291
193
  .rf-hero--cover:is([data-content-place="auto"], :not([data-content-place])):not([data-scrim="none"]) > [data-section="media"]::after {
292
194
  background-image: var(--cover-scrim-image, linear-gradient(rgb(0 0 0 / 0.45), rgb(0 0 0 / 0.35) 50%, rgb(0 0 0 / 0.55)));
293
195
  }
@@ -295,23 +197,8 @@
295
197
  /* Mobile: stack actions full-width so the code block and button line up */
296
198
  @media (max-width: 640px) {
297
199
  .rf-hero__actions {
298
- flex-direction: column;
299
- align-items: stretch;
300
200
  max-width: none;
301
201
  }
302
- .rf-hero__actions pre {
303
- width: 100%;
304
- box-sizing: border-box;
305
- }
306
- .rf-hero ul,
307
- .rf-hero nav {
308
- flex-direction: column;
309
- align-items: stretch;
310
- }
311
- .rf-hero li a,
312
- .rf-hero nav a {
313
- justify-content: center;
314
- width: 100%;
315
- box-sizing: border-box;
316
- }
202
+ }
203
+
317
204
  }