@refrakt-md/lumina 0.21.0 → 0.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (131) hide show
  1. package/base.css +2 -1
  2. package/dist/config.d.ts.map +1 -1
  3. package/dist/config.js +7 -0
  4. package/dist/config.js.map +1 -1
  5. package/dist/tokens.d.ts +5 -3
  6. package/dist/tokens.d.ts.map +1 -1
  7. package/dist/tokens.js +44 -3
  8. package/dist/tokens.js.map +1 -1
  9. package/index.css +11 -1
  10. package/package.json +7 -5
  11. package/styles/base/attributes.css +6 -7
  12. package/styles/dimensions/checklist.css +7 -36
  13. package/styles/dimensions/cover.css +13 -95
  14. package/styles/dimensions/density.css +6 -3
  15. package/styles/dimensions/frame.css +7 -4
  16. package/styles/dimensions/media.css +14 -61
  17. package/styles/dimensions/metadata.css +30 -80
  18. package/styles/dimensions/sections.css +16 -30
  19. package/styles/dimensions/sequence.css +17 -82
  20. package/styles/dimensions/state.css +39 -56
  21. package/styles/dimensions/substrate.css +3 -0
  22. package/styles/dimensions/surfaces.css +73 -113
  23. package/styles/elements/blockquote.css +3 -2
  24. package/styles/elements/code.css +3 -0
  25. package/styles/elements/table.css +3 -0
  26. package/styles/global.css +24 -63
  27. package/styles/layouts/blog.css +34 -95
  28. package/styles/layouts/default.css +12 -86
  29. package/styles/layouts/docs.css +9 -159
  30. package/styles/layouts/mobile.css +3 -52
  31. package/styles/layouts/on-this-page.css +8 -7
  32. package/styles/layouts/plan.css +27 -158
  33. package/styles/layouts/search.css +17 -82
  34. package/styles/layouts/split.css +24 -169
  35. package/styles/layouts/theme-toggle.css +3 -29
  36. package/styles/layouts/version-switcher.css +9 -10
  37. package/styles/runes/accordion.css +25 -68
  38. package/styles/runes/aggregate.css +4 -13
  39. package/styles/runes/annotate.css +11 -40
  40. package/styles/runes/api.css +4 -1
  41. package/styles/runes/audio.css +12 -50
  42. package/styles/runes/badge.css +5 -2
  43. package/styles/runes/bar.css +3 -0
  44. package/styles/runes/bento.css +18 -161
  45. package/styles/runes/bg.css +3 -37
  46. package/styles/runes/blog.css +18 -20
  47. package/styles/runes/bond.css +6 -26
  48. package/styles/runes/breadcrumb.css +7 -15
  49. package/styles/runes/budget.css +23 -45
  50. package/styles/runes/bug.css +5 -2
  51. package/styles/runes/card.css +27 -95
  52. package/styles/runes/cast.css +10 -27
  53. package/styles/runes/changelog.css +13 -17
  54. package/styles/runes/character.css +6 -20
  55. package/styles/runes/chart.css +15 -57
  56. package/styles/runes/codegroup.css +18 -26
  57. package/styles/runes/collection.css +8 -85
  58. package/styles/runes/compare.css +8 -19
  59. package/styles/runes/comparison.css +29 -56
  60. package/styles/runes/conversation.css +9 -31
  61. package/styles/runes/cta.css +17 -40
  62. package/styles/runes/datatable.css +33 -48
  63. package/styles/runes/decision.css +5 -2
  64. package/styles/runes/design-context.css +5 -4
  65. package/styles/runes/details.css +9 -17
  66. package/styles/runes/diagram.css +8 -16
  67. package/styles/runes/diff.css +11 -94
  68. package/styles/runes/drawer.css +9 -113
  69. package/styles/runes/embed.css +5 -13
  70. package/styles/runes/event.css +5 -3
  71. package/styles/runes/expand.css +10 -45
  72. package/styles/runes/faction.css +6 -12
  73. package/styles/runes/feature.css +15 -43
  74. package/styles/runes/figure.css +7 -26
  75. package/styles/runes/file-ref.css +3 -18
  76. package/styles/runes/form.css +19 -48
  77. package/styles/runes/gallery.css +8 -140
  78. package/styles/runes/grid.css +4 -56
  79. package/styles/runes/hero.css +28 -140
  80. package/styles/runes/hint.css +23 -48
  81. package/styles/runes/howto.css +9 -31
  82. package/styles/runes/itinerary.css +15 -44
  83. package/styles/runes/juxtapose.css +17 -92
  84. package/styles/runes/lore.css +7 -14
  85. package/styles/runes/map.css +9 -42
  86. package/styles/runes/mediatext.css +4 -45
  87. package/styles/runes/milestone.css +15 -28
  88. package/styles/runes/mockup.css +10 -115
  89. package/styles/runes/nav.css +37 -212
  90. package/styles/runes/organization.css +6 -5
  91. package/styles/runes/page-section.css +3 -4
  92. package/styles/runes/pagination.css +10 -42
  93. package/styles/runes/palette.css +16 -35
  94. package/styles/runes/placeholder.css +16 -0
  95. package/styles/runes/plan-history.css +23 -43
  96. package/styles/runes/plan-progress.css +6 -7
  97. package/styles/runes/plan-ref.css +4 -1
  98. package/styles/runes/playlist.css +10 -44
  99. package/styles/runes/plot.css +9 -25
  100. package/styles/runes/preview.css +9 -34
  101. package/styles/runes/pricing.css +23 -41
  102. package/styles/runes/progress.css +8 -27
  103. package/styles/runes/pullquote.css +9 -31
  104. package/styles/runes/realm.css +6 -12
  105. package/styles/runes/recipe.css +12 -36
  106. package/styles/runes/relationships.css +5 -36
  107. package/styles/runes/reveal.css +17 -22
  108. package/styles/runes/sandbox.css +9 -39
  109. package/styles/runes/section.css +10 -24
  110. package/styles/runes/showcase.css +3 -20
  111. package/styles/runes/sidenote.css +5 -4
  112. package/styles/runes/snippet.css +3 -0
  113. package/styles/runes/spacing.css +14 -33
  114. package/styles/runes/spec.css +5 -2
  115. package/styles/runes/steps.css +14 -46
  116. package/styles/runes/storyboard.css +4 -19
  117. package/styles/runes/swatch.css +4 -7
  118. package/styles/runes/symbol.css +16 -14
  119. package/styles/runes/tabs.css +15 -18
  120. package/styles/runes/testimonial.css +12 -13
  121. package/styles/runes/textblock.css +6 -24
  122. package/styles/runes/timeline.css +10 -28
  123. package/styles/runes/tint.css +3 -0
  124. package/styles/runes/toc.css +9 -7
  125. package/styles/runes/track.css +12 -41
  126. package/styles/runes/typography.css +15 -27
  127. package/styles/runes/work.css +5 -2
  128. package/styles/runes/xref.css +3 -1
  129. package/tokens/base.css +56 -66
  130. package/tokens/dark.css +79 -80
  131. package/styles/dimensions/guest-posture.css +0 -27
