@refrakt-md/lumina 0.22.0 → 0.24.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 (132) hide show
  1. package/base.css +7 -1
  2. package/contracts/structures.json +537 -0
  3. package/dist/config.d.ts.map +1 -1
  4. package/dist/config.js +7 -0
  5. package/dist/config.js.map +1 -1
  6. package/dist/tokens.d.ts.map +1 -1
  7. package/dist/tokens.js +13 -0
  8. package/dist/tokens.js.map +1 -1
  9. package/index.css +11 -1
  10. package/package.json +5 -4
  11. package/styles/base/attributes.css +6 -7
  12. package/styles/dimensions/checklist.css +6 -35
  13. package/styles/dimensions/cover.css +13 -95
  14. package/styles/dimensions/density.css +3 -0
  15. package/styles/dimensions/frame.css +3 -0
  16. package/styles/dimensions/media.css +14 -61
  17. package/styles/dimensions/metadata.css +24 -74
  18. package/styles/dimensions/motion.css +102 -0
  19. package/styles/dimensions/sections.css +10 -24
  20. package/styles/dimensions/sequence.css +14 -79
  21. package/styles/dimensions/state.css +39 -56
  22. package/styles/dimensions/substrate.css +3 -0
  23. package/styles/dimensions/surfaces.css +73 -113
  24. package/styles/elements/blockquote.css +3 -2
  25. package/styles/elements/code.css +3 -0
  26. package/styles/elements/table.css +3 -0
  27. package/styles/global.css +9 -48
  28. package/styles/layouts/blog.css +3 -64
  29. package/styles/layouts/default.css +3 -77
  30. package/styles/layouts/docs.css +3 -153
  31. package/styles/layouts/mobile.css +1 -50
  32. package/styles/layouts/on-this-page.css +3 -2
  33. package/styles/layouts/plan.css +3 -134
  34. package/styles/layouts/search.css +3 -68
  35. package/styles/layouts/split.css +24 -169
  36. package/styles/layouts/theme-toggle.css +3 -29
  37. package/styles/layouts/version-switcher.css +3 -4
  38. package/styles/runes/accordion.css +15 -58
  39. package/styles/runes/aggregate.css +3 -12
  40. package/styles/runes/annotate.css +6 -35
  41. package/styles/runes/api.css +3 -0
  42. package/styles/runes/audio.css +3 -41
  43. package/styles/runes/badge.css +3 -0
  44. package/styles/runes/bar.css +3 -0
  45. package/styles/runes/bento.css +16 -159
  46. package/styles/runes/bg.css +3 -37
  47. package/styles/runes/blog.css +3 -5
  48. package/styles/runes/bond.css +3 -23
  49. package/styles/runes/breadcrumb.css +5 -13
  50. package/styles/runes/budget.css +3 -25
  51. package/styles/runes/bug.css +3 -0
  52. package/styles/runes/card.css +24 -92
  53. package/styles/runes/cast.css +5 -22
  54. package/styles/runes/changelog.css +5 -9
  55. package/styles/runes/character.css +3 -17
  56. package/styles/runes/chart.css +35 -53
  57. package/styles/runes/codegroup.css +15 -23
  58. package/styles/runes/collection.css +5 -82
  59. package/styles/runes/compare.css +3 -14
  60. package/styles/runes/comparison.css +7 -34
  61. package/styles/runes/conversation.css +5 -27
  62. package/styles/runes/cta.css +3 -26
  63. package/styles/runes/datatable.css +25 -40
  64. package/styles/runes/decision.css +3 -0
  65. package/styles/runes/design-context.css +3 -2
  66. package/styles/runes/details.css +5 -13
  67. package/styles/runes/diagram.css +5 -13
  68. package/styles/runes/diff.css +5 -88
  69. package/styles/runes/drawer.css +1 -105
  70. package/styles/runes/embed.css +4 -12
  71. package/styles/runes/event.css +3 -1
  72. package/styles/runes/expand.css +5 -40
  73. package/styles/runes/faction.css +3 -9
  74. package/styles/runes/feature.css +4 -32
  75. package/styles/runes/figure.css +5 -24
  76. package/styles/runes/file-ref.css +3 -18
  77. package/styles/runes/form.css +3 -32
  78. package/styles/runes/gallery.css +3 -135
  79. package/styles/runes/grid.css +4 -56
  80. package/styles/runes/hero.css +13 -126
  81. package/styles/runes/hint.css +16 -41
  82. package/styles/runes/howto.css +3 -25
  83. package/styles/runes/itinerary.css +3 -32
  84. package/styles/runes/juxtapose.css +12 -87
  85. package/styles/runes/lore.css +3 -10
  86. package/styles/runes/map.css +3 -36
  87. package/styles/runes/mediatext.css +3 -44
  88. package/styles/runes/milestone.css +3 -16
  89. package/styles/runes/mockup.css +15 -108
  90. package/styles/runes/nav.css +3 -178
  91. package/styles/runes/organization.css +3 -2
  92. package/styles/runes/page-section.css +3 -4
  93. package/styles/runes/pagination.css +5 -37
  94. package/styles/runes/palette.css +3 -22
  95. package/styles/runes/placeholder.css +3 -3
  96. package/styles/runes/plan-history.css +3 -23
  97. package/styles/runes/plan-progress.css +3 -4
  98. package/styles/runes/plan-ref.css +3 -0
  99. package/styles/runes/playlist.css +2 -36
  100. package/styles/runes/plot.css +3 -19
  101. package/styles/runes/preview.css +7 -25
  102. package/styles/runes/pricing.css +7 -25
  103. package/styles/runes/progress.css +6 -25
  104. package/styles/runes/pullquote.css +3 -26
  105. package/styles/runes/realm.css +3 -9
  106. package/styles/runes/recipe.css +3 -27
  107. package/styles/runes/relationships.css +3 -34
  108. package/styles/runes/reveal.css +7 -12
  109. package/styles/runes/sandbox.css +6 -36
  110. package/styles/runes/section.css +4 -18
  111. package/styles/runes/showcase.css +3 -20
  112. package/styles/runes/sidenote.css +3 -2
  113. package/styles/runes/snippet.css +3 -0
  114. package/styles/runes/spacing.css +3 -22
  115. package/styles/runes/spec.css +3 -0
  116. package/styles/runes/steps.css +4 -36
  117. package/styles/runes/storyboard.css +2 -17
  118. package/styles/runes/swatch.css +3 -6
  119. package/styles/runes/symbol.css +6 -4
  120. package/styles/runes/tabs.css +6 -9
  121. package/styles/runes/testimonial.css +5 -6
  122. package/styles/runes/textblock.css +2 -20
  123. package/styles/runes/timeline.css +3 -21
  124. package/styles/runes/tint.css +3 -0
  125. package/styles/runes/toc.css +5 -3
  126. package/styles/runes/track.css +2 -31
  127. package/styles/runes/typography.css +3 -15
  128. package/styles/runes/work.css +3 -0
  129. package/styles/runes/xref.css +3 -1
  130. package/tokens/base.css +19 -0
  131. package/tokens/dark.css +3 -0
  132. package/styles/dimensions/guest-posture.css +0 -27
