@refrakt-md/lumina 0.33.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 (141) hide show
  1. package/base.css +29 -29
  2. package/dist/config.d.ts.map +1 -1
  3. package/dist/config.js.map +1 -1
  4. package/dist/icons.d.ts.map +1 -1
  5. package/dist/icons.js +57 -57
  6. package/dist/icons.js.map +1 -1
  7. package/dist/presets/catppuccin.js.map +1 -1
  8. package/dist/presets/dracula.js.map +1 -1
  9. package/dist/presets/gruvbox.js.map +1 -1
  10. package/dist/presets/niwaki.js.map +1 -1
  11. package/dist/presets/nord.js.map +1 -1
  12. package/dist/presets/one-dark.js.map +1 -1
  13. package/dist/presets/solarized.js.map +1 -1
  14. package/dist/presets/tideline.d.ts.map +1 -1
  15. package/dist/presets/tideline.js +20 -4
  16. package/dist/presets/tideline.js.map +1 -1
  17. package/dist/presets/tokyo-night.js.map +1 -1
  18. package/dist/tokens.js.map +1 -1
  19. package/index.css +124 -124
  20. package/package.json +5 -5
  21. package/presets.json +61 -13
  22. package/styles/base/attributes.css +32 -13
  23. package/styles/dimensions/checklist.css +45 -46
  24. package/styles/dimensions/cover.css +71 -51
  25. package/styles/dimensions/density.css +69 -65
  26. package/styles/dimensions/frame.css +116 -57
  27. package/styles/dimensions/metadata.css +110 -103
  28. package/styles/dimensions/motion.css +42 -13
  29. package/styles/dimensions/reading.css +27 -27
  30. package/styles/dimensions/sections.css +44 -45
  31. package/styles/dimensions/sequence.css +56 -57
  32. package/styles/dimensions/state.css +8 -2
  33. package/styles/dimensions/substrate.css +82 -58
  34. package/styles/dimensions/surfaces.css +65 -62
  35. package/styles/elements/blockquote.css +24 -25
  36. package/styles/elements/code.css +72 -71
  37. package/styles/elements/table.css +36 -37
  38. package/styles/global.css +163 -121
  39. package/styles/layouts/blog.css +219 -218
  40. package/styles/layouts/default.css +168 -167
  41. package/styles/layouts/docs.css +121 -122
  42. package/styles/layouts/mobile.css +54 -55
  43. package/styles/layouts/on-this-page.css +46 -47
  44. package/styles/layouts/plan.css +248 -247
  45. package/styles/layouts/search.css +142 -140
  46. package/styles/layouts/split.css +45 -45
  47. package/styles/layouts/theme-toggle.css +33 -31
  48. package/styles/layouts/version-switcher.css +38 -37
  49. package/styles/runes/accordion.css +90 -81
  50. package/styles/runes/aggregate.css +50 -39
  51. package/styles/runes/annotate.css +46 -45
  52. package/styles/runes/api.css +22 -23
  53. package/styles/runes/audio.css +140 -141
  54. package/styles/runes/badge.css +12 -13
  55. package/styles/runes/bar.css +4 -5
  56. package/styles/runes/bento.css +73 -62
  57. package/styles/runes/bg.css +62 -47
  58. package/styles/runes/blog.css +89 -90
  59. package/styles/runes/bond.css +49 -50
  60. package/styles/runes/breadcrumb.css +34 -35
  61. package/styles/runes/budget.css +126 -127
  62. package/styles/runes/bug.css +28 -27
  63. package/styles/runes/card.css +63 -60
  64. package/styles/runes/carousel.css +15 -15
  65. package/styles/runes/cast.css +50 -51
  66. package/styles/runes/changelog.css +45 -46
  67. package/styles/runes/character.css +31 -32
  68. package/styles/runes/chart.css +194 -106
  69. package/styles/runes/codegroup.css +109 -100
  70. package/styles/runes/collection.css +87 -86
  71. package/styles/runes/compare.css +38 -39
  72. package/styles/runes/comparison.css +205 -179
  73. package/styles/runes/conversation.css +36 -33
  74. package/styles/runes/cta.css +135 -132
  75. package/styles/runes/datatable.css +84 -83
  76. package/styles/runes/decision.css +25 -26
  77. package/styles/runes/design-context.css +21 -23
  78. package/styles/runes/details.css +26 -27
  79. package/styles/runes/diagram.css +28 -29
  80. package/styles/runes/diff.css +75 -72
  81. package/styles/runes/drawer.css +276 -198
  82. package/styles/runes/embed.css +20 -21
  83. package/styles/runes/event.css +35 -36
  84. package/styles/runes/expand.css +43 -34
  85. package/styles/runes/faction.css +47 -48
  86. package/styles/runes/feature.css +119 -112
  87. package/styles/runes/figure.css +11 -12
  88. package/styles/runes/file-ref.css +11 -13
  89. package/styles/runes/form.css +155 -154
  90. package/styles/runes/gallery.css +59 -60
  91. package/styles/runes/grid.css +10 -7
  92. package/styles/runes/hero.css +189 -185
  93. package/styles/runes/hint.css +57 -58
  94. package/styles/runes/howto.css +62 -64
  95. package/styles/runes/itinerary.css +133 -134
  96. package/styles/runes/juxtapose.css +83 -82
  97. package/styles/runes/lore.css +32 -34
  98. package/styles/runes/map.css +106 -99
  99. package/styles/runes/mediatext.css +30 -27
  100. package/styles/runes/milestone.css +98 -97
  101. package/styles/runes/mockup.css +338 -335
  102. package/styles/runes/nav.css +465 -450
  103. package/styles/runes/organization.css +23 -20
  104. package/styles/runes/page-section.css +14 -15
  105. package/styles/runes/pagination.css +45 -44
  106. package/styles/runes/palette.css +78 -80
  107. package/styles/runes/placeholder.css +8 -9
  108. package/styles/runes/plan-history.css +160 -161
  109. package/styles/runes/plan-progress.css +15 -16
  110. package/styles/runes/plan-ref.css +32 -23
  111. package/styles/runes/playlist.css +106 -107
  112. package/styles/runes/plot.css +92 -91
  113. package/styles/runes/preview.css +152 -149
  114. package/styles/runes/pricing.css +133 -123
  115. package/styles/runes/progress.css +32 -27
  116. package/styles/runes/pullquote.css +89 -90
  117. package/styles/runes/realm.css +47 -48
  118. package/styles/runes/recipe.css +112 -114
  119. package/styles/runes/relationships.css +77 -76
  120. package/styles/runes/reveal.css +90 -79
  121. package/styles/runes/sandbox.css +59 -60
  122. package/styles/runes/section.css +57 -50
  123. package/styles/runes/showcase.css +35 -16
  124. package/styles/runes/sidenote.css +30 -27
  125. package/styles/runes/snippet.css +8 -9
  126. package/styles/runes/spacing.css +86 -88
  127. package/styles/runes/spec.css +24 -25
  128. package/styles/runes/steps.css +89 -80
  129. package/styles/runes/storyboard.css +46 -45
  130. package/styles/runes/swatch.css +22 -23
  131. package/styles/runes/symbol.css +117 -118
  132. package/styles/runes/tabs.css +88 -79
  133. package/styles/runes/testimonial.css +43 -44
  134. package/styles/runes/textblock.css +32 -28
  135. package/styles/runes/timeline.css +63 -64
  136. package/styles/runes/tint.css +214 -215
  137. package/styles/runes/toc.css +40 -41
  138. package/styles/runes/track.css +89 -90
  139. package/styles/runes/typography.css +89 -91
  140. package/styles/runes/work.css +47 -36
  141. package/styles/runes/xref.css +21 -22
