@refrakt-md/lumina 0.44.0 → 0.45.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.
@@ -160,7 +160,8 @@
160
160
  "quiet",
161
161
  "normal",
162
162
  "prominent",
163
- "display"
163
+ "display",
164
+ "marquee"
164
165
  ],
165
166
  "dataAttributes": [
166
167
  "data-prominence"
@@ -7671,7 +7672,7 @@
7671
7672
  "scope": "child"
7672
7673
  },
7673
7674
  {
7674
- "source": "track-artist",
7675
+ "source": "artist",
7675
7676
  "property": "byArtist",
7676
7677
  "kind": "property",
7677
7678
  "entity": "track",
@@ -7685,7 +7686,7 @@
7685
7686
  "scope": "child"
7686
7687
  },
7687
7688
  {
7688
- "source": "track-meta",
7689
+ "source": "date",
7689
7690
  "property": "datePublished",
7690
7691
  "kind": "property",
7691
7692
  "entity": "track",
@@ -7725,8 +7726,30 @@
7725
7726
  "dataRune": "track",
7726
7727
  "parent": "Playlist",
7727
7728
  "childOrder": [
7729
+ "ordinal",
7730
+ "track-name",
7731
+ "details",
7728
7732
  "{content}"
7729
7733
  ],
7734
+ "modifiers": {
7735
+ "meta": {
7736
+ "source": "meta",
7737
+ "default": "row",
7738
+ "dataAttribute": "data-meta"
7739
+ },
7740
+ "artist": {
7741
+ "source": "meta",
7742
+ "dataAttribute": "data-artist"
7743
+ },
7744
+ "duration": {
7745
+ "source": "meta",
7746
+ "dataAttribute": "data-duration"
7747
+ },
7748
+ "date": {
7749
+ "source": "meta",
7750
+ "dataAttribute": "data-date"
7751
+ }
7752
+ },
7730
7753
  "universalAxes": {
7731
7754
  "axes": {
7732
7755
  "tint": {
@@ -7752,6 +7775,100 @@
7752
7775
  "frame": "this rune declares neither a `frameTarget` nor a media section"
7753
7776
  }
7754
7777
  },
7778
+ "elements": {
7779
+ "details": {
7780
+ "tag": "div",
7781
+ "selector": ".rf-track__details",
7782
+ "source": "block",
7783
+ "layout": "bar",
7784
+ "fields": [
7785
+ "artist",
7786
+ "duration",
7787
+ "date"
7788
+ ]
7789
+ }
7790
+ },
7791
+ "variants": {
7792
+ "meta": {
7793
+ "byline": {
7794
+ "block": "track",
7795
+ "root": ".rf-track",
7796
+ "dataRune": "track",
7797
+ "parent": "Playlist",
7798
+ "childOrder": [
7799
+ "ordinal",
7800
+ "heading",
7801
+ "{content}"
7802
+ ],
7803
+ "modifiers": {
7804
+ "meta": {
7805
+ "source": "meta",
7806
+ "default": "row",
7807
+ "dataAttribute": "data-meta"
7808
+ },
7809
+ "artist": {
7810
+ "source": "meta",
7811
+ "dataAttribute": "data-artist"
7812
+ },
7813
+ "duration": {
7814
+ "source": "meta",
7815
+ "dataAttribute": "data-duration"
7816
+ },
7817
+ "date": {
7818
+ "source": "meta",
7819
+ "dataAttribute": "data-date"
7820
+ }
7821
+ },
7822
+ "universalAxes": {
7823
+ "axes": {
7824
+ "tint": {
7825
+ "selectors": [
7826
+ ".rf-track--tinted"
7827
+ ]
7828
+ },
7829
+ "elevation": {
7830
+ "default": "flat"
7831
+ },
7832
+ "bg": {
7833
+ "selectors": [
7834
+ ".rf-track--has-bg"
7835
+ ]
7836
+ }
7837
+ },
7838
+ "unavailable": {
7839
+ "reading": "this rune declares no prose body",
7840
+ "dropcap": "this rune declares no prose body",
7841
+ "prominence": "this rune has no page-section header",
7842
+ "content-place": "this rune declares no `content-place` modifier",
7843
+ "cover": "this rune declares no `media-position` modifier, so it cannot enter cover mode",
7844
+ "frame": "this rune declares neither a `frameTarget` nor a media section"
7845
+ }
7846
+ },
7847
+ "elements": {
7848
+ "details": {
7849
+ "tag": "div",
7850
+ "selector": ".rf-track__details",
7851
+ "source": "block",
7852
+ "layout": "bar",
7853
+ "fields": [
7854
+ "artist",
7855
+ "date",
7856
+ "duration"
7857
+ ]
7858
+ },
7859
+ "heading": {
7860
+ "tag": "div",
7861
+ "selector": ".rf-track__heading",
7862
+ "source": "layout",
7863
+ "children": [
7864
+ "track-name",
7865
+ "details"
7866
+ ]
7867
+ }
7868
+ }
7869
+ }
7870
+ }
7871
+ },
7755
7872
  "schemaOrg": {
7756
7873
  "type": "MusicRecording",
7757
7874
  "by": "type",
@@ -7777,7 +7894,7 @@
7777
7894
  "kind": "property"
7778
7895
  },
7779
7896
  {
7780
- "source": "datePublished",
7897
+ "source": "date",
7781
7898
  "property": "datePublished",
7782
7899
  "kind": "property"
7783
7900
  },
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@refrakt-md/lumina",
3
3
  "description": "Lumina theme for refrakt.md — design tokens, CSS, identity transform, and layout configs",
4
- "version": "0.44.0",
4
+ "version": "0.45.0",
5
5
  "type": "module",
6
6
  "license": "MIT",
7
7
  "repository": {
@@ -86,10 +86,10 @@
86
86
  "generate-tokens": "node scripts/generate-tokens.mjs"
87
87
  },
88
88
  "dependencies": {
89
- "@refrakt-md/runes": "0.44.0",
90
- "@refrakt-md/skeleton": "0.44.0",
91
- "@refrakt-md/transform": "0.44.0",
92
- "@refrakt-md/types": "0.44.0"
89
+ "@refrakt-md/runes": "0.45.0",
90
+ "@refrakt-md/skeleton": "0.45.0",
91
+ "@refrakt-md/transform": "0.45.0",
92
+ "@refrakt-md/types": "0.45.0"
93
93
  },
94
94
  "devDependencies": {
95
95
  "postcss": "^8.4.0"
@@ -45,6 +45,12 @@
45
45
  * `data-density` and `data-prominence` still keeps its own. */
46
46
  [data-density] {
47
47
  --rf-prominence-size: initial;
48
+ --rf-prominence-blurb-size: initial;
49
+ --rf-prominence-header-scale: initial;
50
+ --rf-prominence-band-padding: initial;
51
+ --rf-prominence-title-gradient: initial;
52
+ --rf-prominence-header-measure: initial;
53
+ --rf-prominence-blurb-measure: initial;
48
54
  }
49
55
 
50
56
  [data-density="minimal"] [data-section="description"] {
@@ -90,8 +90,11 @@
90
90
  /* ─── Layout: lead — emphasis ──────────────────────────────────────── */
91
91
  /* The column is structure (skeleton); the lead's weight and the secondary
92
92
  * values' size and colour are skin. */
93
+ /* A byline is fine print: the whole block is set small, the lead
94
+ * distinguished by weight and colour, as a testimonial's always was. */
93
95
  [data-zone-layout="lead"] {
94
96
  gap: 0.125rem;
97
+ font-size: var(--rf-text-sm);
95
98
  }
96
99
 
97
100
  /* Emphasised by weight alone: a lead is often a `<cite>`, whose italic would
@@ -103,7 +106,6 @@
103
106
  }
104
107
 
105
108
  [data-zone-layout="lead"] > :not([data-lead]) {
106
- font-size: var(--rf-text-sm);
107
109
  color: var(--rf-color-muted);
108
110
  }
109
111
 
@@ -65,11 +65,28 @@
65
65
  line-height: var(--rf-leading-tight);
66
66
  color: var(--rf-color-text);
67
67
  margin: 0;
68
+ /* SPEC-183 D4 — a step that turns the gradient on sets
69
+ * --rf-prominence-title-gradient to nothing, so these read as written;
70
+ * unset (or cleared at a rune root), the var() is invalid and each property
71
+ * falls back to its initial value: no image, no clip, the title's colour.
72
+ * Built here, from the title's own colours. */
73
+ background-image: var(--rf-prominence-title-gradient)
74
+ linear-gradient(135deg, var(--rf-color-text) 0%, var(--rf-color-muted) 100%);
75
+ -webkit-background-clip: var(--rf-prominence-title-gradient) text;
76
+ background-clip: var(--rf-prominence-title-gradient) text;
77
+ -webkit-text-fill-color: var(--rf-prominence-title-gradient) transparent;
78
+ }
79
+ @media (forced-colors: active) {
80
+ [data-section="title"] {
81
+ background-image: none;
82
+ -webkit-text-fill-color: currentColor;
83
+ }
68
84
  }
69
85
 
70
86
  /* ─── Description: secondary text ─────────────────────────────────── */
71
87
  [data-section="description"] {
72
- font-size: var(--rf-text);
88
+ font-size: var(--rf-prominence-blurb-size, var(--rf-text));
89
+ max-width: var(--rf-prominence-blurb-measure, none);
73
90
  line-height: var(--rf-leading-normal);
74
91
  color: var(--rf-color-muted);
75
92
  margin: var(--rf-spacing-xs) 0 var(--rf-spacing-md);
@@ -1,12 +1,12 @@
1
1
  @layer skin {
2
2
  /* === Sequential Items — skin ===
3
3
  * The connector lines (borders), the marker chrome (fill, radius, shadow), the
4
- * counter type, and the layout gaps. The counter mechanism, list resets, item
4
+ * ordinal's type, and the layout gaps. The list resets, item
5
5
  * geometry, and marker box placement live in @refrakt-md/skeleton
6
6
  * (dimensions/sequence.css). */
7
7
 
8
- /* Numbered — counter circle chrome + type. */
9
- [data-sequence="numbered"] > li::before {
8
+ /* Numbered — the ordinal's circle chrome + type (WORK-583). */
9
+ [data-sequence="numbered"] > li > [data-name="ordinal"] {
10
10
  font-size: var(--rf-text-xs);
11
11
  font-weight: var(--rf-weight-bold);
12
12
  font-variant-numeric: tabular-nums;
@@ -19,6 +19,24 @@
19
19
  border-top: 1px solid var(--rf-color-border);
20
20
  }
21
21
 
22
+ /* A numbered ladder's step (SPEC-156 D3): a composition's steps take the
23
+ * rhythm the native howto, recipe and steps give theirs — the item padded,
24
+ * its title flush with the ordinal, its text set small. */
25
+ [data-zone-layout="ladder"][data-sequence="numbered"] {
26
+ margin: 0;
27
+ }
28
+ [data-zone-layout="ladder"][data-sequence="numbered"] > li {
29
+ padding-block: 0.625rem;
30
+ }
31
+ [data-zone-layout="ladder"][data-sequence="numbered"] > li > :is(h1, h2, h3, h4, h5, h6) {
32
+ margin-top: 0;
33
+ margin-bottom: 0.375rem;
34
+ }
35
+ [data-zone-layout="ladder"][data-sequence="numbered"] > li p {
36
+ font-size: var(--rf-text-sm);
37
+ line-height: var(--rf-leading-relaxed);
38
+ }
39
+
22
40
  /* Connected vertical — the line is a left border; the dot is the marker. */
23
41
  [data-sequence="connected"] > li {
24
42
  border-left: 2px solid var(--rf-color-border);
@@ -52,7 +70,7 @@
52
70
  /* === Density interaction === */
53
71
 
54
72
  /* Compact: smaller circle keeps the same type scale. */
55
- [data-density="compact"] [data-sequence="numbered"] > li::before {
73
+ [data-density="compact"] [data-sequence="numbered"] > li > [data-name="ordinal"] {
56
74
  font-size: var(--rf-text-xs);
57
75
  }
58
76
 
@@ -83,7 +83,7 @@
83
83
  * --rune-padding). Replaces the old inline/banner padding buckets; banner runes
84
84
  * that want a more generous band declare their own `padding-block`. */
85
85
  [data-elevation="flush"] {
86
- padding-block: var(--rune-padding, var(--rf-spacing-sm));
86
+ padding-block: var(--rf-prominence-band-padding, var(--rune-padding, var(--rf-spacing-sm)));
87
87
  }
88
88
 
89
89
  /* ─── Prominence: page-section-header type register ───────────────────
@@ -116,6 +116,99 @@
116
116
  [data-prominence="display"] {
117
117
  --rf-prominence-size: calc(var(--rf-title-size, var(--rf-text-2xl)) * 5 / 3);
118
118
  }
119
+ /* SPEC-183 D1 — a landing page's opening band: 3.25rem from the 1.5rem default. */
120
+ [data-prominence="marquee"] {
121
+ --rf-prominence-size: calc(var(--rf-title-size, var(--rf-text-2xl)) * 13 / 6);
122
+ }
123
+ /* On a phone the loud steps ramp smaller, so a long word fits the line:
124
+ * marquee 2.5rem, display 2rem from the default (WORK-690). */
125
+ @container (max-width: 640px) {
126
+ [data-prominence="display"] {
127
+ --rf-prominence-size: calc(var(--rf-title-size, var(--rf-text-2xl)) * 4 / 3);
128
+ }
129
+ [data-prominence="marquee"] {
130
+ --rf-prominence-size: calc(var(--rf-title-size, var(--rf-text-2xl)) * 5 / 3);
131
+ }
132
+ }
133
+
134
+ /* ─── Prominence: the rest of the header, and the band (SPEC-183 D2–D4) ──
135
+ * A step sizes the whole header, not just its title. Each value is a custom
136
+ * property, cleared at every rune root in density.css with
137
+ * --rf-prominence-size, so a card nested in a marquee band keeps its own.
138
+ * `normal` and `quiet` set nothing: a section at rest looks as it did.
139
+ *
140
+ * --rf-prominence-blurb-size the description's type size
141
+ * --rf-prominence-header-scale multiplies the header's gaps (title → blurb,
142
+ * header → what follows)
143
+ * --rf-prominence-band-padding a flush band's block padding (D3)
144
+ * --rf-prominence-header-measure, the header's and the blurb's max-width
145
+ * --rf-prominence-blurb-measure
146
+ * --rf-prominence-title-gradient a switch (empty when on, unset when off):
147
+ * the title draws Lumina's gradient (D4) */
148
+ [data-prominence="prominent"] {
149
+ --rf-prominence-blurb-size: var(--rf-text-lg);
150
+ --rf-prominence-header-scale: 1.25;
151
+ }
152
+ [data-prominence="display"] {
153
+ --rf-prominence-blurb-size: var(--rf-text-lg);
154
+ --rf-prominence-header-scale: 2;
155
+ --rf-prominence-band-padding: 3.5rem 3rem;
156
+ }
157
+ [data-prominence="marquee"] {
158
+ --rf-prominence-blurb-size: var(--rf-text-xl);
159
+ --rf-prominence-header-scale: 2;
160
+ --rf-prominence-band-padding: 7rem 6.5rem;
161
+ }
162
+ /* A loud title is set wider than the reading measure (it would wrap at 65ch
163
+ * of body type), and its blurb carries the measure instead: the plugin hero's
164
+ * and cta's 40rem. */
165
+ :is([data-prominence="display"], [data-prominence="marquee"]) {
166
+ --rf-prominence-header-measure: 100%;
167
+ --rf-prominence-blurb-measure: 40rem;
168
+ }
169
+ /* The loud steps' titles are Lumina's gradient, as the plugin hero's and
170
+ * cta's were. A switch, not the gradient itself: a custom property's var()s
171
+ * resolve where it is declared, so a gradient built here would keep this
172
+ * band's colours on a title whose own differ (a cover band's light-on-dark
173
+ * content). The title builds it from its own colours. */
174
+ :is([data-prominence="display"], [data-prominence="marquee"]) {
175
+ --rf-prominence-title-gradient: ;
176
+ }
177
+ /* The band's inline padding, the plugin hero's and cta's 2rem. A page that
178
+ * bleeds the band full width replaces it with its gutter (layouts/default.css). */
179
+ [data-elevation="flush"]:is([data-prominence="display"], [data-prominence="marquee"]) {
180
+ padding-inline: 2rem;
181
+ }
182
+ /* A cover band keeps its media well flush: the padding moves onto the
183
+ * overlaid content (D3). */
184
+ [data-elevation="flush"][data-media-position="cover"]:is(
185
+ [data-prominence="display"],
186
+ [data-prominence="marquee"]
187
+ ) {
188
+ padding: 0;
189
+ }
190
+ [data-elevation="flush"][data-media-position="cover"]:is(
191
+ [data-prominence="display"],
192
+ [data-prominence="marquee"]
193
+ )
194
+ > [data-name="content"] {
195
+ padding-block: var(--rf-prominence-band-padding);
196
+ padding-inline: 2rem;
197
+ }
198
+ /* On a phone the overlay's band padding would eat most of the well, so a cover
199
+ * band tightens it, as the plugin hero's did. An uncovered band keeps it. */
200
+ @media (max-width: 640px) {
201
+ [data-elevation="flush"][data-media-position="cover"][data-prominence="display"]
202
+ > [data-name="content"] {
203
+ padding-block: 2.5rem 2rem;
204
+ padding-inline: 1.25rem;
205
+ }
206
+ [data-elevation="flush"][data-media-position="cover"][data-prominence="marquee"]
207
+ > [data-name="content"] {
208
+ padding-block: 3.5rem 3rem;
209
+ padding-inline: 1.25rem;
210
+ }
211
+ }
119
212
 
120
213
  /* ─── Media slot shares the surface chrome ───────────────────────────
121
214
  * When a `flat` surface wraps a cover `[data-section="media"]` slot, the slot
@@ -64,6 +64,19 @@
64
64
  calc((100% - var(--rf-content-max, 80rem)) / 2)
65
65
  );
66
66
  }
67
+ /* A composed rune's root is an empty, block-less wrapper (no class, SPEC-145
68
+ * D2) around the runes it places; its paint carrier is the band a reader sees,
69
+ * whose background, cover well and surface fill the bleed. So the gutter moves
70
+ * inside it. */
71
+ .rf-page-content > article > [data-width="full"][data-rune]:not([class]) {
72
+ padding-inline: 0;
73
+ }
74
+ .rf-page-content > article > [data-width="full"][data-rune]:not([class]) > [data-rune] {
75
+ padding-inline: max(
76
+ var(--rf-content-gutter, 1.5rem),
77
+ calc((100% - var(--rf-content-max, 80rem)) / 2)
78
+ );
79
+ }
67
80
  /* Page sections (data-content-measure="anchored") keep their content at the
68
81
  * text measure when bled to the wide track — only the surface/background
69
82
  * widens, matching how `full` reads as a band. The absolutely-positioned bg
@@ -1,9 +1,9 @@
1
1
  @layer skin {
2
- /* Button size by the enclosing rune's prominence (SPEC-160 D7): `display` and
3
- * `prominent` give the large size, today's hero buttons; anything else falls
2
+ /* Button size by the enclosing rune's prominence (SPEC-160 D7, SPEC-183 D5):
3
+ * `marquee` gives the large size, today's hero buttons; anything else falls
4
4
  * back to the defaults below, today's cta buttons. The skeleton clears these at
5
5
  * every other rune root, so they never reach an `actions` inside a nested rune. */
6
- :is([data-prominence="display"], [data-prominence="prominent"]) {
6
+ [data-prominence="marquee"] {
7
7
  --action-padding: 0.7rem 1.75rem;
8
8
  --action-font-size: var(--rf-text);
9
9
  }
@@ -5,6 +5,12 @@
5
5
  --rf-title-size: var(--rf-text-4xl);
6
6
  padding: 3.5rem 2rem 3rem;
7
7
  }
8
+ /* On a phone the headline steps down, as a composed cta's display does. */
9
+ @container (max-width: 640px) {
10
+ .rf-cta {
11
+ --rf-title-size: 2rem;
12
+ }
13
+ }
8
14
  .rf-cta .rf-cta__preamble,
9
15
  .rf-cta > h1,
10
16
  .rf-cta > h2,
@@ -15,6 +15,12 @@
15
15
  background-size: cover;
16
16
  background-position: center;
17
17
  }
18
+ /* On a phone the headline steps down, as a composed hero's marquee does. */
19
+ @container (max-width: 640px) {
20
+ .rf-hero {
21
+ --rf-title-size: 2.5rem;
22
+ }
23
+ }
18
24
  .rf-hero__preamble {
19
25
  gap: 0.25rem;
20
26
  margin-bottom: 2rem;
@@ -18,26 +18,16 @@
18
18
  color: var(--rf-color-primary);
19
19
  }
20
20
 
21
- /* Steps — numbered with styled counters */
21
+ /* Steps — the number, its circle and the rule between steps are the
22
+ * sequence dimension's ([data-sequence="numbered"], BUG-024); the rune sets
23
+ * only the rows' spacing. */
22
24
  .rf-howto__content ol {
23
- padding-left: 0;
24
25
  margin: 0;
25
26
  }
26
27
  .rf-howto__content ol > li {
27
- padding: 0.625rem 0;
28
- padding-left: 2.25rem;
28
+ padding-block: 0.625rem;
29
29
  line-height: var(--rf-leading-relaxed);
30
30
  }
31
- .rf-howto__content ol > li + li {
32
- border-top: 1px solid var(--rf-color-border);
33
- }
34
- .rf-howto__content ol > li::before {
35
- font-size: var(--rf-text-xs);
36
- font-weight: var(--rf-weight-bold);
37
- color: var(--rf-color-primary);
38
- background: var(--rf-color-surface);
39
- border-radius: var(--rf-radius-full);
40
- }
41
31
 
42
32
  .rf-howto__content ol > li > p,
43
33
  .rf-howto__content ul > li > p {
@@ -69,7 +69,7 @@
69
69
  .rf-playlist__tracks > li:hover {
70
70
  background: color-mix(in srgb, var(--rf-color-border) 15%, transparent);
71
71
  }
72
- .rf-playlist__tracks > li::before {
72
+ .rf-playlist__tracks > li > [data-name="ordinal"] {
73
73
  font-size: var(--rf-text-xs);
74
74
  font-variant-numeric: tabular-nums;
75
75
  color: var(--rf-color-muted);
@@ -87,35 +87,8 @@
87
87
  white-space: nowrap;
88
88
  }
89
89
 
90
- /* Track artist */
91
- .rf-playlist__tracks [data-name="track-artist"] {
92
- font-size: var(--rf-text-sm);
93
- color: var(--rf-color-muted);
94
- }
95
- .rf-playlist__tracks [data-name="track-artist"]::before {
96
- content: "\00b7";
97
- margin-right: 0.5rem;
98
- opacity: 0.5;
99
- }
100
-
101
- /* Track duration — pushed right */
102
- .rf-playlist__tracks [data-name="track-duration"] {
103
- font-size: var(--rf-text-sm);
104
- color: var(--rf-color-muted);
105
- font-variant-numeric: tabular-nums;
106
- text-align: right;
107
- }
108
-
109
- /* Track meta (date etc.) */
110
- .rf-playlist__tracks [data-name="track-meta"] {
111
- font-size: var(--rf-text-xs);
112
- color: var(--rf-color-muted);
113
- }
114
- .rf-playlist__tracks [data-name="track-meta"]::before {
115
- content: "\00b7";
116
- margin-right: 0.5rem;
117
- opacity: 0.5;
118
- }
90
+ /* The artist, running time and date are every track's details block
91
+ * (WORK-679), styled once in track.css for both track forms. */
119
92
 
120
93
  /* Player area */
121
94
  .rf-playlist__player {
@@ -73,19 +73,6 @@
73
73
  letter-spacing: var(--rf-tracking-normal);
74
74
  }
75
75
 
76
- /* Reset inner blockquote — global blockquote styles shouldn't apply here */
77
- .rf-pullquote blockquote {
78
- border: none;
79
- background: none;
80
- padding: 0;
81
- margin: 0;
82
- border-radius: 0;
83
- color: inherit;
84
- }
85
- .rf-pullquote blockquote::before {
86
- display: none;
87
- }
88
-
89
76
  /* Responsive — floated quotes become full-width on mobile */
90
77
  @media (max-width: 768px) {
91
78
  .rf-pullquote[data-align="left"],
@@ -78,26 +78,16 @@
78
78
  color: var(--rf-color-primary);
79
79
  }
80
80
 
81
- /* Steps — numbered with styled counters */
81
+ /* Steps — the number, its circle and the rule between steps are the
82
+ * sequence dimension's ([data-sequence="numbered"], BUG-024); the rune sets
83
+ * only the rows' spacing. */
82
84
  .rf-recipe__content ol {
83
- padding-left: 0;
84
85
  margin: 0;
85
86
  }
86
87
  .rf-recipe__content ol > li {
87
- padding: 0.625rem 0;
88
- padding-left: 2.25rem;
88
+ padding-block: 0.625rem;
89
89
  line-height: var(--rf-leading-relaxed);
90
90
  }
91
- .rf-recipe__content ol > li + li {
92
- border-top: 1px solid var(--rf-color-border);
93
- }
94
- .rf-recipe__content ol > li::before {
95
- font-size: var(--rf-text-xs);
96
- font-weight: var(--rf-weight-bold);
97
- color: var(--rf-color-primary);
98
- background: var(--rf-color-surface);
99
- border-radius: var(--rf-radius-full);
100
- }
101
91
 
102
92
  .rf-recipe__content ol > li > p,
103
93
  .rf-recipe__content ul > li > p {
@@ -2,13 +2,14 @@
2
2
  /* Section — a generic page section: an eyebrow/headline/blurb header above
3
3
  arbitrary body content. Header styling mirrors the shared page-section look
4
4
  (reveal/feature); the body is content-agnostic and full width. */
5
+ /* The header-to-body rhythm widens with the prominence step (SPEC-183 D2). */
5
6
  .rf-section {
6
- gap: 1.5rem;
7
+ gap: calc(1.5rem * var(--rf-prominence-header-scale, 1));
7
8
  }
8
9
 
9
10
  /* With a split, the content column keeps the header-to-body rhythm. */
10
11
  .rf-section__content {
11
- gap: 1.5rem;
12
+ gap: calc(1.5rem * var(--rf-prominence-header-scale, 1));
12
13
  }
13
14
  .rf-section__footer {
14
15
  padding-top: var(--rf-spacing-sm);
@@ -27,8 +28,10 @@
27
28
  /* Block margins only: the skeleton's inline auto-margins centre or end-align
28
29
  * the header, and a `margin: 0` here would cancel them. */
29
30
  .rf-section__preamble {
30
- gap: 0.5rem;
31
- max-width: var(--rf-measure, 65ch);
31
+ gap: calc(0.5rem * var(--rf-prominence-header-scale, 1));
32
+ /* Never wider than the column: a word longer than the line then overflows
33
+ * evenly around a centred header rather than pushing it off the end. */
34
+ max-width: min(var(--rf-prominence-header-measure, var(--rf-measure, 65ch)), 100%);
32
35
  margin-block: 0;
33
36
  }
34
37
  .rf-section__eyebrow {
@@ -1,6 +1,6 @@
1
1
  @layer skin {
2
- /* Steps — skin. The counter mechanism, step item layout, badge box placement, and
3
- * media-position flip live in @refrakt-md/skeleton (styles/runes/steps.css). */
2
+ /* Steps — skin. The step numbers, their circle and the rule between steps are
3
+ * the sequence dimension's (BUG-024); the media-position flip is skeleton's. */
4
4
  .rf-steps__preamble {
5
5
  gap: 0.25rem;
6
6
  margin-bottom: 1.5rem;
@@ -18,25 +18,14 @@
18
18
  .rf-steps__image {
19
19
  margin-bottom: 1rem;
20
20
  }
21
- .rf-steps ol {
21
+ .rf-steps__steps {
22
22
  padding-left: 0;
23
23
  margin: 0;
24
24
  }
25
25
 
26
26
  /* Individual step — borderless, matching recipe */
27
27
  .rf-step {
28
- padding: 0.625rem 0 0.625rem 2.25rem;
29
- }
30
- .rf-step + .rf-step {
31
- border-top: 1px solid var(--rf-color-border);
32
- }
33
- .rf-step::before {
34
- background: var(--rf-color-surface);
35
- color: var(--rf-color-primary);
36
- border-radius: var(--rf-radius-full);
37
- font-weight: var(--rf-weight-bold);
38
- font-size: var(--rf-text-xs);
39
- font-variant-numeric: tabular-nums;
28
+ padding-block: 0.625rem;
40
29
  }
41
30
  .rf-step h1,
42
31
  .rf-step h2,
@@ -5,17 +5,9 @@
5
5
  padding: 0.75rem 1.25rem;
6
6
  transition: background 0.15s ease;
7
7
  }
8
- .rf-track + .rf-track {
9
- border-top: 1px solid var(--rf-color-border);
10
- }
11
8
  .rf-track:hover {
12
9
  background: color-mix(in srgb, var(--rf-color-border) 15%, transparent);
13
10
  }
14
- .rf-track::before {
15
- font-size: var(--rf-text-xs);
16
- color: var(--rf-color-primary);
17
- text-align: right;
18
- }
19
11
 
20
12
  /* Track name — primary text, takes remaining space */
21
13
  .rf-track__track-name {
@@ -26,36 +18,45 @@
26
18
  white-space: nowrap;
27
19
  }
28
20
 
29
- /* Artist — secondary text with dot separator */
30
- .rf-track__track-artist {
21
+ /* Details (WORK-679) — the artist, running time and date. */
22
+ .rf-track__details > [data-field] {
31
23
  font-size: var(--rf-text-sm);
32
24
  color: var(--rf-color-muted);
33
25
  }
34
- .rf-track__track-artist::before {
35
- content: "\00b7";
36
- margin-right: 0.5rem;
37
- opacity: 0.5;
38
- }
39
-
40
- /* Duration — pushed right, tabular nums */
41
- .rf-track__track-duration {
42
- font-size: var(--rf-text-sm);
43
- color: var(--rf-color-muted);
26
+ .rf-track__details > [data-field="duration"] {
44
27
  font-variant-numeric: tabular-nums;
28
+ }
29
+ .rf-track[data-meta="row"] > .rf-track__details > [data-field="duration"] {
45
30
  text-align: right;
46
31
  }
47
-
48
- /* Meta (date etc.) — dot separator */
49
- .rf-track__track-meta {
32
+ /* In the row the artist and date open with a dot; the duration, pushed to
33
+ * the end, needs none. */
34
+ .rf-track[data-meta="row"] > .rf-track__details > [data-field="date"] {
50
35
  font-size: var(--rf-text-xs);
51
- color: var(--rf-color-muted);
52
36
  }
53
- .rf-track__track-meta::before {
37
+ .rf-track[data-meta="row"]
38
+ > .rf-track__details
39
+ > :is([data-field="artist"], [data-field="date"])::before,
40
+ /* As a byline, a dot between each value and the one before it. */
41
+ .rf-track[data-meta="byline"]
42
+ .rf-track__details
43
+ > [data-field]
44
+ + [data-field]::before {
54
45
  content: "\00b7";
55
46
  margin-right: 0.5rem;
56
47
  opacity: 0.5;
57
48
  }
58
49
 
50
+ /* Byline — the details sit beneath the name, which has the line to itself
51
+ * and so may wrap rather than be cut short. */
52
+ .rf-track[data-meta="byline"] .rf-track__heading > .rf-track__track-name {
53
+ white-space: normal;
54
+ }
55
+ .rf-track__heading > .rf-track__details {
56
+ gap: 0 0.5rem;
57
+ margin-top: 0.125rem;
58
+ }
59
+
59
60
  /* Description — full width below the row */
60
61
  .rf-track__track-description {
61
62
  font-size: var(--rf-text-sm);