@@ -1,21 +1,24 @@
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
  }
14
17
  /* Higher specificity needed to override .rf-hero p (0,1,1) */
15
18
  .rf-hero .rf-hero__eyebrow {
16
- font-size: 0.875rem;
17
- font-weight: 600;
18
- letter-spacing: 0.05em;
19
+ font-size: var(--rf-text-sm);
20
+ font-weight: var(--rf-weight-semibold);
21
+ letter-spacing: var(--rf-tracking-wider);
19
22
  text-transform: uppercase;
20
23
  color: var(--rf-color-primary);
21
24
  margin: 0 0 1rem;
@@ -23,15 +26,13 @@
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);
31
32
  color: var(--rf-color-text);
32
- font-weight: 400;
33
+ font-weight: var(--rf-weight-normal);
33
34
  text-transform: none;
34
- letter-spacing: 0;
35
+ letter-spacing: var(--rf-tracking-normal);
35
36
  transition: border-color 150ms ease;
36
37
  }
37
38
  .rf-hero .rf-hero__eyebrow:has(a):hover {
@@ -39,13 +40,10 @@
39
40
  }
40
41
  .rf-hero .rf-hero__eyebrow:has(a) a {
41
42
  color: var(--rf-color-primary);
42
- font-weight: 600;
43
+ font-weight: var(--rf-weight-semibold);
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,47 +51,27 @@
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;
96
- font-size: 0.95rem;
74
+ font-size: var(--rf-text);
97
75
  border-radius: var(--rf-radius-sm);
98
76
  background: var(--rf-color-code-bg);
99
77
  color: var(--rf-color-code-text);
@@ -102,10 +80,11 @@
102
80
  }
