@refrakt-md/lumina 0.33.0 → 0.35.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 (142) hide show
  1. package/base.css +29 -29
  2. package/contracts/structures.json +623 -0
  3. package/dist/config.d.ts.map +1 -1
  4. package/dist/config.js.map +1 -1
  5. package/dist/icons.d.ts.map +1 -1
  6. package/dist/icons.js +57 -57
  7. package/dist/icons.js.map +1 -1
  8. package/dist/presets/catppuccin.js.map +1 -1
  9. package/dist/presets/dracula.js.map +1 -1
  10. package/dist/presets/gruvbox.js.map +1 -1
  11. package/dist/presets/niwaki.js.map +1 -1
  12. package/dist/presets/nord.js.map +1 -1
  13. package/dist/presets/one-dark.js.map +1 -1
  14. package/dist/presets/solarized.js.map +1 -1
  15. package/dist/presets/tideline.d.ts.map +1 -1
  16. package/dist/presets/tideline.js +20 -4
  17. package/dist/presets/tideline.js.map +1 -1
  18. package/dist/presets/tokyo-night.js.map +1 -1
  19. package/dist/tokens.js.map +1 -1
  20. package/index.css +124 -124
  21. package/package.json +5 -5
  22. package/presets.json +61 -13
  23. package/styles/base/attributes.css +32 -13
  24. package/styles/dimensions/checklist.css +45 -46
  25. package/styles/dimensions/cover.css +71 -51
  26. package/styles/dimensions/density.css +69 -65
  27. package/styles/dimensions/frame.css +116 -57
  28. package/styles/dimensions/metadata.css +110 -103
  29. package/styles/dimensions/motion.css +42 -13
  30. package/styles/dimensions/reading.css +27 -27
  31. package/styles/dimensions/sections.css +44 -45
  32. package/styles/dimensions/sequence.css +56 -57
  33. package/styles/dimensions/state.css +8 -2
  34. package/styles/dimensions/substrate.css +82 -58
  35. package/styles/dimensions/surfaces.css +65 -62
  36. package/styles/elements/blockquote.css +24 -25
  37. package/styles/elements/code.css +72 -71
  38. package/styles/elements/table.css +36 -37
  39. package/styles/global.css +163 -121
  40. package/styles/layouts/blog.css +219 -218
  41. package/styles/layouts/default.css +168 -167
  42. package/styles/layouts/docs.css +121 -122
  43. package/styles/layouts/mobile.css +54 -55
  44. package/styles/layouts/on-this-page.css +46 -47
  45. package/styles/layouts/plan.css +248 -247
  46. package/styles/layouts/search.css +142 -140
  47. package/styles/layouts/split.css +45 -45
  48. package/styles/layouts/theme-toggle.css +33 -31
  49. package/styles/layouts/version-switcher.css +38 -37
  50. package/styles/runes/accordion.css +90 -81
  51. package/styles/runes/aggregate.css +50 -39
  52. package/styles/runes/annotate.css +46 -45
  53. package/styles/runes/api.css +22 -23
  54. package/styles/runes/audio.css +140 -141
  55. package/styles/runes/badge.css +12 -13
  56. package/styles/runes/bar.css +4 -5
  57. package/styles/runes/bento.css +73 -62
  58. package/styles/runes/bg.css +62 -47
  59. package/styles/runes/blog.css +89 -90
  60. package/styles/runes/bond.css +49 -50
  61. package/styles/runes/breadcrumb.css +34 -35
  62. package/styles/runes/budget.css +126 -127
  63. package/styles/runes/bug.css +28 -27
  64. package/styles/runes/card.css +63 -60
  65. package/styles/runes/carousel.css +15 -15
  66. package/styles/runes/cast.css +50 -51
  67. package/styles/runes/changelog.css +45 -46
  68. package/styles/runes/character.css +31 -32
  69. package/styles/runes/chart.css +194 -106
  70. package/styles/runes/codegroup.css +109 -100
  71. package/styles/runes/collection.css +87 -86
  72. package/styles/runes/compare.css +38 -39
  73. package/styles/runes/comparison.css +205 -179
  74. package/styles/runes/conversation.css +36 -33
  75. package/styles/runes/cta.css +135 -132
  76. package/styles/runes/datatable.css +84 -83
  77. package/styles/runes/decision.css +25 -26
  78. package/styles/runes/design-context.css +21 -23
  79. package/styles/runes/details.css +26 -27
  80. package/styles/runes/diagram.css +28 -29
  81. package/styles/runes/diff.css +75 -72
  82. package/styles/runes/drawer.css +276 -198
  83. package/styles/runes/embed.css +20 -21
  84. package/styles/runes/event.css +35 -36
  85. package/styles/runes/expand.css +43 -34
  86. package/styles/runes/faction.css +47 -48
  87. package/styles/runes/feature.css +119 -112
  88. package/styles/runes/figure.css +11 -12
  89. package/styles/runes/file-ref.css +11 -13
  90. package/styles/runes/form.css +155 -154
  91. package/styles/runes/gallery.css +59 -60
  92. package/styles/runes/grid.css +10 -7
  93. package/styles/runes/hero.css +189 -185
  94. package/styles/runes/hint.css +57 -58
  95. package/styles/runes/howto.css +62 -64
  96. package/styles/runes/itinerary.css +133 -134
  97. package/styles/runes/juxtapose.css +83 -82
  98. package/styles/runes/lore.css +36 -34
  99. package/styles/runes/map.css +106 -99
  100. package/styles/runes/mediatext.css +30 -27
  101. package/styles/runes/milestone.css +98 -97
  102. package/styles/runes/mockup.css +338 -335
  103. package/styles/runes/nav.css +465 -450
  104. package/styles/runes/organization.css +23 -20
  105. package/styles/runes/page-section.css +14 -15
  106. package/styles/runes/pagination.css +45 -44
  107. package/styles/runes/palette.css +78 -80
  108. package/styles/runes/placeholder.css +8 -9
  109. package/styles/runes/plan-history.css +160 -161
  110. package/styles/runes/plan-progress.css +15 -16
  111. package/styles/runes/plan-ref.css +32 -23
  112. package/styles/runes/playlist.css +106 -107
  113. package/styles/runes/plot.css +96 -91
  114. package/styles/runes/preview.css +152 -149
  115. package/styles/runes/pricing.css +133 -123
  116. package/styles/runes/progress.css +32 -27
  117. package/styles/runes/pullquote.css +89 -90
  118. package/styles/runes/realm.css +47 -48
  119. package/styles/runes/recipe.css +112 -114
  120. package/styles/runes/relationships.css +77 -76
  121. package/styles/runes/reveal.css +90 -79
  122. package/styles/runes/sandbox.css +59 -60
  123. package/styles/runes/section.css +57 -50
  124. package/styles/runes/showcase.css +35 -16
  125. package/styles/runes/sidenote.css +30 -27
  126. package/styles/runes/snippet.css +8 -9
  127. package/styles/runes/spacing.css +86 -88
  128. package/styles/runes/spec.css +24 -25
  129. package/styles/runes/steps.css +89 -80
  130. package/styles/runes/storyboard.css +46 -45
  131. package/styles/runes/swatch.css +22 -23
  132. package/styles/runes/symbol.css +117 -118
  133. package/styles/runes/tabs.css +88 -79
  134. package/styles/runes/testimonial.css +43 -44
  135. package/styles/runes/textblock.css +32 -28
  136. package/styles/runes/timeline.css +63 -64
  137. package/styles/runes/tint.css +214 -215
  138. package/styles/runes/toc.css +40 -41
  139. package/styles/runes/track.css +89 -90
  140. package/styles/runes/typography.css +89 -91
  141. package/styles/runes/work.css +47 -36
  142. package/styles/runes/xref.css +21 -22
