@refrakt-md/lumina 0.5.1 → 0.7.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.
- package/base.css +4 -0
- package/contracts/structures.json +1367 -739
- package/dist/config.d.ts +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +2 -1
- package/dist/config.js.map +1 -1
- package/index.css +14 -0
- package/manifest.json +12 -0
- package/package.json +5 -5
- package/styles/layouts/blog.css +10 -1
- package/styles/layouts/default.css +10 -1
- package/styles/layouts/docs.css +56 -1
- package/styles/layouts/mobile.css +5 -3
- package/styles/layouts/on-this-page.css +48 -0
- package/styles/layouts/search.css +210 -0
- package/styles/layouts/version-switcher.css +45 -0
- package/styles/runes/bond.css +77 -0
- package/styles/runes/budget.css +164 -0
- package/styles/runes/character.css +104 -0
- package/styles/runes/faction.css +81 -0
- package/styles/runes/itinerary.css +173 -0
- package/styles/runes/lore.css +68 -0
- package/styles/runes/mediatext.css +72 -0
- package/styles/runes/plot.css +80 -0
- package/styles/runes/pullquote.css +108 -0
- package/styles/runes/realm.css +82 -0
- package/styles/runes/symbol.css +9 -11
- package/styles/runes/textblock.css +64 -0
- package/svelte/elements.ts +1 -1
- package/svelte/index.ts +24 -11
- package/svelte/manifest.json +4 -38
- package/svelte/registry.ts +1 -1
- package/svelte/layouts/BlogLayout.svelte +0 -173
- package/svelte/layouts/DefaultLayout.svelte +0 -67
- package/svelte/layouts/DocsLayout.svelte +0 -155
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import { Renderer } from '@refrakt-md/svelte';
|
|
3
|
-
|
|
4
|
-
let { regions, renderable, url }: {
|
|
5
|
-
title: string;
|
|
6
|
-
description: string;
|
|
7
|
-
regions: Record<string, { name: string; mode: string; content: any[] }>;
|
|
8
|
-
renderable: any;
|
|
9
|
-
url: string;
|
|
10
|
-
pages: any[];
|
|
11
|
-
} = $props();
|
|
12
|
-
|
|
13
|
-
let menuOpen = $state(false);
|
|
14
|
-
|
|
15
|
-
function onKeydown(e: KeyboardEvent) {
|
|
16
|
-
if (e.key === 'Escape') menuOpen = false;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
$effect(() => {
|
|
20
|
-
url;
|
|
21
|
-
menuOpen = false;
|
|
22
|
-
});
|
|
23
|
-
|
|
24
|
-
// Lock body scroll when panel is open
|
|
25
|
-
$effect(() => {
|
|
26
|
-
document.body.style.overflow = menuOpen ? 'hidden' : '';
|
|
27
|
-
});
|
|
28
|
-
</script>
|
|
29
|
-
|
|
30
|
-
<svelte:window onkeydown={onKeydown} />
|
|
31
|
-
|
|
32
|
-
{#if regions.header}
|
|
33
|
-
<header class="rf-header">
|
|
34
|
-
<div class="rf-header__inner">
|
|
35
|
-
<Renderer node={regions.header.content} />
|
|
36
|
-
<button class="rf-mobile-menu-btn" onclick={() => menuOpen = true} aria-label="Open menu">
|
|
37
|
-
<svg width="20" height="20" viewBox="0 0 20 20" fill="currentColor">
|
|
38
|
-
<circle cx="10" cy="4" r="1.5"/>
|
|
39
|
-
<circle cx="10" cy="10" r="1.5"/>
|
|
40
|
-
<circle cx="10" cy="16" r="1.5"/>
|
|
41
|
-
</svg>
|
|
42
|
-
</button>
|
|
43
|
-
</div>
|
|
44
|
-
</header>
|
|
45
|
-
{/if}
|
|
46
|
-
|
|
47
|
-
{#if menuOpen}
|
|
48
|
-
<div class="rf-mobile-panel" role="dialog" aria-label="Navigation menu">
|
|
49
|
-
<div class="rf-mobile-panel__header">
|
|
50
|
-
<span class="rf-mobile-panel__title">Menu</span>
|
|
51
|
-
<button class="rf-mobile-panel__close" onclick={() => menuOpen = false} aria-label="Close menu">
|
|
52
|
-
<svg width="20" height="20" viewBox="0 0 20 20" stroke="currentColor" stroke-width="2" fill="none">
|
|
53
|
-
<line x1="4" y1="4" x2="16" y2="16"/><line x1="16" y1="4" x2="4" y2="16"/>
|
|
54
|
-
</svg>
|
|
55
|
-
</button>
|
|
56
|
-
</div>
|
|
57
|
-
<nav class="rf-mobile-panel__nav">
|
|
58
|
-
{#if regions.header}
|
|
59
|
-
<Renderer node={regions.header.content} />
|
|
60
|
-
{/if}
|
|
61
|
-
</nav>
|
|
62
|
-
</div>
|
|
63
|
-
{/if}
|
|
64
|
-
|
|
65
|
-
<main class="rf-page-content">
|
|
66
|
-
<Renderer node={renderable} />
|
|
67
|
-
</main>
|
|
@@ -1,155 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import { Renderer } from '@refrakt-md/svelte';
|
|
3
|
-
|
|
4
|
-
let { title, regions, renderable, url, pages }: {
|
|
5
|
-
title: string;
|
|
6
|
-
description: string;
|
|
7
|
-
regions: Record<string, { name: string; mode: string; content: any[] }>;
|
|
8
|
-
renderable: any;
|
|
9
|
-
url: string;
|
|
10
|
-
pages: Array<{ url: string; title: string; draft: boolean }>;
|
|
11
|
-
} = $props();
|
|
12
|
-
|
|
13
|
-
const hasNav = $derived(!!regions.nav);
|
|
14
|
-
|
|
15
|
-
// Mobile panel state
|
|
16
|
-
let menuOpen = $state(false);
|
|
17
|
-
let navOpen = $state(false);
|
|
18
|
-
|
|
19
|
-
// Helpers to walk the serialized nav tree (same patterns as Nav.svelte)
|
|
20
|
-
function isTag(node: any): node is { $$mdtype: 'Tag'; name: string; attributes: Record<string, any>; children: any[] } {
|
|
21
|
-
return node !== null && typeof node === 'object' && !Array.isArray(node) && node.$$mdtype === 'Tag';
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
function getTextContent(node: any): string {
|
|
25
|
-
if (typeof node === 'string') return node;
|
|
26
|
-
if (typeof node === 'number') return String(node);
|
|
27
|
-
if (isTag(node)) return node.children.map(getTextContent).join('');
|
|
28
|
-
if (Array.isArray(node)) return node.map(getTextContent).join('');
|
|
29
|
-
return '';
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
// Build slug → group title map from nav region
|
|
33
|
-
function buildNavMap(content: any[]): Map<string, string> {
|
|
34
|
-
const map = new Map<string, string>();
|
|
35
|
-
function walk(nodes: any[], groupTitle: string) {
|
|
36
|
-
for (const node of nodes) {
|
|
37
|
-
if (!isTag(node)) continue;
|
|
38
|
-
if (node.attributes.typeof === 'NavGroup') {
|
|
39
|
-
const heading = node.children.find((c: any) => isTag(c) && /^h[1-6]$/.test(c.name));
|
|
40
|
-
walk(node.children, heading ? getTextContent(heading) : '');
|
|
41
|
-
} else if (node.attributes.typeof === 'NavItem') {
|
|
42
|
-
const slugSpan = node.children.find((c: any) => isTag(c) && c.name === 'span' && c.attributes.property === 'slug');
|
|
43
|
-
if (slugSpan && groupTitle) map.set(getTextContent(slugSpan), groupTitle);
|
|
44
|
-
} else if (node.children) {
|
|
45
|
-
walk(node.children, groupTitle);
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
walk(content, '');
|
|
50
|
-
return map;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
// Breadcrumb: look up current page slug in nav group headings
|
|
54
|
-
const pageSlug = $derived((url || '').split('/').filter(Boolean).pop() || '');
|
|
55
|
-
const navMap = $derived(regions.nav ? buildNavMap(regions.nav.content) : new Map());
|
|
56
|
-
const breadcrumbCategory = $derived(navMap.get(pageSlug) || '');
|
|
57
|
-
|
|
58
|
-
function closeMenu() { menuOpen = false; }
|
|
59
|
-
|
|
60
|
-
function onKeydown(e: KeyboardEvent) {
|
|
61
|
-
if (e.key === 'Escape') {
|
|
62
|
-
menuOpen = false;
|
|
63
|
-
navOpen = false;
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
// Close panels on navigation
|
|
68
|
-
$effect(() => {
|
|
69
|
-
url;
|
|
70
|
-
menuOpen = false;
|
|
71
|
-
navOpen = false;
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
// Lock body scroll when a panel is open
|
|
75
|
-
$effect(() => {
|
|
76
|
-
document.body.style.overflow = (menuOpen || navOpen) ? 'hidden' : '';
|
|
77
|
-
});
|
|
78
|
-
</script>
|
|
79
|
-
|
|
80
|
-
<svelte:window onkeydown={onKeydown} />
|
|
81
|
-
|
|
82
|
-
{#if regions.header}
|
|
83
|
-
<header class="rf-docs-header">
|
|
84
|
-
<div class="rf-docs-header__inner">
|
|
85
|
-
<Renderer node={regions.header.content} />
|
|
86
|
-
<button class="rf-mobile-menu-btn" onclick={() => { navOpen = false; menuOpen = true; }} aria-label="Open menu">
|
|
87
|
-
<svg width="20" height="20" viewBox="0 0 20 20" fill="currentColor">
|
|
88
|
-
<circle cx="10" cy="4" r="1.5"/>
|
|
89
|
-
<circle cx="10" cy="10" r="1.5"/>
|
|
90
|
-
<circle cx="10" cy="16" r="1.5"/>
|
|
91
|
-
</svg>
|
|
92
|
-
</button>
|
|
93
|
-
</div>
|
|
94
|
-
</header>
|
|
95
|
-
{/if}
|
|
96
|
-
|
|
97
|
-
<!-- Mobile header menu panel -->
|
|
98
|
-
{#if menuOpen}
|
|
99
|
-
<div class="rf-mobile-panel" role="dialog" aria-label="Navigation menu">
|
|
100
|
-
<div class="rf-mobile-panel__header">
|
|
101
|
-
<span class="rf-mobile-panel__title">Menu</span>
|
|
102
|
-
<button class="rf-mobile-panel__close" onclick={closeMenu} aria-label="Close menu">
|
|
103
|
-
<svg width="20" height="20" viewBox="0 0 20 20" stroke="currentColor" stroke-width="2" fill="none">
|
|
104
|
-
<line x1="4" y1="4" x2="16" y2="16"/><line x1="16" y1="4" x2="4" y2="16"/>
|
|
105
|
-
</svg>
|
|
106
|
-
</button>
|
|
107
|
-
</div>
|
|
108
|
-
<nav class="rf-mobile-panel__nav">
|
|
109
|
-
{#if regions.header}
|
|
110
|
-
<Renderer node={regions.header.content} />
|
|
111
|
-
{/if}
|
|
112
|
-
</nav>
|
|
113
|
-
</div>
|
|
114
|
-
{/if}
|
|
115
|
-
|
|
116
|
-
<!-- Mobile docs toolbar with hamburger + breadcrumbs -->
|
|
117
|
-
{#if hasNav}
|
|
118
|
-
<div class="rf-docs-toolbar">
|
|
119
|
-
<button class="rf-docs-toolbar__hamburger" onclick={() => { menuOpen = false; navOpen = !navOpen; }} aria-label="Toggle navigation">
|
|
120
|
-
<svg width="20" height="20" viewBox="0 0 20 20" stroke="currentColor" stroke-width="2" fill="none">
|
|
121
|
-
<line x1="3" y1="5" x2="17" y2="5"/><line x1="3" y1="10" x2="17" y2="10"/><line x1="3" y1="15" x2="17" y2="15"/>
|
|
122
|
-
</svg>
|
|
123
|
-
</button>
|
|
124
|
-
<div class="rf-docs-toolbar__breadcrumb">
|
|
125
|
-
{#if breadcrumbCategory}
|
|
126
|
-
<span class="rf-docs-breadcrumb-category">{breadcrumbCategory}</span>
|
|
127
|
-
<span class="rf-docs-breadcrumb-sep">›</span>
|
|
128
|
-
{/if}
|
|
129
|
-
<span class="rf-docs-breadcrumb-page">{title}</span>
|
|
130
|
-
</div>
|
|
131
|
-
</div>
|
|
132
|
-
{/if}
|
|
133
|
-
|
|
134
|
-
<!-- Mobile nav panel -->
|
|
135
|
-
{#if navOpen}
|
|
136
|
-
<div class="rf-mobile-panel rf-mobile-panel--nav" role="dialog" aria-label="Page navigation">
|
|
137
|
-
<div class="rf-mobile-panel__body">
|
|
138
|
-
{#if regions.nav}
|
|
139
|
-
<Renderer node={regions.nav.content} />
|
|
140
|
-
{/if}
|
|
141
|
-
</div>
|
|
142
|
-
</div>
|
|
143
|
-
{/if}
|
|
144
|
-
|
|
145
|
-
{#if regions.nav}
|
|
146
|
-
<aside class="rf-docs-sidebar">
|
|
147
|
-
<Renderer node={regions.nav.content} />
|
|
148
|
-
</aside>
|
|
149
|
-
{/if}
|
|
150
|
-
|
|
151
|
-
<main class="rf-docs-content" class:rf-docs-content--has-nav={hasNav}>
|
|
152
|
-
<div class="rf-docs-content__inner">
|
|
153
|
-
<Renderer node={renderable} />
|
|
154
|
-
</div>
|
|
155
|
-
</main>
|