@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,27 +1,26 @@
1
1
  @layer skin {
2
- /* Blockquote */
3
- blockquote {
4
- position: relative;
5
- border-left: 3px solid var(--rf-color-primary);
6
- margin: 1.5rem 0;
7
- padding: 1rem 1.25rem 1rem 3.25rem;
8
- color: var(--rf-color-muted);
9
- }
10
- blockquote::before {
11
- content: '';
12
- position: absolute;
13
- left: 0.75rem;
14
- top: 1rem;
15
- width: 18px;
16
- height: 18px;
17
- background: var(--rf-color-primary);
18
- opacity: 0.4;
19
- mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M10 8C10 5.79 8.21 4 6 4C3.79 4 2 5.79 2 8C2 10.21 3.79 12 6 12C6.67 12 7.31 11.83 7.88 11.54C7.63 14.08 5.55 16.09 3 16.34V18.36C6.68 18.09 9.64 15.13 9.93 11.45C9.98 10.99 10 10.5 10 10V8ZM22 8C22 5.79 20.21 4 18 4C15.79 4 14 5.79 14 8C14 10.21 15.79 12 18 12C18.67 12 19.31 11.83 19.88 11.54C19.63 14.08 17.55 16.09 15 16.34V18.36C18.68 18.09 21.64 15.13 21.93 11.45C21.98 10.99 22 10.5 22 10V8Z'/%3E%3C/svg%3E");
20
- mask-size: contain;
21
- mask-repeat: no-repeat;
22
- }
23
- blockquote p:last-child {
24
- margin-bottom: 0;
25
- }
26
-
2
+ /* Blockquote */
3
+ blockquote {
4
+ position: relative;
5
+ border-left: 3px solid var(--rf-color-primary);
6
+ margin: 1.5rem 0;
7
+ padding: 1rem 1.25rem 1rem 3.25rem;
8
+ color: var(--rf-color-muted);
9
+ }
10
+ blockquote::before {
11
+ content: "";
12
+ position: absolute;
13
+ left: 0.75rem;
14
+ top: 1rem;
15
+ width: 18px;
16
+ height: 18px;
17
+ background: var(--rf-color-primary);
18
+ opacity: 0.4;
19
+ mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M10 8C10 5.79 8.21 4 6 4C3.79 4 2 5.79 2 8C2 10.21 3.79 12 6 12C6.67 12 7.31 11.83 7.88 11.54C7.63 14.08 5.55 16.09 3 16.34V18.36C6.68 18.09 9.64 15.13 9.93 11.45C9.98 10.99 10 10.5 10 10V8ZM22 8C22 5.79 20.21 4 18 4C15.79 4 14 5.79 14 8C14 10.21 15.79 12 18 12C18.67 12 19.31 11.83 19.88 11.54C19.63 14.08 17.55 16.09 15 16.34V18.36C18.68 18.09 21.64 15.13 21.93 11.45C21.98 10.99 22 10.5 22 10V8Z'/%3E%3C/svg%3E");
20
+ mask-size: contain;
21
+ mask-repeat: no-repeat;
22
+ }
23
+ blockquote p:last-child {
24
+ margin-bottom: 0;
25
+ }
27
26
  }