@@ -1,101 +1,106 @@
1
1
  @layer skin {
2
- .rf-plot > span[property="name"] {
3
- font-size: var(--rf-text-2xl);
4
- font-weight: var(--rf-weight-bold);
5
- margin-bottom: 0.5rem;
6
- color: var(--rf-color-text);
7
- }
2
+ .rf-plot__title {
3
+ /* No `font-size` — see the note on .rf-lore__title. This rule was *live*
4
+ under its old `[property="name"]` selector, so plot's prominence axis and
5
+ density ramp have both been inert: `{% plot prominence="display" %}` did
6
+ nothing. The guard could not see it because the selector named the
7
+ schema.org channel rather than the BEM slot. */
8
+ font-weight: var(--rf-weight-bold);
9
+ margin-bottom: 0.5rem;
10
+ color: var(--rf-color-text);
11
+ }
8
12
 
9
- /* Description */
10
- .rf-plot > p {
11
- color: var(--rf-color-muted);
12
- margin-bottom: 1rem;
13
- margin-top: 0;
14
- }
13
+ /* Description */
14
+ .rf-plot > p {
15
+ color: var(--rf-color-muted);
16
+ margin-bottom: 1rem;
17
+ margin-top: 0;
18
+ }
15
19
 
16
- /* Beats list */
17
- .rf-plot ol {
18
- padding-left: 0;
19
- margin: 1rem 0 0;
20
- }
20
+ /* Beats list */
21
+ .rf-plot ol {
22
+ padding-left: 0;
23
+ margin: 1rem 0 0;
24
+ }
21
25
 
22
- /* Beat — all variants use left padding with dot at left: 0 */
23
- .rf-beat {
24
- padding: 0.625rem 0 0.625rem 2.25rem;
25
- }
26
- .rf-beat + .rf-beat {
27
- border-top: 1px solid var(--rf-color-border);
28
- }
29
- .rf-beat::before {
30
- border-radius: 50%;
31
- background: var(--rf-color-surface-active);
32
- border: 2px solid var(--rf-color-bg);
33
- box-shadow: 0 0 0 2px var(--rf-color-surface-active);
34
- }
35
- .rf-beat > span[data-field="label"] {
36
- font-weight: var(--rf-weight-semibold);
37
- font-size: var(--rf-text);
38
- color: var(--rf-color-text);
39
- }
40
- .rf-beat__body {
41
- margin-top: 0.25rem;
42
- font-size: var(--rf-text);
43
- color: var(--rf-color-muted);
44
- line-height: var(--rf-leading-relaxed);
45
- }
46
- .rf-beat__body p {
47
- margin: 0;
48
- }
49
-
50
- .rf-plot--linear ol {
51
- margin-top: 1.5rem;
52
- }
53
- /* Linear variant — connector line matching timeline pattern */
54
- .rf-plot--linear .rf-beat {
55
- padding: 0 0 2rem 2rem;
56
- border-left: 2px solid var(--rf-color-border);
57
- margin-left: 0.375rem;
58
- }
59
- .rf-plot--linear .rf-beat > span[data-field="label"] {
60
- line-height: 1;
61
- margin-top: -0.5rem;
62
- }
63
- .rf-plot--linear .rf-beat + .rf-beat {
64
- border-top: none;
65
- }
66
- .rf-plot--linear .rf-beat:last-child {
67
- border-left-color: transparent;
68
- padding-bottom: 0;
69
- }
26
+ /* Beat — all variants use left padding with dot at left: 0 */
27
+ .rf-beat {
28
+ padding: 0.625rem 0 0.625rem 2.25rem;
29
+ }
30
+ .rf-beat + .rf-beat {
31
+ border-top: 1px solid var(--rf-color-border);
32
+ }
33
+ .rf-beat::before {
34
+ border-radius: 50%;
35
+ background: var(--rf-color-surface-active);
36
+ border: 2px solid var(--rf-color-bg);
37
+ box-shadow: 0 0 0 2px var(--rf-color-surface-active);
38
+ }
39
+ .rf-beat > span[data-field="label"] {
40
+ font-weight: var(--rf-weight-semibold);
41
+ font-size: var(--rf-text);
42
+ color: var(--rf-color-text);
43
+ }
44
+ .rf-beat__body {
45
+ margin-top: 0.25rem;
46
+ font-size: var(--rf-text);
47
+ color: var(--rf-color-muted);
48
+ line-height: var(--rf-leading-relaxed);
49
+ }
50
+ .rf-beat__body p {
51
+ margin: 0;
52
+ }
70
53
 
71
- /* Beat status variants */
72
- .rf-beat--complete::before {
73
- background: var(--rf-color-success);
74
- box-shadow: 0 0 0 2px var(--rf-color-success);
75
- }
76
- .rf-beat--complete > span[data-field="label"] {
77
- color: var(--rf-color-muted);
78
- }
54
+ .rf-plot--linear ol {
55
+ margin-top: 1.5rem;
56
+ }
57
+ /* Linear variant — connector line matching timeline pattern */
58
+ .rf-plot--linear .rf-beat {
59
+ padding: 0 0 2rem 2rem;
60
+ border-left: 2px solid var(--rf-color-border);
61
+ margin-left: 0.375rem;
62
+ }
63
+ .rf-plot--linear .rf-beat > span[data-field="label"] {
64
+ line-height: 1;
65
+ margin-top: -0.5rem;
66
+ }
67
+ .rf-plot--linear .rf-beat + .rf-beat {
68
+ border-top: none;
69
+ }
70
+ .rf-plot--linear .rf-beat:last-child {
71
+ border-left-color: transparent;
72
+ padding-bottom: 0;
73
+ }
79
74
 
80
- .rf-beat--active::before {
81
- background: var(--rf-color-primary);
82
- box-shadow: 0 0 0 2px var(--rf-color-primary), 0 0 0 5px color-mix(in srgb, var(--rf-color-primary) 20%, transparent);
83
- }
84
- .rf-beat--active > span[data-field="label"] {
85
- color: var(--rf-color-primary);
86
- }
75
+ /* Beat status variants */
76
+ .rf-beat--complete::before {
77
+ background: var(--rf-color-success);
78
+ box-shadow: 0 0 0 2px var(--rf-color-success);
79
+ }
80
+ .rf-beat--complete > span[data-field="label"] {
81
+ color: var(--rf-color-muted);
82
+ }
87
83
 
88
- .rf-beat--planned::before {
89
- background: var(--rf-color-surface-active);
90
- }
84
+ .rf-beat--active::before {
85
+ background: var(--rf-color-primary);
86
+ box-shadow:
87
+ 0 0 0 2px var(--rf-color-primary),
88
+ 0 0 0 5px color-mix(in srgb, var(--rf-color-primary) 20%, transparent);
89
+ }
90
+ .rf-beat--active > span[data-field="label"] {
91
+ color: var(--rf-color-primary);
92
+ }
91
93
 
92
- .rf-beat--abandoned > span[data-field="label"] {
93
- text-decoration: line-through;
94
- color: var(--rf-color-muted);
95
- }
96
- .rf-beat--abandoned::before {
97
- background: var(--rf-color-muted);
98
- box-shadow: 0 0 0 2px var(--rf-color-muted);
99
- }
94
+ .rf-beat--planned::before {
95
+ background: var(--rf-color-surface-active);
96
+ }
100
97
 
98
+ .rf-beat--abandoned > span[data-field="label"] {
99
+ text-decoration: line-through;
100
+ color: var(--rf-color-muted);
101
+ }
102
+ .rf-beat--abandoned::before {
103
+ background: var(--rf-color-muted);
104
+ box-shadow: 0 0 0 2px var(--rf-color-muted);
105
+ }
101
106
  }
