@refrakt-md/lumina 0.20.2 → 0.22.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 (108) hide show
  1. package/contracts/structures.json +154 -5
  2. package/dist/tokens.d.ts +5 -3
  3. package/dist/tokens.d.ts.map +1 -1
  4. package/dist/tokens.js +42 -3
  5. package/dist/tokens.js.map +1 -1
  6. package/index.css +2 -0
  7. package/package.json +6 -5
  8. package/styles/dimensions/checklist.css +1 -1
  9. package/styles/dimensions/cover.css +18 -0
  10. package/styles/dimensions/density.css +3 -0
  11. package/styles/dimensions/frame.css +4 -4
  12. package/styles/dimensions/metadata.css +6 -6
  13. package/styles/dimensions/sections.css +12 -15
  14. package/styles/dimensions/sequence.css +3 -3
  15. package/styles/global.css +15 -15
  16. package/styles/layouts/blog.css +31 -31
  17. package/styles/layouts/default.css +9 -9
  18. package/styles/layouts/docs.css +6 -6
  19. package/styles/layouts/mobile.css +2 -2
  20. package/styles/layouts/on-this-page.css +5 -5
  21. package/styles/layouts/plan.css +24 -24
  22. package/styles/layouts/search.css +14 -14
  23. package/styles/layouts/version-switcher.css +6 -6
  24. package/styles/runes/accordion.css +10 -10
  25. package/styles/runes/aggregate.css +1 -1
  26. package/styles/runes/annotate.css +5 -5
  27. package/styles/runes/api.css +1 -1
  28. package/styles/runes/audio.css +9 -9
  29. package/styles/runes/badge.css +2 -2
  30. package/styles/runes/bento.css +2 -2
  31. package/styles/runes/blog.css +15 -15
  32. package/styles/runes/bond.css +3 -3
  33. package/styles/runes/breadcrumb.css +2 -2
  34. package/styles/runes/budget.css +20 -20
  35. package/styles/runes/bug.css +2 -2
  36. package/styles/runes/card.css +3 -3
  37. package/styles/runes/cast.css +5 -5
  38. package/styles/runes/changelog.css +8 -8
  39. package/styles/runes/character.css +3 -3
  40. package/styles/runes/chart.css +5 -5
  41. package/styles/runes/codegroup.css +3 -3
  42. package/styles/runes/collection.css +3 -3
  43. package/styles/runes/compare.css +5 -5
  44. package/styles/runes/comparison.css +22 -22
  45. package/styles/runes/conversation.css +4 -4
  46. package/styles/runes/cta.css +14 -14
  47. package/styles/runes/datatable.css +8 -8
  48. package/styles/runes/decision.css +2 -2
  49. package/styles/runes/design-context.css +2 -2
  50. package/styles/runes/details.css +4 -4
  51. package/styles/runes/diagram.css +3 -3
  52. package/styles/runes/diff.css +6 -6
  53. package/styles/runes/drawer.css +8 -8
  54. package/styles/runes/embed.css +1 -1
  55. package/styles/runes/event.css +2 -2
  56. package/styles/runes/expand.css +5 -5
  57. package/styles/runes/faction.css +3 -3
  58. package/styles/runes/feature.css +23 -11
  59. package/styles/runes/figure.css +3 -3
  60. package/styles/runes/form.css +16 -16
  61. package/styles/runes/gallery.css +7 -7
  62. package/styles/runes/hero.css +116 -14
  63. package/styles/runes/hint.css +7 -7
  64. package/styles/runes/howto.css +6 -6
  65. package/styles/runes/itinerary.css +12 -12
  66. package/styles/runes/juxtapose.css +6 -6
  67. package/styles/runes/lore.css +4 -4
  68. package/styles/runes/map.css +6 -6
  69. package/styles/runes/mediatext.css +1 -1
  70. package/styles/runes/milestone.css +12 -12
  71. package/styles/runes/mockup.css +7 -7
  72. package/styles/runes/nav.css +34 -34
  73. package/styles/runes/organization.css +3 -3
  74. package/styles/runes/pagination.css +5 -5
  75. package/styles/runes/palette.css +13 -13
  76. package/styles/runes/placeholder.css +16 -0
  77. package/styles/runes/plan-history.css +20 -20
  78. package/styles/runes/plan-progress.css +3 -3
  79. package/styles/runes/plan-ref.css +1 -1
  80. package/styles/runes/playlist.css +8 -8
  81. package/styles/runes/plot.css +6 -6
  82. package/styles/runes/preview.css +6 -6
  83. package/styles/runes/pricing.css +16 -16
  84. package/styles/runes/progress.css +2 -2
  85. package/styles/runes/pullquote.css +6 -5
  86. package/styles/runes/realm.css +3 -3
  87. package/styles/runes/recipe.css +9 -9
  88. package/styles/runes/relationships.css +2 -2
  89. package/styles/runes/reveal.css +10 -10
  90. package/styles/runes/sandbox.css +52 -2
  91. package/styles/runes/section.css +70 -0
  92. package/styles/runes/sidenote.css +2 -2
  93. package/styles/runes/spacing.css +11 -11
  94. package/styles/runes/spec.css +2 -2
  95. package/styles/runes/steps.css +22 -10
  96. package/styles/runes/storyboard.css +2 -2
  97. package/styles/runes/swatch.css +1 -1
  98. package/styles/runes/symbol.css +10 -10
  99. package/styles/runes/tabs.css +9 -9
  100. package/styles/runes/testimonial.css +7 -7
  101. package/styles/runes/textblock.css +4 -4
  102. package/styles/runes/timeline.css +7 -7
  103. package/styles/runes/toc.css +4 -4
  104. package/styles/runes/track.css +10 -10
  105. package/styles/runes/typography.css +12 -12
  106. package/styles/runes/work.css +2 -2
  107. package/tokens/base.css +43 -66
  108. package/tokens/dark.css +76 -80