@@ -1,5 +1,5 @@
1
1
  @layer skin {
2
- /* Drawer — addressable modal panel (SPEC-060).
2
+ /* Drawer — addressable modal panel (SPEC-060).
3
3
  *
4
4
  * Two visual modes ride on the same `.rf-drawer` element:
5
5
  *
@@ -19,230 +19,309 @@
19
19
  * scroll the page underneath the open dialog.
20
20
  */
21
21
 
22
- .rf-drawer {
23
- --rf-drawer-bg: var(--rf-color-surface);
24
- --rf-drawer-fg: var(--rf-color-text);
25
- --rf-drawer-border: var(--rf-color-border);
26
- --rf-drawer-shadow: 0 18px 48px -12px rgb(0 0 0 / 0.35);
27
- --rf-drawer-gutter: var(--rf-spacing-sm);
28
- --rf-drawer-radius: var(--rf-radius-md);
29
- --rf-drawer-anim-duration: 220ms;
30
- --rf-drawer-anim-ease: cubic-bezier(0.32, 0.72, 0, 1);
31
- }
22
+ .rf-drawer {
23
+ --rf-drawer-bg: var(--rf-color-surface);
24
+ --rf-drawer-fg: var(--rf-color-text);
25
+ --rf-drawer-border: var(--rf-color-border);
26
+ --rf-drawer-shadow: 0 18px 48px -12px rgb(0 0 0 / 0.35);
27
+ --rf-drawer-gutter: var(--rf-spacing-sm);
28
+ --rf-drawer-radius: var(--rf-radius-md);
29
+ --rf-drawer-anim-duration: 220ms;
30
+ --rf-drawer-anim-ease: cubic-bezier(0.32, 0.72, 0, 1);
31
+ }
32
32
 
33
- /* ─── No-JS / in-flow mode ─────────────────────────────────────── */
33
+ /* ─── No-JS / in-flow mode ─────────────────────────────────────── */
34
34
 
35
- section.rf-drawer {
36
- margin: var(--rf-spacing-lg) 0;
37
- padding: var(--rf-spacing-md) var(--rf-spacing-lg);
38
- background: var(--rf-drawer-bg);
39
- color: var(--rf-drawer-fg);
40
- border: 1px solid var(--rf-drawer-border);
41
- border-left: 4px solid var(--rf-color-primary);
42
- border-radius: var(--rf-drawer-radius);
43
- }
35
+ section.rf-drawer {
36
+ margin: var(--rf-spacing-lg) 0;
37
+ padding: var(--rf-spacing-md) var(--rf-spacing-lg);
38
+ background: var(--rf-drawer-bg);
39
+ color: var(--rf-drawer-fg);
40
+ border: 1px solid var(--rf-drawer-border);
41
+ border-left: 4px solid var(--rf-color-primary);
42
+ border-radius: var(--rf-drawer-radius);
43
+ }
44
44
 
45
- section.rf-drawer .rf-drawer__header {
46
- gap: var(--rf-spacing-sm);
47
- margin-bottom: var(--rf-spacing-sm);
48
- }
45
+ section.rf-drawer .rf-drawer__header {
46
+ gap: var(--rf-spacing-sm);
47
+ margin-bottom: var(--rf-spacing-sm);
48
+ }
49
49
 
50
- section.rf-drawer .rf-drawer__title {
51
- margin: 0;
52
- font-size: var(--rf-text);
53
- font-weight: var(--rf-weight-semibold);
54
- color: var(--rf-color-primary);
55
- letter-spacing: var(--rf-tracking-normal);
56
- }
50
+ section.rf-drawer .rf-drawer__title {
51
+ margin: 0;
52
+ font-size: var(--rf-text);
53
+ font-weight: var(--rf-weight-semibold);
54
+ color: var(--rf-color-primary);
55
+ letter-spacing: var(--rf-tracking-normal);
56
+ }
57
57
 
58
- section.rf-drawer .rf-drawer__body > :first-child { margin-top: 0; }
59
- section.rf-drawer .rf-drawer__body > :last-child { margin-bottom: 0; }
58
+ section.rf-drawer .rf-drawer__body > :first-child {
59
+ margin-top: 0;
60
+ }
61
+ section.rf-drawer .rf-drawer__body > :last-child {
62
+ margin-bottom: 0;
63
+ }
60
64
 
61
- /* In-flow footer — small text, top divider, mirrors the dialog-mode look so
65
+ /* In-flow footer — small text, top divider, mirrors the dialog-mode look so
62
66
  * authors get the same chrome whether JS is enhancing or not. */
63
- section.rf-drawer .rf-drawer__footer {
64
- margin-top: var(--rf-spacing-md);
65
- padding-top: var(--rf-spacing-sm);
66
- border-top: 1px solid var(--rf-drawer-border);
67
- font-size: var(--rf-text-sm);
68
- color: var(--rf-color-muted);
69
- }
70
- section.rf-drawer .rf-drawer__footer > :first-child { margin-top: 0; }
71
- section.rf-drawer .rf-drawer__footer > :last-child { margin-bottom: 0; }
67
+ section.rf-drawer .rf-drawer__footer {
68
+ margin-top: var(--rf-spacing-md);
69
+ padding-top: var(--rf-spacing-sm);
70
+ border-top: 1px solid var(--rf-drawer-border);
71
+ font-size: var(--rf-text-sm);
72
+ color: var(--rf-color-muted);
73
+ }
74
+ section.rf-drawer .rf-drawer__footer > :first-child {
75
+ margin-top: 0;
76
+ }
77
+ section.rf-drawer .rf-drawer__footer > :last-child {
78
+ margin-bottom: 0;
79
+ }
72
80
 
73
- /* ─── JS / dialog mode ─────────────────────────────────────────── */
81
+ /* ─── JS / dialog mode ─────────────────────────────────────────── */
74
82
 
75
- /* Dialog base. Crucially the `display: flex` rule below is scoped to the
83
+ /* Dialog base. Crucially the `display: flex` rule below is scoped to the
76
84
  * `[open]` state — without that scope, declaring `display: flex` on the
77
85
  * bare `dialog.rf-drawer` overrides the browser UA's `display: none` for
78
86
  * closed dialogs, so the closed dialog renders visibly as an empty box
79
87
  * positioned by the side `inset` rules. */
80
- dialog.rf-drawer {
81
- background: var(--rf-drawer-bg);
82
- color: var(--rf-drawer-fg);
83
- border: 1px solid var(--rf-drawer-border);
84
- border-radius: var(--rf-drawer-radius);
85
- box-shadow: var(--rf-drawer-shadow);
86
- padding: 0;
87
- margin: 0;
88
- }
88
+ dialog.rf-drawer {
89
+ background: var(--rf-drawer-bg);
90
+ color: var(--rf-drawer-fg);
91
+ border: 1px solid var(--rf-drawer-border);
92
+ border-radius: var(--rf-drawer-radius);
93
+ box-shadow: var(--rf-drawer-shadow);
94
+ padding: 0;
95
+ margin: 0;
96
+ }
89
97
 
90
- dialog.rf-drawer::backdrop {
91
- background: rgb(0 0 0 / 0.35);
92
- backdrop-filter: blur(2px);
93
- }
98
+ dialog.rf-drawer::backdrop {
99
+ background: rgb(0 0 0 / 0.35);
100
+ backdrop-filter: blur(2px);
101
+ }
94
102
 
95
- dialog.rf-drawer .rf-drawer__header {
96
- gap: var(--rf-spacing-md);
97
- /* Reset the generous `[data-section="header"]` bottom margin (3rem) — the
103
+ dialog.rf-drawer .rf-drawer__header {
104
+ gap: var(--rf-spacing-md);
105
+ /* Reset the generous `[data-section="header"]` bottom margin (3rem) — the
98
106
  * dialog chrome spaces the header from the body via the body's own
99
107
  * padding, so the section default would push the body off-screen. */
100
- margin: 0;
101
- padding: var(--rf-spacing-md) var(--rf-spacing-lg);
102
- border-bottom: 1px solid var(--rf-drawer-border);
103
- background: var(--rf-drawer-bg);
104
- }
105
- dialog.rf-drawer .rf-drawer__title {
106
- margin: 0;
107
- font-size: var(--rf-text);
108
- font-weight: var(--rf-weight-semibold);
109
- }
108
+ margin: 0;
109
+ padding: var(--rf-spacing-md) var(--rf-spacing-lg);
110
+ border-bottom: 1px solid var(--rf-drawer-border);
111
+ background: var(--rf-drawer-bg);
112
+ }
113
+ dialog.rf-drawer .rf-drawer__title {
114
+ margin: 0;
115
+ font-size: var(--rf-text);
116
+ font-weight: var(--rf-weight-semibold);
117
+ }
110
118
 
