@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
package/dist/tokens.js ADDED
@@ -0,0 +1,178 @@
1
+ /**
2
+ * Lumina's design tokens — the new **neutral default** palette landing in
3
+ * v0.14.0 per SPEC-051. Warm-neutral surface, monochrome primary, the
4
+ * "quiet spectrum walk" syntax palette (teal / violet / rust / ochre /
5
+ * sage), and the four muted-earthy status colours.
6
+ *
7
+ * This is the *source of truth* for Lumina's runtime CSS values; the
8
+ * hand-authored `tokens/base.css` and `tokens/dark.css` mirror it
9
+ * verbatim and a coverage test keeps the two in lockstep.
10
+ *
11
+ * Sites that want the previous cream-and-navy appearance opt into the
12
+ * `tideline` preset shipping alongside this default (see
13
+ * `@refrakt-md/lumina/presets/tideline` once Chunk 7 lands).
14
+ *
15
+ * Sites that want Japanese-garden syntax colours on top of this neutral
16
+ * chrome opt into the `niwaki` preset (Chunk 7).
17
+ */
18
+ export const luminaTokens = {
19
+ font: {
20
+ sans: "'Inter', system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif",
21
+ mono: "'JetBrains Mono', 'Fira Code', ui-monospace, 'Cascadia Code', monospace",
22
+ },
23
+ color: {
24
+ text: '#1c1a17',
25
+ muted: '#6b6661',
26
+ border: '#e2e0dd',
27
+ bg: '#f5f4f1',
28
+ primary: '#1c1a17',
29
+ 'primary-hover': '#3a342d',
30
+ // Warm-neutral axis from near-bg to near-text, eleven hand-picked stops.
31
+ // Several stops intentionally overlap with semantic tokens (surface.base,
32
+ // border, primary-hover, text) — that's normal; palette steps double as
33
+ // the implementations of the named tokens at their lightness level.
34
+ 'primary-scale': {
35
+ '50': '#fbfaf7',
36
+ '100': '#f5f4f1',
37
+ '200': '#ecebe8',
38
+ '300': '#e2e0dd',
39
+ '400': '#bfbab2',
40
+ '500': '#94908a',
41
+ '600': '#76716a',
42
+ '700': '#5a564f',
43
+ '800': '#3a342d',
44
+ '900': '#2a2622',
45
+ '950': '#1c1a17',
46
+ },
47
+ surface: {
48
+ base: '#fbfaf7',
49
+ hover: '#ecebe8',
50
+ active: '#e2e0dd',
51
+ raised: '#ffffff',
52
+ },
53
+ // Muted earthy status colours — same saturation/lightness band across all
54
+ // four so no sentiment is more aggressive than another. Per SPEC-051.
55
+ info: { base: '#34547a', bg: '#e8edf4', border: '#c5d2e0' },
56
+ warning: { base: '#9c5a18', bg: '#f5ebd9', border: '#e0c9a3' },
57
+ danger: { base: '#a83232', bg: '#f5e0e0', border: '#e0b8b8' },
58
+ success: { base: '#2d6a3e', bg: '#e0eee4', border: '#b8d4be' },
59
+ code: {
60
+ bg: '#ebeae8',
61
+ text: '#1c1a17',
62
+ // Mapped to --rf-color-code-inline-bg per the contract.
63
+ // `--rf-color-inline-code-bg` (legacy variable name) is emitted as an
64
+ // alias via `extra` below for downstream CSS that still reads it.
65
+ 'inline-bg': '#e6e5e3',
66
+ },
67
+ },
68
+ radius: {
69
+ sm: '6px',
70
+ md: '10px',
71
+ lg: '16px',
72
+ full: '9999px',
73
+ },
74
+ spacing: {
75
+ xs: '0.25rem',
76
+ sm: '0.5rem',
77
+ md: '1.5rem',
78
+ lg: '2rem',
79
+ xl: '3rem',
80
+ '2xl': '4rem',
81
+ section: {
82
+ base: '4rem',
83
+ tight: '1.5rem',
84
+ loose: '6rem',
85
+ breathe: '8rem',
86
+ },
87
+ },
88
+ inset: {
89
+ flush: '0',
90
+ tight: '1rem',
91
+ loose: '4rem',
92
+ breathe: '8rem',
93
+ },
94
+ shadow: {
95
+ xs: '0 1px 2px rgba(0,0,0,0.04)',
96
+ sm: '0 1px 3px rgba(0,0,0,0.06), 0 1px 2px rgba(0,0,0,0.04)',
97
+ md: '0 4px 12px rgba(0,0,0,0.07), 0 1px 3px rgba(0,0,0,0.04)',
98
+ lg: '0 8px 24px rgba(0,0,0,0.08), 0 2px 6px rgba(0,0,0,0.04)',
99
+ },
100
+ // The "quiet spectrum walk": teal → violet → rust → ochre — cool, cool,
101
+ // warm, warm. Spectrum-adjacent without shouting. `constant` covers
102
+ // numeric literals + boolean/null/Symbol (Shiki paints them all from
103
+ // one slot).
104
+ syntax: {
105
+ keyword: '#2a5c63', // deep teal
106
+ function: '#4a3b6e', // slate violet
107
+ string: '#8a3a3a', // warm rust
108
+ constant: '#876327', // antique ochre
109
+ comment: '#8a857d', // warm muted (italic via rune CSS)
110
+ punctuation: '#6b6661', // tonal — same as color.muted
111
+ variable: '#1c1a17', // tonal — same as color.text
112
+ },
113
+ modes: {
114
+ dark: {
115
+ color: {
116
+ text: '#f6f4ef',
117
+ muted: '#94908a',
118
+ border: '#2a2825',
119
+ bg: '#1a1a17',
120
+ primary: '#f6f4ef',
121
+ 'primary-hover': '#d4cfc5',
122
+ surface: {
123
+ base: '#211f1c',
124
+ hover: '#2a2825',
125
+ active: '#353330',
126
+ raised: '#292723',
127
+ },
128
+ info: { base: '#9bb4c7', bg: '#1f2530', border: '#3d4655' },
129
+ warning: { base: '#d4a868', bg: '#2a2519', border: '#4a3f2a' },
130
+ danger: { base: '#d48888', bg: '#2a1818', border: '#4a2a2a' },
131
+ success: { base: '#7eb398', bg: '#1a2a1f', border: '#2a4a35' },
132
+ code: {
133
+ bg: '#222220',
134
+ text: '#f6f4ef',
135
+ 'inline-bg': '#2b2b29',
136
+ },
137
+ },
138
+ shadow: {
139
+ xs: '0 1px 2px rgba(0,0,0,0.3)',
140
+ sm: '0 1px 3px rgba(0,0,0,0.4), 0 1px 2px rgba(0,0,0,0.3)',
141
+ md: '0 4px 12px rgba(0,0,0,0.4), 0 1px 3px rgba(0,0,0,0.3)',
142
+ lg: '0 8px 24px rgba(0,0,0,0.5), 0 2px 6px rgba(0,0,0,0.3)',
143
+ },
144
+ // Dark-mode syntax — lifted and slightly desaturated from light values
145
+ // so they read against the warm-near-black surface without shouting.
146
+ syntax: {
147
+ keyword: '#7eb6bc', // light teal
148
+ function: '#a89bc7', // light slate violet
149
+ string: '#c79a9a', // light rust
150
+ constant: '#d4b07e', // light antique ochre
151
+ comment: '#6b6661', // warm muted (italic)
152
+ punctuation: '#94908a', // = dark color.muted
153
+ variable: '#f6f4ef', // = dark color.text
154
+ },
155
+ // Legacy alias — kept until the rename is fully rolled out. All the
156
+ // `rf-syntax-*` Shiki aliases (foreground/background/token-*) are
157
+ // auto-derived from the `syntax.*` and `color.{text,code.bg}` values
158
+ // above by the generator.
159
+ extra: {
160
+ 'rf-color-inline-code-bg': '#2b2b29',
161
+ },
162
+ },
163
+ },
164
+ /** Lumina-specific tokens outside the universal contract. `rf-color-
165
+ * inline-code-bg` is the legacy variable name for what the contract
166
+ * calls `color.code.inline-bg` (→ `--rf-color-code-inline-bg`).
167
+ * Aliased here so downstream CSS that reads the old name keeps
168
+ * working through v0.14.0; rename target is a future cleanup.
169
+ *
170
+ * The Shiki aliases (`--rf-syntax-foreground`, `--rf-syntax-background`,
171
+ * and `--rf-syntax-token-*`) are auto-derived by the generator from
172
+ * `color.text`, `color.code.bg`, and `syntax.*` — no need to repeat
173
+ * them here. */
174
+ extra: {
175
+ 'rf-color-inline-code-bg': '#e6e5e3',
176
+ },
177
+ };
178
+ //# sourceMappingURL=tokens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,YAAY,GAAsB;IAC9C,IAAI,EAAE;QACL,IAAI,EAAE,mEAAmE;QACzE,IAAI,EAAE,yEAAyE;KAC/E;IAED,KAAK,EAAE;QACN,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,SAAS;QAChB,MAAM,EAAE,SAAS;QACjB,EAAE,EAAE,SAAS;QACb,OAAO,EAAE,SAAS;QAClB,eAAe,EAAE,SAAS;QAE1B,yEAAyE;QACzE,0EAA0E;QAC1E,wEAAwE;QACxE,oEAAoE;QACpE,eAAe,EAAE;YAChB,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,SAAS;YAChB,KAAK,EAAE,SAAS;YAChB,KAAK,EAAE,SAAS;YAChB,KAAK,EAAE,SAAS;YAChB,KAAK,EAAE,SAAS;YAChB,KAAK,EAAE,SAAS;YAChB,KAAK,EAAE,SAAS;YAChB,KAAK,EAAE,SAAS;YAChB,KAAK,EAAE,SAAS;YAChB,KAAK,EAAE,SAAS;SAChB;QAED,OAAO,EAAE;YACR,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,SAAS;YAChB,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,SAAS;SACjB;QAED,0EAA0E;QAC1E,sEAAsE;QACtE,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE;QAC3D,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE;QAC9D,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE;QAC7D,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE;QAE9D,IAAI,EAAE;YACL,EAAE,EAAE,SAAS;YACb,IAAI,EAAE,SAAS;YACf,wDAAwD;YACxD,sEAAsE;YACtE,kEAAkE;YAClE,WAAW,EAAE,SAAS;SACtB;KACD;IAED,MAAM,EAAE;QACP,EAAE,EAAE,KAAK;QACT,EAAE,EAAE,MAAM;QACV,EAAE,EAAE,MAAM;QACV,IAAI,EAAE,QAAQ;KACd;IAED,OAAO,EAAE;QACR,EAAE,EAAE,SAAS;QACb,EAAE,EAAE,QAAQ;QACZ,EAAE,EAAE,QAAQ;QACZ,EAAE,EAAE,MAAM;QACV,EAAE,EAAE,MAAM;QACV,KAAK,EAAE,MAAM;QACb,OAAO,EAAE;YACR,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,QAAQ;YACf,KAAK,EAAE,MAAM;YACb,OAAO,EAAE,MAAM;SACf;KACD;IAED,KAAK,EAAE;QACN,KAAK,EAAE,GAAG;QACV,KAAK,EAAE,MAAM;QACb,KAAK,EAAE,MAAM;QACb,OAAO,EAAE,MAAM;KACf;IAED,MAAM,EAAE;QACP,EAAE,EAAE,4BAA4B;QAChC,EAAE,EAAE,wDAAwD;QAC5D,EAAE,EAAE,yDAAyD;QAC7D,EAAE,EAAE,yDAAyD;KAC7D;IAED,wEAAwE;IACxE,oEAAoE;IACpE,qEAAqE;IACrE,aAAa;IACb,MAAM,EAAE;QACP,OAAO,EAAE,SAAS,EAAM,YAAY;QACpC,QAAQ,EAAE,SAAS,EAAK,eAAe;QACvC,MAAM,EAAE,SAAS,EAAO,YAAY;QACpC,QAAQ,EAAE,SAAS,EAAK,gBAAgB;QACxC,OAAO,EAAE,SAAS,EAAM,mCAAmC;QAC3D,WAAW,EAAE,SAAS,EAAE,8BAA8B;QACtD,QAAQ,EAAE,SAAS,EAAK,6BAA6B;KACrD;IAED,KAAK,EAAE;QACN,IAAI,EAAE;YACL,KAAK,EAAE;gBACN,IAAI,EAAE,SAAS;gBACf,KAAK,EAAE,SAAS;gBAChB,MAAM,EAAE,SAAS;gBACjB,EAAE,EAAE,SAAS;gBACb,OAAO,EAAE,SAAS;gBAClB,eAAe,EAAE,SAAS;gBAE1B,OAAO,EAAE;oBACR,IAAI,EAAE,SAAS;oBACf,KAAK,EAAE,SAAS;oBAChB,MAAM,EAAE,SAAS;oBACjB,MAAM,EAAE,SAAS;iBACjB;gBAED,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE;gBAC3D,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE;gBAC9D,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE;gBAC7D,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE;gBAE9D,IAAI,EAAE;oBACL,EAAE,EAAE,SAAS;oBACb,IAAI,EAAE,SAAS;oBACf,WAAW,EAAE,SAAS;iBACtB;aACD;YAED,MAAM,EAAE;gBACP,EAAE,EAAE,2BAA2B;gBAC/B,EAAE,EAAE,sDAAsD;gBAC1D,EAAE,EAAE,uDAAuD;gBAC3D,EAAE,EAAE,uDAAuD;aAC3D;YAED,uEAAuE;YACvE,qEAAqE;YACrE,MAAM,EAAE;gBACP,OAAO,EAAE,SAAS,EAAM,aAAa;gBACrC,QAAQ,EAAE,SAAS,EAAK,qBAAqB;gBAC7C,MAAM,EAAE,SAAS,EAAO,aAAa;gBACrC,QAAQ,EAAE,SAAS,EAAK,sBAAsB;gBAC9C,OAAO,EAAE,SAAS,EAAM,sBAAsB;gBAC9C,WAAW,EAAE,SAAS,EAAE,qBAAqB;gBAC7C,QAAQ,EAAE,SAAS,EAAK,oBAAoB;aAC5C;YAED,oEAAoE;YACpE,kEAAkE;YAClE,qEAAqE;YACrE,0BAA0B;YAC1B,KAAK,EAAE;gBACN,yBAAyB,EAAE,SAAS;aACpC;SACD;KACD;IAED;;;;;;;;;qBASiB;IACjB,KAAK,EAAE;QACN,yBAAyB,EAAE,SAAS;KACpC;CACD,CAAC"}
@@ -2,6 +2,11 @@ export { createTransform } from '@refrakt-md/transform';
2
2
  export type { ThemeConfig, RuneConfig, SerializedTag, RendererNode } from '@refrakt-md/transform';
