@terra-symposium/docs 0.1.73 → 0.1.75
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/README.md +1 -1
- package/bin/terra-docs.mjs +151 -115
- package/lib-dist/components/StaticWorkspace.d.ts.map +1 -1
- package/lib-dist/components/StaticWorkspace.js +4 -4
- package/lib-dist/components/StaticWorkspace.js.map +1 -1
- package/lib-dist/components/terra/Workspace.d.ts.map +1 -1
- package/lib-dist/components/terra/Workspace.js +1 -1
- package/lib-dist/components/terra/Workspace.js.map +1 -1
- package/lib-dist/components/terra/pages/docs/_editable.d.ts +2 -1
- package/lib-dist/components/terra/pages/docs/_editable.d.ts.map +1 -1
- package/lib-dist/components/terra/pages/docs/_editable.js +2 -2
- package/lib-dist/components/terra/pages/docs/_editable.js.map +1 -1
- package/lib-dist/components/terra/pages/docs/_main.d.ts +2 -1
- package/lib-dist/components/terra/pages/docs/_main.d.ts.map +1 -1
- package/lib-dist/components/terra/pages/docs/_main.js +5 -5
- package/lib-dist/components/terra/pages/docs/_main.js.map +1 -1
- package/lib-dist/components/terra/pages/docs/_sidebar.d.ts.map +1 -1
- package/lib-dist/components/terra/pages/docs/_sidebar.js +5 -2
- package/lib-dist/components/terra/pages/docs/_sidebar.js.map +1 -1
- package/lib-dist/components/terra/pages/docs/_toolbar.d.ts.map +1 -1
- package/lib-dist/components/terra/pages/docs/_toolbar.js +1 -4
- package/lib-dist/components/terra/pages/docs/_toolbar.js.map +1 -1
- package/lib-dist/components/terra/ui.d.ts +3 -1
- package/lib-dist/components/terra/ui.d.ts.map +1 -1
- package/lib-dist/components/terra/ui.js +11 -3
- package/lib-dist/components/terra/ui.js.map +1 -1
- package/lib-dist/lib/host.d.ts +2 -0
- package/lib-dist/lib/host.d.ts.map +1 -1
- package/lib-dist/lib/workspace-types.d.ts.map +1 -1
- package/lib-dist/style.css +1 -1
- package/package.json +2 -1
- package/site/astro.config.mjs +45 -43
- package/site/base-path-remark-plugin.mjs +30 -23
- package/site/docs-content-plugin.mjs +68 -57
- package/site/src/components/DocsSiteSearch.tsx +106 -91
- package/site/src/lib/catalog.ts +110 -96
- package/site/src/styles/search.css +114 -43
package/site/src/lib/catalog.ts
CHANGED
|
@@ -1,151 +1,165 @@
|
|
|
1
1
|
/// <reference types="vite/client" />
|
|
2
2
|
|
|
3
3
|
import type { DocsNavNode } from '../../../src/components/navigation.js';
|
|
4
|
+
import { getHue } from '@terra-symposium/styling';
|
|
4
5
|
|
|
5
6
|
type SidebarFrontmatter = {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
label?: string;
|
|
8
|
+
order?: number;
|
|
9
|
+
hidden?: boolean;
|
|
9
10
|
};
|
|
10
11
|
|
|
11
12
|
type DocsFrontmatter = {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
13
|
+
title?: string;
|
|
14
|
+
description?: string;
|
|
15
|
+
hue?: number | null;
|
|
16
|
+
label?: string;
|
|
17
|
+
order?: number;
|
|
18
|
+
hidden?: boolean;
|
|
19
|
+
visibility?: 'visible' | 'hidden';
|
|
20
|
+
sidebar?: SidebarFrontmatter;
|
|
20
21
|
};
|
|
21
22
|
|
|
22
23
|
type ContentModule = {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
24
|
+
Content?: unknown;
|
|
25
|
+
default?: unknown;
|
|
26
|
+
frontmatter?: DocsFrontmatter;
|
|
26
27
|
};
|
|
27
28
|
|
|
28
29
|
export type SitePage = {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
30
|
+
file: string;
|
|
31
|
+
slug: string;
|
|
32
|
+
title: string;
|
|
33
|
+
sidebarLabel?: string;
|
|
34
|
+
description: string;
|
|
35
|
+
hue?: number | null;
|
|
36
|
+
hidden: boolean;
|
|
37
|
+
order: number;
|
|
38
|
+
content: unknown;
|
|
39
|
+
markdown: string;
|
|
39
40
|
};
|
|
40
41
|
|
|
41
42
|
const modules = import.meta.glob<ContentModule>('/docs/**/*.{md,mdx}', { eager: true });
|
|
42
43
|
const sources = import.meta.glob<string>('/docs/**/*.{md,mdx}', {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
44
|
+
query: '?raw',
|
|
45
|
+
import: 'default',
|
|
46
|
+
eager: true,
|
|
46
47
|
});
|
|
47
48
|
const base = import.meta.env.BASE_URL;
|
|
48
49
|
|
|
49
50
|
function titleFromSource(source: string, slug: string): string {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
51
|
+
const body = source.replace(/^---\s*\n[\s\S]*?\n---\s*\n/, '');
|
|
52
|
+
const heading = /^#\s+(.+?)\s*#*\s*$/m.exec(body)?.[1]?.trim();
|
|
53
|
+
if (heading) return heading;
|
|
54
|
+
const name = slug.split('/').at(-1) || 'Overview';
|
|
55
|
+
return name.replace(/[-_]+/g, ' ').replace(/\b\p{L}/gu, (letter) => letter.toUpperCase());
|
|
55
56
|
}
|
|
56
57
|
|
|
57
58
|
function routeForFile(file: string): string {
|
|
58
|
-
|
|
59
|
-
|
|
59
|
+
const relative = file.replace(/^\/?docs\//, '').replace(/\.(?:md|mdx)$/i, '');
|
|
60
|
+
return relative.replace(/(?:^|\/)index$/i, '').replace(/^\/+|\/+$/g, '');
|
|
60
61
|
}
|
|
61
62
|
|
|
62
63
|
const routes = new Map<string, string>();
|
|
63
64
|
export const sitePages: SitePage[] = Object.entries(modules)
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
65
|
+
.map(([file, module]) => {
|
|
66
|
+
const slug = routeForFile(file);
|
|
67
|
+
const previous = routes.get(slug);
|
|
68
|
+
if (previous) {
|
|
69
|
+
throw new Error(`Duplicate Docs route "${slug || '/'}": ${previous} and ${file}`);
|
|
70
|
+
}
|
|
71
|
+
routes.set(slug, file);
|
|
72
|
+
const markdown = sources[file] ?? '';
|
|
73
|
+
const frontmatter = module.frontmatter ?? {};
|
|
74
|
+
return {
|
|
75
|
+
file,
|
|
76
|
+
slug,
|
|
77
|
+
title: frontmatter.title ?? titleFromSource(markdown, slug),
|
|
78
|
+
...((frontmatter.sidebar?.label ?? frontmatter.label)
|
|
79
|
+
? { sidebarLabel: frontmatter.sidebar?.label ?? frontmatter.label }
|
|
80
|
+
: {}),
|
|
81
|
+
description: frontmatter.description ?? '',
|
|
82
|
+
...(frontmatter.hue !== undefined ? { hue: frontmatter.hue } : {}),
|
|
83
|
+
hidden:
|
|
84
|
+
frontmatter.sidebar?.hidden ?? frontmatter.hidden ?? frontmatter.visibility === 'hidden',
|
|
85
|
+
order: frontmatter.sidebar?.order ?? frontmatter.order ?? Number.MAX_SAFE_INTEGER,
|
|
86
|
+
content: module.Content ?? module.default,
|
|
87
|
+
markdown: markdown.replace(/^---\s*\n[\s\S]*?\n---\s*\n/, ''),
|
|
88
|
+
};
|
|
89
|
+
})
|
|
90
|
+
.sort((left, right) => left.order - right.order || left.file.localeCompare(right.file));
|
|
87
91
|
|
|
88
92
|
if (sitePages.length === 0) {
|
|
89
|
-
|
|
93
|
+
throw new Error(
|
|
94
|
+
'No Markdown files found in docs/. Add docs/index.md to start a Terra Docs site.',
|
|
95
|
+
);
|
|
90
96
|
}
|
|
91
97
|
|
|
92
98
|
type MutableNode = Omit<DocsNavNode, 'children'> & { children: Map<string, MutableNode> };
|
|
93
99
|
const rootNodes = new Map<string, MutableNode>();
|
|
94
100
|
|
|
95
101
|
function label(value: string): string {
|
|
96
|
-
|
|
102
|
+
return value.replace(/[-_]+/g, ' ').replace(/\b\p{L}/gu, (letter) => letter.toUpperCase());
|
|
97
103
|
}
|
|
98
104
|
|
|
99
105
|
for (const page of sitePages.filter((item) => !item.hidden && item.slug !== '404')) {
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
106
|
+
const segments = page.slug.split('/').filter(Boolean);
|
|
107
|
+
let currentNodes = rootNodes;
|
|
108
|
+
let current: MutableNode | undefined;
|
|
109
|
+
let prefix = '';
|
|
110
|
+
if (segments.length === 0) {
|
|
111
|
+
const overview = currentNodes.get('overview') ?? {
|
|
112
|
+
id: 'overview',
|
|
113
|
+
title: 'Overview',
|
|
114
|
+
hue: getHue('Overview'),
|
|
115
|
+
children: new Map(),
|
|
116
|
+
};
|
|
117
|
+
if (!currentNodes.has('overview')) currentNodes.set('overview', overview);
|
|
118
|
+
Object.assign(overview, pageMetadata(page, pageHref('', base)));
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
for (const segment of segments) {
|
|
122
|
+
prefix = prefix ? `${prefix}/${segment}` : segment;
|
|
123
|
+
let node = currentNodes.get(segment);
|
|
124
|
+
if (!node) {
|
|
125
|
+
node = {
|
|
126
|
+
id: prefix,
|
|
127
|
+
title: label(segment),
|
|
128
|
+
...(prefix === segment ? { hue: getHue(label(segment)) } : {}),
|
|
129
|
+
children: new Map(),
|
|
130
|
+
};
|
|
131
|
+
currentNodes.set(segment, node);
|
|
132
|
+
}
|
|
133
|
+
current = node;
|
|
134
|
+
currentNodes = node.children;
|
|
135
|
+
}
|
|
136
|
+
if (current) Object.assign(current, pageMetadata(page, pageHref(page.slug, base)));
|
|
123
137
|
}
|
|
124
138
|
|
|
125
139
|
function pageMetadata(page: SitePage, href: string): Partial<MutableNode> {
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
140
|
+
return {
|
|
141
|
+
id: page.slug || 'index',
|
|
142
|
+
title: page.sidebarLabel ?? page.title,
|
|
143
|
+
href,
|
|
144
|
+
...(page.description ? { description: page.description } : {}),
|
|
145
|
+
...(page.hue !== undefined ? { hue: page.hue } : {}),
|
|
146
|
+
};
|
|
133
147
|
}
|
|
134
148
|
|
|
135
149
|
function materialize(nodes: Map<string, MutableNode>): DocsNavNode[] {
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
150
|
+
return [...nodes.values()].map(({ children, ...node }) => ({
|
|
151
|
+
...node,
|
|
152
|
+
...(children.size ? { children: materialize(children) } : {}),
|
|
153
|
+
}));
|
|
140
154
|
}
|
|
141
155
|
|
|
142
156
|
export const siteNavigation = materialize(rootNodes);
|
|
143
157
|
|
|
144
158
|
export function pageHref(slug: string, base = '/'): string {
|
|
145
|
-
|
|
146
|
-
|
|
159
|
+
const prefix = base === '/' ? '' : `/${base.replace(/^\/+|\/+$/g, '')}`;
|
|
160
|
+
return slug ? `${prefix}/${slug}/` : `${prefix}/`;
|
|
147
161
|
}
|
|
148
162
|
|
|
149
163
|
export function pageForSlug(slug: string): SitePage | undefined {
|
|
150
|
-
|
|
164
|
+
return sitePages.find((page) => page.slug === slug);
|
|
151
165
|
}
|
|
@@ -1,56 +1,127 @@
|
|
|
1
1
|
.terra-docs-search {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
2
|
+
position: fixed;
|
|
3
|
+
top: 0.65rem;
|
|
4
|
+
right: 1rem;
|
|
5
|
+
z-index: 80;
|
|
6
|
+
font: inherit;
|
|
7
7
|
}
|
|
8
8
|
|
|
9
9
|
.terra-docs-search-trigger {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
10
|
+
display: flex;
|
|
11
|
+
align-items: center;
|
|
12
|
+
gap: 0.55rem;
|
|
13
|
+
min-height: 2.4rem;
|
|
14
|
+
padding: 0.35rem 0.55rem;
|
|
15
|
+
border: 1px solid rgb(var(--primary-6));
|
|
16
|
+
border-radius: 0.45rem;
|
|
17
|
+
background: rgb(var(--primary-2));
|
|
18
|
+
color: rgb(var(--primary-11));
|
|
19
|
+
font-size: 0.85rem;
|
|
20
|
+
cursor: pointer;
|
|
21
21
|
}
|
|
22
22
|
|
|
23
|
-
.terra-docs-search-trigger:hover {
|
|
24
|
-
|
|
25
|
-
|
|
23
|
+
.terra-docs-search-trigger:hover {
|
|
24
|
+
background: rgb(var(--primary-3));
|
|
25
|
+
}
|
|
26
|
+
.terra-docs-search-trigger > span:first-child {
|
|
27
|
+
font-size: 1.25rem;
|
|
28
|
+
line-height: 1;
|
|
29
|
+
}
|
|
30
|
+
.terra-docs-search-trigger kbd {
|
|
31
|
+
padding: 0.05rem 0.25rem;
|
|
32
|
+
border: 1px solid rgb(var(--primary-6));
|
|
33
|
+
border-radius: 0.25rem;
|
|
34
|
+
font-size: 0.7rem;
|
|
35
|
+
}
|
|
26
36
|
|
|
27
37
|
.terra-docs-search-dialog {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
38
|
+
width: min(42rem, calc(100vw - 2rem));
|
|
39
|
+
max-width: none;
|
|
40
|
+
max-height: min(75vh, 42rem);
|
|
41
|
+
padding: 0;
|
|
42
|
+
border: 1px solid rgb(var(--primary-7));
|
|
43
|
+
border-radius: 0.75rem;
|
|
44
|
+
background: rgb(var(--primary-2));
|
|
45
|
+
color: rgb(var(--primary-12));
|
|
46
|
+
box-shadow: 0 1.5rem 5rem rgb(0 0 0 / 0.35);
|
|
37
47
|
}
|
|
38
48
|
|
|
39
|
-
.terra-docs-search-dialog::backdrop {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
.terra-docs-search-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
.terra-docs-search-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
49
|
+
.terra-docs-search-dialog::backdrop {
|
|
50
|
+
background: rgb(0 0 0 / 0.58);
|
|
51
|
+
backdrop-filter: blur(2px);
|
|
52
|
+
}
|
|
53
|
+
.terra-docs-search-panel {
|
|
54
|
+
overflow: hidden;
|
|
55
|
+
}
|
|
56
|
+
.terra-docs-search-input-row {
|
|
57
|
+
display: flex;
|
|
58
|
+
align-items: center;
|
|
59
|
+
gap: 0.75rem;
|
|
60
|
+
padding: 1rem;
|
|
61
|
+
border-bottom: 1px solid rgb(var(--primary-5));
|
|
62
|
+
}
|
|
63
|
+
.terra-docs-search-input-row > span {
|
|
64
|
+
font-size: 1.3rem;
|
|
65
|
+
}
|
|
66
|
+
.terra-docs-search-input-row input {
|
|
67
|
+
min-width: 0;
|
|
68
|
+
flex: 1;
|
|
69
|
+
border: 0;
|
|
70
|
+
outline: 0;
|
|
71
|
+
background: transparent;
|
|
72
|
+
color: inherit;
|
|
73
|
+
font: inherit;
|
|
74
|
+
}
|
|
75
|
+
.terra-docs-search-input-row button {
|
|
76
|
+
border: 1px solid rgb(var(--primary-6));
|
|
77
|
+
border-radius: 0.3rem;
|
|
78
|
+
background: transparent;
|
|
79
|
+
color: inherit;
|
|
80
|
+
font-size: 0.7rem;
|
|
81
|
+
cursor: pointer;
|
|
82
|
+
}
|
|
83
|
+
.terra-docs-search-results {
|
|
84
|
+
max-height: calc(75vh - 4rem);
|
|
85
|
+
overflow: auto;
|
|
86
|
+
padding: 0.5rem;
|
|
87
|
+
}
|
|
88
|
+
.terra-docs-search-results > p {
|
|
89
|
+
padding: 1rem;
|
|
90
|
+
color: rgb(var(--primary-10));
|
|
91
|
+
font-size: 0.9rem;
|
|
92
|
+
}
|
|
93
|
+
.terra-docs-search-results > a {
|
|
94
|
+
display: grid;
|
|
95
|
+
gap: 0.25rem;
|
|
96
|
+
padding: 0.75rem;
|
|
97
|
+
border-radius: 0.45rem;
|
|
98
|
+
color: inherit;
|
|
99
|
+
text-decoration: none;
|
|
100
|
+
}
|
|
101
|
+
.terra-docs-search-results > a:hover,
|
|
102
|
+
.terra-docs-search-results > a:focus {
|
|
103
|
+
outline: 0;
|
|
104
|
+
background: rgb(var(--primary-4));
|
|
105
|
+
}
|
|
106
|
+
.terra-docs-search-results > a span,
|
|
107
|
+
.terra-docs-search-results > a small {
|
|
108
|
+
color: rgb(var(--primary-10));
|
|
109
|
+
}
|
|
110
|
+
.terra-docs-search-results > a small {
|
|
111
|
+
overflow: hidden;
|
|
112
|
+
text-overflow: ellipsis;
|
|
113
|
+
white-space: nowrap;
|
|
114
|
+
}
|
|
51
115
|
|
|
52
116
|
@media (max-width: 640px) {
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
117
|
+
.terra-docs-search {
|
|
118
|
+
top: 0.5rem;
|
|
119
|
+
right: 0.5rem;
|
|
120
|
+
}
|
|
121
|
+
.terra-docs-search-trigger {
|
|
122
|
+
min-height: 2.1rem;
|
|
123
|
+
}
|
|
124
|
+
.terra-docs-search-trigger kbd {
|
|
125
|
+
display: none;
|
|
126
|
+
}
|
|
56
127
|
}
|