@refrakt-md/lumina 0.11.3 → 0.14.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 (55) hide show
  1. package/assets/logo/prism-16-dark.png +0 -0
  2. package/assets/logo/prism-16-light.png +0 -0
  3. package/assets/logo/prism-180-dark.png +0 -0
  4. package/assets/logo/prism-180-light.png +0 -0
  5. package/assets/logo/prism-192-dark.png +0 -0
  6. package/assets/logo/prism-192-light.png +0 -0
  7. package/assets/logo/prism-24-dark.png +0 -0
  8. package/assets/logo/prism-24-light.png +0 -0
  9. package/assets/logo/prism-32-dark.png +0 -0
  10. package/assets/logo/prism-32-light.png +0 -0
  11. package/assets/logo/prism-48-dark.png +0 -0
  12. package/assets/logo/prism-48-light.png +0 -0
  13. package/assets/logo/prism-512-dark.png +0 -0
  14. package/assets/logo/prism-512-light.png +0 -0
  15. package/assets/logo/prism-64-dark.png +0 -0
  16. package/assets/logo/prism-64-light.png +0 -0
  17. package/assets/logo/prism-96-dark.png +0 -0
  18. package/assets/logo/prism-96-light.png +0 -0
  19. package/assets/logo/prism.svg +4 -0
  20. package/contracts/structures.json +23 -1
  21. package/dist/config.js +32 -32
  22. package/dist/config.js.map +1 -1
  23. package/dist/presets/niwaki.d.ts +23 -0
  24. package/dist/presets/niwaki.d.ts.map +1 -0
  25. package/dist/presets/niwaki.js +50 -0
  26. package/dist/presets/niwaki.js.map +1 -0
  27. package/dist/presets/tideline.d.ts +26 -0
  28. package/dist/presets/tideline.d.ts.map +1 -0
  29. package/dist/presets/tideline.js +132 -0
  30. package/dist/presets/tideline.js.map +1 -0
  31. package/dist/tokens.d.ts +20 -0
  32. package/dist/tokens.d.ts.map +1 -0
  33. package/dist/tokens.js +178 -0
  34. package/dist/tokens.js.map +1 -0
  35. package/dist/transform.d.ts +5 -0
  36. package/dist/transform.d.ts.map +1 -1
  37. package/dist/transform.js +5 -0
  38. package/dist/transform.js.map +1 -1
  39. package/index.css +1 -0
  40. package/package.json +17 -6
  41. package/styles/dimensions/surfaces.css +4 -2
  42. package/styles/global.css +4 -4
  43. package/styles/layouts/blog.css +8 -2
  44. package/styles/layouts/default.css +37 -3
  45. package/styles/layouts/docs.css +24 -6
  46. package/styles/layouts/mobile.css +36 -5
  47. package/styles/runes/codegroup.css +19 -15
  48. package/styles/runes/hint.css +5 -9
  49. package/styles/runes/nav.css +330 -1
  50. package/styles/runes/pagination.css +85 -0
  51. package/styles/runes/palette.css +9 -0
  52. package/styles/runes/sandbox.css +17 -0
  53. package/styles/runes/tint.css +116 -72
  54. package/tokens/base.css +74 -53
  55. package/tokens/dark.css +97 -75
@@ -49,7 +49,7 @@
49
49
  text-decoration: none;
50
50
  }
51
51
  .rf-nav-item__link--active {
52
- background: var(--rf-color-info-bg);
52
+ background: var(--rf-color-surface-active);
53
53
  color: var(--rf-color-primary);
54
54
  font-weight: 600;
55
55
  }
@@ -58,3 +58,332 @@
58
58
  font-size: 0.85rem;
59
59
  color: var(--rf-color-muted);
60
60
  }