3
3
  /** Lumina theme configuration — rune-to-BEM-block mappings, modifier sources, structural injection */
4
4
  export { luminaConfig } from './config.js';
5
+ /** Lumina design tokens — the typed {@link ThemeTokensConfig} that drives the
6
+ * `--rf-*` CSS custom properties. Adapters consume this when composing
7
+ * site-level token overrides; see `@refrakt-md/transform`'s
8
+ * `mergeThemeTokensConfigs` and `generateThemeStylesheet`. */
9
+ export { luminaTokens } from './tokens.js';
5
10
  /** Lumina identity transform — adds BEM classes, consumes meta tags, enhances structure */
6
11
  export declare const identityTransform: (tree: import("@refrakt-md/transform").RendererNode) => import("@refrakt-md/transform").RendererNode;
7
12
  //# sourceMappingURL=transform.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../src/transform.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAElG,sGAAsG;AACtG,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,2FAA2F;AAC3F,eAAO,MAAM,iBAAiB,sGAAgC,CAAC"}
1
+ {"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../src/transform.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAElG,sGAAsG;AACtG,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C;;;+DAG+D;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,2FAA2F;AAC3F,eAAO,MAAM,iBAAiB,sGAAgC,CAAC"}
package/dist/transform.js CHANGED
@@ -4,6 +4,11 @@ import { luminaConfig } from './config.js';
4
4
  export { createTransform } from '@refrakt-md/transform';
