@refrakt-md/lumina 0.32.0 → 0.34.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 +58 -60
  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 +32 -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 +92 -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,150 +1,152 @@
1
1
  @layer skin {
2
- /* Search trigger button */
3
- .rf-search-trigger {
4
- gap: 0.5rem;
5
- padding: 0.375rem 0.625rem 0.375rem 0.5rem;
6
- border: 1px solid var(--rf-color-border);
7
- border-radius: var(--rf-radius-full);
8
- background: var(--rf-color-surface);
9
- color: var(--rf-color-muted);
10
- font-size: var(--rf-text-xs);
11
- font-family: var(--rf-font-sans);
12
- cursor: pointer;
13
- transition: border-color 0.15s, color 0.15s, background 0.15s;
14
- line-height: 1;
15
- white-space: nowrap;
16
- }
17
- .rf-search-trigger:hover {
18
- border-color: var(--rf-color-primary);
19
- color: var(--rf-color-text);
20
- background: var(--rf-color-surface-hover);
21
- }
22
- .rf-search-trigger__kbd {
23
- padding: 0.125rem 0.375rem;
24
- border: 1px solid var(--rf-color-border);
25
- border-radius: var(--rf-radius-sm);
26
- background: var(--rf-color-bg);
27
- font-family: var(--rf-font-sans);
28
- font-size: var(--rf-text-xs);
29
- line-height: var(--rf-leading-tight);
30
- color: var(--rf-color-muted);
31
- }
32
-
33
- /* Search dialog */
34
- .rf-search-dialog {
35
- margin: 0;
36
- padding: 0;
37
- border: 1px solid var(--rf-color-border);
38
- border-radius: var(--rf-radius-lg);
39
- background: var(--rf-color-bg);
40
- box-shadow: var(--rf-shadow-lg);
41
- font-family: var(--rf-font-sans);
42
- }
43
- .rf-search-dialog::backdrop {
44
- background: rgba(0, 0, 0, 0.4);
45
- }
2
+ /* Search trigger button */
3
+ .rf-search-trigger {
4
+ gap: 0.5rem;
5
+ padding: 0.375rem 0.625rem 0.375rem 0.5rem;
6
+ border: 1px solid var(--rf-color-border);
7
+ border-radius: var(--rf-radius-full);
8
+ background: var(--rf-color-surface);
9
+ color: var(--rf-color-muted);
10
+ font-size: var(--rf-text-xs);
11
+ font-family: var(--rf-font-sans);
12
+ cursor: pointer;
13
+ transition:
14
+ border-color 0.15s,
15
+ color 0.15s,
16
+ background 0.15s;
17
+ line-height: 1;
18
+ white-space: nowrap;
19
+ }
20
+ .rf-search-trigger:hover {
21
+ border-color: var(--rf-color-primary);
22
+ color: var(--rf-color-text);
23
+ background: var(--rf-color-surface-hover);
24
+ }
25
+ .rf-search-trigger__kbd {
26
+ padding: 0.125rem 0.375rem;
27
+ border: 1px solid var(--rf-color-border);
28
+ border-radius: var(--rf-radius-sm);
29
+ background: var(--rf-color-bg);
30
+ font-family: var(--rf-font-sans);
31
+ font-size: var(--rf-text-xs);
32
+ line-height: var(--rf-leading-tight);
33
+ color: var(--rf-color-muted);
34
+ }
46
35
 
47
- /* Dialog header */
48
- .rf-search-dialog__header {
49
- gap: 0.75rem;
50
- padding: 0.875rem 1rem;
51
- border-bottom: 1px solid var(--rf-color-border);
52
- }
53
- .rf-search-dialog__icon {
54
- color: var(--rf-color-muted);
55
- }
56
- .rf-search-dialog__input {
57
- border: none;
58
- outline: none;
59
- background: transparent;
60
- font-size: var(--rf-text);
61
- font-family: var(--rf-font-sans);
62
- color: var(--rf-color-text);
63
- }
64
- .rf-search-dialog__input::placeholder {
65
- color: var(--rf-color-muted);
66
- }
67
- .rf-search-dialog__esc {
68
- padding: 0.125rem 0.375rem;
69
- border: 1px solid var(--rf-color-border);
70
- border-radius: var(--rf-radius-sm);
71
- background: var(--rf-color-surface);
72
- font-family: var(--rf-font-sans);
73
- font-size: var(--rf-text-xs);
74
- color: var(--rf-color-muted);
75
- }
36
+ /* Search dialog */
37
+ .rf-search-dialog {
38
+ margin: 0;
39
+ padding: 0;
40
+ border: 1px solid var(--rf-color-border);
41
+ border-radius: var(--rf-radius-lg);
42
+ background: var(--rf-color-bg);
43
+ box-shadow: var(--rf-shadow-lg);
44
+ font-family: var(--rf-font-sans);
45
+ }
46
+ .rf-search-dialog::backdrop {
47
+ background: rgba(0, 0, 0, 0.4);
48
+ }
76
49
 
77
- /* Results */
78
- .rf-search-dialog__results {
79
- padding: 0.5rem;
80
- }
81
- .rf-search-result {
82
- padding: 0.625rem 0.75rem;
83
- border-radius: var(--rf-radius-md);
84
- text-decoration: none;
85
- color: var(--rf-color-text);
86
- cursor: pointer;
87
- }
88
- .rf-search-result:hover,
89
- .rf-search-result[data-active] {
90
- background: var(--rf-color-surface-hover);
91
- }
92
- .rf-search-result__title {
93
- font-weight: var(--rf-weight-medium);
94
- font-size: var(--rf-text-sm);
95
- line-height: var(--rf-leading-snug);
96
- margin-bottom: 0.125rem;
97
- }
98
- .rf-search-result__excerpt {
99
- font-size: var(--rf-text-xs);
100
- line-height: var(--rf-leading-normal);
101
- color: var(--rf-color-muted);
102
- }
103
- .rf-search-result__excerpt mark {
104
- background: var(--rf-color-primary-bg);
105
- color: var(--rf-color-text);
106
- border-radius: 2px;
107
- padding: 0 1px;
108
- }
50
+ /* Dialog header */
51
+ .rf-search-dialog__header {
52
+ gap: 0.75rem;
53
+ padding: 0.875rem 1rem;
54
+ border-bottom: 1px solid var(--rf-color-border);
55
+ }
56
+ .rf-search-dialog__icon {
57
+ color: var(--rf-color-muted);
58
+ }
59
+ .rf-search-dialog__input {
60
+ border: none;
61
+ outline: none;
62
+ background: transparent;
63
+ font-size: var(--rf-text);
64
+ font-family: var(--rf-font-sans);
65
+ color: var(--rf-color-text);
66
+ }
67
+ .rf-search-dialog__input::placeholder {
68
+ color: var(--rf-color-muted);
69
+ }
70
+ .rf-search-dialog__esc {
71
+ padding: 0.125rem 0.375rem;
72
+ border: 1px solid var(--rf-color-border);
73
+ border-radius: var(--rf-radius-sm);
74
+ background: var(--rf-color-surface);
75
+ font-family: var(--rf-font-sans);
76
+ font-size: var(--rf-text-xs);
77
+ color: var(--rf-color-muted);
78
+ }
109
79
 
110
- /* Empty / unavailable state */
111
- .rf-search-dialog__empty {
112
- text-align: center;
113
- padding: 2rem 1rem;
114
- font-size: var(--rf-text-sm);
115
- color: var(--rf-color-muted);
116
- }
80
+ /* Results */
81
+ .rf-search-dialog__results {
82
+ padding: 0.5rem;
83
+ }
84
+ .rf-search-result {
85
+ padding: 0.625rem 0.75rem;
86
+ border-radius: var(--rf-radius-md);
87
+ text-decoration: none;
88
+ color: var(--rf-color-text);
89
+ cursor: pointer;
90
+ }
91
+ .rf-search-result:hover,
92
+ .rf-search-result[data-active] {
93
+ background: var(--rf-color-surface-hover);
94
+ }
95
+ .rf-search-result__title {
96
+ font-weight: var(--rf-weight-medium);
97
+ font-size: var(--rf-text-sm);
98
+ line-height: var(--rf-leading-snug);
99
+ margin-bottom: 0.125rem;
100
+ }
101
+ .rf-search-result__excerpt {
102
+ font-size: var(--rf-text-xs);
103
+ line-height: var(--rf-leading-normal);
104
+ color: var(--rf-color-muted);
105
+ }
106
+ .rf-search-result__excerpt mark {
107
+ background: var(--rf-color-primary-bg);
108
+ color: var(--rf-color-text);
109
+ border-radius: 2px;
110
+ padding: 0 1px;
111
+ }
117
112
 
118
- /* Footer */
119
- .rf-search-dialog__footer {
120
- gap: 1rem;
121
- padding: 0.5rem 1rem;
122
- border-top: 1px solid var(--rf-color-border);
123
- font-size: var(--rf-text-xs);
124
- color: var(--rf-color-muted);
125
- }
126
- .rf-search-dialog__footer kbd {
127
- padding: 0 0.25rem;
128
- border: 1px solid var(--rf-color-border);
129
- border-radius: 3px;
130
- background: var(--rf-color-surface);
131
- font-family: var(--rf-font-sans);
132
- font-size: var(--rf-text-xs);
133
- line-height: var(--rf-leading-snug);
134
- }
113
+ /* Empty / unavailable state */
114
+ .rf-search-dialog__empty {
115
+ text-align: center;
116
+ padding: 2rem 1rem;
117
+ font-size: var(--rf-text-sm);
118
+ color: var(--rf-color-muted);
119
+ }
135
120
 
136
- /* Mobile */
137
- @media (max-width: 768px) {
138
- .rf-search-trigger {
139
- padding: 0.375rem;
140
- /* Collapsed to an icon-only button — keep it fully rounded so it reads
141
- * as a circle matching the adjacent theme toggle, not a small square. */
142
- border-radius: var(--rf-radius-full);
121
+ /* Footer */
122
+ .rf-search-dialog__footer {
123
+ gap: 1rem;
124
+ padding: 0.5rem 1rem;
125
+ border-top: 1px solid var(--rf-color-border);
126
+ font-size: var(--rf-text-xs);
127
+ color: var(--rf-color-muted);
143
128
  }
144
- .rf-search-dialog[open] {
145
- border-radius: 0;
146
- border: none;
129
+ .rf-search-dialog__footer kbd {
130
+ padding: 0 0.25rem;
131
+ border: 1px solid var(--rf-color-border);
132
+ border-radius: 3px;
133
+ background: var(--rf-color-surface);
134
+ font-family: var(--rf-font-sans);
135
+ font-size: var(--rf-text-xs);
136
+ line-height: var(--rf-leading-snug);
147
137
  }
148
- }
149
138
 
139
+ /* Mobile */
140
+ @media (max-width: 768px) {
141
+ .rf-search-trigger {
142
+ padding: 0.375rem;
143
+ /* Collapsed to an icon-only button — keep it fully rounded so it reads
144
+ * as a circle matching the adjacent theme toggle, not a small square. */
145
+ border-radius: var(--rf-radius-full);
146
+ }
147
+ .rf-search-dialog[open] {
148
+ border-radius: 0;
149
+ border: none;
150
+ }
151
+ }
150
152
  }
@@ -1,5 +1,5 @@
1
1
  @layer skin {
2
- /* Shared media + content layout — skin.
2
+ /* Shared media + content layout — skin.
3
3
  *
4
4
  * The layout *structure* (start/end grid, top/bottom stack, 3-section placement,
5
5
  * the media-zone fill/clip mechanism, responsive collapse) lives in
@@ -7,24 +7,24 @@
7
7
  * radius tier, the beside-image depth shadow, the codegroup radius alignment,
8
8
  * and the default side-by-side spacing rhythm. */
9
9
 
10
- /* Default side-by-side spacing — applies to every rune using the split layout
10
+ /* Default side-by-side spacing — applies to every rune using the split layout
11
11
  * (hero, feature, step, realm, faction, etc.). Contained-chrome runes
12
12
  * (card, recipe, bento-cell, playlist) override `column-gap` / `row-gap` with
13
13
  * higher-specificity selectors to hug their internal media well; everything
14
14
  * else inherits this comfortable default so columns don't sit flush. */
15
- [data-media-position="start"],
16
- [data-media-position="end"] {
17
- column-gap: var(--rf-spacing-lg);
18
- row-gap: var(--rf-spacing-lg);
19
- }
15
+ [data-media-position="start"],
16
+ [data-media-position="end"] {
17
+ column-gap: var(--rf-spacing-lg);
18
+ row-gap: var(--rf-spacing-lg);
19
+ }
20
20
 
21
- /* Media guests use the smaller media radius tier so they never read as more
21
+ /* Media guests use the smaller media radius tier so they never read as more
22
22
  * rounded than the (larger-radius) container they sit in. */
23
- [data-section="media"] {
24
- border-radius: var(--rf-radius-media);
25
- }
23
+ [data-section="media"] {
24
+ border-radius: var(--rf-radius-media);
25
+ }
26
26
 
27
- /* `data-guest-fit` (emitted from rune config) is the chrome/containment axis:
27
+ /* `data-guest-fit` (emitted from rune config) is the chrome/containment axis:
28
28
  *
29
29
  * clip — a framed well (card, bento-cell, recipe, playlist). Every guest
30
30
  * adopts the slot radius so it reads as one surface with the well.
@@ -35,44 +35,44 @@
35
35
  * chrome of its own, so a bare hero image stays rounded).
36
36
  *
37
37
  * Absence of the attribute reads as `clip` (the historical default). */
38
- [data-section="media"]:not([data-guest-fit="bleed"]) > * {
39
- border-radius: inherit;
40
- }
41
- [data-section="media"]:not([data-guest-fit="bleed"]) .rf-codegroup {
42
- border-radius: var(--rf-radius-media);
43
- }
38
+ [data-section="media"]:not([data-guest-fit="bleed"]) > * {
39
+ border-radius: inherit;
40
+ }
41
+ [data-section="media"]:not([data-guest-fit="bleed"]) .rf-codegroup {
42
+ border-radius: var(--rf-radius-media);
43
+ }
44
44
 
45
- /* Bleed host: leaf media adopts the slot radius; a rune guest does not, and the
45
+ /* Bleed host: leaf media adopts the slot radius; a rune guest does not, and the
46
46
  * slot drops its own radius so its clip never rounds the guest's corners. */
47
- [data-section="media"][data-guest-fit="bleed"] > :is(img, video, svg, .rf-placeholder) {
48
- border-radius: inherit;
49
- }
50
- [data-section="media"][data-guest-fit="bleed"]:has(> [data-rune]) {
51
- border-radius: 0;
52
- }
47
+ [data-section="media"][data-guest-fit="bleed"] > :is(img, video, svg, .rf-placeholder) {
48
+ border-radius: inherit;
49
+ }
50
+ [data-section="media"][data-guest-fit="bleed"]:has(> [data-rune]) {
51
+ border-radius: 0;
52
+ }
53
53
 
54
- /* `preview` (negative-margin breakout) and a displaced `showcase` (peek spill)
54
+ /* `preview` (negative-margin breakout) and a displaced `showcase` (peek spill)
55
55
  * want the slot fully de-chromed so the bleed reads as edge-to-edge. Juxtapose
56
56
  * keeps the slot's rounded corners (it still reads as part of the card surface). */
57
- [data-section="media"]:is(
58
- :has(> [data-rune="preview"]),
59
- :has(> .rf-showcase[data-displace]:not(.rf-showcase--in-bento-cell))
60
- ) {
61
- border-radius: 0;
62
- }
63
- [data-section="media"]:is(
64
- :has(> [data-rune="preview"]),
65
- :has(> [data-rune="juxtapose"]),
66
- :has(> .rf-showcase[data-displace]:not(.rf-showcase--in-bento-cell))
67
- ) > * {
68
- border-radius: 0;
69
- }
57
+ [data-section="media"]:is(
58
+ :has(> [data-rune="preview"]),
59
+ :has(> .rf-showcase[data-displace]:not(.rf-showcase--in-bento-cell))
60
+ ) {
61
+ border-radius: 0;
62
+ }
63
+ [data-section="media"]:is(
64
+ :has(> [data-rune="preview"]),
65
+ :has(> [data-rune="juxtapose"]),
66
+ :has(> .rf-showcase[data-displace]:not(.rf-showcase--in-bento-cell))
67
+ )
68
+ > * {
69
+ border-radius: 0;
70
+ }
70
71
 
71
- /* Beside-layout images get subtle depth. Block runes carry their own visual
72
+ /* Beside-layout images get subtle depth. Block runes carry their own visual
72
73
  * weight (topbars, frames) so the shadow is image-only. */
73
- [data-media-position="start"] > [data-section="media"] > img,
74
- [data-media-position="end"] > [data-section="media"] > img {
75
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
76
- }
77
-
74
+ [data-media-position="start"] > [data-section="media"] > img,
75
+ [data-media-position="end"] > [data-section="media"] > img {
76
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
77
+ }
78
78
  }
@@ -1,5 +1,5 @@
1
1
  @layer skin {
2
- /* Theme-mode toggle button (SPEC-073).
2
+ /* Theme-mode toggle button (SPEC-073).
3
3
  *
4
4
  * Layout chrome — a peer of the search trigger, placed in the header/toolbar.
5
5
  * The `theme-toggle` behavior cycles auto → light → dark and reflects the
@@ -8,37 +8,39 @@
8
8
  * attribute. Chrome (surface fill, full radius, muted colour, primary hover
9
9
  * accent) is kept in sync with the search trigger so the two header buttons
10
10
  * read as a matched set. */
11
- .rf-theme-toggle {
12
- padding: 0;
13
- border: 1px solid var(--rf-color-border);
14
- border-radius: var(--rf-radius-full);
15
- background: var(--rf-color-surface);
16
- color: var(--rf-color-muted);
17
- cursor: pointer;
18
- transition: border-color 0.15s, color 0.15s, background 0.15s;
19
- }
20
- .rf-theme-toggle:hover {
21
- border-color: var(--rf-color-primary);
22
- color: var(--rf-color-text);
23
- background: var(--rf-color-surface-hover);
24
- }
25
- .rf-theme-toggle:focus-visible {
26
- outline: 2px solid var(--rf-color-primary);
27
- outline-offset: 2px;
28
- }
11
+ .rf-theme-toggle {
12
+ padding: 0;
13
+ border: 1px solid var(--rf-color-border);
14
+ border-radius: var(--rf-radius-full);
15
+ background: var(--rf-color-surface);
16
+ color: var(--rf-color-muted);
17
+ cursor: pointer;
18
+ transition:
19
+ border-color 0.15s,
20
+ color 0.15s,
21
+ background 0.15s;
22
+ }
23
+ .rf-theme-toggle:hover {
24
+ border-color: var(--rf-color-primary);
25
+ color: var(--rf-color-text);
26
+ background: var(--rf-color-surface-hover);
27
+ }
28
+ .rf-theme-toggle:focus-visible {
29
+ outline: 2px solid var(--rf-color-primary);
30
+ outline-offset: 2px;
31
+ }
29
32
 
30
- /* Icon — a currentColor-tinted mask. Defaults to the auto glyph so the SSR'd
33
+ /* Icon — a currentColor-tinted mask. Defaults to the auto glyph so the SSR'd
31
34
  * button shows an icon before the behavior sets data-theme-pref; the light and
32
35
  * dark glyphs swap in by state. */
33
- .rf-theme-toggle__icon {
34
- background: currentColor;
35
- mask-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><circle cx='12' cy='12' r='10'/><path d='M12 2a10 10 0 0 0 0 20Z' fill='currentColor'/></svg>");
36
- }
37
- .rf-theme-toggle[data-theme-pref="light"] .rf-theme-toggle__icon {
38
- mask-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><circle cx='12' cy='12' r='4'/><path d='M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M4.93 19.07l1.41-1.41M17.66 6.34l1.41-1.41'/></svg>");
39
- }
40
- .rf-theme-toggle[data-theme-pref="dark"] .rf-theme-toggle__icon {
41
- mask-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z'/></svg>");
42
- }
43
-
36
+ .rf-theme-toggle__icon {
37
+ background: currentColor;
38
+ mask-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><circle cx='12' cy='12' r='10'/><path d='M12 2a10 10 0 0 0 0 20Z' fill='currentColor'/></svg>");
39
+ }
40
+ .rf-theme-toggle[data-theme-pref="light"] .rf-theme-toggle__icon {
41
+ mask-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><circle cx='12' cy='12' r='4'/><path d='M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M4.93 19.07l1.41-1.41M17.66 6.34l1.41-1.41'/></svg>");
42
+ }
43
+ .rf-theme-toggle[data-theme-pref="dark"] .rf-theme-toggle__icon {
44
+ mask-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z'/></svg>");
45
+ }
44
46
  }
@@ -1,44 +1,45 @@
1
1
  @layer skin {
2
- /* Version Switcher — page-level version dropdown */
2
+ /* Version Switcher — page-level version dropdown */
3
3
 
4
- .rf-version-switcher {
5
- gap: 0.5rem;
6
- margin-bottom: 1.5rem;
7
- font-size: var(--rf-text-sm);
8
- }
9
-
10
- .rf-version-switcher__label {
11
- color: var(--rf-color-muted);
12
- font-weight: var(--rf-weight-medium);
13
- font-size: var(--rf-text-xs);
14
- text-transform: uppercase;
15
- letter-spacing: var(--rf-tracking-wide);
16
- }
4
+ .rf-version-switcher {
5
+ gap: 0.5rem;
6
+ margin-bottom: 1.5rem;
7
+ font-size: var(--rf-text-sm);
8
+ }
17
9
 
18
- .rf-version-switcher__select {
19
- background: var(--rf-color-surface);
20
- border: 1px solid var(--rf-color-border);
21
- border-radius: var(--rf-radius-sm, 0.25rem);
22
- color: var(--rf-color-text);
23
- font-size: var(--rf-text-sm);
24
- font-family: inherit;
25
- padding: 0.3rem 2rem 0.3rem 0.6rem;
26
- cursor: pointer;
27
- line-height: var(--rf-leading-snug);
28
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E");
29
- background-repeat: no-repeat;
30
- background-position: right 0.5rem center;
31
- transition: border-color 150ms ease, box-shadow 150ms ease;
32
- }
10
+ .rf-version-switcher__label {
11
+ color: var(--rf-color-muted);
12
+ font-weight: var(--rf-weight-medium);
13
+ font-size: var(--rf-text-xs);
14
+ text-transform: uppercase;
15
+ letter-spacing: var(--rf-tracking-wide);
16
+ }
33
17
 
34
- .rf-version-switcher__select:hover {
35
- border-color: var(--rf-color-primary);
36
- }
18
+ .rf-version-switcher__select {
19
+ background: var(--rf-color-surface);
20
+ border: 1px solid var(--rf-color-border);
21
+ border-radius: var(--rf-radius-sm, 0.25rem);
22
+ color: var(--rf-color-text);
23
+ font-size: var(--rf-text-sm);
24
+ font-family: inherit;
25
+ padding: 0.3rem 2rem 0.3rem 0.6rem;
26
+ cursor: pointer;
27
+ line-height: var(--rf-leading-snug);
28
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E");
29
+ background-repeat: no-repeat;
30
+ background-position: right 0.5rem center;
31
+ transition:
32
+ border-color 150ms ease,
33
+ box-shadow 150ms ease;
34
+ }
37
35
 
38
- .rf-version-switcher__select:focus-visible {
39
- outline: none;
40
- border-color: var(--rf-color-primary);
41
- box-shadow: 0 0 0 2px var(--rf-color-primary-bg);
42
- }
36
+ .rf-version-switcher__select:hover {
37
+ border-color: var(--rf-color-primary);
38
+ }
43
39
 
40
+ .rf-version-switcher__select:focus-visible {
41
+ outline: none;
42
+ border-color: var(--rf-color-primary);
43
+ box-shadow: 0 0 0 2px var(--rf-color-primary-bg);
44
+ }
44
45
  }