@@ -1,50 +1,52 @@
1
1
  @layer skin {
2
- /* Code block wrapper — the rf-codeblock div comes from the Markdoc fence node
2
+ /* Code block wrapper — the rf-codeblock div comes from the Markdoc fence node
3
3
  schema at build time. Inside codegroup the margin is removed by
4
4
  .rf-codegroup .rf-codeblock. */
5
- .rf-codeblock {
6
- position: relative;
7
- margin: 1.5rem 0;
8
- }
5
+ .rf-codeblock {
6
+ position: relative;
7
+ margin: 1.5rem 0;
8
+ }
9
9
 
10
- .rf-codeblock > pre {
11
- margin: 0;
12
- }
10
+ .rf-codeblock > pre {
11
+ margin: 0;
12
+ }
13
13
 
14
- /* Copy button — injected by the copy behavior at runtime */
15
- .rf-codeblock__copy {
16
- position: absolute;
17
- top: 0.5rem;
18
- right: 0.5rem;
19
- display: flex;
20
- align-items: center;
21
- justify-content: center;
22
- width: 2rem;
23
- height: 2rem;
24
- border: none;
25
- border-radius: var(--rf-radius-sm);
26
- background: transparent;
27
- color: var(--rf-color-code-text, #e2e8f0);
28
- cursor: pointer;
29
- opacity: 0;
30
- transition: opacity 150ms ease, background-color 150ms ease;
31
- }
14
+ /* Copy button — injected by the copy behavior at runtime */
15
+ .rf-codeblock__copy {
16
+ position: absolute;
17
+ top: 0.5rem;
18
+ right: 0.5rem;
19
+ display: flex;
20
+ align-items: center;
21
+ justify-content: center;
22
+ width: 2rem;
23
+ height: 2rem;
24
+ border: none;
25
+ border-radius: var(--rf-radius-sm);
26
+ background: transparent;
27
+ color: var(--rf-color-code-text, #e2e8f0);
28
+ cursor: pointer;
29
+ opacity: 0;
30
+ transition:
31
+ opacity 150ms ease,
32
+ background-color 150ms ease;
33
+ }
32
34
 
33
- .rf-codeblock:hover .rf-codeblock__copy {
34
- opacity: 0.6;
35
- }
35
+ .rf-codeblock:hover .rf-codeblock__copy {
36
+ opacity: 0.6;
37
+ }
36
38
 
37
- .rf-codeblock__copy:hover {
38
- opacity: 1 !important;
39
- background: rgba(255, 255, 255, 0.1);
40
- }
39
+ .rf-codeblock__copy:hover {
40
+ opacity: 1 !important;
41
+ background: rgba(255, 255, 255, 0.1);
42
+ }
41
43
 
42
- .rf-codeblock__copy--copied {
43
- opacity: 1 !important;
44
- color: var(--rf-color-success, #4ade80);
45
- }
44
+ .rf-codeblock__copy--copied {
45
+ opacity: 1 !important;
46
+ color: var(--rf-color-success, #4ade80);
47
+ }
46
48
 
47
- /* WORK-304 — fence-level annotations: line numbers + line highlight.
49
+ /* WORK-304 — fence-level annotations: line numbers + line highlight.
48
50
  *
49
51
  * Shiki renders each line as `<span class="line">…</span>`. The fence
50
52
  * schema forwards `data-linenumbers` / `data-highlight-lines` /
@@ -71,49 +73,48 @@
71
73
  * consistent across highlighted and plain rows — matches the diff row
72
74
  * primitive at `runes/diff.css`. Highlighted rows just colour the
73
75
  * border + add the surface tint. */
74
- .rf-codeblock pre code {
75
- display: grid;
76
- min-width: max-content;
77
- }
76
+ .rf-codeblock pre code {
77
+ display: grid;
78
+ min-width: max-content;
79
+ }
78
80
 
79
- .rf-codeblock pre code .line {
80
- border-left: 3px solid transparent;
81
- }
81
+ .rf-codeblock pre code .line {
82
+ border-left: 3px solid transparent;
83
+ }
82
84
 
83
- /* Line numbers — gutter::before owns the left column. Strip the pre's
85
+ /* Line numbers — gutter::before owns the left column. Strip the pre's
84
86
  * horizontal padding when linenumbers are on so the gutter sits flush
85
87
  * against the codeblock edge; the gutter's own padding + right border
86
88
  * provides the visual separation from the code body. */
87
- .rf-codeblock pre[data-linenumbers] {
88
- padding-left: 0;
89
- }
89
+ .rf-codeblock pre[data-linenumbers] {
90
+ padding-left: 0;
91
+ }
90
92
 
91
- .rf-codeblock pre[data-linenumbers] code {
92
- counter-reset: rf-line var(--rf-start-line, 0);
93
- }
93
+ .rf-codeblock pre[data-linenumbers] code {
94
+ counter-reset: rf-line var(--rf-start-line, 0);
95
+ }
94
96
 
95
- .rf-codeblock pre[data-linenumbers] code .line::before {
96
- counter-increment: rf-line;
97
- content: counter(rf-line);
98
- display: inline-block;
99
- width: 3em;
100
- padding-inline: 0.75rem 0.5rem;
101
- margin-right: 0.75rem;
102
- text-align: right;
103
- color: var(--rf-color-line-number);
104
- font-variant-numeric: tabular-nums;
105
- user-select: none;
106
- border-right: 1px solid var(--rf-color-border);
107
- }
97
+ .rf-codeblock pre[data-linenumbers] code .line::before {
98
+ counter-increment: rf-line;
99
+ content: counter(rf-line);
100
+ display: inline-block;
101
+ width: 3em;
102
+ padding-inline: 0.75rem 0.5rem;
103
+ margin-right: 0.75rem;
104
+ text-align: right;
105
+ color: var(--rf-color-line-number);
106
+ font-variant-numeric: tabular-nums;
107
+ user-select: none;
108
+ border-right: 1px solid var(--rf-color-border);
109
+ }
108
110
 
109
- /* Highlighted lines share diff's row template — neutral surface tint
111
+ /* Highlighted lines share diff's row template — neutral surface tint
110
112
  * + primary-coloured left rail, no `+`/`-` sigil. The grid layout on
111
113
  * `<code>` above keeps consecutive highlighted rows continuous (no
112
114
  * subpixel gaps between the rails). Border is on every `.line` (above)
113
115
  * so the content alignment doesn't jump when highlighting a row. */
114
- .rf-codeblock pre code .line[data-line-status="highlight"] {
115
- background: var(--rf-color-line-highlight);
116
- border-left-color: var(--rf-color-line-highlight-rail);
117
- }
118
-
116
+ .rf-codeblock pre code .line[data-line-status="highlight"] {
117
+ background: var(--rf-color-line-highlight);
118
+ border-left-color: var(--rf-color-line-highlight-rail);
119
+ }
119
120
  }
@@ -1,39 +1,38 @@
1
1
  @layer skin {
2
- /* Table wrapper */
3
- .rf-table-wrapper {
4
- overflow-x: auto;
5
- -webkit-overflow-scrolling: touch;
6
- margin: 1.5rem 0;
7
- }
8
- .rf-table-wrapper table {
9
- margin: 0;
10
- border-collapse: collapse;
11
- width: 100%;
12
- }
13
- .rf-table-wrapper th {
14
- white-space: nowrap;
15
- }
16
- .rf-table-wrapper td {
17
- white-space: nowrap;
18
- }
19
- .rf-table-wrapper td:last-child {
20
- white-space: normal;
21
- min-width: 20rem;
22
- }
23
- .rf-table-wrapper th:first-child,
24
- .rf-table-wrapper td:first-child {
25
- padding-left: 0;
26
- }
27
- .rf-table-wrapper th:last-child,
28
- .rf-table-wrapper td:last-child {
29
- padding-right: 0;
30
- }
31
- .rf-table-wrapper tr:last-child td {
32
- border-bottom: none;
33
- }
34
- .rf-table-wrapper th code,
35
- .rf-table-wrapper td code {
36
- font-size: 1em;
37
- }
38
-
2
+ /* Table wrapper */
3
+ .rf-table-wrapper {
4
+ overflow-x: auto;
5
+ -webkit-overflow-scrolling: touch;
6
+ margin: 1.5rem 0;
7
+ }
8
+ .rf-table-wrapper table {
9
+ margin: 0;
10
+ border-collapse: collapse;
11
+ width: 100%;
12
+ }
13
+ .rf-table-wrapper th {
14
+ white-space: nowrap;
15
+ }
16
+ .rf-table-wrapper td {
17
+ white-space: nowrap;
18
+ }
19
+ .rf-table-wrapper td:last-child {
20
+ white-space: normal;
21
+ min-width: 20rem;
22
+ }
23
+ .rf-table-wrapper th:first-child,
24
+ .rf-table-wrapper td:first-child {
25
+ padding-left: 0;
26
+ }
27
+ .rf-table-wrapper th:last-child,
28
+ .rf-table-wrapper td:last-child {
29
+ padding-right: 0;
30
+ }
31
+ .rf-table-wrapper tr:last-child td {
32
+ border-bottom: none;
33
+ }
34
+ .rf-table-wrapper th code,
35
+ .rf-table-wrapper td code {
36
+ font-size: 1em;
37
+ }
39
38
  }
package/styles/global.css CHANGED
@@ -1,5 +1,5 @@
1
1
  @layer skin {
2
- /* Lumina Theme — Global Base Styles (skin).
2
+ /* Lumina Theme — Global Base Styles (skin).
3
3
  *
4
4
  * Structure (box model, zone resets, prose/heading/list/table rhythm, the
5
5
  * responsive-image + scroll mechanisms) lives in @refrakt-md/skeleton
@@ -7,163 +7,205 @@
7
7
  * typography, colour, native chrome, and the surface treatment of code/pre/
8
8
  * tables. */
9
9
 
10
- html {
11
- font-family: var(--rf-font-sans);
12
- color: var(--rf-color-text);
13
- background: var(--rf-color-bg);
14
- line-height: var(--rf-leading-relaxed);
15
- -webkit-font-smoothing: antialiased;
16
- -moz-osx-font-smoothing: grayscale;
17
- -webkit-text-size-adjust: 100%;
18
- text-size-adjust: 100%;
19
- transition: background-color 200ms ease, color 200ms ease;
20
- /* Opt out of mobile Safari's "text inflation" — it auto-scales text
10
+ html {
11
+ font-family: var(--rf-font-sans);
12
+ color: var(--rf-color-text);
13
+ background: var(--rf-color-bg);
14
+ line-height: var(--rf-leading-relaxed);
15
+ -webkit-font-smoothing: antialiased;
16
+ -moz-osx-font-smoothing: grayscale;
17
+ -webkit-text-size-adjust: 100%;
18
+ text-size-adjust: 100%;
19
+ transition:
20
+ background-color 200ms ease,
21
+ color 200ms ease;
22
+ /* Opt out of mobile Safari's "text inflation" — it auto-scales text
21
23
  * inside elements wider than the viewport (e.g. the diff's
22
24
  * `min-width: 40rem` split panels and any horizontally-scrolling
23
25
  * code block) and makes their fonts read several pixels larger
24
26
  * than designed. */
25
- -webkit-text-size-adjust: 100%;
26
- text-size-adjust: 100%;
27
- }
27
+ -webkit-text-size-adjust: 100%;
28
+ text-size-adjust: 100%;
29
+ }
28
30
 
29
- /* ─── Theme-aware browser chrome (WORK-351) ─────────────────────────
31
+ /* ─── Theme-aware browser chrome (WORK-351) ─────────────────────────
30
32
  * Make native chrome — scrollbars, form controls, the main viewport
31
33
  * scrollbar — follow the active theme instead of always rendering in
32
34
  * the OS default scheme. */
33
35
 
34
- /* `color-scheme` so the UA paints native widgets/scrollbars per mode. */
35
- :root { color-scheme: light; }
36
- [data-theme="dark"] { color-scheme: dark; }
37
- @media (prefers-color-scheme: dark) {
38
- :root:not([data-theme="light"]) { color-scheme: dark; }
39
- }
36
+ /* `color-scheme` so the UA paints native widgets/scrollbars per mode. */
37
+ :root {
38
+ color-scheme: light;
39
+ }
40
+ [data-theme="dark"] {
41
+ color-scheme: dark;
42
+ }
43
+ @media (prefers-color-scheme: dark) {
44
+ :root:not([data-theme="light"]) {
45
+ color-scheme: dark;
46
+ }
47
+ }
40
48
 
41
- /* Branded text selection — a subtle primary wash (the native/OS blue
49
+ /* Branded text selection — a subtle primary wash (the native/OS blue
42
50
  * otherwise leaks through). Background only, so the element's own text
43
51
  * colour stays legible under any theme. */
44
- ::selection {
45
- background: color-mix(in oklch, var(--rf-color-primary) 22%, transparent);
46
- }
52
+ ::selection {
53
+ background: color-mix(in oklch, var(--rf-color-primary) 22%, transparent);
54
+ }
47
55
 
48
- /* Token-driven scrollbars. `scrollbar-color` / `scrollbar-width` inherit,
56
+ /* Token-driven scrollbars. `scrollbar-color` / `scrollbar-width` inherit,
49
57
  * so setting them on the root reaches every overflow container (codegroup,
50
58
  * datatable, drawer body, nav/sidebar) without per-rune rules; the WebKit
51
59
  * pseudo-elements refine the same colours. More specific per-container
52
60
  * rules (e.g. the hidden docs sidebar) still win. */
53
- :root {
54
- scrollbar-width: thin;
55
- scrollbar-color: var(--rf-color-muted) transparent;
56
- }
57
- ::-webkit-scrollbar { width: 10px; height: 10px; }
58
- ::-webkit-scrollbar-track { background: transparent; }
59
- ::-webkit-scrollbar-thumb {
60
- background: var(--rf-color-muted);
61
- border-radius: var(--rf-radius-full);
62
- border: 2px solid transparent;
63
- background-clip: padding-box;
64
- }
65
- ::-webkit-scrollbar-thumb:hover { background: var(--rf-color-text); }
61
+ :root {
62
+ scrollbar-width: thin;
63
+ scrollbar-color: var(--rf-color-muted) transparent;
64
+ }
65
+ ::-webkit-scrollbar {
66
+ width: 10px;
67
+ height: 10px;
68
+ }
69
+ ::-webkit-scrollbar-track {
70
+ background: transparent;
71
+ }
72
+ ::-webkit-scrollbar-thumb {
73
+ background: var(--rf-color-muted);
74
+ border-radius: var(--rf-radius-full);
75
+ border: 2px solid transparent;
76
+ background-clip: padding-box;
77
+ }
78
+ ::-webkit-scrollbar-thumb:hover {
79
+ background: var(--rf-color-text);
80
+ }
66
81
 
67
- /* ─── Keyboard focus (WORK-352) ─────────────────────────────────────
82
+ /* ─── Keyboard focus (WORK-352) ─────────────────────────────────────
68
83
  * A uniform, token-driven focus ring on every interactive element, at
69
84
  * zero specificity (`:where`) so a rune's own `:focus-visible` overrides
70
85
  * it. An outline (not box-shadow) follows border-radius and never shifts
71
86
  * layout; `outline-color` uses `primary`, so it is visible in both modes. */
72
- :where(
73
- a[href], button, input, select, textarea, summary,
74
- [tabindex]:not([tabindex="-1"]),
75
- [role="button"], [role="tab"], [role="link"], [role="menuitem"], [role="menuitemradio"]
76
- ):focus-visible {
77
- outline: 2px solid var(--rf-color-primary);
78
- outline-offset: 2px;
79
- }
87
+ :where(
88
+ a[href],
89
+ button,
90
+ input,
91
+ select,
92
+ textarea,
93
+ summary,
94
+ [tabindex]:not([tabindex="-1"]),
95
+ [role="button"],
96
+ [role="tab"],
97
+ [role="link"],
98
+ [role="menuitem"],
99
+ [role="menuitemradio"]
100
+ ):focus-visible {
101
+ outline: 2px solid var(--rf-color-primary);
102
+ outline-offset: 2px;
103
+ }
80
104
 
81
- /* ─── Reduced motion (WORK-352) ─────────────────────────────────────
105
+ /* ─── Reduced motion (WORK-352) ─────────────────────────────────────
82
106
  * Honour the user's motion preference across every animated rune
83
107
  * (chart, reveal, juxtapose, accordion, drawer, …) in one place. Uses a
84
108
  * near-zero duration rather than `none` so animation/transition end
85
109
  * events still fire for behaviours that await them. */
86
- @media (prefers-reduced-motion: reduce) {
87
- *, *::before, *::after {
88
- animation-duration: 0.01ms !important;
89
- animation-iteration-count: 1 !important;
90
- transition-duration: 0.01ms !important;
91
- scroll-behavior: auto !important;
110
+ @media (prefers-reduced-motion: reduce) {
111
+ *,
112
+ *::before,
113
+ *::after {
114
+ animation-duration: 0.01ms !important;
115
+ animation-iteration-count: 1 !important;
116
+ transition-duration: 0.01ms !important;
117
+ scroll-behavior: auto !important;
118
+ }
92
119
  }
93
- }
94
-
95
- h1, h2, h3, h4, h5, h6 {
96
- line-height: var(--rf-leading-tight);
97
- font-weight: var(--rf-weight-semibold);
98
- letter-spacing: var(--rf-tracking-tight);
99
- }
100
120
 
101
- h1 { font-size: var(--rf-text-3xl); font-weight: var(--rf-weight-bold); letter-spacing: var(--rf-tracking-tight); }
102
- h2 { font-size: var(--rf-text-2xl); }
103
- h3 { font-size: var(--rf-text-xl); }
104
- h4 { font-size: var(--rf-text); }
121
+ h1,
122
+ h2,
123
+ h3,
124
+ h4,
125
+ h5,
126
+ h6 {
127
+ line-height: var(--rf-leading-tight);
128
+ font-weight: var(--rf-weight-semibold);
129
+ letter-spacing: var(--rf-tracking-tight);
130
+ }
105
131
 
106
- a {
107
- color: var(--rf-color-primary);
108
- text-decoration: none;
109
- transition: color 150ms ease;
110
- }
111
- a:hover {
112
- color: var(--rf-color-primary-hover);
113
- text-decoration: underline;
114
- }
132
+ h1 {
133
+ font-size: var(--rf-text-3xl);
134
+ font-weight: var(--rf-weight-bold);
135
+ letter-spacing: var(--rf-tracking-tight);
136
+ }
137
+ h2 {
138
+ font-size: var(--rf-text-2xl);
139
+ }
140
+ h3 {
141
+ font-size: var(--rf-text-xl);
142
+ }
143
+ h4 {
144
+ font-size: var(--rf-text);
145
+ }
115
146
 
116
- strong { font-weight: var(--rf-weight-semibold); }
147
+ a {
148
+ color: var(--rf-color-primary);
149
+ text-decoration: none;
150
+ transition: color 150ms ease;
151
+ }
152
+ a:hover {
153
+ color: var(--rf-color-primary-hover);
154
+ text-decoration: underline;
155
+ }
117
156
 
118
- code {
119
- font-family: var(--rf-font-mono);
120
- font-size: 0.875em;
121
- background: var(--rf-color-inline-code-bg);
122
- padding: 0.15rem 0.4rem;
123
- border-radius: var(--rf-radius-sm);
124
- font-variant-ligatures: none;
125
- }
157
+ strong {
158
+ font-weight: var(--rf-weight-semibold);
159
+ }
126
160
 
127
- pre {
128
- background: var(--rf-color-code-bg);
129
- color: var(--rf-color-code-text);
130
- padding: 1.25rem 1.5rem;
131
- border-radius: var(--rf-radius-md);
132
- font-size: var(--rf-text-sm);
133
- line-height: var(--rf-leading-relaxed);
134
- border: 1px solid var(--rf-color-border);
135
- }
161
+ code {
162
+ font-family: var(--rf-font-mono);
163
+ font-size: 0.875em;
164
+ background: var(--rf-color-inline-code-bg);
165
+ padding: 0.15rem 0.4rem;
166
+ border-radius: var(--rf-radius-sm);
167
+ font-variant-ligatures: none;
168
+ }
136
169
 
137
- pre code {
138
- background: none;
139
- padding: 0;
140
- font-size: inherit;
141
- border-radius: 0;
142
- }
170
+ pre {
171
+ background: var(--rf-color-code-bg);
172
+ color: var(--rf-color-code-text);
173
+ padding: 1.25rem 1.5rem;
174
+ border-radius: var(--rf-radius-md);
175
+ font-size: var(--rf-text-sm);
176
+ line-height: var(--rf-leading-relaxed);
177
+ border: 1px solid var(--rf-color-border);
178
+ }
143
179
 
144
- hr {
145
- border: none;
146
- border-top: 1px solid var(--rf-color-border);
147
- }
180
+ pre code {
181
+ background: none;
182
+ padding: 0;
183
+ font-size: inherit;
184
+ border-radius: 0;
185
+ }
148
186
 
149
- table {
150
- font-size: var(--rf-text-sm);
151
- }
187
+ hr {
188
+ border: none;
189
+ border-top: 1px solid var(--rf-color-border);
190
+ }
152
191
 
153
- th {
154
- text-align: left;
155
- font-weight: var(--rf-weight-semibold);
156
- padding: 0.625rem 1rem;
157
- border-bottom: 1px solid var(--rf-color-border);
158
- font-size: var(--rf-text-xs);
159
- text-transform: uppercase;
160
- letter-spacing: var(--rf-tracking-wide);
161
- color: var(--rf-color-muted);
162
- }
192
+ table {
193
+ font-size: var(--rf-text-sm);
194
+ }
163
195
 
164
- td {
165
- padding: 0.625rem 1rem;
166
- border-bottom: 1px solid var(--rf-color-border);
167
- }
196
+ th {
197
+ text-align: left;
198
+ font-weight: var(--rf-weight-semibold);
199
+ padding: 0.625rem 1rem;
200
+ border-bottom: 1px solid var(--rf-color-border);
201
+ font-size: var(--rf-text-xs);
202
+ text-transform: uppercase;
203
+ letter-spacing: var(--rf-tracking-wide);
204
+ color: var(--rf-color-muted);
205
+ }
168
206
 
207
+ td {
208
+ padding: 0.625rem 1rem;
209
+ border-bottom: 1px solid var(--rf-color-border);
210
+ }
169
211
  }