111
- dialog.rf-drawer .rf-drawer__close {
112
- appearance: none;
113
- background: transparent;
114
- border: 0;
115
- cursor: pointer;
116
- color: var(--rf-color-muted);
117
- padding: var(--rf-spacing-xs) var(--rf-spacing-sm);
118
- font-size: var(--rf-text-xl);
119
- line-height: 1;
120
- border-radius: var(--rf-radius-sm);
121
- }
122
- dialog.rf-drawer .rf-drawer__close:hover {
123
- color: var(--rf-color-text);
124
- background: var(--rf-color-surface-hover);
125
- }
119
+ dialog.rf-drawer .rf-drawer__close {
120
+ appearance: none;
121
+ background: transparent;
122
+ border: 0;
123
+ cursor: pointer;
124
+ color: var(--rf-color-muted);
125
+ padding: var(--rf-spacing-xs) var(--rf-spacing-sm);
126
+ font-size: var(--rf-text-xl);
127
+ line-height: 1;
128
+ border-radius: var(--rf-radius-sm);
129
+ }
130
+ dialog.rf-drawer .rf-drawer__close:hover {
131
+ color: var(--rf-color-text);
132
+ background: var(--rf-color-surface-hover);
133
+ }
126
134
 
127
- dialog.rf-drawer .rf-drawer__body {
128
- padding: var(--rf-spacing-md) var(--rf-spacing-lg);
129
- }
135
+ dialog.rf-drawer .rf-drawer__body {
136
+ padding: var(--rf-spacing-md) var(--rf-spacing-lg);
137
+ }
130
138
 