5
5
  /** Lumina theme configuration — rune-to-BEM-block mappings, modifier sources, structural injection */
6
6
  export { luminaConfig } from './config.js';
7
+ /** Lumina design tokens — the typed {@link ThemeTokensConfig} that drives the
8
+ * `--rf-*` CSS custom properties. Adapters consume this when composing
9
+ * site-level token overrides; see `@refrakt-md/transform`'s
10
+ * `mergeThemeTokensConfigs` and `generateThemeStylesheet`. */
11
+ export { luminaTokens } from './tokens.js';
7
12
  /** Lumina identity transform — adds BEM classes, consumes meta tags, enhances structure */
8
13
  export const identityTransform = createTransform(luminaConfig);
9
14
  //# sourceMappingURL=transform.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"transform.js","sourceRoot":"","sources":["../src/transform.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,sEAAsE;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAGxD,sGAAsG;AACtG,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,2FAA2F;AAC3F,MAAM,CAAC,MAAM,iBAAiB,GAAG,eAAe,CAAC,YAAY,CAAC,CAAC"}
1
+ {"version":3,"file":"transform.js","sourceRoot":"","sources":["../src/transform.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,sEAAsE;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAGxD,sGAAsG;AACtG,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C;;;+DAG+D;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,2FAA2F;AAC3F,MAAM,CAAC,MAAM,iBAAiB,GAAG,eAAe,CAAC,YAAY,CAAC,CAAC"}
package/index.css CHANGED
@@ -78,6 +78,7 @@
78
78
  @import './styles/runes/nav.css';
79
79
  @import './styles/runes/organization.css';
80
80
  @import './styles/runes/page-section.css';
81
+ @import './styles/runes/pagination.css';
81
82
  @import './styles/runes/playlist.css';
82
83
  @import './styles/runes/plot.css';
83
84
  @import './styles/runes/preview.css';
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@refrakt-md/lumina",
3
3
  "description": "Lumina theme for refrakt.md — design tokens, CSS, identity transform, and layout configs",
4
- "version": "0.11.3",
4
+ "version": "0.14.0",
5
5
  "type": "module",
6
6
  "license": "MIT",
7
7
  "repository": {
@@ -27,7 +27,17 @@
27
27
  "types": "./dist/layouts.d.ts",
28
28
  "default": "./dist/layouts.js"
29
29
  },
30
- "./styles/runes/*.css": "./styles/runes/*.css"
30
+ "./presets/tideline": {
31
+ "types": "./dist/presets/tideline.d.ts",
32
+ "default": "./dist/presets/tideline.js"
33
+ },
34
+ "./presets/niwaki": {
35
+ "types": "./dist/presets/niwaki.d.ts",
36
+ "default": "./dist/presets/niwaki.js"
37
+ },
38
+ "./styles/runes/*.css": "./styles/runes/*.css",
39
+ "./assets/logo/prism.svg": "./assets/logo/prism.svg",
40
+ "./assets/*": "./assets/*"
31
41
  },
