@refrakt-md/skeleton 0.42.0 → 0.44.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/index.css +2 -1
- package/package.json +2 -2
- package/styles/dimensions/link.css +25 -0
- package/styles/dimensions/metadata.css +10 -1
- package/styles/dimensions/sections.css +14 -0
- package/styles/layouts/split.css +13 -1
- package/styles/runes/accordion.css +1 -10
- package/styles/runes/actions.css +50 -0
- package/styles/runes/bento.css +2 -12
- package/styles/runes/card.css +4 -15
- package/styles/runes/cta.css +7 -39
- package/styles/runes/feature.css +1 -11
- package/styles/runes/hero.css +8 -59
- package/styles/runes/pricing.css +1 -13
- package/styles/runes/reveal.css +1 -10
- package/styles/runes/section.css +72 -12
- package/styles/runes/steps.css +1 -13
- package/styles/runes/tabs.css +1 -11
- package/styles/runes/page-section.css +0 -12
package/index.css
CHANGED
|
@@ -36,6 +36,7 @@
|
|
|
36
36
|
@import "./styles/dimensions/cover.css" layer(skeleton);
|
|
37
37
|
@import "./styles/dimensions/metadata.css" layer(skeleton);
|
|
38
38
|
@import "./styles/dimensions/sections.css" layer(skeleton);
|
|
39
|
+
@import "./styles/dimensions/link.css" layer(skeleton);
|
|
39
40
|
@import "./styles/dimensions/reading.css" layer(skeleton);
|
|
40
41
|
@import "./styles/dimensions/checklist.css" layer(skeleton);
|
|
41
42
|
@import "./styles/dimensions/sequence.css" layer(skeleton);
|
|
@@ -54,6 +55,7 @@
|
|
|
54
55
|
@import "./styles/layouts/plan.css" layer(skeleton);
|
|
55
56
|
|
|
56
57
|
/* ── Rune structure ── */
|
|
58
|
+
@import "./styles/runes/actions.css" layer(skeleton);
|
|
57
59
|
@import "./styles/runes/card.css" layer(skeleton);
|
|
58
60
|
@import "./styles/runes/hint.css" layer(skeleton);
|
|
59
61
|
@import "./styles/runes/steps.css" layer(skeleton);
|
|
@@ -110,7 +112,6 @@
|
|
|
110
112
|
@import "./styles/runes/file-ref.css" layer(skeleton);
|
|
111
113
|
@import "./styles/runes/form.css" layer(skeleton);
|
|
112
114
|
@import "./styles/runes/mediatext.css" layer(skeleton);
|
|
113
|
-
@import "./styles/runes/page-section.css" layer(skeleton);
|
|
114
115
|
@import "./styles/runes/placeholder.css" layer(skeleton);
|
|
115
116
|
@import "./styles/runes/pullquote.css" layer(skeleton);
|
|
116
117
|
@import "./styles/runes/relationships.css" layer(skeleton);
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@refrakt-md/skeleton",
|
|
3
3
|
"description": "The structural cascade layer + layer-order contract every refrakt theme builds on — ships `@layer skeleton` and the `@layer skeleton, skin;` order declaration, plus the token-name contract",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.44.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"repository": {
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
"styles"
|
|
30
30
|
],
|
|
31
31
|
"dependencies": {
|
|
32
|
-
"@refrakt-md/types": "0.
|
|
32
|
+
"@refrakt-md/types": "0.44.0"
|
|
33
33
|
},
|
|
34
34
|
"scripts": {
|
|
35
35
|
"build": "tsc"
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/* link — structure (SPEC-160 D8, WORK-655). Whole-region links, keyed on the
|
|
2
|
+
* `data-link` attribute the identity transform writes, so they work around any
|
|
3
|
+
* rune and need no rune CSS.
|
|
4
|
+
*
|
|
5
|
+
* - wrap: a real `<a>` around content with nothing interactive in it.
|
|
6
|
+
* - stretch: an `<a>` laid over its host (`card`/`bento-cell` `href`, or a
|
|
7
|
+
* `{% link %}` around interactive content); the content's own links and
|
|
8
|
+
* controls sit above it and stay clickable. */
|
|
9
|
+
|
|
10
|
+
a[data-link="wrap"] {
|
|
11
|
+
display: block;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
:has(> [data-link="stretch"]) {
|
|
15
|
+
position: relative;
|
|
16
|
+
}
|
|
17
|
+
[data-link="stretch"] {
|
|
18
|
+
position: absolute;
|
|
19
|
+
inset: 0;
|
|
20
|
+
z-index: 0;
|
|
21
|
+
}
|
|
22
|
+
:has(> [data-link="stretch"]) :is(a, button, input, select, textarea, summary):not([data-link]) {
|
|
23
|
+
position: relative;
|
|
24
|
+
z-index: 1;
|
|
25
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/* metadata — structure. The zone-layout primitives (bar, definition-list) and the
|
|
1
|
+
/* metadata — structure. The zone-layout primitives (bar, definition-list, lead) and the
|
|
2
2
|
* visually-hidden label mechanism. [data-zone-layout] is layout-uncontested (no
|
|
3
3
|
* layout file targets it), and a rune overriding these resolves correctly (skin
|
|
4
4
|
* beats skeleton). Spacing values (gap / padding / rhythm margins), borders,
|
|
@@ -26,6 +26,15 @@
|
|
|
26
26
|
margin-left: auto;
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
+
/* ── Layout: lead (SPEC-161 D6) ──
|
|
30
|
+
* A byline: the fields in a column, the lead (`data-lead`) first and the rest
|
|
31
|
+
* beneath it. No value is ranked, so a compact container hides none of them. */
|
|
32
|
+
[data-zone-layout="lead"] {
|
|
33
|
+
display: flex;
|
|
34
|
+
flex-direction: column;
|
|
35
|
+
align-items: flex-start;
|
|
36
|
+
}
|
|
37
|
+
|
|
29
38
|
/* ── Layout: definition-list ──
|
|
30
39
|
* Each row stacks dt over dd; rows flow into auto-fit columns that collapse to a
|
|
31
40
|
* single column on narrow containers without a media-query step. */
|
|
@@ -20,3 +20,17 @@
|
|
|
20
20
|
display: flex;
|
|
21
21
|
flex-wrap: wrap;
|
|
22
22
|
}
|
|
23
|
+
|
|
24
|
+
/* An eyebrow holding a link is a pill whose link covers it (WORK-656). The
|
|
25
|
+
* stretched link is structure; the pill's chrome is skin (Lumina's
|
|
26
|
+
* dimensions/sections.css). Keyed on the role, so every rune with an eyebrow
|
|
27
|
+
* gets it, `card` included. */
|
|
28
|
+
[data-section="eyebrow"]:has(a) {
|
|
29
|
+
display: inline-block;
|
|
30
|
+
position: relative;
|
|
31
|
+
}
|
|
32
|
+
[data-section="eyebrow"]:has(a) a::before {
|
|
33
|
+
content: "";
|
|
34
|
+
position: absolute;
|
|
35
|
+
inset: 0;
|
|
36
|
+
}
|
package/styles/layouts/split.css
CHANGED
|
@@ -15,9 +15,12 @@
|
|
|
15
15
|
grid-template-columns: var(--media-share, 50%) 1fr;
|
|
16
16
|
align-items: var(--split-valign, start);
|
|
17
17
|
}
|
|
18
|
-
/* "end" flips the grid so media lands in column 2 (source order is media-first).
|
|
18
|
+
/* "end" flips the grid so media lands in column 2 (source order is media-first).
|
|
19
|
+
* `dense` backfills the content into row 1, column 1: placed after the media,
|
|
20
|
+
* it would otherwise start a second row. */
|
|
19
21
|
[data-media-position="end"] {
|
|
20
22
|
grid-template-columns: 1fr var(--media-share, 50%);
|
|
23
|
+
grid-auto-flow: dense;
|
|
21
24
|
}
|
|
22
25
|
[data-media-position="end"] > [data-section="media"],
|
|
23
26
|
[data-media-position="end"] > [data-name="media"] {
|
|
@@ -27,6 +30,15 @@
|
|
|
27
30
|
grid-column: 1;
|
|
28
31
|
}
|
|
29
32
|
|
|
33
|
+
/* A portrait media zone (a round avatar) takes its portrait's width rather than
|
|
34
|
+
* a share of the row, unless a `media-ratio` asks for one. */
|
|
35
|
+
[data-media-position="start"]:not([data-media-ratio]):has(> [data-media="portrait"]) {
|
|
36
|
+
grid-template-columns: auto 1fr;
|
|
37
|
+
}
|
|
38
|
+
[data-media-position="end"]:not([data-media-ratio]):has(> [data-media="portrait"]) {
|
|
39
|
+
grid-template-columns: 1fr auto;
|
|
40
|
+
}
|
|
41
|
+
|
|
30
42
|
/* `media-ratio` → media's share of the row width. */
|
|
31
43
|
[data-media-ratio="1/3"] {
|
|
32
44
|
--media-share: 33.333%;
|
|
@@ -1,19 +1,10 @@
|
|
|
1
|
-
/* accordion — structure. The
|
|
1
|
+
/* accordion — structure. The items passthrough, the
|
|
2
2
|
* item-header flex + native-marker hide + chevron box/glyph/open-rotate mechanism,
|
|
3
3
|
* the title/count flex, and the ::details-content collapse mechanism. Type,
|
|
4
4
|
* borders, spacing, the chevron tint, transitions, and prose are skin (Lumina's
|
|
5
5
|
* styles/runes/accordion.css). The chevron glyph is the registry mask
|
|
6
6
|
* --rf-icon-accordion-chevron (SPEC-094 §8 / WORK-437). */
|
|
7
7
|
|
|
8
|
-
.rf-accordion__eyebrow:has(a) {
|
|
9
|
-
display: inline-block;
|
|
10
|
-
position: relative;
|
|
11
|
-
}
|
|
12
|
-
.rf-accordion__eyebrow:has(a) a::before {
|
|
13
|
-
content: "";
|
|
14
|
-
position: absolute;
|
|
15
|
-
inset: 0;
|
|
16
|
-
}
|
|
17
8
|
.rf-accordion__items {
|
|
18
9
|
display: contents;
|
|
19
10
|
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/* actions — structure (SPEC-160 D6). The action row, the button-shaped link, and
|
|
2
|
+
* the mobile stack. The look (padding, fill, rank) is skin: Lumina's
|
|
3
|
+
* styles/runes/actions.css. A host positions the row by setting
|
|
4
|
+
* `--actions-justify` (hero and cta do, from their alignment). */
|
|
5
|
+
|
|
6
|
+
.rf-actions {
|
|
7
|
+
display: flex;
|
|
8
|
+
align-items: center;
|
|
9
|
+
flex-wrap: wrap;
|
|
10
|
+
justify-content: var(--actions-justify, flex-start);
|
|
11
|
+
}
|
|
12
|
+
.rf-actions__list {
|
|
13
|
+
display: flex;
|
|
14
|
+
flex-wrap: wrap;
|
|
15
|
+
list-style: none;
|
|
16
|
+
justify-content: var(--actions-justify, flex-start);
|
|
17
|
+
}
|
|
18
|
+
.rf-actions__action > a {
|
|
19
|
+
display: inline-flex;
|
|
20
|
+
align-items: center;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/* Mobile: stack actions full-width so a command line and the buttons line up. */
|
|
24
|
+
@media (max-width: 640px) {
|
|
25
|
+
.rf-actions,
|
|
26
|
+
.rf-actions__list {
|
|
27
|
+
flex-direction: column;
|
|
28
|
+
align-items: stretch;
|
|
29
|
+
}
|
|
30
|
+
.rf-actions__command pre {
|
|
31
|
+
width: 100%;
|
|
32
|
+
box-sizing: border-box;
|
|
33
|
+
}
|
|
34
|
+
.rf-actions__action > a {
|
|
35
|
+
justify-content: center;
|
|
36
|
+
width: 100%;
|
|
37
|
+
box-sizing: border-box;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/* Size follows the nearest enclosing rune's `prominence` (SPEC-160 D7). The skin
|
|
42
|
+
* sets `--action-padding` / `--action-font-size` on a `[data-prominence]` rune;
|
|
43
|
+
* every other rune root clears them, so they reach only an `actions` whose
|
|
44
|
+
* nearest enclosing rune carries the prominence. A raised card inside a display
|
|
45
|
+
* hero keeps default buttons — the same protection density.css gives titles.
|
|
46
|
+
* `actions` itself is exempt: it is what reads them. */
|
|
47
|
+
[data-rune]:not([data-prominence], [data-rune="actions"]) {
|
|
48
|
+
--action-padding: initial;
|
|
49
|
+
--action-font-size: initial;
|
|
50
|
+
}
|
package/styles/runes/bento.css
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/* bento — structure. The container-query grid system: the grid track + cell
|
|
2
2
|
* spans, the cell flex layout + media placement, the row/content sizing knobs,
|
|
3
|
-
* the collapse queries,
|
|
3
|
+
* the collapse queries, and metadata hiding (the stretched `href` link is the
|
|
4
|
+
* shared dimensions/link.css). The cell surface
|
|
4
5
|
* chrome, spacing vars (padding/edge/gap), type, and the media-well chrome stay
|
|
5
6
|
* skin (Lumina's styles/runes/bento.css). bento-cell is a hand-rolled surface
|
|
6
7
|
* outside the data-elevation axis, so its padding has no surfaces competitor. */
|
|
@@ -157,17 +158,6 @@
|
|
|
157
158
|
height: auto;
|
|
158
159
|
}
|
|
159
160
|
|
|
160
|
-
/* Whole-cell link — stretched overlay; nested links stay clickable. */
|
|
161
|
-
.rf-bento-cell__link {
|
|
162
|
-
position: absolute;
|
|
163
|
-
inset: 0;
|
|
164
|
-
z-index: 0;
|
|
165
|
-
}
|
|
166
|
-
.rf-bento-cell a:not(.rf-bento-cell__link) {
|
|
167
|
-
position: relative;
|
|
168
|
-
z-index: 1;
|
|
169
|
-
}
|
|
170
|
-
|
|
171
161
|
/* ─── Binary collapse — single stacked column with auto rows below breakpoint. ─── */
|
|
172
162
|
@container rf-bento (max-width: 640px) {
|
|
173
163
|
:is(.rf-bento[data-collapse="sm"], .rf-bento[data-collapse=""]) .rf-bento__grid {
|
package/styles/runes/card.css
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
/* card — structure (SPEC-070). Pure layout only: the
|
|
2
|
-
*
|
|
3
|
-
*
|
|
1
|
+
/* card — structure (SPEC-070). Pure layout only: the clip, the split
|
|
2
|
+
* vertical-align, the collection-grid height filling, and the intrinsic-height
|
|
3
|
+
* scale. The stretched `href` link is the shared dimensions/link.css. ALL spacing stays skin in Lumina's card.css — the root
|
|
4
4
|
* `padding` overrides the surface-elevation padding (skin) by source order, and
|
|
5
5
|
* the split gaps + zone-reset margins are same-layer rhythm contests. */
|
|
6
6
|
|
|
7
7
|
.rf-card {
|
|
8
|
-
position: relative; /* anchor for the stretched link */
|
|
8
|
+
position: relative; /* anchor for the stretched link (dimensions/link.css) */
|
|
9
9
|
overflow: hidden; /* clip non-media layers to the rounded box */
|
|
10
10
|
}
|
|
11
11
|
|
|
@@ -46,14 +46,3 @@
|
|
|
46
46
|
.rf-card[data-height="xl"] {
|
|
47
47
|
min-height: 34rem;
|
|
48
48
|
}
|
|
49
|
-
|
|
50
|
-
/* Whole-card stretched link; real links in body/footer sit above it. */
|
|
51
|
-
.rf-card__link {
|
|
52
|
-
position: absolute;
|
|
53
|
-
inset: 0;
|
|
54
|
-
z-index: 0;
|
|
55
|
-
}
|
|
56
|
-
.rf-card a:not(.rf-card__link) {
|
|
57
|
-
position: relative;
|
|
58
|
-
z-index: 1;
|
|
59
|
-
}
|
package/styles/runes/cta.css
CHANGED
|
@@ -1,46 +1,14 @@
|
|
|
1
|
-
/* cta — structure. The preamble layout
|
|
2
|
-
*
|
|
3
|
-
* gradient, surface chrome, and colour stay skin
|
|
1
|
+
/* cta — structure. The preamble layout and the centred
|
|
2
|
+
* actions row (the row itself is the `actions` rune's, styles/runes/actions.css).
|
|
3
|
+
* All spacing, type, the headline gradient, surface chrome, and colour stay skin
|
|
4
|
+
* (Lumina's styles/runes/cta.css). */
|
|
4
5
|
|
|
5
6
|
.rf-cta__preamble {
|
|
6
7
|
flex-direction: column;
|
|
7
8
|
align-items: center;
|
|
8
9
|
}
|
|
9
10
|
|
|
10
|
-
/*
|
|
11
|
-
.rf-
|
|
12
|
-
|
|
13
|
-
position: relative;
|
|
14
|
-
}
|
|
15
|
-
.rf-cta .rf-cta__eyebrow:has(a) a::before {
|
|
16
|
-
content: "";
|
|
17
|
-
position: absolute;
|
|
18
|
-
inset: 0;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
/* Action-button row. */
|
|
22
|
-
.rf-cta ul {
|
|
23
|
-
display: flex;
|
|
24
|
-
justify-content: center;
|
|
25
|
-
flex-wrap: wrap;
|
|
26
|
-
list-style: none;
|
|
27
|
-
}
|
|
28
|
-
.rf-cta li a,
|
|
29
|
-
.rf-cta nav a {
|
|
30
|
-
display: inline-flex;
|
|
31
|
-
align-items: center;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
/* Mobile: stack action buttons full-width so multi-button CTAs line up. */
|
|
35
|
-
@media (max-width: 640px) {
|
|
36
|
-
.rf-cta ul {
|
|
37
|
-
flex-direction: column;
|
|
38
|
-
align-items: stretch;
|
|
39
|
-
}
|
|
40
|
-
.rf-cta li a,
|
|
41
|
-
.rf-cta nav a {
|
|
42
|
-
justify-content: center;
|
|
43
|
-
width: 100%;
|
|
44
|
-
box-sizing: border-box;
|
|
45
|
-
}
|
|
11
|
+
/* The actions row is centred. */
|
|
12
|
+
.rf-cta__actions {
|
|
13
|
+
--actions-justify: center;
|
|
46
14
|
}
|
package/styles/runes/feature.css
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/* feature — structure. The preamble flex
|
|
1
|
+
/* feature — structure. The preamble flex, the content
|
|
2
2
|
* display reset, the definitions grid, the feature-item icon stack, and the
|
|
3
3
|
* media-position flip. Spacing, type, surface chrome, alignment (text-align), and
|
|
4
4
|
* colour stay skin (Lumina's styles/runes/feature.css). */
|
|
@@ -8,16 +8,6 @@
|
|
|
8
8
|
align-items: flex-start;
|
|
9
9
|
}
|
|
10
10
|
|
|
11
|
-
.rf-feature__eyebrow:has(a) {
|
|
12
|
-
display: inline-block;
|
|
13
|
-
position: relative;
|
|
14
|
-
}
|
|
15
|
-
.rf-feature__eyebrow:has(a) a::before {
|
|
16
|
-
content: "";
|
|
17
|
-
position: absolute;
|
|
18
|
-
inset: 0;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
11
|
.rf-feature__content {
|
|
22
12
|
display: contents;
|
|
23
13
|
}
|
package/styles/runes/hero.css
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
/* hero — structure. The relative root (scrim/overlay anchor), the preamble
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* box, and the cover-band height/containment authority (which wins over the
|
|
1
|
+
/* hero — structure. The relative root (scrim/overlay anchor), the preamble,
|
|
2
|
+
* the actions row's position via auto-margins (the row itself is the `actions`
|
|
3
|
+
* rune's, styles/runes/actions.css), the media-position flip, the responsive
|
|
4
|
+
* image box, and the cover-band height/containment authority (which wins over the
|
|
5
5
|
* shared cover layer by specificity). All spacing, type, the headline gradient,
|
|
6
6
|
* surface chrome, scrim, radii, and text-align stay skin (Lumina's
|
|
7
7
|
* styles/runes/hero.css). */
|
|
@@ -19,28 +19,15 @@
|
|
|
19
19
|
align-items: center;
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
-
/* Linked eyebrow → pill with a stretched link (chrome is skin). */
|
|
23
|
-
.rf-hero .rf-hero__eyebrow:has(a) {
|
|
24
|
-
display: inline-block;
|
|
25
|
-
position: relative;
|
|
26
|
-
}
|
|
27
|
-
.rf-hero .rf-hero__eyebrow:has(a) a::before {
|
|
28
|
-
content: "";
|
|
29
|
-
position: absolute;
|
|
30
|
-
inset: 0;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
22
|
.rf-hero__actions {
|
|
34
|
-
display: flex;
|
|
35
|
-
align-items: center;
|
|
36
|
-
flex-wrap: wrap;
|
|
37
23
|
margin: 0 auto;
|
|
38
24
|
}
|
|
39
25
|
|
|
40
|
-
/* Alignment — auto-margins
|
|
26
|
+
/* Alignment — auto-margins position the preamble and the actions row, and
|
|
27
|
+
* `--actions-justify` aligns the buttons inside it. */
|
|
41
28
|
.rf-hero[data-align="center"] .rf-hero__actions {
|
|
29
|
+
--actions-justify: center;
|
|
42
30
|
margin: 0 auto;
|
|
43
|
-
justify-content: center;
|
|
44
31
|
}
|
|
45
32
|
.rf-hero[data-align="left"] .rf-hero__preamble {
|
|
46
33
|
align-items: flex-start;
|
|
@@ -52,6 +39,7 @@
|
|
|
52
39
|
align-items: flex-end;
|
|
53
40
|
}
|
|
54
41
|
.rf-hero[data-align="right"] .rf-hero__actions {
|
|
42
|
+
--actions-justify: flex-end;
|
|
55
43
|
margin: 0 0 0 auto;
|
|
56
44
|
}
|
|
57
45
|
.rf-hero[data-align="center"] > p,
|
|
@@ -60,22 +48,6 @@
|
|
|
60
48
|
margin-right: auto;
|
|
61
49
|
}
|
|
62
50
|
|
|
63
|
-
.rf-hero ul,
|
|
64
|
-
.rf-hero nav {
|
|
65
|
-
display: flex;
|
|
66
|
-
flex-wrap: wrap;
|
|
67
|
-
list-style: none;
|
|
68
|
-
}
|
|
69
|
-
.rf-hero[data-align="center"] ul,
|
|
70
|
-
.rf-hero[data-align="center"] nav {
|
|
71
|
-
justify-content: center;
|
|
72
|
-
}
|
|
73
|
-
.rf-hero li a,
|
|
74
|
-
.rf-hero nav a {
|
|
75
|
-
display: inline-flex;
|
|
76
|
-
align-items: center;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
51
|
/* BUG-001 — content-first DOM inverts the shared media-first stacked contract. */
|
|
80
52
|
.rf-hero[data-media-position="bottom"] {
|
|
81
53
|
display: block;
|
|
@@ -122,26 +94,3 @@
|
|
|
122
94
|
align-self: center;
|
|
123
95
|
justify-self: stretch;
|
|
124
96
|
}
|
|
125
|
-
|
|
126
|
-
/* Mobile: stack actions full-width so the code block and button line up. */
|
|
127
|
-
@media (max-width: 640px) {
|
|
128
|
-
.rf-hero__actions {
|
|
129
|
-
flex-direction: column;
|
|
130
|
-
align-items: stretch;
|
|
131
|
-
}
|
|
132
|
-
.rf-hero__actions pre {
|
|
133
|
-
width: 100%;
|
|
134
|
-
box-sizing: border-box;
|
|
135
|
-
}
|
|
136
|
-
.rf-hero ul,
|
|
137
|
-
.rf-hero nav {
|
|
138
|
-
flex-direction: column;
|
|
139
|
-
align-items: stretch;
|
|
140
|
-
}
|
|
141
|
-
.rf-hero li a,
|
|
142
|
-
.rf-hero nav a {
|
|
143
|
-
justify-content: center;
|
|
144
|
-
width: 100%;
|
|
145
|
-
box-sizing: border-box;
|
|
146
|
-
}
|
|
147
|
-
}
|
package/styles/runes/pricing.css
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
/* pricing — structure. The tiers grid, the tier flex-column (so CTAs drop to a
|
|
2
|
-
* common baseline via margin-top:auto), the preamble
|
|
3
|
-
* stretched-link, and list resets. All spacing, type, surface chrome, colour, and
|
|
2
|
+
* common baseline via margin-top:auto), the preamble layout, and list resets. All spacing, type, surface chrome, colour, and
|
|
4
3
|
* shadow stay skin (Lumina's styles/runes/pricing.css). */
|
|
5
4
|
|
|
6
5
|
.rf-pricing > header,
|
|
@@ -9,17 +8,6 @@
|
|
|
9
8
|
align-items: flex-start;
|
|
10
9
|
}
|
|
11
10
|
|
|
12
|
-
/* Linked eyebrow → pill with a stretched link (chrome is skin). */
|
|
13
|
-
.rf-pricing__eyebrow:has(a) {
|
|
14
|
-
display: inline-block;
|
|
15
|
-
position: relative;
|
|
16
|
-
}
|
|
17
|
-
.rf-pricing__eyebrow:has(a) a::before {
|
|
18
|
-
content: "";
|
|
19
|
-
position: absolute;
|
|
20
|
-
inset: 0;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
11
|
.rf-pricing__tiers,
|
|
24
12
|
.rf-pricing > ul[data-layout="grid"] {
|
|
25
13
|
display: grid;
|
package/styles/runes/reveal.css
CHANGED
|
@@ -1,17 +1,8 @@
|
|
|
1
|
-
/* reveal — structure. The
|
|
1
|
+
/* reveal — structure. The steps flex column, the
|
|
2
2
|
* hidden-step collapse (height/overflow), the metadata hide, and the control
|
|
3
3
|
* button flex. The animation (opacity/transform/transition), spacing, type,
|
|
4
4
|
* borders, and surface chrome are skin (Lumina's styles/runes/reveal.css). */
|
|
5
5
|
|
|
6
|
-
.rf-reveal__eyebrow:has(a) {
|
|
7
|
-
display: inline-block;
|
|
8
|
-
position: relative;
|
|
9
|
-
}
|
|
10
|
-
.rf-reveal__eyebrow:has(a) a::before {
|
|
11
|
-
content: "";
|
|
12
|
-
position: absolute;
|
|
13
|
-
inset: 0;
|
|
14
|
-
}
|
|
15
6
|
.rf-reveal__steps {
|
|
16
7
|
display: flex;
|
|
17
8
|
flex-direction: column;
|
package/styles/runes/section.css
CHANGED
|
@@ -1,23 +1,38 @@
|
|
|
1
|
-
/* section — structure. The column stack, the preamble flex
|
|
2
|
-
*
|
|
1
|
+
/* section — structure. The column stack, the preamble flex, the responsive image
|
|
2
|
+
* box, the full-width body, and the header alignment
|
|
3
3
|
* (align-items + auto-margins). Type, gaps, max-width, radii, and text-align are
|
|
4
|
-
* skin.
|
|
5
|
-
|
|
4
|
+
* skin.
|
|
5
|
+
*
|
|
6
|
+
* The split (`media-position`, SPEC-160 D2) is the shared layout's, keyed on
|
|
7
|
+
* `[data-media-position]` in layouts/split.css and the cover dimension. The
|
|
8
|
+
* column stack is `:where()` so it never outranks those attribute selectors,
|
|
9
|
+
* which this file loads after. */
|
|
10
|
+
:where(.rf-section) {
|
|
6
11
|
display: flex;
|
|
7
12
|
flex-direction: column;
|
|
8
13
|
}
|
|
9
|
-
.rf-
|
|
14
|
+
.rf-section__content {
|
|
10
15
|
display: flex;
|
|
11
16
|
flex-direction: column;
|
|
17
|
+
min-width: 0;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/* Intrinsic-height scale (SPEC-089), as on `card` — for cover sections. */
|
|
21
|
+
.rf-section[data-height="sm"] {
|
|
22
|
+
min-height: 12rem;
|
|
23
|
+
}
|
|
24
|
+
.rf-section[data-height="md"] {
|
|
25
|
+
min-height: 18rem;
|
|
26
|
+
}
|
|
27
|
+
.rf-section[data-height="lg"] {
|
|
28
|
+
min-height: 26rem;
|
|
12
29
|
}
|
|
13
|
-
.rf-
|
|
14
|
-
|
|
15
|
-
position: relative;
|
|
30
|
+
.rf-section[data-height="xl"] {
|
|
31
|
+
min-height: 34rem;
|
|
16
32
|
}
|
|
17
|
-
.rf-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
inset: 0;
|
|
33
|
+
.rf-section__preamble {
|
|
34
|
+
display: flex;
|
|
35
|
+
flex-direction: column;
|
|
21
36
|
}
|
|
22
37
|
.rf-section__image {
|
|
23
38
|
max-width: 100%;
|
|
@@ -34,3 +49,48 @@
|
|
|
34
49
|
align-items: flex-end;
|
|
35
50
|
margin-inline-start: auto;
|
|
36
51
|
}
|
|
52
|
+
|
|
53
|
+
/* The section's `align` positions its own actions row too (SPEC-160 D7), whether
|
|
54
|
+
* it sits in the body or the content column — never an `actions` inside a
|
|
55
|
+
* nested rune, which has its own alignment. */
|
|
56
|
+
.rf-section[data-align="center"] > .rf-section__body > .rf-actions,
|
|
57
|
+
.rf-section[data-align="center"] > .rf-section__content > .rf-section__body > .rf-actions {
|
|
58
|
+
--actions-justify: center;
|
|
59
|
+
}
|
|
60
|
+
.rf-section[data-align="end"] > .rf-section__body > .rf-actions,
|
|
61
|
+
.rf-section[data-align="end"] > .rf-section__content > .rf-section__body > .rf-actions {
|
|
62
|
+
--actions-justify: flex-end;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/* Cover band (SPEC-160 D7). A section is a page band, not a card: in cover mode
|
|
66
|
+
* its height comes from its content and `height` / `aspect`, never from the
|
|
67
|
+
* cover layer's portrait default, and an unplaced overlay sits mid-band. These
|
|
68
|
+
* win over the shared cover layer (dimensions/cover.css) by specificity. */
|
|
69
|
+
.rf-section--cover[data-media-position="cover"] {
|
|
70
|
+
--cover-aspect: auto;
|
|
71
|
+
container-type: normal;
|
|
72
|
+
min-height: clamp(22rem, 55vh, 40rem);
|
|
73
|
+
}
|
|
74
|
+
.rf-section--cover[data-media-position="cover"][data-aspect] {
|
|
75
|
+
min-height: 0;
|
|
76
|
+
}
|
|
77
|
+
.rf-section--cover[data-media-position="cover"][data-height="sm"] {
|
|
78
|
+
min-height: 12rem;
|
|
79
|
+
}
|
|
80
|
+
.rf-section--cover[data-media-position="cover"][data-height="md"] {
|
|
81
|
+
min-height: 18rem;
|
|
82
|
+
}
|
|
83
|
+
.rf-section--cover[data-media-position="cover"][data-height="lg"] {
|
|
84
|
+
min-height: 26rem;
|
|
85
|
+
}
|
|
86
|
+
.rf-section--cover[data-media-position="cover"][data-height="xl"] {
|
|
87
|
+
min-height: 34rem;
|
|
88
|
+
}
|
|
89
|
+
.rf-section--cover[data-media-position="cover"]:is(
|
|
90
|
+
[data-content-place="auto"],
|
|
91
|
+
:not([data-content-place])
|
|
92
|
+
)
|
|
93
|
+
> [data-name="content"] {
|
|
94
|
+
align-self: center;
|
|
95
|
+
justify-self: stretch;
|
|
96
|
+
}
|
package/styles/runes/steps.css
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
/* steps — structure. The step counter mechanism, the step item positioning, the
|
|
2
|
-
* counter-badge box placement, the preamble
|
|
3
|
-
* resets, and the media-position flip. All spacing, type, surface, and the badge
|
|
2
|
+
* counter-badge box placement, the preamble layout, list resets, and the media-position flip. All spacing, type, surface, and the badge
|
|
4
3
|
* chrome stay skin (Lumina's styles/runes/steps.css). */
|
|
5
4
|
|
|
6
5
|
.rf-steps {
|
|
@@ -12,17 +11,6 @@
|
|
|
12
11
|
align-items: flex-start;
|
|
13
12
|
}
|
|
14
13
|
|
|
15
|
-
/* Linked eyebrow → pill with a stretched link (chrome is skin). */
|
|
16
|
-
.rf-steps__eyebrow:has(a) {
|
|
17
|
-
display: inline-block;
|
|
18
|
-
position: relative;
|
|
19
|
-
}
|
|
20
|
-
.rf-steps__eyebrow:has(a) a::before {
|
|
21
|
-
content: "";
|
|
22
|
-
position: absolute;
|
|
23
|
-
inset: 0;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
14
|
.rf-steps ol {
|
|
27
15
|
list-style: none;
|
|
28
16
|
}
|
package/styles/runes/tabs.css
CHANGED
|
@@ -1,19 +1,9 @@
|
|
|
1
|
-
/* tabs — structure. The
|
|
1
|
+
/* tabs — structure. The scrollable tab strip (display
|
|
2
2
|
* + overflow), and the tab-button flex. The strip's `display: flex` is what
|
|
3
3
|
* guest-posture's hide rule overrides — now both skeleton, resolved by specificity.
|
|
4
4
|
* Type, colour, borders, spacing, and the active treatment are skin (Lumina's
|
|
5
5
|
* styles/runes/tabs.css). */
|
|
6
6
|
|
|
7
|
-
.rf-tabs__eyebrow:has(a) {
|
|
8
|
-
display: inline-block;
|
|
9
|
-
position: relative;
|
|
10
|
-
}
|
|
11
|
-
.rf-tabs__eyebrow:has(a) a::before {
|
|
12
|
-
content: "";
|
|
13
|
-
position: absolute;
|
|
14
|
-
inset: 0;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
7
|
/* Tab bar — the scrollable strip. */
|
|
18
8
|
.rf-tabs__tabs {
|
|
19
9
|
display: flex;
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
/* page-section — structure. The split two-column grid (+ mobile collapse). Padding,
|
|
2
|
-
* heading resets, and the gap are skin. */
|
|
3
|
-
.rf-page-section--split {
|
|
4
|
-
display: grid;
|
|
5
|
-
grid-template-columns: 1fr 1fr;
|
|
6
|
-
align-items: start;
|
|
7
|
-
}
|
|
8
|
-
@media (max-width: 768px) {
|
|
9
|
-
.rf-page-section--split {
|
|
10
|
-
grid-template-columns: 1fr;
|
|
11
|
-
}
|
|
12
|
-
}
|