131
- /* Dialog footer — small text, top divider, pinned at bottom via flex.
139
+ /* Dialog footer — small text, top divider, pinned at bottom via flex.
132
140
  * Stays visible regardless of body scroll depth so links like "View
133
141
  * source on GitHub →" (the SPEC-078 use case) are always one tap away. */
134
- dialog.rf-drawer .rf-drawer__footer {
135
- padding: var(--rf-spacing-sm) var(--rf-spacing-lg);
136
- border-top: 1px solid var(--rf-drawer-border);
137
- background: var(--rf-drawer-bg);
138
- font-size: var(--rf-text-sm);
139
- color: var(--rf-color-muted);
140
- }
141
- dialog.rf-drawer .rf-drawer__footer > :first-child { margin-top: 0; }
142
- dialog.rf-drawer .rf-drawer__footer > :last-child { margin-bottom: 0; }
143
- dialog.rf-drawer .rf-drawer__footer p { margin: 0; }
142
+ dialog.rf-drawer .rf-drawer__footer {
143
+ padding: var(--rf-spacing-sm) var(--rf-spacing-lg);
144
+ border-top: 1px solid var(--rf-drawer-border);
145
+ background: var(--rf-drawer-bg);
146
+ font-size: var(--rf-text-sm);
147
+ color: var(--rf-color-muted);
148
+ }
149
+ dialog.rf-drawer .rf-drawer__footer > :first-child {
150
+ margin-top: 0;
151
+ }
152
+ dialog.rf-drawer .rf-drawer__footer > :last-child {
153
+ margin-bottom: 0;
154
+ }
155
+ dialog.rf-drawer .rf-drawer__footer p {
156
+ margin: 0;
157
+ }
144
158
 