61
+
62
+ /* ─── Collapsible groups (vertical sidebar) ───────────────────────────── */
63
+
64
+ .rf-nav--collapsible .rf-nav-group h2,
65
+ .rf-nav--collapsible .rf-nav-group h3 {
66
+ display: flex;
67
+ align-items: center;
68
+ justify-content: space-between;
69
+ cursor: pointer;
70
+ user-select: none;
71
+ border-radius: var(--rf-radius-sm);
72
+ }
73
+ .rf-nav--collapsible .rf-nav-group h2:hover,
74
+ .rf-nav--collapsible .rf-nav-group h3:hover {
75
+ color: var(--rf-color-text);
76
+ }
77
+ .rf-nav--collapsible .rf-nav-group h2:focus-visible,
78
+ .rf-nav--collapsible .rf-nav-group h3:focus-visible {
79
+ outline: 2px solid var(--rf-color-primary);
80
+ outline-offset: 2px;
81
+ }
82
+ .rf-nav--collapsible .rf-nav-group h2::after,
83
+ .rf-nav--collapsible .rf-nav-group h3::after {
84
+ content: '';
85
+ width: 0.5rem;
86
+ height: 0.5rem;
87
+ border-right: 1.5px solid currentColor;
88
+ border-bottom: 1.5px solid currentColor;
89
+ transform: rotate(45deg);
90
+ transition: transform 150ms ease;
91
+ margin-right: 0.25rem;
92
+ }
93
+ .rf-nav--collapsible .rf-nav-group[data-collapsed="true"] > ul,
94
+ .rf-nav--collapsible .rf-nav-group[data-collapsed="true"] > ol {
95
+ display: none;
96
+ }
97
+ .rf-nav--collapsible .rf-nav-group[data-collapsed="true"] h2::after,
98
+ .rf-nav--collapsible .rf-nav-group[data-collapsed="true"] h3::after {
99
+ transform: rotate(-45deg);
100
+ }
101
+
102
+ /* ─── Menubar layout (header) ─────────────────────────────────────────── */
103
+
104
+ .rf-nav--menubar {
105
+ padding: 0;
106
+ margin: 0;
107
+ }
108
+ .rf-nav--menubar > .rf-nav__top-level {
109
+ padding: 0;
110
+ margin: 0;
111
+ border: 0;
112
+ }
113
+ .rf-nav--menubar > .rf-nav__top-level > ul,
114
+ .rf-nav--menubar > .rf-nav__top-level ul {
115
+ display: flex;
116
+ flex-wrap: wrap;
117
+ gap: 0.25rem;
118
+ align-items: center;
119
+ margin: 0;
120
+ }
121
+ .rf-nav--menubar > .rf-nav__top-level li {
122
+ padding: 0;
123
+ }
124
+ .rf-nav--menubar > .rf-nav__top-level .rf-nav-item__link {
125
+ display: inline-block;
126
+ padding: 0.375rem 0.75rem;
127
+ font-weight: 500;
128
+ font-size: 0.9rem;
129
+ border-radius: var(--rf-radius-sm);
130
+ color: var(--rf-color-muted);
131
+ transition: background-color 150ms ease, color 150ms ease;
132
+ }
133
+ .rf-nav--menubar > .rf-nav__top-level .rf-nav-item__link:hover {
134
+ background: var(--rf-color-surface);
135
+ color: var(--rf-color-text);
136
+ }
137
+ .rf-nav--menubar .rf-nav-group {
138
+ margin: 0;
139
+ position: relative;
140
+ display: inline-block;
141
+ }
142
+ .rf-nav--menubar .rf-nav-group h2,
143
+ .rf-nav--menubar .rf-nav-group h3 {
144
+ margin: 0;
145
+ padding: 0.375rem 0.75rem;
146
+ font-size: 0.9rem;
147
+ font-weight: 500;
148
+ text-transform: none;
149
+ letter-spacing: normal;
150
+ color: var(--rf-color-muted);
151
+ cursor: pointer;
152
+ user-select: none;
153
+ border-radius: var(--rf-radius-sm);
154
+ transition: background-color 150ms ease, color 150ms ease;
155
+ }
156
+ .rf-nav--menubar .rf-nav-group h2:hover,
157
+ .rf-nav--menubar .rf-nav-group h3:hover,
158
+ .rf-nav--menubar .rf-nav-group[data-open="true"] h2,
159
+ .rf-nav--menubar .rf-nav-group[data-open="true"] h3 {
160
+ background: var(--rf-color-surface);
161
+ color: var(--rf-color-text);
162
+ }
163
+ .rf-nav--menubar .rf-nav-group ul {
164
+ display: block;
165
+ position: absolute;
166
+ top: 100%;
167
+ right: 0;
168
+ left: auto;
169
+ min-width: 12rem;
170
+ padding: 0.5rem;
171
+ background: var(--rf-color-bg);
172
+ border: 1px solid var(--rf-color-border);
173
+ border-radius: var(--rf-radius-md);
174
+ box-shadow: var(--rf-shadow-md, 0 4px 12px rgba(0, 0, 0, 0.08));
175
+ z-index: 50;
176
+ opacity: 0;
177
+ visibility: hidden;
178
+ pointer-events: none;
179
+ transform: translateY(-4px);
180
+ transition: opacity 150ms ease, visibility 150ms ease, transform 150ms ease;
181
+ }
182
+ .rf-nav--menubar .rf-nav-group:hover > ul,
183
+ .rf-nav--menubar .rf-nav-group:focus-within > ul,
184
+ .rf-nav--menubar .rf-nav-group[data-open="true"] > ul {
185
+ opacity: 1;
186
+ visibility: visible;
187
+ pointer-events: auto;
188
+ transform: translateY(0);
189
+ }
190
+ .rf-nav--menubar .rf-nav-group .rf-nav-item__link {
191
+ font-size: 0.85rem;
192
+ font-weight: 400;
193
+ }
194
+ .rf-nav--menubar > nav,
195
+ .rf-nav--menubar {
196
+ display: flex;
197
+ flex-wrap: wrap;
198
+ gap: 0.25rem;
199
+ align-items: center;
200
+ }
201
+ .rf-nav--menubar [data-name="trigger"] {
202
+ display: none;
203
+ }
204
+
205
+ @media (max-width: 768px) {
206
+ /* Mobile: render the menubar as a flat vertical side-nav. No hamburger
207
+ trigger, no click-to-expand groups — category headings render as plain
208
+ headings with their items always visible. */
209
+ .rf-nav--menubar [data-name="trigger"] {
210
+ display: none;
211
+ }
212
+ .rf-nav--menubar {
213
+ flex-direction: column;
214
+ align-items: stretch;
215
+ gap: 0;
216
+ }
217
+ .rf-nav--menubar > .rf-nav__top-level,
218
+ .rf-nav--menubar > .rf-nav-group {
219
+ display: block;
220
+ width: 100%;
221
+ }
222
+ .rf-nav--menubar > .rf-nav__top-level > ul {
223
+ flex-direction: column;
224
+ align-items: stretch;
225
+ gap: 0;
226
+ }
227
+ .rf-nav--menubar > .rf-nav__top-level .rf-nav-item__link {
228
+ display: block;
229
+ padding: 0.5rem 0.75rem;
230
+ }
231
+ .rf-nav--menubar .rf-nav-group {
232
+ position: static;
233
+ display: block;
234
+ margin: 1rem 0 0;
235
+ }
236
+ .rf-nav--menubar .rf-nav-group h2,
237
+ .rf-nav--menubar .rf-nav-group h3 {
238
+ font-size: 0.7rem;
239
+ text-transform: uppercase;
240
+ letter-spacing: 0.06em;
241
+ color: var(--rf-color-muted);
242
+ background: transparent;
243
+ cursor: default;
244
+ padding: 0.5rem 0.75rem 0.25rem;
245
+ font-weight: 600;
246
+ }
247
+ .rf-nav--menubar .rf-nav-group h2:hover,
248
+ .rf-nav--menubar .rf-nav-group h3:hover,
249
+ .rf-nav--menubar .rf-nav-group[data-open="true"] h2,
250
+ .rf-nav--menubar .rf-nav-group[data-open="true"] h3 {
251
+ background: transparent;
252
+ color: var(--rf-color-muted);
253
+ }
254
+ .rf-nav--menubar .rf-nav-group ul {
255
+ position: static;
256
+ display: block;
257
+ min-width: 0;
258
+ padding: 0;
259
+ background: transparent;
260
+ border: 0;
261
+ box-shadow: none;
262
+ opacity: 1;
263
+ visibility: visible;
264
+ pointer-events: auto;
265
+ transform: none;
266
+ }
267
+ }
268
+
269
+ /* ─── Columns layout (footer) ─────────────────────────────────────────── */
270
+
271
+ .rf-nav--columns {
272
+ display: grid;
273
+ grid-template-columns: repeat(auto-fit, minmax(10rem, 1fr));
274
+ gap: 2rem;
275
+ padding: 1.5rem 0;
276
+ }
277
+ .rf-nav--columns .rf-nav__top-level {
278
+ grid-column: 1 / -1;
279
+ padding-bottom: 1rem;
280
+ margin-bottom: 0;
281
+ border-bottom: 0;
282
+ }
283
+ .rf-nav--columns .rf-nav-group {
284
+ margin: 0;
285
+ }
286
+ .rf-nav--columns .rf-nav-group h2,
287
+ .rf-nav--columns .rf-nav-group h3 {
288
+ padding-left: 0;
289
+ margin-bottom: 0.75rem;
290
+ color: var(--rf-color-text);
291
+ font-size: 0.75rem;
292
+ }
293
+ .rf-nav--columns .rf-nav-item__link {
294
+ padding: 0.25rem 0;
295
+ color: var(--rf-color-muted);
296
+ }
297
+ .rf-nav--columns .rf-nav-item__link:hover {
298
+ background: transparent;
299
+ color: var(--rf-color-text);
300
+ }
301
+
302
+ @media (max-width: 600px) {
303
+ .rf-nav--columns {
304
+ grid-template-columns: 1fr;
305
+ gap: 1.25rem;
306
+ }
307
+ }
308
+
309
+ /* ─── Cards layout (section landing) ──────────────────────────────────── */
310
+
311
+ .rf-nav--cards {
312
+ padding: 0;
313
+ }
314
+ .rf-nav--cards > .rf-nav__top-level {
315
+ padding: 0;
316
+ margin: 0 0 1.5rem;
317
+ border: 0;
318
+ }
319
+ .rf-nav--cards > .rf-nav__top-level > ul,
320
+ .rf-nav--cards > ul {
321
+ display: grid;
322
+ grid-template-columns: repeat(auto-fill, minmax(16rem, 1fr));
323
+ gap: 1rem;
324
+ list-style: none;
325
+ padding: 0;
326
+ margin: 0;
327
+ }
328
+ .rf-nav--cards .rf-nav-group {
329
+ margin: 0 0 2rem;
330
+ }
331
+ .rf-nav--cards .rf-nav-group h2,
332
+ .rf-nav--cards .rf-nav-group h3 {
333
+ font-size: 0.85rem;
334
+ padding-left: 0;
335
+ margin-bottom: 1rem;
336
+ }
337
+ .rf-nav--cards .rf-nav-group > ul {
338
+ display: grid;
339
+ grid-template-columns: repeat(auto-fill, minmax(16rem, 1fr));
340
+ gap: 1rem;
341
+ }
342
+ .rf-nav--cards .rf-nav-item {
343
+ padding: 0;
344
+ color: inherit;
345
+ font-size: inherit;
346
+ }
347
+ .rf-nav--cards .rf-nav-item__link {
348
+ display: flex;
349
+ flex-direction: column;
350
+ gap: 0.5rem;
351
+ padding: 1.25rem;
352
+ background: var(--rf-color-surface, var(--rf-color-bg));
353
+ border: 1px solid var(--rf-color-border);
354
+ border-radius: var(--rf-radius-md);
355
+ color: var(--rf-color-text);
356
+ text-decoration: none;
357
+ transition: border-color 150ms ease, transform 150ms ease, box-shadow 150ms ease;
358
+ height: 100%;
359
+ }
360
+ .rf-nav--cards .rf-nav-item__link:hover {
361
+ border-color: var(--rf-color-primary);
362
+ background: var(--rf-color-surface, var(--rf-color-bg));
363
+ transform: translateY(-1px);
364
+ box-shadow: var(--rf-shadow-sm, 0 2px 6px rgba(0, 0, 0, 0.05));
365
+ }
366
+ .rf-nav--cards .rf-nav-item__icon {
367
+ width: 1.5rem;
368
+ height: 1.5rem;
369
+ color: var(--rf-color-primary);
370
+ margin-bottom: 0.25rem;
371
+ }
372
+ .rf-nav--cards .rf-nav-item__title {
373
+ font-size: 1rem;
374
+ font-weight: 600;
375
+ color: var(--rf-color-text);
376
+ }
377
+ .rf-nav--cards .rf-nav-item__description {
378
+ font-size: 0.85rem;
379
+ color: var(--rf-color-muted);
380
+ line-height: 1.5;
381
+ }
382
+
383
+ @media (max-width: 500px) {
384
+ .rf-nav--cards > ul,
385
+ .rf-nav--cards > .rf-nav__top-level > ul,
386
+ .rf-nav--cards .rf-nav-group > ul {
387
+ grid-template-columns: 1fr;
388
+ }
389
+ }
@@ -0,0 +1,85 @@
1
+ /* Pagination — prev/next links at the foot of sequential pages.
2
+ *
3
+ * Each box stacks the directional marker above the label so the two
4
+ * controls stay compact enough to sit side-by-side on mobile. Equal
5
+ * heights are guaranteed by the container's `align-items: stretch`, so
6
+ * if one label wraps to multiple lines the other box grows to match.
7
+ *
8
+ * Boxes are capped at ~50% width via `flex: 1 1 0` + `max-width`, with
9
+ * `margin-left: auto` on `__next` so it stays right-aligned even when
10
+ * `__prev` isn't rendered (first page in a sequence). */
11
+
12
+ .rf-pagination {
13
+ display: flex;
14
+ align-items: stretch;
15
+ gap: 1rem;
16
+ margin: 3rem 0 1.5rem;
17
+ padding-top: 1.5rem;
18
+ border-top: 1px solid var(--rf-color-border);
19
+ }
20
+
21
+ .rf-pagination__prev,
22
+ .rf-pagination__next {
23
+ display: flex;
24
+ flex-direction: column;
25
+ gap: 0.375rem;
26
+ padding: 0.75rem 1rem;
27
+ border: 1px solid var(--rf-color-border);
28
+ border-radius: var(--rf-radius-md);
29
+ color: var(--rf-color-text);
30
+ text-decoration: none;
31
+ font-size: 0.9rem;
32
+ transition: border-color 150ms ease, background-color 150ms ease;
33
+ flex: 1 1 0;
34
+ min-width: 0;
35
+ max-width: calc(50% - 0.5rem);
36
+ }
37
+
38
+ .rf-pagination__prev {
39
+ align-items: flex-start;
40
+ text-align: left;
41
+ }
42
+
43
+ .rf-pagination__next {
44
+ align-items: flex-end;
45
+ text-align: right;
46
+ margin-left: auto;
47
+ }
48
+
49
+ .rf-pagination__prev:hover,
50
+ .rf-pagination__next:hover {
51
+ border-color: var(--rf-color-primary);
52
+ background: var(--rf-color-surface, var(--rf-color-bg));
53
+ text-decoration: none;
54
+ }
55
+
56
+ .rf-pagination [data-name="marker"] {
57
+ color: var(--rf-color-muted);
58
+ font-weight: 400;
59
+ font-size: 1.1rem;
60
+ line-height: 1;
61
+ }
62
+
63
+ .rf-pagination [data-name="label"] {
64
+ font-weight: 500;
65
+ }
66
+
67
+ /* The pagination rune emits prev as `<marker> <label>` but next as
68
+ `<label> <marker>` (an artefact of the original row layout where the
69
+ arrow flanked the outer edge). With our vertical stack this puts the
70
+ next arrow at the bottom of its box. Force it to the top to match prev. */
71
+ .rf-pagination__next [data-name="marker"] {
72
+ order: -1;
73
+ }
74
+
75
+ @media (max-width: 768px) {
76
+ .rf-pagination {
77
+ gap: 0.5rem;
78
+ }
79
+ .rf-pagination__prev,
80
+ .rf-pagination__next {
81
+ padding: 0.625rem 0.875rem;
82
+ max-width: calc(50% - 0.25rem);
83
+ font-size: 0.85rem;
84
+ }
85
+ }
@@ -23,6 +23,15 @@
23
23
  grid-template-columns: repeat(var(--rf-palette-cols, 4), 1fr);