103
81
  .rf-hero h1,
104
82
  .rf-hero__headline {
83
+ /* Hero display headline — a one-off above the --rf-text scale's top step. */
105
84
  font-size: 3.25rem;
106
- font-weight: 800;
107
- letter-spacing: -0.035em;
108
- line-height: 1.1;
85
+ font-weight: var(--rf-weight-bold);
86
+ letter-spacing: var(--rf-tracking-tight);
87
+ line-height: var(--rf-leading-tight);
109
88
  margin: 0 0 1rem;
110
89
  background: linear-gradient(135deg, var(--rf-color-text) 0%, var(--rf-color-muted) 100%);
111
90
  -webkit-background-clip: text;
@@ -115,8 +94,8 @@
115
94
  /* Higher specificity needed to override .rf-hero p (0,1,1) */
116
95
  .rf-hero p,
117
96
  .rf-hero .rf-hero__blurb {
118
- font-size: 1.2rem;
119
- line-height: 1.65;
97
+ font-size: var(--rf-text-xl);
98
+ line-height: var(--rf-leading-relaxed);
120
99
  color: var(--rf-color-muted);
121
100
  margin: 0 0 2rem;
122
101
  max-width: 40rem;
@@ -124,36 +103,25 @@
124
103
  .rf-hero[data-align="center"] > p,
125
104
  .rf-hero[data-align="center"] .rf-hero__blurb {
126
105
  max-width: 560px;
127
- margin-left: auto;
128
- margin-right: auto;
129
106
  margin-bottom: 2rem;
130
107
  }
131
108
  .rf-hero ul,
132
109
  .rf-hero nav {
133
- display: flex;
134
110
  gap: 0.75rem;
135
- flex-wrap: wrap;
136
- list-style: none;
137
111
  padding: 0;
138
112
  margin: 0;
139
113
  }
140
- .rf-hero[data-align="center"] ul,
141
- .rf-hero[data-align="center"] nav {
142
- justify-content: center;
143
- }
144
114
  .rf-hero li {
145
115
  padding: 0;
146
116
  margin: 0;
147
117
  }
148
118
  .rf-hero li a,
149
119
  .rf-hero nav a {
150
- display: inline-flex;
151
- align-items: center;
152
120
  padding: 0.7rem 1.75rem;
153
121
  border-radius: var(--rf-radius-sm);
154
122
  text-decoration: none;
155
- font-weight: 600;
156
- font-size: 0.95rem;
123
+ font-weight: var(--rf-weight-semibold);
124
+ font-size: var(--rf-text);
157
125
  transition: all 200ms ease;
158
126
  }
159
127
  .rf-hero li:first-child a {
@@ -181,40 +149,17 @@
181
149
  margin-top: 3rem;
182
150
  border-radius: var(--rf-radius-lg);
183
151
  }
184
- /* BUG-001 — hero DOM is content-first (headline before media: the right
185
- * reading order for the classic hero), inverting the shared media-first
186
- * stacked contract in layouts/split.css. Counter it so the labels are
187
- * truthful: `bottom` (the hero default) is plain block flow — media renders
188
- * after the content, exactly the historical look — and an explicit `top`
189
- * flips the visual order without touching the DOM. */
190
- .rf-hero[data-media-position="bottom"] {
191
- display: block;
192
- }
193
- .rf-hero[data-media-position="top"] {
194
- display: flex;
195
- flex-direction: column-reverse;
196
- }
197
152
  .rf-hero[data-media-position="top"] > .rf-hero__media {
198
153
  margin-top: 0;
199
154
  margin-bottom: 3rem;
200
155
  }
201
- .rf-hero__media img {
202
- display: block;
203
- width: 100%;
204
- height: auto;
205
- }
206
156
  .rf-hero__media pre {
207
157
  margin: 0;
208
158
  }
209
159
 
210
- /* ── Cover mode (SPEC-101) — `media-position="cover"` ───────────────────
211
- * The shared cover layer (dimensions/cover.css) does the grid stacking, the
212
- * default scrim, and the overlay anchoring; these rules supply the hero-band
213
- * specifics. This file imports after cover.css, so equal-specificity rules
214
- * here win. */
215
-
216
- /* The section's generous padding moves to the overlaid content — on the root
217
- * 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). */
218
163
  .rf-hero--cover {
219
164
  padding: 0;
220
165
  }
@@ -222,38 +167,6 @@
222
167
  --rune-padding: 7rem 2rem 6.5rem;
223
168
  }
224
169
 
225
- /* Band height authority: a hero is a full-width band, not a portrait tile.
226
- * Height comes from a viewport-aware floor — deliberately NOT a default
227
- * aspect-ratio: with `aspect-ratio` + `min-height`, the ratio transfers a
228
- * winning min-height back into *width* on narrow screens (a 22rem-tall 21/9
229
- * band computes ~820px wide on a 375px phone — the band marches off-screen).
230
- * `--cover-aspect: auto` releases the shared 3/4 tile default; an explicit
231
- * `aspect` knob still lands as an inline style and owns the shape. */
232
- .rf-hero--cover {
233
- --cover-aspect: auto;
234
- min-height: clamp(22rem, 55vh, 40rem);
235
- }
236
- /* An explicit aspect owns the shape — drop the floor so the same
237
- * ratio-vs-min-height transfer can't reintroduce the overflow. */
238
- .rf-hero--cover[data-aspect] {
239
- min-height: 0;
240
- }
241
-
242
- /* The shared cover layer applies `container-type: size` (size containment) for
243
- * its orientation query — under it the band cannot grow with its content, so
244
- * tall content clips at min-height. The hero band doesn't use the orientation
245
- * query (the centred-band default below covers `auto` placement), so release
246
- * the containment and let the band stretch to fit. */
247
- .rf-hero--cover[data-media-position="cover"][data-cover-scope="full"] {
248
- container-type: normal;
249
- }
250
-
251
- /* Named height scale (`height="sm…xl"`): an explicit band height. */
252
- .rf-hero--cover[data-height="sm"] { min-height: 20rem; }
253
- .rf-hero--cover[data-height="md"] { min-height: 28rem; }
254
- .rf-hero--cover[data-height="lg"] { min-height: 36rem; }
255
- .rf-hero--cover[data-height="xl"] { min-height: 44rem; }
256
-
257
170
  /* Mobile: the desktop overlay padding (7rem bands) would eat most of the well
258
171
  * on a phone — tighten it so the content fits the band. */
259
172
  @media (max-width: 640px) {
@@ -274,19 +187,9 @@
274
187
  color: var(--rf-color-on-accent, var(--rf-color-bg));
275
188
  }
276
189
 
277
- /* Centre-band default: a hero overlay reads as a centred band, not the
278
- * cover-card caption strip — seat it mid-well unless the author anchors it
279
- * with an explicit `content-place`. */
280
- .rf-hero--cover[data-media-position="cover"]:is([data-content-place="auto"], :not([data-content-place])) > [data-name="content"] {
281
- align-self: center;
282
- justify-self: stretch;
283
- }
284
-
285
190
  /* The default cover scrim is edge-weighted (a caption-strip treatment); under
286
191
  * the centred band it would leave the headline on undarkened media. With no
287
- * explicit `content-place`, darken the well evenly (slightly bottom-weighted).
288
- * An explicit `content-place` re-enters the shared content-edge scrim contract,
289
- * and `scrim="none"` still opts out. */
192
+ * explicit `content-place`, darken the well evenly (slightly bottom-weighted). */
290
193
  .rf-hero--cover:is([data-content-place="auto"], :not([data-content-place])):not([data-scrim="none"]) > [data-section="media"]::after {
291
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)));
292
195
  }