145
- /* Collapse the vertical margins of first / last children inside the body
159
+ /* Collapse the vertical margins of first / last children inside the body
146
160
  * so the drawer's own padding is what spaces content from the chrome —
147
161
  * otherwise a `<figure>` or `<p>` with its own top/bottom margin stacks
148
162
  * on top of the body's padding and the content looks adrift. A snippet
149
163
  * inside a drawer compiles to `body > .rf-codeblock > .rf-snippet > <pre>`,
150
164
  * so the margin-zero walk reaches two levels deep to catch the figure. */
151
- dialog.rf-drawer .rf-drawer__body > :first-child,
152
- dialog.rf-drawer .rf-drawer__body > :first-child > :first-child {
153
- margin-top: 0;
154
- }
155
- dialog.rf-drawer .rf-drawer__body > :last-child,
156
- dialog.rf-drawer .rf-drawer__body > :last-child > :last-child {
157
- margin-bottom: 0;
158
- }
159
- dialog.rf-drawer[data-side="right"][open]:not([data-state="closing"]) {
160
- animation: rf-drawer-slide-in-right var(--rf-drawer-anim-duration) var(--rf-drawer-anim-ease);
161
- }
162
- dialog.rf-drawer[data-side="right"][data-state="closing"] {
163
- animation: rf-drawer-slide-out-right var(--rf-drawer-anim-duration) var(--rf-drawer-anim-ease) forwards;
164
- }
165
- dialog.rf-drawer[data-side="left"][open]:not([data-state="closing"]) {
166
- animation: rf-drawer-slide-in-left var(--rf-drawer-anim-duration) var(--rf-drawer-anim-ease);
167
- }
168
- dialog.rf-drawer[data-side="left"][data-state="closing"] {
169
- animation: rf-drawer-slide-out-left var(--rf-drawer-anim-duration) var(--rf-drawer-anim-ease) forwards;
170
- }
171
- dialog.rf-drawer[data-side="top"][open]:not([data-state="closing"]) {
172
- animation: rf-drawer-slide-in-top var(--rf-drawer-anim-duration) var(--rf-drawer-anim-ease);
173
- }
174
- dialog.rf-drawer[data-side="top"][data-state="closing"] {
175
- animation: rf-drawer-slide-out-top var(--rf-drawer-anim-duration) var(--rf-drawer-anim-ease) forwards;
176
- }
177
- dialog.rf-drawer[data-side="bottom"][open]:not([data-state="closing"]) {
178
- animation: rf-drawer-slide-in-bottom var(--rf-drawer-anim-duration) var(--rf-drawer-anim-ease);
179
- }
180
- dialog.rf-drawer[data-side="bottom"][data-state="closing"] {
181
- animation: rf-drawer-slide-out-bottom var(--rf-drawer-anim-duration) var(--rf-drawer-anim-ease) forwards;
182
- }
165
+ dialog.rf-drawer .rf-drawer__body > :first-child,
166
+ dialog.rf-drawer .rf-drawer__body > :first-child > :first-child {
167
+ margin-top: 0;
168
+ }
169
+ dialog.rf-drawer .rf-drawer__body > :last-child,
170
+ dialog.rf-drawer .rf-drawer__body > :last-child > :last-child {
171
+ margin-bottom: 0;
172
+ }
173
+ dialog.rf-drawer[data-side="right"][open]:not([data-state="closing"]) {
174
+ animation: rf-drawer-slide-in-right var(--rf-drawer-anim-duration) var(--rf-drawer-anim-ease);
175
+ }
176
+ dialog.rf-drawer[data-side="right"][data-state="closing"] {
177
+ animation: rf-drawer-slide-out-right var(--rf-drawer-anim-duration) var(--rf-drawer-anim-ease)
178
+ forwards;
179
+ }
180
+ dialog.rf-drawer[data-side="left"][open]:not([data-state="closing"]) {
181
+ animation: rf-drawer-slide-in-left var(--rf-drawer-anim-duration) var(--rf-drawer-anim-ease);
182
+ }
183
+ dialog.rf-drawer[data-side="left"][data-state="closing"] {
184
+ animation: rf-drawer-slide-out-left var(--rf-drawer-anim-duration) var(--rf-drawer-anim-ease)
185
+ forwards;
186
+ }
187
+ dialog.rf-drawer[data-side="top"][open]:not([data-state="closing"]) {
188
+ animation: rf-drawer-slide-in-top var(--rf-drawer-anim-duration) var(--rf-drawer-anim-ease);
189
+ }
190
+ dialog.rf-drawer[data-side="top"][data-state="closing"] {
191
+ animation: rf-drawer-slide-out-top var(--rf-drawer-anim-duration) var(--rf-drawer-anim-ease)
192
+ forwards;
193
+ }
194
+ dialog.rf-drawer[data-side="bottom"][open]:not([data-state="closing"]) {
195
+ animation: rf-drawer-slide-in-bottom var(--rf-drawer-anim-duration) var(--rf-drawer-anim-ease);
196
+ }
197
+ dialog.rf-drawer[data-side="bottom"][data-state="closing"] {
198
+ animation: rf-drawer-slide-out-bottom var(--rf-drawer-anim-duration) var(--rf-drawer-anim-ease)
199
+ forwards;
200
+ }
183
201
 
