@refrakt-md/lumina 0.22.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 (130) 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.map +1 -1
  6. package/dist/tokens.js +2 -0
  7. package/dist/tokens.js.map +1 -1
  8. package/index.css +10 -1
  9. package/package.json +5 -4
  10. package/styles/base/attributes.css +6 -7
  11. package/styles/dimensions/checklist.css +6 -35
  12. package/styles/dimensions/cover.css +13 -95
  13. package/styles/dimensions/density.css +3 -0
  14. package/styles/dimensions/frame.css +3 -0
  15. package/styles/dimensions/media.css +14 -61
  16. package/styles/dimensions/metadata.css +24 -74
  17. package/styles/dimensions/sections.css +10 -24
  18. package/styles/dimensions/sequence.css +14 -79
  19. package/styles/dimensions/state.css +39 -56
  20. package/styles/dimensions/substrate.css +3 -0
  21. package/styles/dimensions/surfaces.css +73 -113
  22. package/styles/elements/blockquote.css +3 -2
  23. package/styles/elements/code.css +3 -0
  24. package/styles/elements/table.css +3 -0
  25. package/styles/global.css +9 -48
  26. package/styles/layouts/blog.css +3 -64
  27. package/styles/layouts/default.css +3 -77
  28. package/styles/layouts/docs.css +3 -153
  29. package/styles/layouts/mobile.css +1 -50
  30. package/styles/layouts/on-this-page.css +3 -2
  31. package/styles/layouts/plan.css +3 -134
  32. package/styles/layouts/search.css +3 -68
  33. package/styles/layouts/split.css +24 -169
  34. package/styles/layouts/theme-toggle.css +3 -29
  35. package/styles/layouts/version-switcher.css +3 -4
  36. package/styles/runes/accordion.css +15 -58
  37. package/styles/runes/aggregate.css +3 -12
  38. package/styles/runes/annotate.css +6 -35
  39. package/styles/runes/api.css +3 -0
  40. package/styles/runes/audio.css +3 -41
  41. package/styles/runes/badge.css +3 -0
  42. package/styles/runes/bar.css +3 -0
  43. package/styles/runes/bento.css +16 -159
  44. package/styles/runes/bg.css +3 -37
  45. package/styles/runes/blog.css +3 -5
  46. package/styles/runes/bond.css +3 -23
  47. package/styles/runes/breadcrumb.css +5 -13
  48. package/styles/runes/budget.css +3 -25
  49. package/styles/runes/bug.css +3 -0
  50. package/styles/runes/card.css +24 -92
  51. package/styles/runes/cast.css +5 -22
  52. package/styles/runes/changelog.css +5 -9
  53. package/styles/runes/character.css +3 -17
  54. package/styles/runes/chart.css +10 -52
  55. package/styles/runes/codegroup.css +15 -23
  56. package/styles/runes/collection.css +5 -82
  57. package/styles/runes/compare.css +3 -14
  58. package/styles/runes/comparison.css +7 -34
  59. package/styles/runes/conversation.css +5 -27
  60. package/styles/runes/cta.css +3 -26
  61. package/styles/runes/datatable.css +25 -40
  62. package/styles/runes/decision.css +3 -0
  63. package/styles/runes/design-context.css +3 -2
  64. package/styles/runes/details.css +5 -13
  65. package/styles/runes/diagram.css +5 -13
  66. package/styles/runes/diff.css +5 -88
  67. package/styles/runes/drawer.css +1 -105
  68. package/styles/runes/embed.css +4 -12
  69. package/styles/runes/event.css +3 -1
  70. package/styles/runes/expand.css +5 -40
  71. package/styles/runes/faction.css +3 -9
  72. package/styles/runes/feature.css +4 -32
  73. package/styles/runes/figure.css +5 -24
  74. package/styles/runes/file-ref.css +3 -18
  75. package/styles/runes/form.css +3 -32
  76. package/styles/runes/gallery.css +3 -135
  77. package/styles/runes/grid.css +4 -56
  78. package/styles/runes/hero.css +13 -126
  79. package/styles/runes/hint.css +16 -41
  80. package/styles/runes/howto.css +3 -25
  81. package/styles/runes/itinerary.css +3 -32
  82. package/styles/runes/juxtapose.css +12 -87
  83. package/styles/runes/lore.css +3 -10
  84. package/styles/runes/map.css +3 -36
  85. package/styles/runes/mediatext.css +3 -44
  86. package/styles/runes/milestone.css +3 -16
  87. package/styles/runes/mockup.css +3 -108
  88. package/styles/runes/nav.css +3 -178
  89. package/styles/runes/organization.css +3 -2
  90. package/styles/runes/page-section.css +3 -4
  91. package/styles/runes/pagination.css +5 -37
  92. package/styles/runes/palette.css +3 -22
  93. package/styles/runes/placeholder.css +3 -3
  94. package/styles/runes/plan-history.css +3 -23
  95. package/styles/runes/plan-progress.css +3 -4
  96. package/styles/runes/plan-ref.css +3 -0
  97. package/styles/runes/playlist.css +2 -36
  98. package/styles/runes/plot.css +3 -19
  99. package/styles/runes/preview.css +3 -28
  100. package/styles/runes/pricing.css +7 -25
  101. package/styles/runes/progress.css +6 -25
  102. package/styles/runes/pullquote.css +3 -26
  103. package/styles/runes/realm.css +3 -9
  104. package/styles/runes/recipe.css +3 -27
  105. package/styles/runes/relationships.css +3 -34
  106. package/styles/runes/reveal.css +7 -12
  107. package/styles/runes/sandbox.css +6 -36
  108. package/styles/runes/section.css +4 -18
  109. package/styles/runes/showcase.css +3 -20
  110. package/styles/runes/sidenote.css +3 -2
  111. package/styles/runes/snippet.css +3 -0
  112. package/styles/runes/spacing.css +3 -22
  113. package/styles/runes/spec.css +3 -0
  114. package/styles/runes/steps.css +4 -36
  115. package/styles/runes/storyboard.css +2 -17
  116. package/styles/runes/swatch.css +3 -6
  117. package/styles/runes/symbol.css +6 -4
  118. package/styles/runes/tabs.css +6 -9
  119. package/styles/runes/testimonial.css +5 -6
  120. package/styles/runes/textblock.css +2 -20
  121. package/styles/runes/timeline.css +3 -21
  122. package/styles/runes/tint.css +3 -0
  123. package/styles/runes/toc.css +5 -3
  124. package/styles/runes/track.css +2 -31
  125. package/styles/runes/typography.css +3 -15
  126. package/styles/runes/work.css +3 -0
  127. package/styles/runes/xref.css +3 -1
  128. package/tokens/base.css +13 -0
  129. package/tokens/dark.css +3 -0
  130. package/styles/dimensions/guest-posture.css +0 -27