@@ -294,23 +197,8 @@
294
197
  /* Mobile: stack actions full-width so the code block and button line up */
295
198
  @media (max-width: 640px) {
296
199
  .rf-hero__actions {
297
- flex-direction: column;
298
- align-items: stretch;
299
200
  max-width: none;
300
201
  }
301
- .rf-hero__actions pre {
302
- width: 100%;
303
- box-sizing: border-box;
304
- }
305
- .rf-hero ul,
306
- .rf-hero nav {
307
- flex-direction: column;
308
- align-items: stretch;
309
- }
310
- .rf-hero li a,
311
- .rf-hero nav a {
312
- justify-content: center;
313
- width: 100%;
314
- box-sizing: border-box;
315
- }
202
+ }
203
+
316
204
  }
@@ -1,59 +1,32 @@
1
- /* Hint */
1
+ @layer skin {
2
+ /* Hint — skin. The sunken surface chrome (fill, border, radius) comes from
3
+ * dimensions/surfaces.css via defaultElevation: 'sunken'; only the bespoke
4
+ * padding stays here so the icon+title+body breathes wider than --rune-padding
5
+ * at compact density. The header layout + icon-glyph box mechanism live in
6
+ * @refrakt-md/skeleton (styles/runes/hint.css). */
2
7
  .rf-hint {
3
8
  --hint-color: var(--rf-color-info);
4
- padding: 0.875rem 1.25rem;
5
- border-radius: var(--rf-radius-md);
6
- background: var(--rf-color-surface);
9
+ padding: var(--rf-spacing-snug) var(--rf-spacing-cozy);
7
10
  }
8
11
  .rf-hint__header {
9
- margin-bottom: 0.375rem;
12
+ margin-bottom: var(--rf-spacing-xs);
10
13
  color: var(--hint-color);
11
14
  }
12
- /* The lone `hintType` field renders icon + label in one inline-flex span. */
13
15
  .rf-hint__header > span {
14
- display: inline-flex;
15
- align-items: center;
16
- gap: 0.375rem;
17
- }
18
- .rf-hint__header [data-icon-group="hint"] {
19
- display: block;
16
+ gap: var(--rf-spacing-xs);
20
17
  }
21
18
  .rf-hint__header [data-icon-group="hint"]::before {
22
- content: '';
23
- display: block;
24
- width: 1.25rem;
25
- height: 1.25rem;
26
19
  background-color: var(--hint-color);
27
- -webkit-mask-size: contain;
28
- mask-size: contain;
29
- -webkit-mask-repeat: no-repeat;
30
- mask-repeat: no-repeat;
31
- }
32
- [data-icon-group="hint"][data-icon="note"]::before {
33
- -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'/%3E%3Cline x1='12' y1='16' x2='12' y2='12'/%3E%3Cline x1='12' y1='8' x2='12.01' y2='8'/%3E%3C/svg%3E");
34
- mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'/%3E%3Cline x1='12' y1='16' x2='12' y2='12'/%3E%3Cline x1='12' y1='8' x2='12.01' y2='8'/%3E%3C/svg%3E");
35
- }
36
- [data-icon-group="hint"][data-icon="warning"]::before {
37
- -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z'/%3E%3Cline x1='12' y1='9' x2='12' y2='13'/%3E%3Cline x1='12' y1='17' x2='12.01' y2='17'/%3E%3C/svg%3E");
38
- mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z'/%3E%3Cline x1='12' y1='9' x2='12' y2='13'/%3E%3Cline x1='12' y1='17' x2='12.01' y2='17'/%3E%3C/svg%3E");
39
- }
40
- [data-icon-group="hint"][data-icon="caution"]::before {
41
- -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'/%3E%3Cline x1='15' y1='9' x2='9' y2='15'/%3E%3Cline x1='9' y1='9' x2='15' y2='15'/%3E%3C/svg%3E");
42
- mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'/%3E%3Cline x1='15' y1='9' x2='9' y2='15'/%3E%3Cline x1='9' y1='9' x2='15' y2='15'/%3E%3C/svg%3E");
43
- }
44
- [data-icon-group="hint"][data-icon="check"]::before {
45
- -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M22 11.08V12a10 10 0 1 1-5.93-9.14'/%3E%3Cpolyline points='22 4 12 14.01 9 11.01'/%3E%3C/svg%3E");
46
- mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M22 11.08V12a10 10 0 1 1-5.93-9.14'/%3E%3Cpolyline points='22 4 12 14.01 9 11.01'/%3E%3C/svg%3E");
47
20
  }
48
21
  .rf-hint__header [data-meta-value] {
49
- font-weight: 600;
22
+ font-weight: var(--rf-weight-semibold);
50
23
  text-transform: capitalize;
51
- font-size: 0.8rem;
52
- letter-spacing: 0.03em;
24
+ font-size: var(--rf-text-xs);
25
+ letter-spacing: var(--rf-tracking-wide);
53
26
  }
54
27
  .rf-hint__body {
55
- font-size: 0.925rem;
56
- line-height: 1.65;
28
+ font-size: var(--rf-text-sm);
29
+ line-height: var(--rf-leading-relaxed);
57
30
  }
58
31
  .rf-hint__body p:last-child {
59
32
  margin-bottom: 0;
@@ -75,18 +48,20 @@
75
48
 
76
49
  /* Context-aware: compact hint when nested inside a hero */
77
50
  .rf-hint--in-hero {
78
- margin: 1rem 0 0;
79
- padding: 0.625rem 1rem;
51
+ margin: var(--rf-spacing-cozy) 0 0;
52
+ padding: var(--rf-spacing-sm) var(--rf-spacing-cozy);
80
53
  border-radius: var(--rf-radius-sm);
81
- font-size: 0.875rem;
54
+ font-size: var(--rf-text-sm);
82
55
  }
83
56
  .rf-hint--in-hero .rf-hint__header {
84
- margin-bottom: 0.25rem;
57
+ margin-bottom: var(--rf-spacing-xs);
85
58
  }
86
59
 
87
60
  /* Context-aware: hint inside a feature block */
88
61
  .rf-hint--in-feature {
89
- margin: 0.75rem 0 0;
90
- padding: 0.5rem 0.875rem;
91
- font-size: 0.85rem;
62
+ margin: var(--rf-spacing-snug) 0 0;
63
+ padding: var(--rf-spacing-sm) var(--rf-spacing-snug);
64
+ font-size: var(--rf-text-sm);
65
+ }
66
+
92
67
  }
@@ -1,3 +1,4 @@
1
+ @layer skin {
1
2
  /* HowTo — matches recipe design */
2
3
 
3
4
  /* Tools/materials list — surfaced zone with primary markers */
@@ -11,7 +12,7 @@
11
12
  }
12
13
  .rf-howto__content ul li {
13
14
  padding: 0.2rem 0;
14
- line-height: 1.6;
15
+ line-height: var(--rf-leading-relaxed);
15
16
  }
16
17
  .rf-howto__content ul li::marker {
17
18
  color: var(--rf-color-primary);
@@ -21,31 +22,18 @@
21
22
  .rf-howto__content ol {
22
23
  padding-left: 0;
23
24
  margin: 0;
24
- list-style: none;
25
- counter-reset: howto-step;
26
25
  }
27
26
  .rf-howto__content ol > li {
28
- counter-increment: howto-step;
29
27
  padding: 0.625rem 0;
30
28
  padding-left: 2.25rem;
31
- position: relative;
32
- line-height: 1.65;
29
+ line-height: var(--rf-leading-relaxed);
33
30
  }
34
31
  .rf-howto__content ol > li + li {
35
32
  border-top: 1px solid var(--rf-color-border);
36
33
  }
37
34
  .rf-howto__content ol > li::before {
38
- content: counter(howto-step);
39
- position: absolute;
40
- left: 0;
41
- top: 0.625rem;
42
- width: 1.5rem;
43
- height: 1.5rem;
44
- display: flex;
45
- align-items: center;
46
- justify-content: center;
47
- font-size: 0.75rem;
48
- font-weight: 700;
35
+ font-size: var(--rf-text-xs);
36
+ font-weight: var(--rf-weight-bold);
49
37
  color: var(--rf-color-primary);
50
38
  background: var(--rf-color-surface);
51
39
  border-radius: var(--rf-radius-full);
@@ -63,31 +51,21 @@
63
51
  border-radius: 0 var(--rf-radius-md) var(--rf-radius-md) 0;
64
52
  padding: 0.75rem 1.25rem;
65
53
  margin: 1.75rem 0 0;
66
- font-size: 0.9125rem;
54
+ font-size: var(--rf-text-sm);
67
55
  font-style: italic;
68
56
  color: var(--rf-color-muted);
69
- line-height: 1.6;
57
+ line-height: var(--rf-leading-relaxed);
70
58
  }
71
59
  .rf-howto__content blockquote p {
72
60
  margin: 0;
73
61
  }
74
-
75
- /* Metadata — est. time / difficulty are short, symmetric facts, so keep the
76
- * def-list a dense tile grid at every width (a smaller column min than the
77
- * 8rem default) instead of the shared mobile label/value list. */
78
- .rf-howto__metadata {
79
- grid-template-columns: repeat(auto-fit, minmax(6rem, 1fr));
80
- }
81
62
  @media (max-width: 48rem) {
82
63
  .rf-howto__metadata {
83
- grid-template-columns: repeat(auto-fit, minmax(6rem, 1fr));
84
64
  gap: 0.75rem;
85
- align-items: normal;
86
65
  padding: 0;
87
66
  border: none;
88
67
  }
89
- .rf-howto__metadata > [data-name="row"] {
90
- display: flex;
91
- }
92
68
  }
93
69
 
70
+
71
+ }
@@ -1,3 +1,4 @@
1
+ @layer skin {
1
2
  /* Itinerary */
2
3
  .rf-itinerary {
3
4
  margin: 2rem 0;
@@ -14,25 +15,20 @@
14
15
  margin-bottom: 0;
15
16
  }
16
17
  .rf-itinerary-day__header {
17
- font-size: 1.15rem;
18
- font-weight: 700;
18
+ font-size: var(--rf-text-lg);
19
+ font-weight: var(--rf-weight-bold);
19
20
  color: var(--rf-color-text);
20
21
  margin-bottom: 1rem;
21
22
  padding-bottom: 0.5rem;
22
23
  border-bottom: 2px solid var(--rf-color-border);
23
24
  }
24
- .rf-itinerary-day__header:empty {
25
- display: none;
26
- }
27
25
  .rf-itinerary-day ol {
28
- list-style: none;
29
26
  padding: 0;
30
27
  margin: 0;
31
28
  }
32
29
 
33
30
  /* Stop */
34
31
  .rf-itinerary-stop {
35
- position: relative;
36
32
  padding-left: 2rem;
37
33
  padding-bottom: 1.5rem;
38
34
  border-left: 2px solid var(--rf-color-border);
@@ -43,12 +39,6 @@
43
39
  padding-bottom: 0;
44
40
  }
45
41
  .rf-itinerary-stop::before {
46
- content: '';
47
- position: absolute;
48
- left: -0.4375rem;
49
- top: 0.25rem;
50
- width: 0.75rem;
51
- height: 0.75rem;
52
42
  border-radius: 50%;
53
43
  background: var(--rf-color-primary);
54
44
  border: 2px solid var(--rf-color-bg);
@@ -57,27 +47,25 @@
57
47
 
58
48
  /* Stop time */
59
49
  .rf-itinerary-stop__time {
60
- display: block;
61
- font-size: 0.8rem;
62
- font-weight: 600;
50
+ font-size: var(--rf-text-xs);
51
+ font-weight: var(--rf-weight-semibold);
63
52
  color: var(--rf-color-primary);
64
- letter-spacing: 0.02em;
53
+ letter-spacing: var(--rf-tracking-wide);
65
54
  margin-bottom: 0.15rem;
66
55
  }
67
56
 
68
57
  /* Stop location */
69
58
  .rf-itinerary-stop__location {
70
- display: block;
71
- font-size: 1.05rem;
72
- font-weight: 700;
59
+ font-size: var(--rf-text);
60
+ font-weight: var(--rf-weight-bold);
73
61
  color: var(--rf-color-text);
74
62
  margin-bottom: 0.35rem;
75
63
  }
76
64
 
77
65
  /* Stop body */
78
66
  .rf-itinerary-stop__body {
79
- font-size: 0.925rem;
80
- line-height: 1.65;
67
+ font-size: var(--rf-text-sm);
68
+ line-height: var(--rf-leading-relaxed);
81
69
  color: var(--rf-color-muted);
82
70
  }
83
71
  .rf-itinerary-stop__body p:last-child {
@@ -87,11 +75,8 @@
87
75
  /* Duration badge */
88
76
  .rf-itinerary-stop[data-duration]::after {
89
77
  content: attr(data-duration);
90
- position: absolute;
91
- top: 0.15rem;
92
- right: 0;
93
- font-size: 0.75rem;
94
- font-weight: 500;
78
+ font-size: var(--rf-text-xs);
79
+ font-weight: var(--rf-weight-medium);
95
80
  color: var(--rf-color-muted);
96
81
  background: var(--rf-color-surface);
97
82
  padding: 0.1rem 0.5rem;
@@ -126,13 +111,10 @@
126
111
 
127
112
  /* Horizontal direction */
128
113
  .rf-itinerary--horizontal .rf-itinerary-day ol {
129
- display: flex;
130
114
  gap: 2rem;
131
- overflow-x: auto;
132
115
  padding: 2rem 0 1rem;
133
116
  }
134
117
  .rf-itinerary--horizontal .rf-itinerary-stop {
135
- min-width: 14rem;
136
118
  padding-left: 0;
137
119
  padding-top: 1.5rem;
138
120
  padding-bottom: 0;
@@ -143,31 +125,20 @@
143
125
  .rf-itinerary--horizontal .rf-itinerary-stop:last-child {
144
126
  border-top-color: transparent;
145
127
  }
146
- .rf-itinerary--horizontal .rf-itinerary-stop::before {
147
- left: 0.5rem;
148
- top: -0.4375rem;
149
- }
150
128
  .rf-itinerary--horizontal .rf-itinerary-stop[data-duration]::after {
151
- position: static;
152
- display: inline-block;
153
129
  margin-top: 0.5rem;
154
130
  }
155
-
156
- /* Compact style */
157
- .rf-itinerary--compact .rf-itinerary-stop__body {
158
- display: none;
159
- }
160
131
  .rf-itinerary--compact .rf-itinerary-stop {
161
132
  padding-bottom: 0.75rem;
162
133
  }
163
134
  .rf-itinerary--compact .rf-itinerary-stop__location {
164
- display: inline;
165
- font-size: 0.925rem;
135
+ font-size: var(--rf-text-sm);
166
136
  }
167
137
  .rf-itinerary--compact .rf-itinerary-stop__time {
168
- display: inline;
169
138
  margin-bottom: 0;
170
139
  }
171
140
  .rf-itinerary--compact .rf-itinerary-stop__time::after {
172
141
  content: ' — ';
173
142
  }
143
+
144
+ }