184
- dialog.rf-drawer[open]:not([data-state="closing"])::backdrop {
185
- animation: rf-drawer-backdrop-in var(--rf-drawer-anim-duration) var(--rf-drawer-anim-ease);
186
- }
187
- dialog.rf-drawer[data-state="closing"]::backdrop {
188
- animation: rf-drawer-backdrop-out var(--rf-drawer-anim-duration) var(--rf-drawer-anim-ease) forwards;
189
- }
202
+ dialog.rf-drawer[open]:not([data-state="closing"])::backdrop {
203
+ animation: rf-drawer-backdrop-in var(--rf-drawer-anim-duration) var(--rf-drawer-anim-ease);
204
+ }
205
+ dialog.rf-drawer[data-state="closing"]::backdrop {
206
+ animation: rf-drawer-backdrop-out var(--rf-drawer-anim-duration) var(--rf-drawer-anim-ease)
207
+ forwards;
208
+ }
190
209
 
191
- @keyframes rf-drawer-slide-in-right {
192
- from { transform: translateX(calc(100% + var(--rf-drawer-gutter))); opacity: 0; }
193
- to { transform: translateX(0); opacity: 1; }
194
- }
195
- @keyframes rf-drawer-slide-in-left {
196
- from { transform: translateX(calc(-100% - var(--rf-drawer-gutter))); opacity: 0; }
197
- to { transform: translateX(0); opacity: 1; }
198
- }
199
- @keyframes rf-drawer-slide-in-top {
200
- from { transform: translateY(calc(-100% - var(--rf-drawer-gutter))); opacity: 0; }
201
- to { transform: translateY(0); opacity: 1; }
202
- }
203
- @keyframes rf-drawer-slide-in-bottom {
204
- from { transform: translateY(calc(100% + var(--rf-drawer-gutter))); opacity: 0; }
205
- to { transform: translateY(0); opacity: 1; }
206
- }
207
- @keyframes rf-drawer-backdrop-in {
208
- from { background: rgb(0 0 0 / 0); backdrop-filter: blur(0); }
209
- to { background: rgb(0 0 0 / 0.35); backdrop-filter: blur(2px); }
210
- }
210
+ @keyframes rf-drawer-slide-in-right {
211
+ from {
212
+ transform: translateX(calc(100% + var(--rf-drawer-gutter)));
213
+ opacity: 0;
214
+ }
215
+ to {
216
+ transform: translateX(0);
217
+ opacity: 1;
218
+ }
219
+ }
220
+ @keyframes rf-drawer-slide-in-left {
221
+ from {
222
+ transform: translateX(calc(-100% - var(--rf-drawer-gutter)));
223
+ opacity: 0;
224
+ }
225
+ to {
226
+ transform: translateX(0);
227
+ opacity: 1;
228
+ }
229
+ }
230
+ @keyframes rf-drawer-slide-in-top {
231
+ from {
232
+ transform: translateY(calc(-100% - var(--rf-drawer-gutter)));
233
+ opacity: 0;
234
+ }
235
+ to {
236
+ transform: translateY(0);
237
+ opacity: 1;
238
+ }
239
+ }
240
+ @keyframes rf-drawer-slide-in-bottom {
241
+ from {
242
+ transform: translateY(calc(100% + var(--rf-drawer-gutter)));
243
+ opacity: 0;
244
+ }
245
+ to {
246
+ transform: translateY(0);
247
+ opacity: 1;
248
+ }
249
+ }
250
+ @keyframes rf-drawer-backdrop-in {
251
+ from {
252
+ background: rgb(0 0 0 / 0);
253
+ backdrop-filter: blur(0);
254
+ }
255
+ to {
256
+ background: rgb(0 0 0 / 0.35);
257
+ backdrop-filter: blur(2px);
258
+ }
259
+ }
211
260
 