@@ -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
9
  font-weight: var(--rf-weight-semibold);
18
10
  color: var(--rf-color-text);
19
11
  }
20
-
21
12
  .rf-progress__value {
22
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,3 +1,4 @@
1
+ @layer skin {
1
2
  /* PullQuote */
2
3
  .rf-pullquote {
3
4
  margin: 2rem 0;
@@ -10,13 +11,9 @@
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;
20
17
  /* Decorative oversized quote glyph — a display one-off above the type scale. */
21
18
  font-size: 4rem;
22
19
  font-style: normal;
@@ -36,40 +33,23 @@
36
33
  .rf-pullquote--center {
37
34
  text-align: center;
38
35
  max-width: 80%;
39
- margin-left: auto;
40
- margin-right: auto;
41
- }
42
- .rf-pullquote--center::before {
43
- left: 50%;
44
- transform: translateX(-50%);
45
36
  }
46
37
  .rf-pullquote--left {
47
38
  text-align: left;
48
39
  border-left: 2px solid var(--rf-color-primary);
49
40
  padding-left: 1.5rem;
50
41
  }
51
- .rf-pullquote--left::before {
52
- display: none;
53
- }
54
42
  .rf-pullquote--right {
55
43
  text-align: right;
56
44
  border-right: 2px solid var(--rf-color-primary);
57
45
  padding-right: 1.5rem;
58
- margin-left: auto;
59
- }
60
- .rf-pullquote--right::before {
61
- display: none;
62
46
  }
63
47
 
64
48
  /* Float modes — left/right pull quotes can float for text wrapping */
65
49
  .rf-pullquote[data-align="left"] {
66
- float: left;
67
- width: 40%;
68
50
  margin: 0.5rem 2rem 1rem 0;
69
51
  }
70
52
  .rf-pullquote[data-align="right"] {
71
- float: right;
72
- width: 40%;
73
53
  margin: 0.5rem 0 1rem 2rem;
74
54
  }
75
55
 
@@ -92,9 +72,6 @@
92
72
  font-family: Georgia, 'Times New Roman', serif;
93
73
  letter-spacing: var(--rf-tracking-normal);
94
74
  }
95
- .rf-pullquote--editorial::before {
96
- display: none;
97
- }
98
75
 
99
76
  /* Reset inner blockquote — global blockquote styles shouldn't apply here */
100
77
  .rf-pullquote blockquote {
@@ -113,11 +90,11 @@
113
90
  @media (max-width: 768px) {
114
91
  .rf-pullquote[data-align="left"],
115
92
  .rf-pullquote[data-align="right"] {
116
- float: none;
117
- width: 100%;
118
93
  margin: 1.5rem 0;
119
94
  }
120
95
  .rf-pullquote--center {
121
96
  max-width: 100%;
122
97
  }
123
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,7 +51,6 @@
58
51
  border-top: 1px solid var(--rf-color-border);
59
52
  }
60
53
  .rf-realm-section__name {
61
- display: block;
62
54
  font-size: var(--rf-text-xl);
63
55
  font-weight: var(--rf-weight-bold);
64
56
  line-height: var(--rf-leading-snug);
@@ -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,
@@ -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
 
@@ -83,29 +82,16 @@
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
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
95
  font-size: var(--rf-text-xs);
110
96
  font-weight: var(--rf-weight-bold);
111
97
  color: var(--rf-color-primary);
@@ -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
  }
@@ -84,18 +63,8 @@
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);
@@ -130,3 +97,5 @@
130
97
  font-size: 0.875em;
131
98
  color: var(--rf-color-muted);
132
99
  }
100
+
101
+ }
@@ -1,4 +1,7 @@
1
- /* Reveal */
1
+ @layer skin {
2
+ /* Reveal — skin. The eyebrow stretched-link, steps flex, hidden-step collapse,
3
+ * metadata hide, and control flex live in @refrakt-md/skeleton
4
+ * (styles/runes/reveal.css). */
2
5
  .rf-reveal__preamble {
3
6
  margin-bottom: 1.5rem;
4
7
  }
@@ -11,8 +14,6 @@
11
14
  margin: 0 0 0.5rem;
12
15
  }