@@ -1162,6 +1162,49 @@
1162
1162
  "{content}"
1163
1163
  ]
1164
1164
  },
1165
+ "Section": {
1166
+ "block": "section",
1167
+ "root": ".rf-section",
1168
+ "dataRune": "section",
1169
+ "childOrder": [
1170
+ "{content}"
1171
+ ],
1172
+ "modifiers": {
1173
+ "align": {
1174
+ "source": "meta",
1175
+ "default": "start",
1176
+ "classPattern": ".rf-section--{value}",
1177
+ "dataAttribute": "data-align"
1178
+ }
1179
+ },
1180
+ "elements": {
1181
+ "preamble": {
1182
+ "tag": "header",
1183
+ "selector": ".rf-section__preamble",
1184
+ "source": "autoLabel"
1185
+ },
1186
+ "eyebrow": {
1187
+ "tag": "eyebrow",
1188
+ "selector": ".rf-section__eyebrow",
1189
+ "source": "autoLabel"
1190
+ },
1191
+ "headline": {
1192
+ "tag": "headline",
1193
+ "selector": ".rf-section__headline",
1194
+ "source": "autoLabel"
1195
+ },
1196
+ "blurb": {
1197
+ "tag": "blurb",
1198
+ "selector": ".rf-section__blurb",
1199
+ "source": "autoLabel"
1200
+ },
1201
+ "image": {
1202
+ "tag": "image",
1203
+ "selector": ".rf-section__image",
1204
+ "source": "autoLabel"
1205
+ }
1206
+ }
1207
+ },
1165
1208
  "Juxtapose": {
1166
1209
  "block": "juxtapose",
1167
1210
  "root": ".rf-juxtapose",
@@ -1266,7 +1309,7 @@
1266
1309
  "modifiers": {
1267
1310
  "media-position": {
1268
1311
  "source": "meta",
1269
- "default": "top",
1312
+ "default": "bottom",
1270
1313
  "dataAttribute": "data-media-position"
1271
1314
  },
1272
1315
  "align": {
@@ -1286,6 +1329,18 @@
1286
1329
  "collapse": {
1287
1330
  "source": "meta",
1288
1331
  "dataAttribute": "data-collapse"
1332
+ },
1333
+ "content-place": {
1334
+ "source": "meta",
1335
+ "dataAttribute": "data-content-place"
1336
+ },
1337
+ "height": {
1338
+ "source": "meta",
1339
+ "dataAttribute": "data-height"
1340
+ },
1341
+ "aspect": {
1342
+ "source": "meta",
1343
+ "dataAttribute": "data-aspect"
1289
1344
  }
1290
1345
  },
1291
1346
  "elements": {
@@ -1323,6 +1378,100 @@
1323
1378
  "inlineStyles": {
1324
1379
  "valign": {
1325
1380
  "prop": "--split-valign"
1381
+ },
1382
+ "aspect": "aspect-ratio"
1383
+ },
1384
+ "variants": {
1385
+ "media-position": {
1386
+ "cover": {
1387
+ "block": "hero",
1388
+ "root": ".rf-hero",
1389
+ "dataRune": "hero",
1390
+ "childOrder": [
1391
+ "{content}"
1392
+ ],
1393
+ "modifiers": {
1394
+ "media-position": {
1395
+ "source": "meta",
1396
+ "default": "bottom",
1397
+ "dataAttribute": "data-media-position"
1398
+ },
1399
+ "align": {
1400
+ "source": "meta",
1401
+ "default": "center",
1402
+ "classPattern": ".rf-hero--{value}",
1403
+ "dataAttribute": "data-align"
1404
+ },
1405
+ "media-ratio": {
1406
+ "source": "meta",
1407
+ "dataAttribute": "data-media-ratio"
1408
+ },
1409
+ "valign": {
1410
+ "source": "meta",
1411
+ "dataAttribute": "data-valign"
1412
+ },
1413
+ "collapse": {
1414
+ "source": "meta",
1415
+ "dataAttribute": "data-collapse"
1416
+ },
1417
+ "content-place": {
1418
+ "source": "meta",
1419
+ "dataAttribute": "data-content-place"
1420
+ },
1421
+ "height": {
1422
+ "source": "meta",
1423
+ "dataAttribute": "data-height"
1424
+ },
1425
+ "aspect": {
1426
+ "source": "meta",
1427
+ "dataAttribute": "data-aspect"
1428
+ }
1429
+ },
1430
+ "staticModifiers": [
1431
+ {
1432
+ "name": "cover",
1433
+ "selector": ".rf-hero--cover"
1434
+ }
1435
+ ],
1436
+ "elements": {
1437
+ "preamble": {
1438
+ "tag": "header",
1439
+ "selector": ".rf-hero__preamble",
1440
+ "source": "autoLabel"
1441
+ },
1442
+ "eyebrow": {
1443
+ "tag": "eyebrow",
1444
+ "selector": ".rf-hero__eyebrow",
1445
+ "source": "autoLabel"
1446
+ },
1447
+ "headline": {
1448
+ "tag": "headline",
1449
+ "selector": ".rf-hero__headline",
1450
+ "source": "autoLabel"
1451
+ },
1452
+ "blurb": {
1453
+ "tag": "blurb",
1454
+ "selector": ".rf-hero__blurb",
1455
+ "source": "autoLabel"
1456
+ },
1457
+ "image": {
1458
+ "tag": "image",
1459
+ "selector": ".rf-hero__image",
1460
+ "source": "autoLabel"
1461
+ },
1462
+ "media": {
1463
+ "tag": "media",
1464
+ "selector": ".rf-hero__media",
1465
+ "source": "autoLabel"
1466
+ }
1467
+ },
1468
+ "inlineStyles": {
1469
+ "valign": {
1470
+ "prop": "--split-valign"
1471
+ },
1472
+ "aspect": "aspect-ratio"
1473
+ }
1474
+ }
1326
1475
  }
1327
1476
  }
1328
1477
  },
@@ -1472,7 +1621,7 @@
1472
1621
  "modifiers": {
1473
1622
  "media-position": {
1474
1623
  "source": "meta",
1475
- "default": "top",
1624
+ "default": "bottom",
1476
1625
  "dataAttribute": "data-media-position"
1477
1626
  },
1478
1627
  "align": {
@@ -1553,7 +1702,7 @@
1553
1702
  "modifiers": {
1554
1703
  "media-position": {
1555
1704
  "source": "meta",
1556
- "default": "top",
1705
+ "default": "bottom",
1557
1706
  "dataAttribute": "data-media-position"
1558
1707
  },
1559
1708
  "align": {
@@ -1639,7 +1788,7 @@
1639
1788
  "modifiers": {
1640
1789
  "media-position": {
1641
1790
  "source": "meta",
1642
- "default": "top",
1791
+ "default": "bottom",
1643
1792
  "dataAttribute": "data-media-position"
1644
1793
  },
1645
1794
  "align": {
@@ -1773,7 +1922,7 @@
1773
1922
  "modifiers": {
1774
1923
  "media-position": {
1775
1924
  "source": "meta",
1776
- "default": "top",
1925
+ "default": "bottom",
1777
1926
  "dataAttribute": "data-media-position"
1778
1927
  },
1779
1928
  "media-ratio": {
package/dist/tokens.d.ts CHANGED
@@ -5,9 +5,11 @@ import type { ThemeTokensConfig } from '@refrakt-md/types';
5
5
  * "quiet spectrum walk" syntax palette (teal / violet / rust / ochre /
6
6
  * sage), and the four muted-earthy status colours.
7
7
  *
8
- * This is the *source of truth* for Lumina's runtime CSS values; the
9
- * hand-authored `tokens/base.css` and `tokens/dark.css` mirror it
10
- * verbatim and a coverage test keeps the two in lockstep.
8
+ * This is the *source of truth* for Lumina's runtime CSS values. The
9
+ * `tokens/base.css` and `tokens/dark.css` files are **generated** from this
10
+ * export by `scripts/generate-tokens.mjs` (run as part of the package build via
11
+ * `generateThemeStylesheet`); a drift test (`test/token-generation.test.ts`)
12
+ * fails CI if the committed CSS diverges. Edit this file, never the CSS.
11
13
  *
12
14
  * Sites that want the previous cream-and-navy appearance opt into the
13
15
  * `tideline` preset shipping alongside this default (see
@@ -1 +1 @@
1
- {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAE3D;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,YAAY,EAAE,iBAyL1B,CAAC"}
1
+ {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAE3D;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,YAAY,EAAE,iBAkO1B,CAAC"}
package/dist/tokens.js CHANGED
@@ -4,9 +4,11 @@
4
4
  * "quiet spectrum walk" syntax palette (teal / violet / rust / ochre /
5
5
  * sage), and the four muted-earthy status colours.
6
6
  *
7
- * This is the *source of truth* for Lumina's runtime CSS values; the
8
- * hand-authored `tokens/base.css` and `tokens/dark.css` mirror it
9
- * verbatim and a coverage test keeps the two in lockstep.
7
+ * This is the *source of truth* for Lumina's runtime CSS values. The
8
+ * `tokens/base.css` and `tokens/dark.css` files are **generated** from this
9
+ * export by `scripts/generate-tokens.mjs` (run as part of the package build via
10
+ * `generateThemeStylesheet`); a drift test (`test/token-generation.test.ts`)
11
+ * fails CI if the committed CSS diverges. Edit this file, never the CSS.
10
12
  *
11
13
  * Sites that want the previous cream-and-navy appearance opt into the
12
14
  * `tideline` preset shipping alongside this default (see
@@ -19,6 +21,43 @@ export const luminaTokens = {
19
21
  font: {
20
22
  sans: "'Inter', system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif",
21
23
  mono: "'JetBrains Mono', 'Fira Code', ui-monospace, 'Cascadia Code', monospace",
24
+ // Lumina is a unified-neutral theme: its headings use the same sans as
25
+ // body. The slot exists so an editorial theme can swap in a serif/display
26
+ // family without touching rune CSS.
27
+ display: "'Inter', system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif",
28
+ },
29
+ // SPEC-094 — typographic scale. A roughly-1.2 modular scale anchored at a
30
+ // 1rem body. Nothing consumes these yet (WORK-405 migrates Lumina's
31
+ // hardcoded sizes onto them); values match Lumina's current type feel.
32
+ text: {
33
+ xs: '0.75rem',
34
+ sm: '0.875rem',
35
+ base: '1rem',
36
+ lg: '1.125rem',
37
+ xl: '1.25rem',
38
+ '2xl': '1.5rem',
39
+ '3xl': '1.875rem',
40
+ '4xl': '2.5rem',
41
+ },
42
+ weight: {
43
+ light: '300',
44
+ normal: '400',
45
+ medium: '500',
46
+ semibold: '600',
47
+ bold: '700',
48
+ },
49
+ leading: {
50
+ tight: '1.2',
51
+ snug: '1.35',
52
+ normal: '1.5',
53
+ relaxed: '1.65',
54
+ loose: '2',
55
+ },
56
+ tracking: {
57
+ tight: '-0.01em',
58
+ normal: '0',
59
+ wide: '0.03em',
60
+ wider: '0.06em',
22
61
  },
23
62
  color: {
24
63
  text: '#1c1a17',
@@ -1 +1 @@
1
- {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"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"}
package/index.css CHANGED
@@ -80,6 +80,7 @@
80
80
  @import './styles/runes/faction.css';
81
81
  @import './styles/runes/feature.css';
82
82
  @import './styles/runes/figure.css';
83
+ @import './styles/runes/placeholder.css';
83
84
  @import './styles/runes/gallery.css';
84
85
  @import './styles/runes/form.css';
85
86
  @import './styles/runes/grid.css';
@@ -103,6 +104,7 @@
103
104
  @import './styles/runes/realm.css';
104
105
  @import './styles/runes/recipe.css';
105
106
  @import './styles/runes/reveal.css';
107
+ @import './styles/runes/section.css';
106
108
  @import './styles/runes/sidenote.css';
107
109
  @import './styles/runes/steps.css';
108
110
  @import './styles/runes/storyboard.css';
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.20.2",
4
+ "version": "0.22.0",
5
5
  "type": "module",
6
6
  "license": "MIT",
7
7
  "repository": {
@@ -80,12 +80,13 @@
80
80
  "assets"
81
81
  ],
82
82
  "scripts": {
83
- "build": "tsc"
83
+ "build": "tsc && node scripts/generate-tokens.mjs",
84
+ "generate-tokens": "node scripts/generate-tokens.mjs"
84
85
  },
85
86
  "dependencies": {
86
- "@refrakt-md/runes": "0.20.2",
87
- "@refrakt-md/transform": "0.20.2",
88
- "@refrakt-md/types": "0.20.2"
87
+ "@refrakt-md/runes": "0.22.0",
88
+ "@refrakt-md/transform": "0.22.0",
89
+ "@refrakt-md/types": "0.22.0"
89
90
  },
90
91
  "devDependencies": {
91
92
  "postcss": "^8.4.0"
@@ -40,7 +40,7 @@
40
40
 
41
41
  [data-checked="active"] {
42
42
  color: var(--rf-color-primary);
43
- font-weight: 600;
43
+ font-weight: var(--rf-weight-semibold);
44
44
  }
45
45
 
46
46
  /* Skipped — muted with strikethrough */
@@ -63,6 +63,24 @@
63
63
  height: 100%;
64
64
  object-fit: cover;
65
65
  }
66
+ /* SPEC-101 — non-img/video guests (a sandbox, an embed) fill the well too.
67
+ * They can't be object-fit-cropped, so they get the well's box outright;
68
+ * display:block covers undefined custom elements (inline by default). */
69
+ [data-media-position="cover"] [data-section="media"] > :not(img, video) {
70
+ display: block;
71
+ width: 100%;
72
+ height: 100%;
73
+ }
74
+ /* A backdrop sandbox sits flush in the well — the well's own radius/overflow
75
+ * does the clipping. The iframe height is pinned inline by the element in
76
+ * `fill` mode; this carries the fixed-height case visually until then. */
77
+ [data-media-position="cover"] [data-section="media"] .rf-sandbox {
78
+ margin: 0;
79
+ border-radius: 0;
80
+ }
81
+ [data-media-position="cover"] [data-section="media"] .rf-sandbox iframe {
82
+ height: 100%;
83
+ }
66
84
  /* The overlaid box (full: content; header: preamble) anchors via content-place. */
67
85
  [data-media-position="cover"]:not([data-cover-scope="header"]) > [data-name="content"],
68
86
  [data-cover-scope="header"] > [data-name="cover-band"] > [data-name="preamble"] {
@@ -9,12 +9,14 @@
9
9
 
10
10
  [data-density="full"] {
11
11
  --rune-padding: var(--rf-spacing-md);
12
+ --rf-title-size: var(--rf-text-2xl);
12
13
  }
13
14
 
14
15
  /* ─── Compact: truncated descriptions, tight spacing ──────────────── */
15
16
 
16
17
  [data-density="compact"] {
17
18
  --rune-padding: var(--rf-spacing-sm);
19
+ --rf-title-size: var(--rf-text-xl);
18
20
  }
19
21
 
20
22
  [data-density="compact"] [data-section="description"] {
@@ -32,6 +34,7 @@
32
34
 
33
35
  [data-density="minimal"] {
34
36
  --rune-padding: var(--rf-spacing-xs);
37
+ --rf-title-size: var(--rf-text);
35
38
  }
36
39
 
37
40
  [data-density="minimal"] [data-section="description"] {
@@ -42,7 +42,7 @@
42
42
  * guest so a displaced image's shadow falls into the slot's exposed
43
43
  * interior (clipped at the slot's `overflow: hidden` boundary like any
44
44
  * other in-slot content). */
45
- [data-section="media"][data-frame-shadow] > :is(img, video, [data-rune]) {
45
+ [data-section="media"][data-frame-shadow] > :is(img, video, .rf-placeholder, [data-rune]) {
46
46
  filter: var(--frame-shadow);
47
47
  }
48
48
 
@@ -50,7 +50,7 @@
50
50
  [style*="--frame-aspect"] { aspect-ratio: var(--frame-aspect); }
51
51
 
52
52
  /* ── Crop anchor — focal point when the guest is cut ─────────────────── */
53
- [style*="--frame-anchor"] > :is(img, video) { object-position: var(--frame-anchor); }
53
+ [style*="--frame-anchor"] > :is(img, video, .rf-placeholder) { object-position: var(--frame-anchor); }
54
54
 
55
55
  /* ── Placement of the framed box within its slot ─────────────────────── */
56
56
  [style*="--frame-place-x"] { justify-self: var(--frame-place-x, auto); align-self: var(--frame-place-y, auto); }
@@ -59,7 +59,7 @@
59
59
  /* `[data-rune]` extends the rule to nested rune guests (codegroup, mockup,
60
60
  * chart, etc.), so frame chrome stays guest-agnostic — the same selector
61
61
  * pattern the displace rule uses. */
62
- [style*="--frame-oversize"] > :is(img, video, [data-rune]) { width: calc(100% * var(--frame-oversize, 1)); max-width: none; }
62
+ [style*="--frame-oversize"] > :is(img, video, .rf-placeholder, [data-rune]) { width: calc(100% * var(--frame-oversize, 1)); max-width: none; }
63
63
 
64
64
  /* ── Displacement (peek / spill) — move the guest toward an edge/corner.
65
65
  * The host decides whether the guest is cropped or spills; this only moves it.
@@ -80,7 +80,7 @@
80
80
  * parent's edge for a true breakout. */
81
81
 
82
82
  /* — Case 1: media-zone displace → translate the inner guest, zone clips. */
83
- [data-section="media"][data-displace] > :is(img, video, [data-rune]) {
83
+ [data-section="media"][data-displace] > :is(img, video, .rf-placeholder, [data-rune]) {
84
84
  transform: translate(var(--displace-x, 0), var(--displace-y, 0));
85
85
  }
86
86
  [data-section="media"][data-displace="top"] { --displace-y: calc(-1 * var(--frame-offset, var(--rf-spacing-lg))); }
@@ -22,7 +22,7 @@
22
22
  [data-meta-type="id"],
23
23
  [data-meta-type="code"] {
24
24
  font-family: var(--rf-font-mono, monospace);
25
- font-size: var(--meta-font-size, 0.8125rem);
25
+ font-size: var(--meta-font-size, var(--rf-text-sm));
26
26
  }
27
27
 
28
28
  /* IDs read as primary-coloured references wherever they appear (eyebrow
@@ -30,7 +30,7 @@
30
30
  * not a per-layout one. `code` (e.g. API paths) stays neutral monospace. */
31
31
  [data-meta-type="id"] {
32
32
  color: var(--rf-color-primary);
33
- font-weight: 500;
33
+ font-weight: var(--rf-weight-medium);
34
34
  }
35
35
 
36
36
  [data-meta-type="quantity"] {
@@ -123,14 +123,14 @@
123
123
  }
124
124
 
125
125
  [data-zone-layout="definition-list"] dt {
126
- font-size: 0.75rem;
127
- font-weight: 500;
126
+ font-size: var(--rf-text-xs);
127
+ font-weight: var(--rf-weight-medium);
128
128
  color: var(--rf-color-muted);
129
129
  }
130
130
 
131
131
  [data-zone-layout="definition-list"] dd {
132
132
  margin: 0;
133
- font-size: 0.875rem;
133
+ font-size: var(--rf-text-sm);
134
134
  }
135
135
 
136
136
  /* Multi-value dd (fields with `splitOn`) renders a row of chips
@@ -145,7 +145,7 @@
145
145
 
146
146
  /* Label element within a chip — thin, muted; pairs visually with the value */
147
147
  [data-meta-label] {
148
- font-weight: 400;
148
+ font-weight: var(--rf-weight-normal);
149
149
  opacity: 0.65;
150
150
  }
151
151
 
@@ -25,29 +25,26 @@
25
25
 
26
26
  /* ─── Title: primary heading ──────────────────────────────────────── */
27
27
 
28
+ /* The size rides --rf-title-size (set per density root in density.css) so a
29
+ * nested rune's own density re-declares it — a full-density hero inside a
30
+ * compact preview keeps its full-size title — and a rune's own title CSS
31
+ * (e.g. .rf-hero__headline) outranks the bare attribute selector. The old
32
+ * `[data-density="compact"] [data-section="title"]` descendant rule leaked
33
+ * through nested densities AND beat per-rune title sizes. */
28
34
  [data-section="title"] {
29
35
  font-family: var(--rf-font-sans);
30
- font-size: 1.5rem;
31
- font-weight: 700;
32
- line-height: 1.2;
36
+ font-size: var(--rf-title-size, var(--rf-text-2xl));
37
+ font-weight: var(--rf-weight-bold);
38
+ line-height: var(--rf-leading-tight);
33
39
  color: var(--rf-color-text);
34
40
  margin: 0;
35
41
  }
36
42
 
37
- /* Scale title with density */
38
- [data-density="compact"] [data-section="title"] {
39
- font-size: 1.25rem;
40
- }
41
-
42
- [data-density="minimal"] [data-section="title"] {
43
- font-size: 1rem;
44
- }
45
-
46
43
  /* ─── Description: secondary text ─────────────────────────────────── */
47
44
 
48
45
  [data-section="description"] {
49
- font-size: 1rem;
50
- line-height: 1.5;
46
+ font-size: var(--rf-text);
47
+ line-height: var(--rf-leading-normal);
51
48
  color: var(--rf-color-muted);
52
49
  margin: var(--rf-spacing-xs) 0 var(--rf-spacing-md);
53
50
  }
@@ -55,7 +52,7 @@
55
52
  /* ─── Body: main content ──────────────────────────────────────────── */
56
53
 
57
54
  [data-section="body"] {
58
- line-height: 1.6;
55
+ line-height: var(--rf-leading-relaxed);
59
56
  color: var(--rf-color-text);
60
57
  }
61
58
 
@@ -23,8 +23,8 @@
23
23
  display: flex;
24
24
  align-items: center;
25
25
  justify-content: center;
26
- font-size: 0.75rem;
27
- font-weight: 700;
26
+ font-size: var(--rf-text-xs);
27
+ font-weight: var(--rf-weight-bold);
28
28
  font-variant-numeric: tabular-nums;
29
29
  color: var(--rf-color-primary);
30
30
  background: var(--rf-color-surface-active);
@@ -110,7 +110,7 @@
110
110
  [data-density="compact"] [data-sequence="numbered"] > li::before {
111
111
  width: 1.25rem;
112
112
  height: 1.25rem;
113
- font-size: 0.625rem;
113
+ font-size: var(--rf-text-xs);
114
114
  }
115
115
 
116
116
  [data-density="compact"] [data-sequence="connected"] > li {
package/styles/global.css CHANGED
@@ -9,7 +9,7 @@ html {
9
9
  font-family: var(--rf-font-sans);
10
10
  color: var(--rf-color-text);
11
11
  background: var(--rf-color-bg);
12
- line-height: 1.7;
12
+ line-height: var(--rf-leading-relaxed);
13
13
  -webkit-font-smoothing: antialiased;
14
14
  -moz-osx-font-smoothing: grayscale;
15
15
  -webkit-text-size-adjust: 100%;
@@ -97,17 +97,17 @@ body {
97
97
  }
98
98
 
99
99
  h1, h2, h3, h4, h5, h6 {
100
- line-height: 1.25;
100
+ line-height: var(--rf-leading-tight);
101
101
  margin-top: 2em;
102
102
  margin-bottom: 0.5em;
103
- font-weight: 650;
104
- letter-spacing: -0.015em;
103
+ font-weight: var(--rf-weight-semibold);
104
+ letter-spacing: var(--rf-tracking-tight);
105
105
  }
106
106
 
107
- h1 { font-size: 1.875rem; font-weight: 700; letter-spacing: -0.025em; }
108
- h2 { font-size: 1.5rem; }
109
- h3 { font-size: 1.2rem; }
110
- h4 { font-size: 1.05rem; }
107
+ h1 { font-size: var(--rf-text-3xl); font-weight: var(--rf-weight-bold); letter-spacing: var(--rf-tracking-tight); }
108
+ h2 { font-size: var(--rf-text-2xl); }
109
+ h3 { font-size: var(--rf-text-xl); }
110
+ h4 { font-size: var(--rf-text); }
111
111
 
112
112
  p {
113
113
  margin-top: 0;
@@ -124,7 +124,7 @@ a:hover {
124
124
  text-decoration: underline;
125
125
  }
126
126
 
127
- strong { font-weight: 600; }
127
+ strong { font-weight: var(--rf-weight-semibold); }
128
128
 
129
129
  code {
130
130
  font-family: var(--rf-font-mono);
@@ -142,8 +142,8 @@ pre {
142
142
  border-radius: var(--rf-radius-md);
143
143
  overflow-x: auto;
144
144
  margin: 1.5rem 0;
145
- font-size: 0.875rem;
146
- line-height: 1.7;
145
+ font-size: var(--rf-text-sm);
146
+ line-height: var(--rf-leading-relaxed);
147
147
  border: 1px solid var(--rf-color-border);
148
148
  }
149
149
 
@@ -183,17 +183,17 @@ table {
183
183
  width: 100%;
184
184
  border-collapse: collapse;
185
185
  margin: 1.5rem 0;
186
- font-size: 0.9rem;
186
+ font-size: var(--rf-text-sm);
187
187
  }
188
188
 
189
189
  th {
190
190
  text-align: left;
191
- font-weight: 600;
191
+ font-weight: var(--rf-weight-semibold);
192
192
  padding: 0.625rem 1rem;
193
193
  border-bottom: 1px solid var(--rf-color-border);
194
- font-size: 0.8rem;
194
+ font-size: var(--rf-text-xs);
195
195
  text-transform: uppercase;
196
- letter-spacing: 0.04em;
196
+ letter-spacing: var(--rf-tracking-wide);
197
197
  color: var(--rf-color-muted);
198
198
  }
199
199