24
24
  gap: 0.75rem;
25
25
  }
26
+
27
+ @media (max-width: 768px) {
28
+ /* Cap the grid at 3 columns on narrow viewports — at 4 cols each swatch
29
+ is too cramped to read the hex value. Palettes with fewer than 3
30
+ declared columns keep their natural count (the `min()`). */
31
+ .rf-palette__grid {
32
+ grid-template-columns: repeat(min(var(--rf-palette-cols, 4), 3), 1fr);
33
+ }
34
+ }
26
35
  .rf-palette__swatch {
27
36
  display: flex;
28
37
  flex-direction: column;
@@ -20,3 +20,20 @@
20
20
  margin: 0;
21
21
  border-radius: 0;
22
22
  }
23
+
24
+ /* Untrusted-mode affordance: persistent banner the iframe can't suppress.
25
+ Rendered by the RfSandbox custom element when `data-security-mode="untrusted"`. */
26
+ .rf-sandbox[data-security-mode="untrusted"] {
27
+ border: 1px solid var(--rf-color-warning, #b45309);
28
+ }
29
+
30
+ .rf-sandbox__untrusted-banner {
31
+ display: block;
32
+ padding: 0.5rem 0.75rem;
33
+ font-size: 0.8125rem;
34
+ line-height: 1.25rem;
35
+ font-weight: 600;
36
+ color: var(--rf-color-warning-fg, #78350f);
37
+ background: var(--rf-color-warning-bg, #fef3c7);
38
+ border-bottom: 1px solid var(--rf-color-warning, #b45309);
39
+ }