@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,3 +1,4 @@
1
+ @layer skin {
1
2
  /* Preview — Component showcase with theme toggle and width control */
2
3
  .rf-preview {
3
4
  margin: 2rem 0;
@@ -5,30 +6,23 @@
5
6
 
6
7
  /* Toolbar — transparent, controls float above the canvas */
7
8
  .rf-preview__toolbar {
8
- display: flex;
9
- align-items: center;
10
- justify-content: space-between;
11
9
  padding: 0.25rem 0.25rem 0.5rem;
12
- min-height: 2rem;
13
10
  }
14
11
  .rf-preview__title {
15
- font-size: 0.75rem;
16
- font-weight: 600;
12
+ font-size: var(--rf-text-xs);
13
+ font-weight: var(--rf-weight-semibold);
17
14
  color: var(--rf-color-muted);
18
15
  text-transform: uppercase;
19
- letter-spacing: 0.05em;
16
+ letter-spacing: var(--rf-tracking-wider);
20
17
  }
21
18
 
22
19
  /* Controls container (view toggle + theme toggle) */
23
20
  .rf-preview__controls {
24
- display: flex;
25
- align-items: center;
26
21
  gap: 0.5rem;
27
22
  }
28
23
 
29
24
  /* View toggle pill (code/preview) */
30
25
  .rf-preview__view-toggle {
31
- display: flex;
32
26
  gap: 0.125rem;
33
27
  background: var(--rf-color-surface-active);
34
28
  border-radius: var(--rf-radius-full);
@@ -37,18 +31,12 @@
37
31
 
38
32
  /* Theme toggle pill */
39
33
  .rf-preview__toggle {
40
- display: flex;
41
34
  gap: 0.125rem;
42
35
  background: var(--rf-color-surface-active);
43
36
  border-radius: var(--rf-radius-full);
44
37
  padding: 0.125rem;
45
38
  }
46
39
  .rf-preview__toggle-btn {
47
- display: flex;
48
- align-items: center;
49
- justify-content: center;
50
- width: 1.625rem;
51
- height: 1.625rem;
52
40
  border: none;
53
41
  border-radius: var(--rf-radius-full);
54
42
  background: transparent;
@@ -73,7 +61,6 @@
73
61
  color: var(--rf-color-text);
74
62
  border: 1px solid var(--rf-color-border);
75
63
  border-radius: var(--rf-radius-lg);
76
- overflow: hidden;
77
64
  }
78
65
  /* Centre a standalone mockup whose `data-fit="none"` makes it inline-block —
79
66
  * margin-inline auto can't centre an inline-block, only its parent's text
@@ -94,7 +81,6 @@
94
81
 
95
82
  /* Viewport simulation toggle pill */
96
83
  .rf-preview__viewport-toggle {
97
- display: flex;
98
84
  gap: 0.125rem;
99
85
  background: var(--rf-color-surface-active);
100
86
  border-radius: var(--rf-radius-full);
@@ -103,24 +89,16 @@
103
89
 
104
90
  /* Viewport simulation frame */
105
91
  .rf-preview__viewport-frame {
106
- position: relative;
107
- overflow: hidden;
108
92
  transition: max-width 300ms ease;
109
93
  }
110
94
  .rf-preview__viewport-frame--constrained {
111
- margin: 0 auto;
112
95
  border: 1px dashed var(--rf-color-border);
113
96
  border-radius: var(--rf-radius-sm);
114
97
  }
115
98
  .rf-preview__viewport-label {
116
- position: absolute;
117
- top: 0.25rem;
118
- right: 0.5rem;
119
- font-size: 0.625rem;
99
+ font-size: var(--rf-text-xs);
120
100
  color: var(--rf-color-muted);
121
101
  font-variant-numeric: tabular-nums;
122
- pointer-events: none;
123
- z-index: 1;
124
102
  }
125
103
 
126
104
  /* Source code view — bordered frame matching the canvas */
@@ -139,7 +117,6 @@
139
117
 
140
118
  /* Source tabs (data-source panels) */
141
119
  .rf-preview__source-tabs {
142
- display: flex;
143
120
  gap: 0;
144
121
  background: var(--rf-color-surface);
145
122
  border-radius: var(--rf-radius-lg);
@@ -149,8 +126,8 @@
149
126
  border: none;
150
127
  background: transparent;
151
128
  color: var(--rf-color-muted);
152
- font-size: 0.75rem;
153
- font-weight: 500;
129
+ font-size: var(--rf-text-xs);
130
+ font-weight: var(--rf-weight-medium);
154
131
  cursor: pointer;
155
132
  border-bottom: 2px solid transparent;
156
133
  transition: color 150ms ease, border-color 150ms ease;
@@ -179,11 +156,9 @@
179
156
  border-left: none;
180
157
  border-right: none;
181
158
  }
182
- /* Break out of feature's padding-inline to reach viewport edges */
183
- .rf-preview--in-feature {
184
- margin-inline: calc(-1 * var(--rf-content-gutter, 1.5rem));
185
- }
186
159
  .rf-preview--in-feature .rf-preview__toolbar {
187
160
  padding-inline: var(--rf-content-gutter, 1.5rem);
188
161
  }
189
162
  }
163
+
164
+ }
@@ -1,11 +1,11 @@
1
- /* Pricing */
1
+ @layer skin {
2
+ /* Pricing — skin. The tiers grid, tier flex-column, eyebrow stretched-link, and
3
+ * list resets live in @refrakt-md/skeleton (styles/runes/pricing.css). */
2
4
  .rf-pricing {
3
5
  padding: 2rem 0;
4
6
  }
5
7
  .rf-pricing > header,
6
8
  .rf-pricing__preamble {
7
- flex-direction: column;
8
- align-items: flex-start;
9
9
  gap: 0.25rem;
10
10
  text-align: center;
11
11
  margin-bottom: 2rem;
@@ -15,28 +15,26 @@
15
15
  margin-top: 0;
16
16
  }
17
17
  .rf-pricing__eyebrow {
18
- font-size: 0.8125rem;
19
- font-weight: 600;
20
- letter-spacing: 0.05em;
18
+ font-size: var(--rf-text-sm);
19
+ font-weight: var(--rf-weight-semibold);
20
+ letter-spacing: var(--rf-tracking-wider);
21
21
  text-transform: uppercase;
22
22
  color: var(--rf-color-primary);
23
23
  margin: 0 0 0.5rem;
24
24
  }
25
25
  .rf-pricing__eyebrow:has(a) {
26
- display: inline-block;
27
- position: relative;
28
26
  padding: 0.25rem 0.875rem;
29
27
  border: 1px solid var(--rf-color-border);
30
28
  border-radius: var(--rf-radius-full);
31
29
  color: var(--rf-color-text);
32
- font-weight: 400;
30
+ font-weight: var(--rf-weight-normal);
33
31
  text-transform: none;
34
- letter-spacing: 0;
32
+ letter-spacing: var(--rf-tracking-normal);
35
33
  transition: border-color 150ms ease;
36
34
  }
37
35
  .rf-pricing__eyebrow:has(a):hover { border-color: var(--rf-color-muted); }
38
- .rf-pricing__eyebrow:has(a) a { color: var(--rf-color-primary); font-weight: 600; text-decoration: none; }
39
- .rf-pricing__eyebrow:has(a) a::before { content: ''; position: absolute; inset: 0; border-radius: inherit; }
36
+ .rf-pricing__eyebrow:has(a) a { color: var(--rf-color-primary); font-weight: var(--rf-weight-semibold); text-decoration: none; }
37
+ .rf-pricing__eyebrow:has(a) a::before { border-radius: inherit; }
40
38
  .rf-pricing__blurb {
41
39
  color: var(--rf-color-muted);
42
40
  margin-bottom: 0;
@@ -44,19 +42,9 @@
44
42
  .rf-pricing__image {
45
43
  margin-bottom: 1rem;
46
44
  }
47
- .rf-pricing__tiers {
48
- display: grid;
49
- grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
50
- gap: 1.5rem;
51
- list-style: none;
52
- padding: 0;
53
- margin: 0;
54
- }
45
+ .rf-pricing__tiers,
55
46
  .rf-pricing > ul[data-layout="grid"] {
56
- display: grid;
57
- grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
58
47
  gap: 1.5rem;
59
- list-style: none;
60
48
  padding: 0;
61
49
  margin: 0;
62
50
  }
@@ -65,8 +53,6 @@
65
53
  border-radius: var(--rf-radius-md);
66
54
  padding: 2rem;
67
55
  background: var(--rf-color-bg);
68
- display: flex;
69
- flex-direction: column;
70
56
  transition: box-shadow 200ms ease;
71
57
  }
72
58
  .rf-tier:hover {
@@ -78,47 +64,41 @@
78
64
  }
79
65
  .rf-tier h1[property="name"] {
80
66
  margin: 0 0 0.5rem;
81
- font-size: 1.1rem;
82
- font-weight: 600;
67
+ font-size: var(--rf-text-lg);
68
+ font-weight: var(--rf-weight-semibold);
83
69
  color: var(--rf-color-muted);
84
70
  }
85
71
  .rf-tier p[property="price"] {
86
- font-size: 2.5rem;
87
- font-weight: 700;
88
- letter-spacing: -0.03em;
72
+ font-size: var(--rf-text-4xl);
73
+ font-weight: var(--rf-weight-bold);
74
+ letter-spacing: var(--rf-tracking-tight);
89
75
  color: var(--rf-color-text);
90
76
  margin-bottom: 1.5rem;
91
- line-height: 1.1;
92
- }
93
- .rf-tier__body {
94
- flex: 1;
77
+ line-height: var(--rf-leading-tight);
95
78
  }
96
79
  .rf-tier__body ul {
97
- list-style: none;
98
80
  padding-left: 0;
99
81
  margin: 0 0 1.5rem;
100
82
  }
101
83
  .rf-tier__body li {
102
84
  padding: 0.375rem 0;
103
- font-size: 0.9rem;
85
+ font-size: var(--rf-text-sm);
104
86
  color: var(--rf-color-muted);
105
87
  }
106
88
  .rf-tier__body li::before {
107
89
  content: '\2713';
108
90
  margin-right: 0.5rem;
109
91
  color: var(--rf-color-success);
110
- font-weight: 600;
92
+ font-weight: var(--rf-weight-semibold);
111
93
  }
112
94
  .rf-tier__body a {
113
- display: block;
114
95
  text-align: center;
115
96
  padding: 0.625rem 1.5rem;
116
97
  border-radius: var(--rf-radius-sm);
117
- font-weight: 600;
118
- font-size: 0.9rem;
98
+ font-weight: var(--rf-weight-semibold);
99
+ font-size: var(--rf-text-sm);
119
100
  text-decoration: none;
120
101
  transition: background-color 200ms ease, box-shadow 200ms ease, transform 200ms ease;
121
- margin-top: auto;
122
102
  }
123
103
  .rf-tier:not(.rf-tier--featured) a {
124
104
  background: var(--rf-color-surface);
@@ -142,3 +122,5 @@
142
122
  .rf-tier__body p:has(a) {
143
123
  margin-bottom: 0;
144
124
  }
125
+
126
+ }
@@ -1,49 +1,30 @@
1
- /* progress — generic completion bar (SPEC-072 / WORK-285).
2
- *
3
- * Presentational: the fill width is driven by the `--rf-progress` custom
4
- * property set on the root from the computed percent. Generalized from the
5
- * former plan milestone progress bar.
6
- */
7
-
1
+ @layer skin {
2
+ /* progress — skin. The flex row, value auto-push, track box, and fill box live in
3
+ * @refrakt-md/skeleton (styles/runes/progress.css). */
8
4
  .rf-progress {
9
- display: flex;
10
- flex-wrap: wrap;
11
- align-items: baseline;
12
5
  gap: var(--rf-spacing-xs) var(--rf-spacing-sm);
13
6
  margin: var(--rf-spacing-sm) 0;
14
7
  }
15
-
16
8
  .rf-progress__label {
17
- font-weight: 600;
9
+ font-weight: var(--rf-weight-semibold);
18
10
  color: var(--rf-color-text);
19
11
  }
20
-
21
12
  .rf-progress__value {
22
- font-weight: 600;
13
+ font-weight: var(--rf-weight-semibold);
23
14
  color: var(--rf-color-text);
24
- margin-left: auto;
25
15
  }
26
-
27
16
  .rf-progress__track {
28
- flex-basis: 100%;
29
- height: 0.5rem;
30
17
  border-radius: var(--rf-radius-pill, 999px);
31
18
  background: var(--rf-color-surface-hover);
32
- overflow: hidden;
33
19
  }
34
-
35
20
  .rf-progress__fill {
36
- display: block;
37
- height: 100%;
38
- width: var(--rf-progress, 0%);
39
21
  border-radius: inherit;
40
22
  background: var(--rf-color-primary);
41
23
  transition: width 0.3s ease;
42
24
  }
43
-
44
- /* Sentiment variants tint the fill; the neutral default uses the primary.
45
- * Token names follow the sentiment scheme in dimensions/metadata.css
46
- * (positive→success, caution→warning, negative→danger). */
25
+ /* Sentiment variants tint the fill. */
47
26
  .rf-progress--positive .rf-progress__fill { background: var(--rf-color-success); }
48
27
  .rf-progress--caution .rf-progress__fill { background: var(--rf-color-warning); }
49
28
  .rf-progress--negative .rf-progress__fill { background: var(--rf-color-danger); }
29
+
30
+ }
@@ -1,25 +1,23 @@
1
+ @layer skin {
1
2
  /* PullQuote */
2
3
  .rf-pullquote {
3
4
  margin: 2rem 0;
4
5
  padding: 1.5rem 2rem;
5
6
  border: none;
6
- font-size: 1.375rem;
7
+ font-size: var(--rf-text-xl);
7
8
  font-style: italic;
8
- font-weight: 500;
9
- line-height: 1.5;
9
+ font-weight: var(--rf-weight-medium);
10
+ line-height: var(--rf-leading-normal);
10
11
  color: var(--rf-color-text);
11
12
  background: none;
12
13
  border-radius: 0;
13
- position: relative;
14
14
  }
15
15
  .rf-pullquote::before {
16
16
  content: '\201C';
17
- position: absolute;
18
- top: -0.25rem;
19
- left: 0;
17
+ /* Decorative oversized quote glyph — a display one-off above the type scale. */
20
18
  font-size: 4rem;
21
19
  font-style: normal;
22
- font-weight: 700;
20
+ font-weight: var(--rf-weight-bold);
23
21
  line-height: 1;
24
22
  color: var(--rf-color-primary);
25
23
  opacity: 0.4;
@@ -35,40 +33,23 @@
35
33
  .rf-pullquote--center {
36
34
  text-align: center;
37
35
  max-width: 80%;
38
- margin-left: auto;
39
- margin-right: auto;
40
- }
41
- .rf-pullquote--center::before {
42
- left: 50%;
43
- transform: translateX(-50%);
44
36
  }
45
37
  .rf-pullquote--left {
46
38
  text-align: left;
47
39
  border-left: 2px solid var(--rf-color-primary);
48
40
  padding-left: 1.5rem;
49
41
  }
50
- .rf-pullquote--left::before {
51
- display: none;
52
- }
53
42
  .rf-pullquote--right {
54
43
  text-align: right;
55
44
  border-right: 2px solid var(--rf-color-primary);
56
45
  padding-right: 1.5rem;
57
- margin-left: auto;
58
- }
59
- .rf-pullquote--right::before {
60
- display: none;
61
46
  }
62
47
 
63
48
  /* Float modes — left/right pull quotes can float for text wrapping */
64
49
  .rf-pullquote[data-align="left"] {
65
- float: left;
66
- width: 40%;
67
50
  margin: 0.5rem 2rem 1rem 0;
68
51
  }
69
52
  .rf-pullquote[data-align="right"] {
70
- float: right;
71
- width: 40%;
72
53
  margin: 0.5rem 0 1rem 2rem;
73
54
  }
74
55
 
@@ -89,10 +70,7 @@
89
70
  border-bottom: 2px solid var(--rf-color-border);
90
71
  padding: 1.75rem 0;
91
72
  font-family: Georgia, 'Times New Roman', serif;
92
- letter-spacing: 0.01em;
93
- }
94
- .rf-pullquote--editorial::before {
95
- display: none;
73
+ letter-spacing: var(--rf-tracking-normal);
96
74
  }
97
75
 
98
76
  /* Reset inner blockquote — global blockquote styles shouldn't apply here */
@@ -112,11 +90,11 @@
112
90
  @media (max-width: 768px) {
113
91
  .rf-pullquote[data-align="left"],
114
92
  .rf-pullquote[data-align="right"] {
115
- float: none;
116
- width: 100%;
117
93
  margin: 1.5rem 0;
118
94
  }
119
95
  .rf-pullquote--center {
120
96
  max-width: 100%;
121
97
  }
122
98
  }
99
+
100
+ }
@@ -1,3 +1,4 @@
1
+ @layer skin {
1
2
  /* Realm — split/stacked geometry, the title, and the metadata def-list all
2
3
  * come from the shared layers: layouts/split.css ([data-layout] +
3
4
  * [data-section="media"]), dimensions/sections.css ([data-section="title"] /
@@ -28,12 +29,6 @@
28
29
  row-gap: var(--rf-realm-media-gap);
29
30
  }
30
31
 
31
- /* Stacked layouts — beside layouts handled by shared split.css */
32
- .rf-realm[data-media-position="top"] {
33
- display: flex;
34
- flex-direction: column;
35
- }
36
-
37
32
  .rf-realm[data-media-position="top"] > .rf-realm__scene {
38
33
  margin-bottom: var(--rf-realm-media-gap);
39
34
  }
@@ -43,8 +38,6 @@
43
38
 
44
39
  /* Content */
45
40
  .rf-realm__sections {
46
- display: flex;
47
- flex-direction: column;
48
41
  gap: 1rem;
49
42
  }
50
43
  .rf-realm__content ul,
@@ -58,10 +51,9 @@
58
51
  border-top: 1px solid var(--rf-color-border);
59
52
  }
60
53
  .rf-realm-section__name {
61
- display: block;
62
- font-size: 1.25rem;
63
- font-weight: 700;
64
- line-height: 1.3;
54
+ font-size: var(--rf-text-xl);
55
+ font-weight: var(--rf-weight-bold);
56
+ line-height: var(--rf-leading-snug);
65
57
  margin-bottom: 0.5rem;
66
58
  color: var(--rf-color-text);
67
59
  }
@@ -69,3 +61,5 @@
69
61
  .rf-realm-section__body ol {
70
62
  padding-left: 1.5rem;
71
63
  }
64
+
65
+ }
@@ -1,3 +1,4 @@
1
+ @layer skin {
1
2
  /* Recipe — editorial cookbook aesthetic */
2
3
 
3
4
  /* Thin-edge inset model (matches `.rf-card`): card outer padding is a thin edge,
@@ -35,9 +36,9 @@
35
36
  }
36
37
 
37
38
  .rf-recipe .rf-recipe__eyebrow {
38
- font-size: 0.8rem;
39
- font-weight: 600;
40
- letter-spacing: 0.06em;
39
+ font-size: var(--rf-text-xs);
40
+ font-weight: var(--rf-weight-semibold);
41
+ letter-spacing: var(--rf-tracking-wider);
41
42
  text-transform: uppercase;
42
43
  color: var(--rf-color-primary);
43
44
  margin: 0 0 0.375rem;
@@ -57,8 +58,6 @@
57
58
 
58
59
  /* Content wrapper */
59
60
  .rf-recipe__content {
60
- display: flex;
61
- flex-direction: column;
62
61
  gap: 1.75rem;
63
62
  }
64
63
 
@@ -73,7 +72,7 @@
73
72
  }
74
73
  .rf-recipe__content ul li {
75
74
  padding: 0.2rem 0;
76
- line-height: 1.6;
75
+ line-height: var(--rf-leading-relaxed);
77
76
  }
78
77
  .rf-recipe__content ul li::marker {
79
78
  color: var(--rf-color-primary);
@@ -83,31 +82,18 @@
83
82
  .rf-recipe__content ol {
84
83
  padding-left: 0;
85
84
  margin: 0;
86
- list-style: none;
87
- counter-reset: recipe-step;
88
85
  }
89
86
  .rf-recipe__content ol > li {
90
- counter-increment: recipe-step;
91
87
  padding: 0.625rem 0;
92
88
  padding-left: 2.25rem;
93
- position: relative;
94
- line-height: 1.65;
89
+ line-height: var(--rf-leading-relaxed);
95
90
  }
96
91
  .rf-recipe__content ol > li + li {
97
92
  border-top: 1px solid var(--rf-color-border);
98
93
  }
99
94
  .rf-recipe__content ol > li::before {
100
- content: counter(recipe-step);
101
- position: absolute;
102
- left: 0;
103
- top: 0.625rem;
104
- width: 1.5rem;
105
- height: 1.5rem;
106
- display: flex;
107
- align-items: center;
108
- justify-content: center;
109
- font-size: 0.75rem;
110
- font-weight: 700;
95
+ font-size: var(--rf-text-xs);
96
+ font-weight: var(--rf-weight-bold);
111
97
  color: var(--rf-color-primary);
112
98
  background: var(--rf-color-surface);
113
99
  border-radius: var(--rf-radius-full);
@@ -125,10 +111,10 @@
125
111
  border-radius: 0 var(--rf-radius-md) var(--rf-radius-md) 0;
126
112
  padding: 0.75rem 1.25rem;
127
113
  margin: 0;
128
- font-size: 0.9125rem;
114
+ font-size: var(--rf-text-sm);
129
115
  font-style: italic;
130
116
  color: var(--rf-color-muted);
131
- line-height: 1.6;
117
+ line-height: var(--rf-leading-relaxed);
132
118
  }
133
119
  .rf-recipe__content blockquote p {
134
120
  margin: 0;
@@ -140,23 +126,13 @@
140
126
  .rf-recipe__media img {
141
127
  border-radius: var(--rf-radius-media);
142
128
  }
143
-
144
- /* Metadata — prep / cook / serves / difficulty are short, symmetric facts,
145
- * so keep the def-list a dense tile grid at every width (a smaller column
146
- * min than the 8rem default) instead of the shared mobile label/value list. */
147
- .rf-recipe__metadata {
148
- grid-template-columns: repeat(auto-fit, minmax(6rem, 1fr));
149
- }
150
129
  @media (max-width: 48rem) {
151
130
  .rf-recipe__metadata {
152
- grid-template-columns: repeat(auto-fit, minmax(6rem, 1fr));
153
131
  gap: 0.75rem;
154
- align-items: normal;
155
132
  padding: 0;
156
133
  border: none;
157
134
  }
158
- .rf-recipe__metadata > [data-name="row"] {
159
- display: flex;
160
- }
161
135
  }
162
136
 
137
+
138
+ }
@@ -1,3 +1,4 @@
1
+ @layer skin {
1
2
  /* Relationships — an entity's graph edges, grouped by kind (SPEC-072).
2
3
  *
3
4
  * Generic over kind: the rune emits `data-kind` on each item and a humanized
@@ -16,8 +17,6 @@
16
17
  }
17
18
 
18
19
  .rf-relationships__items {
19
- display: flex;
20
- flex-direction: column;
21
20
  gap: var(--rf-spacing-sm);
22
21
  }
23
22
 
@@ -25,17 +24,7 @@
25
24
  * Mirrors collection: item chrome comes from the item (the card built-in, or
26
25
  * a {% card %} in the body template), not the layout. */
27
26
  .rf-relationships[data-layout='grid'] .rf-relationships__items {
28
- display: grid;
29
- grid-template-columns: repeat(auto-fill, minmax(16rem, 1fr));
30
27
  gap: var(--rf-spacing-md);
31
- align-items: stretch;
32
- }
33
- .rf-relationships[data-layout='grid'] .rf-relationships__item {
34
- display: flex;
35
- }
36
- .rf-relationships[data-layout='grid'] .rf-relationships__item > * {
37
- flex: 1;
38
- min-width: 0;
39
28
  }
40
29
 
41
30
  /* Grouped grid: the grid belongs to each group (its items are the cells), not
@@ -44,24 +33,14 @@
44
33
  * the groups and each group becomes the grid, with its title spanning. */
45
34
  .rf-relationships[data-layout='grid'] .rf-relationships__items:has(.rf-relationships__group),
46
35
  .rf-relationships[data-layout='grid'] .rf-relationships__items:has(.rf-accordion) {
47
- display: flex;
48
- flex-direction: column;
49
36
  gap: var(--rf-spacing-md);
50
37
  }
51
38
  .rf-relationships[data-layout='grid'] .rf-relationships__group {
52
- display: grid;
53
- grid-template-columns: repeat(auto-fill, minmax(16rem, 1fr));
54
39
  gap: var(--rf-spacing-md);
55
- align-items: stretch;
56
- }
57
- .rf-relationships[data-layout='grid'] .rf-relationships__group-title {
58
- grid-column: 1 / -1;
59
40
  }
60
41
 
61
42
  .rf-relationships__group {
62
43
  margin-top: var(--rf-spacing-md);
63
- display: flex;
64
- flex-direction: column;
65
44
  /* Tight default for the built-in inline shape (title + field spans). */
66
45
  gap: var(--rf-spacing-xs);
67
46
  }
@@ -79,23 +58,13 @@
79
58
  margin: 0 0 var(--rf-spacing-sm);
80
59
  font-size: 0.875em;
81
60
  text-transform: uppercase;
82
- letter-spacing: 0.05em;
61
+ letter-spacing: var(--rf-tracking-wider);
83
62
  color: var(--rf-color-muted);
84
63
  }
85
64
 
86
65
  .rf-relationships__item {
87
- display: flex;
88
- flex-wrap: wrap;
89
- align-items: baseline;
90
66
  gap: var(--rf-spacing-xs) var(--rf-spacing-sm);
91
67
  }
92
- /* Block-content item — let the body template (card / callout / etc.) fill the
93
- * container width instead of shrink-fitting. Same `data-block` signal as the
94
- * group spacing above; trim the template's outer block margins so the group
95
- * `gap` governs spacing (works for any block content, not a wrapper element). */
96
- .rf-relationships__item[data-block] {
97
- display: block;
98
- }
99
68
  .rf-relationships__item[data-block] > :first-child {
100
69
  margin-top: 0;
101
70
  }
@@ -105,8 +74,6 @@
105
74
 
106
75
  /* Card chrome for the grid built-in (mirrors collection's __card). */
107
76
  .rf-relationships__card {
108
- display: flex;
109
- flex-direction: column;
110
77
  gap: var(--rf-spacing-xs);
111
78
  padding: var(--rf-spacing-md);
112
79
  border: 1px solid var(--rf-color-border);
@@ -118,7 +85,7 @@
118
85
  }
119
86
 
120
87
  .rf-relationships__title {
121
- font-weight: 600;
88
+ font-weight: var(--rf-weight-semibold);
122
89
  color: var(--rf-color-text);
123
90
  text-decoration: none;
124
91
  }
@@ -130,3 +97,5 @@
130
97
  font-size: 0.875em;
131
98
  color: var(--rf-color-muted);
132
99
  }
100
+
101
+ }