212
- @keyframes rf-drawer-slide-out-right {
213
- from { transform: translateX(0); opacity: 1; }
214
- to { transform: translateX(calc(100% + var(--rf-drawer-gutter))); opacity: 0; }
215
- }
216
- @keyframes rf-drawer-slide-out-left {
217
- from { transform: translateX(0); opacity: 1; }
218
- to { transform: translateX(calc(-100% - var(--rf-drawer-gutter))); opacity: 0; }
219
- }
220
- @keyframes rf-drawer-slide-out-top {
221
- from { transform: translateY(0); opacity: 1; }
222
- to { transform: translateY(calc(-100% - var(--rf-drawer-gutter))); opacity: 0; }
223
- }
224
- @keyframes rf-drawer-slide-out-bottom {
225
- from { transform: translateY(0); opacity: 1; }
226
- to { transform: translateY(calc(100% + var(--rf-drawer-gutter))); opacity: 0; }
227
- }
228
- @keyframes rf-drawer-backdrop-out {
229
- from { background: rgb(0 0 0 / 0.35); backdrop-filter: blur(2px); }
230
- to { background: rgb(0 0 0 / 0); backdrop-filter: blur(0); }
231
- }
261
+ @keyframes rf-drawer-slide-out-right {
262
+ from {
263
+ transform: translateX(0);
264
+ opacity: 1;
265
+ }
266
+ to {
267
+ transform: translateX(calc(100% + var(--rf-drawer-gutter)));
268
+ opacity: 0;
269
+ }
270
+ }
271
+ @keyframes rf-drawer-slide-out-left {
272
+ from {
273
+ transform: translateX(0);
274
+ opacity: 1;
275
+ }
276
+ to {
277
+ transform: translateX(calc(-100% - var(--rf-drawer-gutter)));
278
+ opacity: 0;
279
+ }
280
+ }
281
+ @keyframes rf-drawer-slide-out-top {
282
+ from {
283
+ transform: translateY(0);
284
+ opacity: 1;
285
+ }
286
+ to {
287
+ transform: translateY(calc(-100% - var(--rf-drawer-gutter)));
288
+ opacity: 0;
289
+ }
290
+ }
291
+ @keyframes rf-drawer-slide-out-bottom {
292
+ from {
293
+ transform: translateY(0);
294
+ opacity: 1;
295
+ }
296
+ to {
297
+ transform: translateY(calc(100% + var(--rf-drawer-gutter)));
298
+ opacity: 0;
299
+ }
300
+ }
301
+ @keyframes rf-drawer-backdrop-out {
302
+ from {
303
+ background: rgb(0 0 0 / 0.35);
304
+ backdrop-filter: blur(2px);
305
+ }
306
+ to {
307
+ background: rgb(0 0 0 / 0);
308
+ backdrop-filter: blur(0);
309
+ }
310
+ }
232
311
 