13
16
  .rf-reveal__eyebrow:has(a) {
14
- display: inline-block;
15
- position: relative;
16
17
  padding: 0.25rem 0.875rem;
17
18
  border: 1px solid var(--rf-color-border);
18
19
  border-radius: var(--rf-radius-full);
@@ -24,7 +25,7 @@
24
25
  }
25
26
  .rf-reveal__eyebrow:has(a):hover { border-color: var(--rf-color-muted); }
26
27
  .rf-reveal__eyebrow:has(a) a { color: var(--rf-color-primary); font-weight: var(--rf-weight-semibold); text-decoration: none; }
27
- .rf-reveal__eyebrow:has(a) a::before { content: ''; position: absolute; inset: 0; border-radius: inherit; }
28
+ .rf-reveal__eyebrow:has(a) a::before { border-radius: inherit; }
28
29
  .rf-reveal__headline {
29
30
  margin-top: 0;
30
31
  }
@@ -36,8 +37,6 @@
36
37
  margin-bottom: 1rem;
37
38
  }
38
39
  .rf-reveal__steps {
39
- display: flex;
40
- flex-direction: column;
41
40
  gap: 1rem;
42
41
  }
43
42
  .rf-reveal-step {
@@ -49,8 +48,6 @@
49
48
  }
50
49
  .rf-reveal-step--hidden {
51
50
  opacity: 0;
52
- height: 0;
53
- overflow: hidden;
54
51
  margin: 0;
55
52
  transform: translateY(0.5rem);
56
53
  }
@@ -63,13 +60,9 @@
63
60
  font-weight: var(--rf-weight-semibold);
64
61
  margin: 0 0 0.5rem;
65
62
  }
