@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,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
  }