@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.
- package/base.css +7 -1
- package/contracts/structures.json +537 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +7 -0
- package/dist/config.js.map +1 -1
- package/dist/tokens.d.ts.map +1 -1
- package/dist/tokens.js +13 -0
- package/dist/tokens.js.map +1 -1
- package/index.css +11 -1
- package/package.json +5 -4
- package/styles/base/attributes.css +6 -7
- package/styles/dimensions/checklist.css +6 -35
- package/styles/dimensions/cover.css +13 -95
- package/styles/dimensions/density.css +3 -0
- package/styles/dimensions/frame.css +3 -0
- package/styles/dimensions/media.css +14 -61
- package/styles/dimensions/metadata.css +24 -74
- package/styles/dimensions/motion.css +102 -0
- package/styles/dimensions/sections.css +10 -24
- package/styles/dimensions/sequence.css +14 -79
- package/styles/dimensions/state.css +39 -56
- package/styles/dimensions/substrate.css +3 -0
- package/styles/dimensions/surfaces.css +73 -113
- package/styles/elements/blockquote.css +3 -2
- package/styles/elements/code.css +3 -0
- package/styles/elements/table.css +3 -0
- package/styles/global.css +9 -48
- package/styles/layouts/blog.css +3 -64
- package/styles/layouts/default.css +3 -77
- package/styles/layouts/docs.css +3 -153
- package/styles/layouts/mobile.css +1 -50
- package/styles/layouts/on-this-page.css +3 -2
- package/styles/layouts/plan.css +3 -134
- package/styles/layouts/search.css +3 -68
- package/styles/layouts/split.css +24 -169
- package/styles/layouts/theme-toggle.css +3 -29
- package/styles/layouts/version-switcher.css +3 -4
- package/styles/runes/accordion.css +15 -58
- package/styles/runes/aggregate.css +3 -12
- package/styles/runes/annotate.css +6 -35
- package/styles/runes/api.css +3 -0
- package/styles/runes/audio.css +3 -41
- package/styles/runes/badge.css +3 -0
- package/styles/runes/bar.css +3 -0
- package/styles/runes/bento.css +16 -159
- package/styles/runes/bg.css +3 -37
- package/styles/runes/blog.css +3 -5
- package/styles/runes/bond.css +3 -23
- package/styles/runes/breadcrumb.css +5 -13
- package/styles/runes/budget.css +3 -25
- package/styles/runes/bug.css +3 -0
- package/styles/runes/card.css +24 -92
- package/styles/runes/cast.css +5 -22
- package/styles/runes/changelog.css +5 -9
- package/styles/runes/character.css +3 -17
- package/styles/runes/chart.css +35 -53
- package/styles/runes/codegroup.css +15 -23
- package/styles/runes/collection.css +5 -82
- package/styles/runes/compare.css +3 -14
- package/styles/runes/comparison.css +7 -34
- package/styles/runes/conversation.css +5 -27
- package/styles/runes/cta.css +3 -26
- package/styles/runes/datatable.css +25 -40
- package/styles/runes/decision.css +3 -0
- package/styles/runes/design-context.css +3 -2
- package/styles/runes/details.css +5 -13
- package/styles/runes/diagram.css +5 -13
- package/styles/runes/diff.css +5 -88
- package/styles/runes/drawer.css +1 -105
- package/styles/runes/embed.css +4 -12
- package/styles/runes/event.css +3 -1
- package/styles/runes/expand.css +5 -40
- package/styles/runes/faction.css +3 -9
- package/styles/runes/feature.css +4 -32
- package/styles/runes/figure.css +5 -24
- package/styles/runes/file-ref.css +3 -18
- package/styles/runes/form.css +3 -32
- package/styles/runes/gallery.css +3 -135
- package/styles/runes/grid.css +4 -56
- package/styles/runes/hero.css +13 -126
- package/styles/runes/hint.css +16 -41
- package/styles/runes/howto.css +3 -25
- package/styles/runes/itinerary.css +3 -32
- package/styles/runes/juxtapose.css +12 -87
- package/styles/runes/lore.css +3 -10
- package/styles/runes/map.css +3 -36
- package/styles/runes/mediatext.css +3 -44
- package/styles/runes/milestone.css +3 -16
- package/styles/runes/mockup.css +15 -108
- package/styles/runes/nav.css +3 -178
- package/styles/runes/organization.css +3 -2
- package/styles/runes/page-section.css +3 -4
- package/styles/runes/pagination.css +5 -37
- package/styles/runes/palette.css +3 -22
- package/styles/runes/placeholder.css +3 -3
- package/styles/runes/plan-history.css +3 -23
- package/styles/runes/plan-progress.css +3 -4
- package/styles/runes/plan-ref.css +3 -0
- package/styles/runes/playlist.css +2 -36
- package/styles/runes/plot.css +3 -19
- package/styles/runes/preview.css +7 -25
- package/styles/runes/pricing.css +7 -25
- package/styles/runes/progress.css +6 -25
- package/styles/runes/pullquote.css +3 -26
- package/styles/runes/realm.css +3 -9
- package/styles/runes/recipe.css +3 -27
- package/styles/runes/relationships.css +3 -34
- package/styles/runes/reveal.css +7 -12
- package/styles/runes/sandbox.css +6 -36
- package/styles/runes/section.css +4 -18
- package/styles/runes/showcase.css +3 -20
- package/styles/runes/sidenote.css +3 -2
- package/styles/runes/snippet.css +3 -0
- package/styles/runes/spacing.css +3 -22
- package/styles/runes/spec.css +3 -0
- package/styles/runes/steps.css +4 -36
- package/styles/runes/storyboard.css +2 -17
- package/styles/runes/swatch.css +3 -6
- package/styles/runes/symbol.css +6 -4
- package/styles/runes/tabs.css +6 -9
- package/styles/runes/testimonial.css +5 -6
- package/styles/runes/textblock.css +2 -20
- package/styles/runes/timeline.css +3 -21
- package/styles/runes/tint.css +3 -0
- package/styles/runes/toc.css +5 -3
- package/styles/runes/track.css +2 -31
- package/styles/runes/typography.css +3 -15
- package/styles/runes/work.css +3 -0
- package/styles/runes/xref.css +3 -1
- package/tokens/base.css +19 -0
- package/tokens/dark.css +3 -0
- package/styles/dimensions/guest-posture.css +0 -27
package/styles/runes/form.css
CHANGED
|
@@ -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
|
+
}
|
package/styles/runes/gallery.css
CHANGED
|
@@ -1,57 +1,25 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
*
|
|
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
|
}
|
package/styles/runes/grid.css
CHANGED
|
@@ -1,62 +1,10 @@
|
|
|
1
|
-
|
|
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
|
-
|
|
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
|
}
|
package/styles/runes/hero.css
CHANGED
|
@@ -1,13 +1,16 @@
|
|
|
1
|
-
|
|
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) —
|
|
212
|
-
* The
|
|
213
|
-
*
|
|
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
|
-
|
|
303
|
-
|
|
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
|
}
|