66
- .rf-reveal-step__body > span[property],
67
- .rf-reveal-step__body > meta { display: none; }
68
63
  .rf-reveal-step__body p:last-child { margin-bottom: 0; }
69
64
  .rf-reveal__next,
70
65
  .rf-reveal__reset {
71
- display: inline-flex;
72
- align-items: center;
73
66
  gap: 0.5rem;
74
67
  margin-top: 1rem;
75
68
  padding: 0.5rem 1.25rem;
@@ -86,3 +79,5 @@
86
79
  .rf-reveal__reset:hover {
87
80
  background: var(--rf-color-border);
88
81
  }
82
+
83
+ }
@@ -1,34 +1,26 @@
1
- /* Sandbox — Isolated HTML/CSS/JS rendering via iframe */
1
+ @layer skin {
2
+ /* Sandbox — skin. The iframe clip/fill + banner/poster/activate layout live in
3
+ * @refrakt-md/skeleton (styles/runes/sandbox.css). */
2
4
  .rf-sandbox {
3
5
  border-radius: var(--rf-radius-md);
4
- overflow: hidden;
5
6
  }
6
-
7
7
  .rf-sandbox iframe {
8
- display: block;
9
- width: 100%;
10
8
  border: none;
11
9
  }
12
-
13
10
  /* Static fallback (pre/code shown before hydration) */
14
11
  .rf-sandbox pre {
15
12
  margin: 0;
16
13
  }
17
-
18
14
  /* When inside preview, remove sandbox margin */
19
15
  .rf-preview .rf-sandbox {
20
16
  margin: 0;
21
17
  border-radius: 0;
22
18
  }
23
-
24
- /* Untrusted-mode affordance: persistent banner the iframe can't suppress.
25
- Rendered by the RfSandbox custom element when `data-security-mode="untrusted"`. */
19
+ /* Untrusted-mode affordance. */
26
20
  .rf-sandbox[data-security-mode="untrusted"] {
27
21
  border: 1px solid var(--rf-color-warning, #b45309);
28
22
  }
29
-
30
23
  .rf-sandbox__untrusted-banner {
31
- display: block;
32
24
  padding: 0.5rem 0.75rem;
33
25
  font-size: var(--rf-text-sm);
34
26
  line-height: 1.25rem;
@@ -37,31 +29,10 @@
37
29
  background: var(--rf-color-warning-bg, #fef3c7);
38
30
  border-bottom: 1px solid var(--rf-color-warning, #b45309);
39
31
  }
40
-
41
- /* Deferred activation (WORK-381): poster shown until a non-eager sandbox
42
- mounts. Rendered by the RfSandbox custom element from `data-poster`. */
43
32
  .rf-sandbox__poster {
44
- position: relative;
45
- display: flex;
46
- align-items: center;
47
- justify-content: center;
48
- min-height: 150px;
49
33
  background: var(--rf-color-surface-2, var(--rf-color-surface, #f4f4f5));
50
34
  }
51
-
52
- .rf-sandbox__poster-image {
53
- position: absolute;
54
- inset: 0;
55
- width: 100%;
56
- height: 100%;
57
- object-fit: cover;
58
- }
59
-
60
35
  .rf-sandbox__activate {
61
- position: relative;
62
- z-index: 1;
63
- display: inline-flex;
64
- align-items: center;
65
36
  gap: 0.5ch;
66
37
  padding: 0.5rem 1rem;
67
38
  font: inherit;
@@ -73,17 +44,16 @@
73
44
  cursor: pointer;
74
45
  box-shadow: 0 2px 10px rgba(0, 0, 0, 0.25);
75
46
  }
76
-
77
47
  .rf-sandbox__activate::before {
78
48
  content: "▶";
79
49
  font-size: 0.85em;
80
50
  }
81
-
82
51
  .rf-sandbox__activate:hover {
83
52
  background: var(--rf-color-accent-hover, var(--rf-color-accent, #1d4ed8));
84
53
  }
85
-
86
54
  .rf-sandbox__activate:focus-visible {
87
55
  outline: 2px solid var(--rf-color-accent, #2563eb);
88
56
  outline-offset: 2px;
89
57
  }
58
+
59
+ }
@@ -1,16 +1,13 @@
1
+ @layer skin {
1
2
  /* Section — a generic page section: an eyebrow/headline/blurb header above
2
3
  arbitrary body content. Header styling mirrors the shared page-section look
3
4
  (reveal/feature); the body is content-agnostic and full width. */
4
5
  .rf-section {
5
- display: flex;
6
- flex-direction: column;
7
6
  gap: 1.5rem;
8
7
  }
9
8
 
10
9
  /* Header */
11
10
  .rf-section__preamble {
12
- display: flex;
13
- flex-direction: column;
14
11
  gap: 0.5rem;
15
12
  max-width: var(--rf-measure, 65ch);
16
13
  margin: 0;
@@ -24,8 +21,6 @@
24
21
  margin: 0;
25
22
  }
26
23
  .rf-section__eyebrow:has(a) {
27
- display: inline-block;
28
- position: relative;
29
24
  padding: 0.25rem 0.875rem;
30
25
  border: 1px solid var(--rf-color-border);
31
26
  border-radius: var(--rf-radius-full);
@@ -37,7 +32,7 @@
37
32
  }
38
33
  .rf-section__eyebrow:has(a):hover { border-color: var(--rf-color-muted); }
39
34
  .rf-section__eyebrow:has(a) a { color: var(--rf-color-primary); font-weight: var(--rf-weight-semibold); text-decoration: none; }
40
- .rf-section__eyebrow:has(a) a::before { content: ''; position: absolute; inset: 0; border-radius: inherit; }
35
+ .rf-section__eyebrow:has(a) a::before { border-radius: inherit; }
41
36
  .rf-section__headline {
42
37
  margin: 0;
43
38
  }
@@ -48,23 +43,14 @@
48
43
  .rf-section__image {
49
44
  margin: 0;
50
45
  border-radius: var(--rf-radius-md);
51
- max-width: 100%;
52
- height: auto;
53
- }
54
-
55
- /* Body — content-agnostic; fills the section width regardless of header align. */
56
- .rf-section__body {
57
- width: 100%;
58
46
  }
59
47
 
60
48
  /* Header alignment (the body stays full width). */
61
49
  .rf-section[data-align="center"] .rf-section__preamble {
62
- align-items: center;
63
50
  text-align: center;
64
- margin-inline: auto;
65
51
  }
66
52
  .rf-section[data-align="end"] .rf-section__preamble {
67
- align-items: flex-end;
68
53
  text-align: end;
69
- margin-inline-start: auto;
54
+ }
55
+
70
56
  }
@@ -1,23 +1,4 @@
1
- /* Showcase — `frameTarget: 'self'` media wrapper (SPEC-086). Shadow, aspect,
2
- * displacement, place, and crop anchor are now the shared `frame` chrome
3
- * (dimensions/frame.css), landing on the showcase root. This file keeps only
4
- * showcase's structural rules and its distinct value: breakout. */
5
- .rf-showcase {
6
- position: relative;
7
- }
8
- .rf-showcase__viewport {
9
- position: relative;
10
- }
11
- /* Breakout — a displaced showcase spills past a non-clipping ancestor; clipping
12
- * hosts (e.g. bento cells) keep it cropped (host-owned clip). */
13
- :has(> .rf-showcase[data-displace]:not(.rf-showcase--in-bento-cell)) {
14
- overflow: visible;
15
- }
16
- /* Bento cell context — showcase fills remaining space */
17
- .rf-showcase--in-bento-cell {
18
- flex: 1;
19
- min-height: 0;
20
- }
1
+ @layer skin {
21
2
  /* Spacing — vertical margin around the showcase */
22
3
  .rf-showcase[data-spacing="flush"] { margin-top: 0; margin-bottom: 0; }
23
4
  .rf-showcase[data-spacing="tight"] { margin-top: var(--rf-spacing-section-tight, 1.5rem); margin-bottom: var(--rf-spacing-section-tight, 1.5rem); }
@@ -36,3 +17,5 @@
36
17
  margin-inline-end: 0;
37
18
  }
38
19
  }
20
+
21
+ }
@@ -1,3 +1,4 @@
1
+ @layer skin {
1
2
  /* Sidenote */
2
3
  .rf-sidenote {
3
4
  margin: 1rem 0;
@@ -7,8 +8,6 @@
7
8
  .rf-sidenote--sidenote {
8
9
  border-left: 3px solid var(--rf-color-primary);
9
10
  padding: 0.75rem 1rem;
10
- background: var(--rf-color-info-bg);
11
- border-radius: 0 var(--rf-radius-md) var(--rf-radius-md) 0;
12
11
  color: var(--rf-color-muted);
13
12
  }
14
13
  .rf-sidenote--footnote {
@@ -26,3 +25,5 @@
26
25
  }
27
26
  .rf-sidenote__body p { margin: 0; }
28
27
  .rf-sidenote__body p + p { margin-top: 0.5rem; }
28
+
29
+ }
@@ -1,3 +1,4 @@
1
+ @layer skin {
1
2
  /* Snippet — file embedded as a code block.
2
3
  *
3
4
  * The standalone form is a `<figure class="rf-snippet">` wrapping the
@@ -25,3 +26,5 @@
25
26
  margin-inline-end: 0;
26
27
  padding: 0;
27
28
  }
29
+
30
+ }
@@ -1,3 +1,4 @@
1
+ @layer skin {
1
2
  /* Spacing — spacing scale, radii, and shadow display */
2
3
  .rf-spacing__title {
3
4
  font-size: var(--rf-text-lg);
@@ -21,28 +22,21 @@
21
22
 
22
23
  /* Spacing scale — proportional bars */
23
24
  .rf-spacing__scale {
24
- display: flex;
25
- flex-direction: column;
26
25
  gap: 0.375rem;
27
26
  }
28
27
  .rf-spacing__scale-item {
29
- display: flex;
30
- align-items: center;
31
28
  gap: 0.75rem;
32
29
  }
33
30
  .rf-spacing__scale-bar {
34
- height: 1.25rem;
35
31
  background: var(--rf-color-primary);
36
32
  border-radius: var(--rf-radius-sm, 4px);
37
33
  opacity: 0.8;
38
- min-width: 4px;
39
34
  }
40
35
  .rf-spacing__scale-label {
41
36
  font-size: var(--rf-text-xs);
42
37
  font-family: var(--rf-font-mono, monospace);
43
38
  color: var(--rf-color-text, #1a1a2e);
44
39
  white-space: nowrap;
45
- flex-shrink: 0;
46
40
  }
47
41
  .rf-spacing__scale-multiplier {
48
42
  color: var(--rf-color-muted);
@@ -51,20 +45,12 @@
51
45
 
52
46
  /* Radius — rounded corner samples */
53
47
  .rf-spacing__radii {
54
- display: flex;
55
48
  gap: 1.25rem;
56
- flex-wrap: wrap;
57
- align-items: flex-end;
58
49
  }
59
50
  .rf-spacing__radius-item {
60
- display: flex;
61
- flex-direction: column;
62
- align-items: center;
63
51
  gap: 0.375rem;
64
52
  }
65
53
  .rf-spacing__radius-sample {
66
- width: 3.5rem;
67
- height: 3.5rem;
68
54
  border: 2px solid var(--rf-color-border, #e5e7eb);
69
55
  background: var(--rf-color-surface-raised, #f9fafb);
70
56
  }
@@ -80,19 +66,12 @@
80
66
 
81
67
  /* Shadows — sample cards */
82
68
  .rf-spacing__shadows {
83
- display: flex;
84
69
  gap: 1.5rem;
85
- flex-wrap: wrap;
86
70
  }
87
71
  .rf-spacing__shadow-item {
88
- display: flex;
89
- flex-direction: column;
90
- align-items: center;
91
72
  gap: 0.5rem;
92
73
  }
93
74
  .rf-spacing__shadow-sample {
94
- width: 5rem;
95
- height: 3.5rem;
96
75
  background: var(--rf-color-surface, #fff);
97
76
  border-radius: var(--rf-radius-md, 8px);
98
77
  }
@@ -105,3 +84,5 @@
105
84
  .rf-spacing--in-design-context {
106
85
  margin: 0;
107
86
  }
87
+
88
+ }
@@ -1,3 +1,4 @@
1
+ @layer skin {
1
2
  /* Spec */
2
3
 
3
4
  /* SPEC-079: eyebrow + metadata zone names replace header-primary /
@@ -28,3 +29,5 @@
28
29
  font-style: italic;
29
30
  color: var(--rf-color-muted);
30
31
  }
32
+
33
+ }