@@ -1,173 +1,176 @@
1
1
  @layer skin {
2
- /* Preview — Component showcase with theme toggle and width control */
3
- .rf-preview {
4
- margin: 2rem 0;
5
- }
2
+ /* Preview — Component showcase with theme toggle and width control */
3
+ .rf-preview {
4
+ margin: 2rem 0;
5
+ }
6
6
 
7
- /* Toolbar — transparent, controls float above the canvas (flush to the canvas
7
+ /* Toolbar — transparent, controls float above the canvas (flush to the canvas
8
8
  * edges, no horizontal inset). */
9
- .rf-preview__toolbar {
10
- padding: 0.25rem 0 0.5rem;
11
- }
12
- .rf-preview__title {
13
- font-size: var(--rf-text-xs);
14
- font-weight: var(--rf-weight-semibold);
15
- color: var(--rf-color-muted);
16
- text-transform: uppercase;
17
- letter-spacing: var(--rf-tracking-wider);
18
- }
9
+ .rf-preview__toolbar {
10
+ padding: 0.25rem 0 0.5rem;
11
+ }
12
+ .rf-preview__title {
13
+ font-size: var(--rf-text-xs);
14
+ font-weight: var(--rf-weight-semibold);
15
+ color: var(--rf-color-muted);
16
+ text-transform: uppercase;
17
+ letter-spacing: var(--rf-tracking-wider);
18
+ }
19
19
 
20
- /* Toolbar groups — view-mode toggle on the left, preview-only controls (viewport
20
+ /* Toolbar groups — view-mode toggle on the left, preview-only controls (viewport
21
21
  * + theme) on the right. */
22
- .rf-preview__controls {
23
- gap: 0.5rem;
24
- }
22
+ .rf-preview__controls {
23
+ gap: 0.5rem;
24
+ }
25
25
 
26
- /* View toggle pill (code/preview) */
27
- .rf-preview__view-toggle {
28
- gap: 0.125rem;
29
- background: var(--rf-color-surface-active);
30
- border-radius: var(--rf-radius-full);
31
- padding: 0.125rem;
32
- }
26
+ /* View toggle pill (code/preview) */
27
+ .rf-preview__view-toggle {
28
+ gap: 0.125rem;
29
+ background: var(--rf-color-surface-active);
30
+ border-radius: var(--rf-radius-full);
31
+ padding: 0.125rem;
32
+ }
33
33
 
34
- /* Theme toggle pill */
35
- .rf-preview__toggle {
36
- gap: 0.125rem;
37
- background: var(--rf-color-surface-active);
38
- border-radius: var(--rf-radius-full);
39
- padding: 0.125rem;
40
- }
41
- .rf-preview__toggle-btn {
42
- border: none;
43
- border-radius: var(--rf-radius-full);
44
- background: transparent;
45
- color: var(--rf-color-muted);
46
- cursor: pointer;
47
- transition: background 150ms ease, color 150ms ease;
48
- padding: 0;
49
- }
50
- .rf-preview__toggle-btn:hover {
51
- color: var(--rf-color-text);
52
- }
53
- .rf-preview__toggle-btn--active {
54
- background: var(--rf-color-bg);
55
- color: var(--rf-color-text);
56
- box-shadow: var(--rf-shadow-xs);
57
- }
34
+ /* Theme toggle pill */
35
+ .rf-preview__toggle {
36
+ gap: 0.125rem;
37
+ background: var(--rf-color-surface-active);
38
+ border-radius: var(--rf-radius-full);
39
+ padding: 0.125rem;
40
+ }
41
+ .rf-preview__toggle-btn {
42
+ border: none;
43
+ border-radius: var(--rf-radius-full);
44
+ background: transparent;
45
+ color: var(--rf-color-muted);
46
+ cursor: pointer;
47
+ transition:
48
+ background 150ms ease,
49
+ color 150ms ease;
50
+ padding: 0;
51
+ }
52
+ .rf-preview__toggle-btn:hover {
53
+ color: var(--rf-color-text);
54
+ }
55
+ .rf-preview__toggle-btn--active {
56
+ background: var(--rf-color-bg);
57
+ color: var(--rf-color-text);
58
+ box-shadow: var(--rf-shadow-xs);
59
+ }
58
60
 
59
- /* Canvas — framed area for the preview content */
60
- .rf-preview__canvas {
61
- padding: 2rem 2.5rem;
62
- background: var(--rf-color-bg);
63
- color: var(--rf-color-text);
64
- border: 1px solid var(--rf-color-border);
65
- border-radius: var(--rf-radius-lg);
66
- }
67
- /* Centre a standalone mockup whose `data-fit="none"` makes it inline-block —
61
+ /* Canvas — framed area for the preview content */
62
+ .rf-preview__canvas {
63
+ padding: 2rem 2.5rem;
64
+ background: var(--rf-color-bg);
65
+ color: var(--rf-color-text);
66
+ border: 1px solid var(--rf-color-border);
67
+ border-radius: var(--rf-radius-lg);
68
+ }
69
+ /* Centre a standalone mockup whose `data-fit="none"` makes it inline-block —
68
70
  * margin-inline auto can't centre an inline-block, only its parent's text
69
71
  * alignment can. Scoped to a *direct-child* mockup so a card or bento cell
70
72
  * that happens to hold a mockup doesn't get its body text centred too. */
71
- .rf-preview__canvas:has(> .rf-mockup) {
72
- text-align: center;
73
- }
74
- .rf-preview__canvas > *:first-child {
75
- margin-top: 0;
76
- }
77
- .rf-preview__canvas > *:last-child {
78
- margin-bottom: 0;
79
- }
80
- .rf-preview__canvas > [data-rune] + [data-rune] {
81
- margin-top: 0.75rem;
82
- }
83
-
84
- /* Viewport simulation toggle pill */
85
- .rf-preview__viewport-toggle {
86
- gap: 0.125rem;
87
- background: var(--rf-color-surface-active);
88
- border-radius: var(--rf-radius-full);
89
- padding: 0.125rem;
90
- }
91
-
92
- /* Viewport simulation frame */
93
- .rf-preview__viewport-frame {
94
- transition: max-width 300ms ease;
95
- }
96
- .rf-preview__viewport-frame--constrained {
97
- border: 1px dashed var(--rf-color-border);
98
- border-radius: var(--rf-radius-sm);
99
- }
100
- .rf-preview__viewport-label {
101
- font-size: var(--rf-text-xs);
102
- color: var(--rf-color-muted);
103
- font-variant-numeric: tabular-nums;
104
- }
73
+ .rf-preview__canvas:has(> .rf-mockup) {
74
+ text-align: center;
75
+ }
76
+ .rf-preview__canvas > *:first-child {
77
+ margin-top: 0;
78
+ }
79
+ .rf-preview__canvas > *:last-child {
80
+ margin-bottom: 0;
81
+ }
82
+ .rf-preview__canvas > [data-rune] + [data-rune] {
83
+ margin-top: 0.75rem;
84
+ }
105
85
 
106
- /* Source code view — bordered frame matching the canvas */
107
- .rf-preview__source {
108
- border: 1px solid var(--rf-color-border);
109
- border-radius: var(--rf-radius-lg);
110
- }
111
- .rf-preview__source pre {
112
- margin: 0;
113
- border-radius: 0;
114
- }
115
- .rf-preview__source .rf-codeblock {
116
- border-radius: 0;
117
- margin: 0;
118
- }
86
+ /* Viewport simulation toggle pill */
87
+ .rf-preview__viewport-toggle {
88
+ gap: 0.125rem;
89
+ background: var(--rf-color-surface-active);
90
+ border-radius: var(--rf-radius-full);
91
+ padding: 0.125rem;
92
+ }
119
93
 
120
- /* Source tabs (data-source panels) */
121
- .rf-preview__source-tabs {
122
- gap: 0;
123
- background: var(--rf-color-surface);
124
- border-radius: var(--rf-radius-lg);
125
- }
126
- .rf-preview__source-tab {
127
- padding: 0.5rem 1rem;
128
- border: none;
129
- background: transparent;
130
- color: var(--rf-color-muted);
131
- font-size: var(--rf-text-xs);
132
- font-weight: var(--rf-weight-medium);
133
- cursor: pointer;
134
- border-bottom: 2px solid transparent;
135
- transition: color 150ms ease, border-color 150ms ease;
136
- }
137
- .rf-preview__source-tab:hover {
138
- color: var(--rf-color-text);
139
- }
140
- .rf-preview__source-tab--active {
141
- color: var(--rf-color-text);
142
- border-bottom-color: var(--rf-color-primary);
143
- }
94
+ /* Viewport simulation frame */
95
+ .rf-preview__viewport-frame {
96
+ transition: max-width 300ms ease;
97
+ }
98
+ .rf-preview__viewport-frame--constrained {
99
+ border: 1px dashed var(--rf-color-border);
100
+ border-radius: var(--rf-radius-sm);
101
+ }
102
+ .rf-preview__viewport-label {
103
+ font-size: var(--rf-text-xs);
104
+ color: var(--rf-color-muted);
105
+ font-variant-numeric: tabular-nums;
106
+ }
144
107
 
145
- /* Small containers: edge-to-edge bleed */
146
- @container (max-width: 1280px) {
147
- .rf-preview__toolbar {
148
- padding: 0.25rem var(--rf-content-padding, 1.5rem) 0.5rem;
108
+ /* Source code view — bordered frame matching the canvas */
109
+ .rf-preview__source {
110
+ border: 1px solid var(--rf-color-border);
111
+ border-radius: var(--rf-radius-lg);
149
112
  }
150
- .rf-preview__canvas {
113
+ .rf-preview__source pre {
114
+ margin: 0;
151
115
  border-radius: 0;
152
- border-left: none;
153
- border-right: none;
154
- padding: 1.5rem var(--rf-content-padding, 1.5rem);
155
116
  }
156
- .rf-preview__source {
117
+ .rf-preview__source .rf-codeblock {
157
118
  border-radius: 0;
158
- border-left: none;
159
- border-right: none;
119
+ margin: 0;
120
+ }
121
+
122
+ /* Source tabs (data-source panels) */
123
+ .rf-preview__source-tabs {
124
+ gap: 0;
125
+ background: var(--rf-color-surface);
126
+ border-radius: var(--rf-radius-lg);
160
127
  }
161
- /* Break out of the feature's padding-inline to reach the viewport edges. Stays
128
+ .rf-preview__source-tab {
129
+ padding: 0.5rem 1rem;
130
+ border: none;
131
+ background: transparent;
132
+ color: var(--rf-color-muted);
133
+ font-size: var(--rf-text-xs);
134
+ font-weight: var(--rf-weight-medium);
135
+ cursor: pointer;
136
+ border-bottom: 2px solid transparent;
137
+ transition:
138
+ color 150ms ease,
139
+ border-color 150ms ease;
140
+ }
141
+ .rf-preview__source-tab:hover {
142
+ color: var(--rf-color-text);
143
+ }
144
+ .rf-preview__source-tab--active {
145
+ color: var(--rf-color-text);
146
+ border-bottom-color: var(--rf-color-primary);
147
+ }
148
+
149
+ /* Small containers: edge-to-edge bleed */
150
+ @container (max-width: 1280px) {
151
+ .rf-preview__toolbar {
152
+ padding: 0.25rem var(--rf-content-padding, 1.5rem) 0.5rem;
153
+ }
154
+ .rf-preview__canvas {
155
+ border-radius: 0;
156
+ border-left: none;
157
+ border-right: none;
158
+ padding: 1.5rem var(--rf-content-padding, 1.5rem);
159
+ }
160
+ .rf-preview__source {
161
+ border-radius: 0;
162
+ border-left: none;
163
+ border-right: none;
164
+ }
165
+ /* Break out of the feature's padding-inline to reach the viewport edges. Stays
162
166
  * skin (not skeleton): this overrides the skin rule `.rf-preview { margin: 2rem 0 }`
163
167
  * by specificity, and that only wins within the same cascade layer — in
164
168
  * @layer skeleton it loses to the skin margin and the bleed is nullified. */
165
- .rf-preview--in-feature {
166
- margin-inline: calc(-1 * var(--rf-content-gutter, 1.5rem));
169
+ .rf-preview--in-feature {
170
+ margin-inline: calc(-1 * var(--rf-content-gutter, 1.5rem));
171
+ }
172
+ .rf-preview--in-feature .rf-preview__toolbar {
173
+ padding-inline: var(--rf-content-gutter, 1.5rem);
174
+ }
167
175
  }
168
- .rf-preview--in-feature .rf-preview__toolbar {
169
- padding-inline: var(--rf-content-gutter, 1.5rem);
170
- }
171
- }
172
-
173
176
  }