32
42
  "files": [
33
43
  "dist",
@@ -38,15 +48,16 @@
38
48
  "contracts",
39
49
  "manifest.json",
40
50
  "layouts",
41
- "svelte"
51
+ "svelte",
52
+ "assets"
42
53
  ],
43
54
  "scripts": {
44
55
  "build": "tsc"
45
56
  },
46
57
  "dependencies": {
47
- "@refrakt-md/runes": "0.11.3",
48
- "@refrakt-md/transform": "0.11.3",
49
- "@refrakt-md/types": "0.11.3"
58
+ "@refrakt-md/runes": "0.14.0",
59
+ "@refrakt-md/transform": "0.14.0",
60
+ "@refrakt-md/types": "0.14.0"
50
61
  },
51
62
  "devDependencies": {
52
63
  "postcss": "^8.4.0"
@@ -6,9 +6,11 @@
6
6
 
7
7
  /* ─── Rune Spacing ────────────────────────────────────────────────── */
8
8
  /* Only top-level runes get vertical margin; child runes (nav items,
9
- accordion items, grid cells, etc.) inherit spacing from their parent. */
9
+ accordion items, grid cells, etc.) inherit spacing from their parent.
10
+ Layout-chrome navs (menubar in header, columns in footer) are excluded
11
+ so they sit flush with the surrounding header/footer container. */
10
12
 