233
- @media (prefers-reduced-motion: reduce) {
234
- dialog.rf-drawer[data-side="right"][open],
235
- dialog.rf-drawer[data-side="left"][open],
236
- dialog.rf-drawer[data-side="top"][open],
237
- dialog.rf-drawer[data-side="bottom"][open],
238
- dialog.rf-drawer[data-state="closing"],
239
- dialog.rf-drawer[open]::backdrop,
240
- dialog.rf-drawer[data-state="closing"]::backdrop {
241
- animation: none;
312
+ @media (prefers-reduced-motion: reduce) {
313
+ dialog.rf-drawer[data-side="right"][open],
314
+ dialog.rf-drawer[data-side="left"][open],
315
+ dialog.rf-drawer[data-side="top"][open],
316
+ dialog.rf-drawer[data-side="bottom"][open],
317
+ dialog.rf-drawer[data-state="closing"],
318
+ dialog.rf-drawer[open]::backdrop,
319
+ dialog.rf-drawer[data-state="closing"]::backdrop {
320
+ animation: none;
321
+ }
242
322
  }
243
- }
244
323
 
245
- /* ─── Mobile tightening ────────────────────────────────────────────
324
+ /* ─── Mobile tightening ────────────────────────────────────────────
246
325
  *
247
326
  * On narrow viewports the drawer fills the screen (capped by
248
327
  * `max-width: 100vw - 2*gutter`), so the desktop-comfortable
@@ -250,12 +329,11 @@ dialog.rf-drawer[data-state="closing"]::backdrop {
250
329
  * roughly to 0.75rem / 1rem so the body has more room without
251
330
  * losing the chrome's breathing space.
252
331
  */
253
- @media (max-width: 640px) {
254
- dialog.rf-drawer .rf-drawer__header,
255
- dialog.rf-drawer .rf-drawer__body,
256
- dialog.rf-drawer .rf-drawer__footer {
257
- padding: 0.75rem 1rem;
332
+ @media (max-width: 640px) {
333
+ dialog.rf-drawer .rf-drawer__header,
334
+ dialog.rf-drawer .rf-drawer__body,
335
+ dialog.rf-drawer .rf-drawer__footer {
336
+ padding: 0.75rem 1rem;
337
+ }
258
338
  }
259
339
  }
260
-
261
- }
@@ -1,24 +1,23 @@
1
1
  @layer skin {
2
- /* Embed — skin. The responsive iframe wrapper + empty-fallback hide live in
2
+ /* Embed — skin. The responsive iframe wrapper + empty-fallback hide live in
3
3
  * @refrakt-md/skeleton (styles/runes/embed.css). */
4
- .rf-embed {
5
- margin: 0;
6
- padding: 0;
7
- }
8
- .rf-embed__wrapper {
9
- border-radius: var(--rf-radius-md);
10
- background: var(--rf-color-surface);
11
- }
12
- .rf-embed__wrapper iframe {
13
- border: none;
14
- }
15
- .rf-embed__fallback {
16
- font-size: var(--rf-text-sm);
17
- color: var(--rf-color-muted);
18
- margin-top: 0.5rem;
19
- }
20
- .rf-embed__fallback p:last-child {
21
- margin-bottom: 0;
22
- }
23
-
4
+ .rf-embed {
5
+ margin: 0;
6
+ padding: 0;
7
+ }
8
+ .rf-embed__wrapper {
9
+ border-radius: var(--rf-radius-md);
10
+ background: var(--rf-color-surface);
11
+ }
12
+ .rf-embed__wrapper iframe {
13
+ border: none;
14
+ }
15
+ .rf-embed__fallback {
16
+ font-size: var(--rf-text-sm);
17
+ color: var(--rf-color-muted);
18
+ margin-top: 0.5rem;
19
+ }
20
+ .rf-embed__fallback p:last-child {
21
+ margin-bottom: 0;
22
+ }
24
23
  }
@@ -1,41 +1,40 @@
1
1
  @layer skin {
2
- /* Event */
2
+ /* Event */
3
3
 
4
- /* When/where def-list — geometry from the shared `[data-zone-layout=
4
+ /* When/where def-list — geometry from the shared `[data-zone-layout=
5
5
  * definition-list]` primitive; this block owns only its top margin. */
6
- .rf-event__metadata {
7
- margin-top: 1.25rem;
8
- }
9
-
10
- /* Register CTA — a bar-wrapped link; style the inner `<a>` as a button. */
11
- .rf-event__register {
12
- margin-top: 1.5rem;
13
- }
14
- .rf-event__register a {
15
- padding: 0.5rem 1rem;
16
- background: var(--rf-color-primary);
17
- color: var(--rf-color-on-primary);
18
- border-radius: var(--rf-radius-md);
19
- font-weight: var(--rf-weight-medium);
20
- font-size: var(--rf-text-sm);
21
- text-decoration: none;
22
- }
23
- .rf-event__register a:hover {
24
- background: var(--rf-color-primary-hover);
25
- }
26
- .rf-event__body {
27
- margin-top: 1.5rem;
28
- }
29
- .rf-event__body ul,
30
- .rf-event__body ol {
31
- padding-left: 1.5rem;
32
- }
33
- .rf-event__body a {
34
- color: var(--rf-color-primary);
35
- text-decoration: none;
36
- }
37
- .rf-event__body a:hover {
38
- color: var(--rf-color-primary-hover);
39
- }
6
+ .rf-event__metadata {
7
+ margin-top: 1.25rem;
8
+ }
40
9
 
10
+ /* Register CTA — a bar-wrapped link; style the inner `<a>` as a button. */
11
+ .rf-event__register {
12
+ margin-top: 1.5rem;
13
+ }
14
+ .rf-event__register a {
15
+ padding: 0.5rem 1rem;
16
+ background: var(--rf-color-primary);
17
+ color: var(--rf-color-on-primary);
18
+ border-radius: var(--rf-radius-md);
19
+ font-weight: var(--rf-weight-medium);
20
+ font-size: var(--rf-text-sm);
21
+ text-decoration: none;
22
+ }
23
+ .rf-event__register a:hover {
24
+ background: var(--rf-color-primary-hover);
25
+ }
26
+ .rf-event__body {
27
+ margin-top: 1.5rem;
28
+ }
29
+ .rf-event__body ul,
30
+ .rf-event__body ol {
31
+ padding-left: 1.5rem;
32
+ }
33
+ .rf-event__body a {
34
+ color: var(--rf-color-primary);
35
+ text-decoration: none;
36
+ }
37
+ .rf-event__body a:hover {
38
+ color: var(--rf-color-primary-hover);
39
+ }
41
40
  }