@@ -1,27 +1,14 @@
1
- /* Pagination — prev/next links at the foot of sequential pages.
2
- *
3
- * Each box stacks the directional marker above the label so the two
4
- * controls stay compact enough to sit side-by-side on mobile. Equal
5
- * heights are guaranteed by the container's `align-items: stretch`, so
6
- * if one label wraps to multiple lines the other box grows to match.
7
- *
8
- * Boxes are capped at ~50% width via `flex: 1 1 0` + `max-width`, with
9
- * `margin-left: auto` on `__next` so it stays right-aligned even when
10
- * `__prev` isn't rendered (first page in a sequence). */
11
-
1
+ @layer skin {
2
+ /* Pagination — skin. The flex row + box flex sizing + alignment + marker order
3
+ * live in @refrakt-md/skeleton (styles/runes/pagination.css). */
12
4
  .rf-pagination {
13
- display: flex;
14
- align-items: stretch;
15
5
  gap: 1rem;
16
6
  margin: 3rem 0 1.5rem;
17
7
  padding-top: 1.5rem;
18
8
  border-top: 1px solid var(--rf-color-border);
19
9
  }
20
-
21
10
  .rf-pagination__prev,
22
11
  .rf-pagination__next {
23
- display: flex;
24
- flex-direction: column;
25
12
  gap: 0.375rem;
26
13
  padding: 0.75rem 1rem;
27
14
  border: 1px solid var(--rf-color-border);
@@ -30,48 +17,28 @@
30
17
  text-decoration: none;
31
18
  font-size: var(--rf-text-sm);
32
19
  transition: border-color 150ms ease, background-color 150ms ease;
33
- flex: 1 1 0;
34
- min-width: 0;
35
- max-width: calc(50% - 0.5rem);
36
20
  }
37
-
38
21
  .rf-pagination__prev {
39
- align-items: flex-start;
40
22
  text-align: left;
41
23
  }
42
-
43
24
  .rf-pagination__next {
44
- align-items: flex-end;
45
25
  text-align: right;
46
- margin-left: auto;
47
26
  }
48
-
49
27
  .rf-pagination__prev:hover,
50
28
  .rf-pagination__next:hover {
51
29
  border-color: var(--rf-color-primary);
52
30
  background: var(--rf-color-surface, var(--rf-color-bg));
53
31
  text-decoration: none;
54
32
  }
55
-
56
33
  .rf-pagination [data-name="marker"] {
57
34
  color: var(--rf-color-muted);
58
35
  font-weight: var(--rf-weight-normal);
59
36
  font-size: var(--rf-text-lg);
60
37
  line-height: 1;
61
38
  }
62
-
63
39
  .rf-pagination [data-name="label"] {
64
40
  font-weight: var(--rf-weight-medium);
65
41
  }
66
-
67
- /* The pagination rune emits prev as `<marker> <label>` but next as
68
- `<label> <marker>` (an artefact of the original row layout where the
69
- arrow flanked the outer edge). With our vertical stack this puts the
70
- next arrow at the bottom of its box. Force it to the top to match prev. */
71
- .rf-pagination__next [data-name="marker"] {
72
- order: -1;
73
- }
74
-
75
42
  @media (max-width: 768px) {
76
43
  .rf-pagination {
77
44
  gap: 0.5rem;
@@ -79,7 +46,8 @@
79
46
  .rf-pagination__prev,
80
47
  .rf-pagination__next {
81
48
  padding: 0.625rem 0.875rem;
82
- max-width: calc(50% - 0.25rem);
83
49
  font-size: var(--rf-text-sm);
84
50
  }
85
51
  }
52
+
53
+ }
@@ -1,3 +1,4 @@
1
+ @layer skin {
1
2
  /* Palette — color swatch grid */
2
3
  .rf-palette__title {
3
4
  font-size: var(--rf-text-lg);
@@ -19,26 +20,12 @@
19
20
  margin-bottom: 0.75rem;
20
21
  }
21
22
  .rf-palette__grid {
22
- display: grid;
23
- grid-template-columns: repeat(var(--rf-palette-cols, 4), 1fr);
24
23
  gap: 0.75rem;
25
24
  }
26
-
27
- @media (max-width: 768px) {
28
- /* Cap the grid at 3 columns on narrow viewports — at 4 cols each swatch
29
- is too cramped to read the hex value. Palettes with fewer than 3
30
- declared columns keep their natural count (the `min()`). */
31
- .rf-palette__grid {
32
- grid-template-columns: repeat(min(var(--rf-palette-cols, 4), 3), 1fr);
33
- }
34
- }
35
25
  .rf-palette__swatch {
36
- display: flex;
37
- flex-direction: column;
38
26
  gap: 0.375rem;
39
27
  }
40
28
  .rf-palette__swatch-color {
41
- height: 5rem;
42
29
  border-radius: var(--rf-radius-md, 8px);
43
30
  border: 1px solid rgba(0, 0, 0, 0.08);
44
31
  }
@@ -57,7 +44,6 @@
57
44
  color: var(--rf-color-muted);
58
45
  }
59
46
  .rf-palette__swatch-a11y {
60
- display: flex;
61
47
  gap: 0.5rem;
62
48
  font-size: var(--rf-text-xs);
63
49
  font-weight: var(--rf-weight-medium);
@@ -71,18 +57,11 @@
71
57
 
72
58
  /* Neutral scale — horizontal gradient strip */
73
59
  .rf-palette__scale {
74
- display: flex;
75
60
  border-radius: var(--rf-radius-md, 8px);
76
- overflow: hidden;
77
61
  margin-bottom: 0.5rem;
78
62
  }
79
63
  .rf-palette__scale-stop {
80
- flex: 1;
81
64
  padding: 1.25rem 0.5rem 0.5rem;
82
- display: flex;
83
- align-items: flex-end;
84
- justify-content: center;
85
- min-height: 4rem;
86
65
  font-size: var(--rf-text-xs);
87
66
  font-family: var(--rf-font-mono, monospace);
88
67
  }
@@ -95,3 +74,5 @@
95
74
  .rf-palette--in-design-context {
96
75
  margin: 0;
97
76
  }
77
+
78
+ }
@@ -1,12 +1,10 @@
1
+ @layer skin {
1
2
  /* Placeholder — generated inline SVG from the `placeholder:<shape>` image-src
2
3
  * scheme (SPEC-106). The SVG carries its own viewBox aspect and tints itself
3
4
  * with theme tokens (surface / muted / border), so it tracks the active tint
4
5
  * and dark mode for free. These rules just make it behave like a responsive
5
6
  * replaced element wherever a real `<img>` would have gone. */
6
7
  .rf-placeholder {
7
- display: block;
8
- width: 100%;
9
- height: auto;
10
8
  border-radius: var(--rf-radius-media);
11
9
  }
12
10
 
@@ -14,3 +12,5 @@
14
12
  .rf-placeholder[data-shape="avatar"] {
15
13
  border-radius: 50%;
16
14
  }
15
+
16
+ }
@@ -1,3 +1,4 @@
1
+ @layer skin {
1
2
  /* Plan History — vertical timeline (mirrors .rf-timeline--vertical) */
2
3
 
3
4
  .rf-plan-history {
@@ -12,14 +13,12 @@
12
13
 
13
14
  /* Event list — vertical line */
14
15
  .rf-plan-history__events {
15
- list-style: none;
16
16
  padding: 0;
17
17
  margin: 0;
18
18
  }
19
19
 
20
20
  /* Each event entry — left-padded with border line */
21
21
  .rf-plan-history__event {
22
- position: relative;
23
22
  padding-left: 2rem;
24
23
  padding-bottom: 2rem;
25
24
  border-left: 2px solid var(--rf-color-border);
@@ -32,12 +31,6 @@
32
31
 
33
32
  /* Circle markers on the timeline line */
34
33
  .rf-plan-history__event::before {
35
- content: '';
36
- position: absolute;
37
- left: -0.4375rem;
38
- top: 0.25rem;
39
- width: 0.75rem;
40
- height: 0.75rem;
41
34
  border-radius: 50%;
42
35
  background: var(--rf-color-primary);
43
36
  border: 2px solid var(--rf-color-bg);
@@ -51,7 +44,6 @@
51
44
 
52
45
  /* Date + hash header */
53
46
  .rf-plan-history__date {
54
- display: inline;
55
47
  font-size: var(--rf-text-xs);
56
48
  font-weight: var(--rf-weight-semibold);
57
49
  color: var(--rf-color-primary);
@@ -74,8 +66,6 @@ a.rf-plan-history__hash:hover {
74
66
  margin-top: 0.25rem;
75
67
  }
76
68
  .rf-plan-history__change {
77
- display: flex;
78
- align-items: center;
79
69
  gap: 0.25rem;
80
70
  font-size: var(--rf-text-sm);
81
71
  line-height: var(--rf-leading-relaxed);
@@ -123,7 +113,6 @@ a.rf-plan-history__hash:hover {
123
113
 
124
114
  /* Criteria list */
125
115
  .rf-plan-history__criteria {
126
- list-style: none;
127
116
  padding: 0;
128
117
  margin: 0.25rem 0 0;
129
118
  }
@@ -156,7 +145,6 @@ a.rf-plan-history__hash:hover {
156
145
 
157
146
  /* Global feed (commit-grouped) */
158
147
  .rf-plan-history--global .rf-plan-history__commit-message {
159
- display: block;
160
148
  font-size: var(--rf-text);
161
149
  font-weight: var(--rf-weight-bold);
162
150
  color: var(--rf-color-text);
@@ -164,8 +152,6 @@ a.rf-plan-history__hash:hover {
164
152
  margin-bottom: 0.5rem;
165
153
  }
166
154
  .rf-plan-history--global .rf-plan-history__entity-summary {
167
- display: flex;
168
- align-items: baseline;
169
155
  gap: 0.5rem;
170
156
  font-size: var(--rf-text-sm);
171
157
  line-height: var(--rf-leading-relaxed);
@@ -186,12 +172,6 @@ a.rf-plan-history__hash:hover {
186
172
  .rf-plan-history__event {
187
173
  padding-left: 1.25rem;
188
174
  }
189
- .rf-plan-history__event::before {
190
- width: 0.625rem;
191
- height: 0.625rem;
192
- left: -0.375rem;
193
- }
194
- .rf-plan-history__change {
195
- flex-wrap: wrap;
196
- }
175
+ }
176
+
197
177
  }
@@ -1,15 +1,12 @@
1
+ @layer skin {
1
2
  /* plan-progress (SPEC-076 / WORK-296) — a stack of per-type blocks, each a type
2
3
  * heading + an `aggregate` composition (progress bar + status badges). The bar
3
4
  * and badge-row chrome come from the `progress` / `aggregate` / `badge` runes;
4
5
  * this file only lays out the per-type grouping. */
5
6
  .rf-plan-progress {
6
- display: flex;
7
- flex-direction: column;
8
7
  gap: var(--rf-spacing-lg, 2rem);
9
8
  }
10
9
  .rf-plan-progress__group {
11
- display: flex;
12
- flex-direction: column;
13
10
  gap: var(--rf-spacing-sm, 0.75rem);
14
11
  }
15
12
  .rf-plan-progress__heading {
@@ -20,3 +17,5 @@
20
17
  letter-spacing: var(--rf-tracking-wider);
21
18
  color: var(--rf-color-muted);
22
19
  }
20
+
21
+ }
@@ -1,3 +1,4 @@
1
+ @layer skin {
1
2
  /* Plan cross-reference links */
2
3
 
3
4
  .rf-plan-ref {
@@ -24,3 +25,5 @@
24
25
  .rf-plan-ref[data-type="bug"]::before { content: '\1F41B'; }
25
26
  .rf-plan-ref[data-type="decision"]::before { content: '\2696\FE0F'; }
26
27
  .rf-plan-ref[data-type="milestone"]::before { content: '\1F3AF'; }
28
+
29
+ }
@@ -1,3 +1,4 @@
1
+ @layer skin {
1
2
  /* Playlist */
2
3
 
3
4
  /* Thin-edge inset model (matches `.rf-card` / `.rf-recipe`): card outer padding
@@ -34,8 +35,6 @@
34
35
 
35
36
  /* Inner header (headline + description) inside content */
36
37
  .rf-playlist__content > .rf-playlist__header {
37
- flex-direction: column;
38
- align-items: flex-start;
39
38
  gap: 0.25rem;
40
39
  margin-bottom: 1rem;
41
40
  }
@@ -51,29 +50,19 @@
51
50
 
52
51
  /* Tracks list wrapper */
53
52
  .rf-playlist__tracks {
54
- list-style: none;
55
53
  padding: 0;
56
54
  margin: 0;
57
- counter-reset: track;
58
55
  border: 1px solid var(--rf-color-border);
59
56
  border-radius: var(--rf-radius-md);
60
- overflow: hidden;
61
57
  }
62
58
 
63
59
  /* Track items — override sequence dimension's absolute positioning */
64
60
  .rf-playlist__tracks > li {
65
- display: flex;
66
- align-items: baseline;
67
61
  gap: 0.75rem;
68
62
  padding: 0.75rem 1.25rem;
69
63
  padding-left: 1.25rem;
70
- position: static;
71
64
  transition: background 0.15s ease;
72
65
  }
73
- /* Hide meta elements from flex layout */
74
- .rf-playlist__tracks > li > meta {
75
- display: none;
76
- }
77
66
  .rf-playlist__tracks > li + li {
78
67
  border-top: 1px solid var(--rf-color-border);
79
68
  }
@@ -81,27 +70,19 @@
81
70
  background: color-mix(in srgb, var(--rf-color-border) 15%, transparent);
82
71
  }
83
72
  .rf-playlist__tracks > li::before {
84
- position: static;
85
- width: auto;
86
- height: auto;
87
- min-width: 1.5rem;
88
73
  font-size: var(--rf-text-xs);
89
74
  font-variant-numeric: tabular-nums;
90
75
  color: var(--rf-color-muted);
91
76
  background: none;
92
77
  border-radius: 0;
93
78
  text-align: right;
94
- flex-shrink: 0;
95
79
  }
96
80
 
97
81
  /* Track name */
98
82
  .rf-playlist__tracks [data-name="track-name"] {
99
- flex: 1;
100
83
  font-size: var(--rf-text);
101
84
  font-weight: var(--rf-weight-medium);
102
85
  color: var(--rf-color-text);
103
- min-width: 0;
104
- overflow: hidden;
105
86
  text-overflow: ellipsis;
106
87
  white-space: nowrap;
107
88
  }
@@ -110,7 +91,6 @@
110
91
  .rf-playlist__tracks [data-name="track-artist"] {
111
92
  font-size: var(--rf-text-sm);
112
93
  color: var(--rf-color-muted);
113
- flex-shrink: 0;
114
94
  }
115
95
  .rf-playlist__tracks [data-name="track-artist"]::before {
116
96
  content: '\00b7';
@@ -123,9 +103,6 @@
123
103
  font-size: var(--rf-text-sm);
124
104
  color: var(--rf-color-muted);
125
105
  font-variant-numeric: tabular-nums;
126
- flex-shrink: 0;
127
- margin-left: auto;
128
- min-width: 3rem;
129
106
  text-align: right;
130
107
  }
131
108
 
@@ -133,7 +110,6 @@
133
110
  .rf-playlist__tracks [data-name="track-meta"] {
134
111
  font-size: var(--rf-text-xs);
135
112
  color: var(--rf-color-muted);
136
- flex-shrink: 0;
137
113
  }
138
114
  .rf-playlist__tracks [data-name="track-meta"]::before {
139
115
  content: '\00b7';
@@ -147,16 +123,6 @@
147
123
  margin-top: 0.5rem;
148
124
  }
149
125
 
150
- /* Media zone — domain-specific cover art overrides (base styles in split.css) */
151
- .rf-playlist__media img {
152
- aspect-ratio: 1;
153
- object-fit: cover;
154
- }
155
-
156
126
  /* Hide secondary columns on narrow screens */
157
- @media (max-width: 480px) {
158
- .rf-playlist__tracks [data-name="track-artist"],
159
- .rf-playlist__tracks [data-name="track-meta"] {
160
- display: none;
161
- }
127
+
162
128
  }
@@ -1,10 +1,5 @@
1
- /* Plot */
2
- .rf-plot {
3
- display: flex;
4
- flex-direction: column;
5
- }
1
+ @layer skin {
6
2
  .rf-plot > span[property="name"] {
7
- display: block;
8
3
  font-size: var(--rf-text-2xl);
9
4
  font-weight: var(--rf-weight-bold);
10
5
  margin-bottom: 0.5rem;
@@ -20,26 +15,18 @@
20
15
 
21
16
  /* Beats list */
22
17
  .rf-plot ol {
23
- list-style: none;
24
18
  padding-left: 0;
25
19
  margin: 1rem 0 0;
26
20
  }
27
21
 
28
22
  /* Beat — all variants use left padding with dot at left: 0 */
29
23
  .rf-beat {
30
- position: relative;
31
24
  padding: 0.625rem 0 0.625rem 2.25rem;
32
25
  }
33
26
  .rf-beat + .rf-beat {
34
27
  border-top: 1px solid var(--rf-color-border);
35
28
  }
36
29
  .rf-beat::before {
37
- content: '';
38
- position: absolute;
39
- left: 0.375rem;
40
- top: 1rem;
41
- width: 0.75rem;
42
- height: 0.75rem;
43
30
  border-radius: 50%;
44
31
  background: var(--rf-color-surface-active);
45
32
  border: 2px solid var(--rf-color-bg);
@@ -69,13 +56,8 @@
69
56
  border-left: 2px solid var(--rf-color-border);
70
57
  margin-left: 0.375rem;
71
58
  }
72
- .rf-plot--linear .rf-beat::before {
73
- left: -0.4375rem;
74
- top: 0.125rem;
75
- }
76
59
  .rf-plot--linear .rf-beat > span[data-field="label"] {
77
60
  line-height: 1;
78
- display: block;
79
61
  margin-top: -0.5rem;
80
62
  }
81
63
  .rf-plot--linear .rf-beat + .rf-beat {
@@ -115,3 +97,5 @@
115
97
  background: var(--rf-color-muted);
116
98
  box-shadow: 0 0 0 2px var(--rf-color-muted);
117
99
  }
100
+
101
+ }
@@ -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,11 +6,7 @@
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
12
  font-size: var(--rf-text-xs);
@@ -21,14 +18,11 @@
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
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);
@@ -179,7 +156,10 @@
179
156
  border-left: none;
180
157
  border-right: none;
181
158
  }
182
- /* Break out of feature's padding-inline to reach viewport edges */
159
+ /* Break out of the feature's padding-inline to reach the viewport edges. Stays
160
+ * skin (not skeleton): this overrides the skin rule `.rf-preview { margin: 2rem 0 }`
161
+ * by specificity, and that only wins within the same cascade layer — in
162
+ * @layer skeleton it loses to the skin margin and the bleed is nullified. */
183
163
  .rf-preview--in-feature {
184
164
  margin-inline: calc(-1 * var(--rf-content-gutter, 1.5rem));
185
165
  }
@@ -187,3 +167,5 @@
187
167
  padding-inline: var(--rf-content-gutter, 1.5rem);
188
168
  }
189
169
  }
170
+
171
+ }
@@ -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;
@@ -23,8 +23,6 @@
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);
@@ -36,7 +34,7 @@
36
34
  }
37
35
  .rf-pricing__eyebrow:has(a):hover { border-color: var(--rf-color-muted); }
38
36
  .rf-pricing__eyebrow:has(a) a { color: var(--rf-color-primary); font-weight: var(--rf-weight-semibold); text-decoration: none; }
39
- .rf-pricing__eyebrow:has(a) a::before { content: ''; position: absolute; inset: 0; border-radius: inherit; }
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 {
@@ -90,11 +76,7 @@
90
76
  margin-bottom: 1.5rem;
91
77
  line-height: var(--rf-leading-tight);
92
78
  }
93
- .rf-tier__body {
94
- flex: 1;
95
- }
96
79
  .rf-tier__body ul {
97
- list-style: none;
98
80
  padding-left: 0;
99
81
  margin: 0 0 1.5rem;
100
82
  }
@@ -110,7 +92,6 @@
110
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);
@@ -118,7 +99,6 @@
118
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
+ }