11
- [data-rune]:not([data-rune] [data-rune]) {
13
+ [data-rune]:not([data-rune] [data-rune]):not(:where([data-layout="menubar"], [data-layout="columns"])) {
12
14
  margin: 1.5rem 0;
13
15
  }
14
16
 
package/styles/global.css CHANGED
@@ -27,10 +27,10 @@ h1, h2, h3, h4, h5, h6 {
27
27
  letter-spacing: -0.015em;
28
28
  }
29
29
 
30
- h1 { font-size: 2rem; font-weight: 400; letter-spacing: -0.025em; }
31
- h2 { font-size: 1.75rem; font-weight: 400; }
32
- h3 { font-size: 1.25rem; }
33
- h4 { font-size: 1.1rem; }
30
+ h1 { font-size: 1.875rem; font-weight: 700; letter-spacing: -0.025em; }
31
+ h2 { font-size: 1.5rem; }
32
+ h3 { font-size: 1.2rem; }
33
+ h4 { font-size: 1.05rem; }
34
34
 
35
35
  p {
36
36
  margin-top: 0;
@@ -39,9 +39,15 @@
39
39
  font-size: 1.2rem;
40
40
  letter-spacing: -0.02em;
41
41
  }
42
- .rf-blog-header img {
42
+ .rf-blog-header img,
43
+ .rf-blog-header p:first-child a > .rf-icon {
43
44
  height: 2rem;
44
- width: auto;
45
+ width: 2rem;
46
+ }
47
+ .rf-blog-header p:first-child a > .rf-icon {
48
+ display: inline-block;
49
+ vertical-align: middle;
50
+ color: currentColor;
45
51
  }
46
52
  .rf-blog-header__inner p ~ p {
47
53
  font-size: 0.85rem;
@@ -10,16 +10,20 @@
10
10
  display: flex;
11
11
  align-items: center;
12
12
  gap: 1rem;
13
- padding: 1.125rem 1.5rem;
13
+ padding: 0.625rem 1.5rem;
14
14
  }
15
15
  .rf-header__inner .rf-search-trigger {
16
16
  margin-left: auto;
17
+ order: 1;
18
+ }
19
+ .rf-header__inner > rf-nav {
20
+ order: 3;
17
21
  }
18
22
  .rf-header__inner p ~ p {
19
23
  order: 1;
20
24
  }
21
25
  .rf-header__inner .rf-mobile-menu-btn {
22
- order: 2;
26
+ order: 3;
23
27
  }
24
28
  .rf-header p {
25
29
  margin: 0;
@@ -48,10 +52,19 @@
48
52
  font-size: 1.2rem;
49
53
  letter-spacing: -0.02em;
50
54
  }
51
- .rf-header img {
55
+ .rf-header img,
56
+ .rf-header p:first-child a > .rf-icon {
52
57
  height: 2rem;
58
+ width: 2rem;
59
+ }
60
+ .rf-header img {
53
61
  width: auto;
54
62
  }
63
+ .rf-header p:first-child a > .rf-icon {
64
+ display: inline-block;
65
+ vertical-align: middle;
66
+ color: currentColor;
67
+ }
55
68
  .rf-header__inner p ~ p {
56
69
  font-size: 0.85rem;
57
70
  }
@@ -211,3 +224,24 @@
211
224
  display: none;
212
225
  }
213
226
  }
227
+
228
+ /* Site footer */
229
+ .rf-footer {
230
+ display: flex;
231
+ flex-direction: column;
232
+ align-items: center;
233
+ padding: 2.5rem 1.5rem 2rem;
234
+ border-top: 1px solid var(--rf-color-border);
235
+ background: var(--rf-color-bg);
236
+ color: var(--rf-color-muted);
237
+ font-size: 0.875rem;
238
+ }
239
+ .rf-footer > * {
240
+ width: 100%;
241
+ max-width: 80rem;
242
+ }
243
+ .rf-footer p {
244
+ margin: 1.5rem 0 0;
245
+ font-size: 0.8rem;
246
+ color: var(--rf-color-muted);
247
+ }
@@ -14,16 +14,20 @@
14
14
  display: flex;
15
15
  align-items: center;
16
16
  gap: 1rem;
17
- padding: 1.125rem 1.5rem;
17
+ padding: 0.625rem 1.5rem;
18
18
  }
19
19
  .rf-docs-header__inner .rf-search-trigger {
20
20
  margin-left: auto;
21
+ order: 1;
22
+ }
23
+ .rf-docs-header__inner > rf-nav {
24
+ order: 3;
21
25
  }
22
26
  .rf-docs-header__inner p ~ p {
23
27
  order: 1;
24
28
  }
25
29
  .rf-docs-header__inner .rf-mobile-menu-btn {
26
- order: 2;
30
+ order: 3;
27
31
  }
28
32
  .rf-docs-header p {
29
33
  margin: 0;
@@ -45,9 +49,15 @@
45
49
  font-size: 1.2rem;
46
50
  letter-spacing: -0.02em;
47
51
  }
48
- .rf-docs-header img {
52
+ .rf-docs-header img,
53
+ .rf-docs-header p:first-child a > .rf-icon {
49
54
  height: 2rem;
50
- width: auto;
55
+ width: 2rem;
56
+ }
57
+ .rf-docs-header p:first-child a > .rf-icon {
58
+ display: inline-block;
59
+ vertical-align: middle;
60
+ color: currentColor;
51
61
  }
52
62
  .rf-docs-header__inner p ~ p {
53
63
  font-size: 0.85rem;
@@ -69,7 +79,7 @@
69
79
  .rf-docs-sidebar {
70
80
  position: fixed;
71
81
  left: 0;
72
- top: 4.125rem;
82
+ top: 3.125rem;
73
83
  bottom: 0;
74
84
  width: 240px;
75
85
  overflow-y: auto;
@@ -84,7 +94,7 @@
84
94
 
85
95
  /* ---- Content area ---- */
86
96
  .rf-docs-content {
87
- padding-top: 5.75rem;
97
+ padding-top: 4.75rem;
88
98
  padding-bottom: 4rem;
89
99
  container-type: inline-size;
90
100
  }
@@ -133,6 +143,14 @@
133
143
  margin-inline: auto;
134
144
  }
135
145
 
146
+ /* Pagination wrapper sits outside the article grid, so it gets its own
147
+ horizontal padding so prev/next don't run to the viewport edges on
148
+ narrow viewports. Uses the same `--rf-content-padding` token the
149
+ article grid uses for its gutter columns. */
150
+ .rf-docs-content__pagination {
151
+ padding-inline: var(--rf-content-padding, 2.5rem);
152
+ }
153
+
136
154
  /* ---- "On this page" sidebar ---- */
137
155
  .rf-docs-toc {
138
156
  width: 220px;
@@ -58,18 +58,36 @@
58
58
  .rf-mobile-panel__nav img {
59
59
  display: none;
60
60
  }
61
- .rf-mobile-panel__nav a {
61
+ /* Panel items — top-level links and group items render uniformly. The
62
+ four-class selectors below carry specificity (0,4,0), beating the
63
+ menubar's mobile rules in nav.css ((0,3,0)) on equal source position
64
+ so the panel's typography always wins (nav.css is imported later than
65
+ mobile.css in index.css). */
66
+ .rf-mobile-panel__nav a,
67
+ .rf-mobile-panel .rf-nav--menubar .rf-nav__top-level .rf-nav-item__link,
68
+ .rf-mobile-panel .rf-nav--menubar .rf-nav-group .rf-nav-item__link {
62
69
  display: block;
63
- padding: 0.75rem 0;
64
- font-size: 1.1rem;
70
+ padding: 0.5rem 0;
71
+ font-size: 1.5rem;
72
+ font-weight: 700;
65
73
  color: var(--rf-color-text);
66
74
  text-decoration: none;
67
- border-bottom: 1px solid var(--rf-color-border);
75
+ background: transparent;
76
+ border: 0;
68
77
  }
69
- .rf-mobile-panel__nav a:hover {
78
+ .rf-mobile-panel__nav a:hover,
79
+ .rf-mobile-panel .rf-nav--menubar .rf-nav__top-level .rf-nav-item__link:hover,
80
+ .rf-mobile-panel .rf-nav--menubar .rf-nav-group .rf-nav-item__link:hover {
70
81
  color: var(--rf-color-primary, var(--rf-color-text));
82
+ background: transparent;
71
83
  text-decoration: none;
72
84
  }
85
+ /* Group headings inside the panel — flush with items (no horizontal
86
+ padding) and breathing room above so each group reads as a section. */
87
+ .rf-mobile-panel .rf-nav--menubar .rf-nav-group h2,
88
+ .rf-mobile-panel .rf-nav--menubar .rf-nav-group h3 {
89
+ padding: 1.5rem 0 0.25rem;
90
+ }
73
91
  .rf-mobile-panel__body {
74
92
  padding: 1rem 1.5rem;
75
93
  }
@@ -83,4 +101,17 @@
83
101
  .rf-mobile-menu-btn {
84
102
  display: block;
85
103
  }
104
+ /* The inline menubar collapses behind the hamburger on mobile — the
105
+ .rf-mobile-panel duplicates the same nav and styles it as a flat
106
+ vertical list (see nav.css's rf-nav--menubar mobile rules). */
107
+ .rf-header__inner > rf-nav,
108
+ .rf-docs-header__inner > rf-nav,
109
+ .rf-blog-header__inner > rf-nav {
110
+ display: none;
111
+ }
112
+ /* Hide the duplicated brand line inside the mobile panel — the panel
113
+ already has its own "Menu" title. */
114
+ .rf-mobile-panel__nav > p:first-child {
115
+ display: none;
116
+ }
86
117
  }
@@ -1,9 +1,15 @@
1
- /* Code Group */
1
+ /* Code Group
2
+ *
3
+ * Chrome (the wrapper + topbar + tabs) uses `--rf-color-surface` so it
4
+ * reads against the page in both light and dark modes. The code areas
5
+ * themselves inherit `--rf-color-code-bg` from the global `pre` rule, so
6
+ * code stays on its own background even when the surrounding chrome
7
+ * flips with the page mode. */
2
8
  .rf-codegroup {
3
9
  border: 1px solid var(--rf-color-border);
4
10
  overflow: hidden;
5
- background: var(--rf-color-code-bg);
6
- color: var(--rf-color-code-text);
11
+ background: var(--rf-color-surface);
12
+ color: var(--rf-color-text);
7
13
  box-shadow: var(--rf-shadow-md);
8
14
  padding: 0;
9
15
  }
@@ -12,8 +18,8 @@
12
18
  align-items: center;
13
19
  gap: 0.375rem;
14
20
  padding: 0.75rem 1rem;
15
- background: rgba(255, 255, 255, 0.03);
16
- border-bottom: 1px solid rgba(255, 255, 255, 0.06);
21
+ background: transparent;
22
+ border-bottom: 1px solid var(--rf-color-border);
17
23
  margin-bottom: 0;
18
24
  }
19
25
  .rf-codegroup__dot {
@@ -30,8 +36,7 @@
30
36
  font-family: var(--rf-font-mono);
31
37
  font-size: 0.8rem;
32
38
  font-weight: normal;
33
- color: inherit;
34
- opacity: 0.7;
39
+ color: var(--rf-color-muted);
35
40
  }
36
41
  .rf-codegroup ul {
37
42
  list-style: none;
@@ -40,8 +45,8 @@
40
45
  }
41
46
  .rf-codegroup__tabs {
42
47
  display: flex;
43
- background: rgba(255, 255, 255, 0.03);
44
- border-bottom: 1px solid rgba(255, 255, 255, 0.06);
48
+ background: transparent;
49
+ border-bottom: 1px solid var(--rf-color-border);
45
50
  overflow-x: auto;
46
51
  overflow-y: hidden;
47
52
  }
@@ -50,7 +55,7 @@
50
55
  padding: 0.5rem 1rem;
51
56
  font-size: 0.8rem;
52
57
  font-family: var(--rf-font-mono);
53
- color: rgba(255, 255, 255, 0.7);
58
+ color: var(--rf-color-muted);
54
59
  background: none;
55
60
  border: none;
56
61
  border-bottom: 2px solid transparent;
@@ -60,15 +65,15 @@
60
65
  }
61
66
  .rf-codegroup__tab:hover,
62
67
  .rf-codegroup button[data-state="inactive"]:hover {
63
- color: rgba(255, 255, 255, 0.8);
68
+ color: var(--rf-color-text);
64
69
  }
65
70
  .rf-codegroup__tab--active,
66
71
  .rf-codegroup button[data-state="active"] {
67
- color: rgba(255, 255, 255, 0.95);
68
- border-bottom-color: var(--rf-color-code-text);
72
+ color: var(--rf-color-text);
73
+ border-bottom-color: var(--rf-color-primary);
69
74
  }
70
75
  .rf-codegroup button[data-state="inactive"] {
71
- color: rgba(255, 255, 255, 0.7);
76
+ color: var(--rf-color-muted);
72
77
  }
73
78
  .rf-codegroup .rf-codeblock {
74
79
  margin: 0;
@@ -77,7 +82,6 @@
77
82
  margin: 0;
78
83
  padding: 1rem 1.25rem;
79
84
  overflow-x: auto;
80
- background: none;
81
85
  border: none;
82
86
  border-radius: 0;
83
87
  }
@@ -1,11 +1,10 @@
1
1
  /* Hint */
2
2
  .rf-hint {
3
3
  --hint-color: var(--rf-color-info);
4
- --hint-bg: var(--rf-color-info-bg);
5
- border-left: 3px solid var(--hint-color);
6
4
  padding: 0.875rem 1.25rem;
7
- border-radius: 0 var(--rf-radius-md) var(--rf-radius-md) 0;
8
- background: var(--hint-bg);
5
+ border-radius: var(--rf-radius-md);
6
+ background: var(--rf-color-surface);
7
+ border: 1px solid var(--rf-color-border);
9
8
  }
10
9
  .rf-hint__header {
11
10
  margin-bottom: 0.375rem;
@@ -56,21 +55,19 @@
56
55
  .rf-hint__body p:last-child {
57
56
  margin-bottom: 0;
58
57
  }
58
+ /* Per-variant colour drives the icon and title only — surface stays
59
+ neutral so the hint reads as a quiet panel, not a saturated banner. */
59
60
  .rf-hint--note {
60
61
  --hint-color: var(--rf-color-info);
61
- --hint-bg: var(--rf-color-info-bg);
62
62
  }
63
63
  .rf-hint--warning {
64
64
  --hint-color: var(--rf-color-warning);
65
- --hint-bg: var(--rf-color-warning-bg);
66
65
  }
67
66
  .rf-hint--caution {
68
67
  --hint-color: var(--rf-color-danger);
69
- --hint-bg: var(--rf-color-danger-bg);
70
68
  }
71
69
  .rf-hint--check {
72
70
  --hint-color: var(--rf-color-success);
73
- --hint-bg: var(--rf-color-success-bg);
74
71
  }
75
72
 
76
73
  /* Context-aware: compact hint when nested inside a hero */
@@ -88,6 +85,5 @@
88
85
  .rf-hint--in-feature {
89
86
  margin: 0.75rem 0 0;
90
87
  padding: 0.5rem 0.875rem;
91
- border-left-width: 2px;
92
88
  font-size: 0.85rem;
93
89
  }