@terra-symposium/docs 0.2.0 → 0.4.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/README.md +7 -1
- package/bin/terra-docs.mjs +78 -23
- package/dist/lib/components/LocalDocsWorkspace.d.ts +3 -0
- package/dist/lib/components/LocalDocsWorkspace.d.ts.map +1 -1
- package/dist/lib/components/LocalDocsWorkspace.js +23 -23
- package/dist/lib/components/LocalDocsWorkspace.js.map +1 -1
- package/dist/lib/components/SiteLayout.d.ts +3 -1
- package/dist/lib/components/SiteLayout.d.ts.map +1 -1
- package/dist/lib/components/SiteLayout.js +2 -2
- package/dist/lib/components/SiteLayout.js.map +1 -1
- package/dist/lib/components/StaticWorkspace.d.ts +4 -1
- package/dist/lib/components/StaticWorkspace.d.ts.map +1 -1
- package/dist/lib/components/StaticWorkspace.js +2 -2
- package/dist/lib/components/StaticWorkspace.js.map +1 -1
- package/dist/lib/components/StrictLocalWorkspaceHarness.d.ts +5 -0
- package/dist/lib/components/StrictLocalWorkspaceHarness.d.ts.map +1 -1
- package/dist/lib/components/StrictLocalWorkspaceHarness.js +14 -1
- package/dist/lib/components/StrictLocalWorkspaceHarness.js.map +1 -1
- package/dist/lib/components/blocks.d.ts +1 -1
- package/dist/lib/components/blocks.d.ts.map +1 -1
- package/dist/lib/components/blocks.js +59 -36
- package/dist/lib/components/blocks.js.map +1 -1
- package/dist/lib/components/navigation.js +1 -1
- package/dist/lib/components/navigation.js.map +1 -1
- package/dist/lib/components/quiz-demo-fixture.d.ts +23 -0
- package/dist/lib/components/quiz-demo-fixture.d.ts.map +1 -0
- package/dist/lib/components/quiz-demo-fixture.js +22 -0
- package/dist/lib/components/quiz-demo-fixture.js.map +1 -0
- package/dist/lib/components/quiz.d.ts +51 -0
- package/dist/lib/components/quiz.d.ts.map +1 -0
- package/dist/lib/components/quiz.js +183 -0
- package/dist/lib/components/quiz.js.map +1 -0
- package/dist/lib/components/terra/Workspace.d.ts.map +1 -1
- package/dist/lib/components/terra/Workspace.js +13 -12
- package/dist/lib/components/terra/Workspace.js.map +1 -1
- package/dist/lib/components/terra/editor/ContentEditor.d.ts.map +1 -1
- package/dist/lib/components/terra/editor/ContentEditor.js +35 -35
- package/dist/lib/components/terra/editor/ContentEditor.js.map +1 -1
- package/dist/lib/components/terra/editor/_blocks.js +6 -6
- package/dist/lib/components/terra/editor/_blocks.js.map +1 -1
- package/dist/lib/components/terra/editor/docs/BlockContext.js +12 -12
- package/dist/lib/components/terra/editor/docs/BlockContext.js.map +1 -1
- package/dist/lib/components/terra/editor/docs/DocsAttachmentPicker.js +6 -6
- package/dist/lib/components/terra/editor/docs/DocsAttachmentPicker.js.map +1 -1
- package/dist/lib/components/terra/editor/docs/TerraToolbar.d.ts.map +1 -1
- package/dist/lib/components/terra/editor/docs/TerraToolbar.js +2 -1
- package/dist/lib/components/terra/editor/docs/TerraToolbar.js.map +1 -1
- package/dist/lib/components/terra/editor/docs/_CodeBlock.js +10 -10
- package/dist/lib/components/terra/editor/docs/_CodeBlock.js.map +1 -1
- package/dist/lib/components/terra/editor/terra-content.styles.d.ts +1 -1
- package/dist/lib/components/terra/editor/terra-content.styles.d.ts.map +1 -1
- package/dist/lib/components/terra/editor/terra-content.styles.js +1 -1
- package/dist/lib/components/terra/editor/terra-content.styles.js.map +1 -1
- package/dist/lib/components/terra/flow/Nodes.js +7 -7
- package/dist/lib/components/terra/flow/Nodes.js.map +1 -1
- package/dist/lib/components/terra/pages/docs/_attachments.d.ts.map +1 -1
- package/dist/lib/components/terra/pages/docs/_attachments.js +11 -11
- package/dist/lib/components/terra/pages/docs/_attachments.js.map +1 -1
- package/dist/lib/components/terra/pages/docs/_blocks.js +2 -2
- package/dist/lib/components/terra/pages/docs/_blocks.js.map +1 -1
- package/dist/lib/components/terra/pages/docs/_editable.d.ts.map +1 -1
- package/dist/lib/components/terra/pages/docs/_editable.js +2 -2
- package/dist/lib/components/terra/pages/docs/_editable.js.map +1 -1
- package/dist/lib/components/terra/pages/docs/_icons.d.ts +1 -0
- package/dist/lib/components/terra/pages/docs/_icons.d.ts.map +1 -1
- package/dist/lib/components/terra/pages/docs/_icons.js +1 -0
- package/dist/lib/components/terra/pages/docs/_icons.js.map +1 -1
- package/dist/lib/components/terra/pages/docs/_main.d.ts.map +1 -1
- package/dist/lib/components/terra/pages/docs/_main.js +48 -16
- package/dist/lib/components/terra/pages/docs/_main.js.map +1 -1
- package/dist/lib/components/terra/pages/docs/_sidebar.js +2 -2
- package/dist/lib/components/terra/pages/docs/_sidebar.js.map +1 -1
- package/dist/lib/components/terra/pages/docs/_toc.js +1 -1
- package/dist/lib/components/terra/pages/docs/_toc.js.map +1 -1
- package/dist/lib/components/terra/pages/docs/_toolbar.d.ts.map +1 -1
- package/dist/lib/components/terra/pages/docs/_toolbar.js +12 -9
- package/dist/lib/components/terra/pages/docs/_toolbar.js.map +1 -1
- package/dist/lib/components/workspace-demo-fixture.d.ts.map +1 -1
- package/dist/lib/components/workspace-demo-fixture.js +51 -53
- package/dist/lib/components/workspace-demo-fixture.js.map +1 -1
- package/dist/lib/lib/host-runtime.js +3 -3
- package/dist/lib/lib/host-runtime.js.map +1 -1
- package/dist/lib/lib/host.d.ts +4 -1
- package/dist/lib/lib/host.d.ts.map +1 -1
- package/dist/lib/lib/index.d.ts +3 -0
- package/dist/lib/lib/index.d.ts.map +1 -1
- package/dist/lib/lib/index.js +2 -0
- package/dist/lib/lib/index.js.map +1 -1
- package/dist/lib/lib/markdown-model.d.ts.map +1 -1
- package/dist/lib/lib/markdown-model.js +106 -107
- package/dist/lib/lib/markdown-model.js.map +1 -1
- package/dist/lib/lib/markdown.js +4 -4
- package/dist/lib/lib/markdown.js.map +1 -1
- package/dist/lib/lib/schema.d.ts +2 -2
- package/dist/lib/lib/terra/custom-components.d.ts +1 -1
- package/dist/lib/lib/terra/custom-components.d.ts.map +1 -1
- package/dist/lib/lib/terra/custom-components.js +2 -2
- package/dist/lib/lib/terra/custom-components.js.map +1 -1
- package/dist/lib/lib/terra/docs/editor-dom.d.ts.map +1 -1
- package/dist/lib/lib/terra/docs/editor-dom.js +2 -2
- package/dist/lib/lib/terra/docs/editor-dom.js.map +1 -1
- package/dist/lib/lib/terra/docs/workspace.d.ts +14 -12
- package/dist/lib/lib/terra/docs/workspace.d.ts.map +1 -1
- package/dist/lib/lib/terra/docs/workspace.js +5 -5
- package/dist/lib/lib/terra/docs/workspace.js.map +1 -1
- package/dist/lib/lib/terra/runtime/action-proxy.d.ts +1 -1
- package/dist/lib/lib/terra/runtime/action-proxy.d.ts.map +1 -1
- package/dist/lib/lib/terra/runtime/action-proxy.js +2 -2
- package/dist/lib/lib/terra/runtime/action-proxy.js.map +1 -1
- package/dist/lib/lib/terra/runtime/content/markdown.d.ts +0 -7
- package/dist/lib/lib/terra/runtime/content/markdown.d.ts.map +1 -1
- package/dist/lib/lib/terra/runtime/content/markdown.js +0 -7
- package/dist/lib/lib/terra/runtime/content/markdown.js.map +1 -1
- package/dist/lib/lib/terra/runtime/nodes.js +3 -3
- package/dist/lib/lib/terra/runtime/nodes.js.map +1 -1
- package/dist/lib/lib/terra/runtime/runtime.d.ts +1 -2
- package/dist/lib/lib/terra/runtime/runtime.d.ts.map +1 -1
- package/dist/lib/lib/terra/runtime/runtime.js +3 -8
- package/dist/lib/lib/terra/runtime/runtime.js.map +1 -1
- package/dist/lib/lib/terra/runtime/shared.d.ts.map +1 -1
- package/dist/lib/lib/terra/runtime/shared.js +6 -6
- package/dist/lib/lib/terra/runtime/shared.js.map +1 -1
- package/dist/lib/lib/terra/runtime/types.d.ts +6 -0
- package/dist/lib/lib/terra/runtime/types.d.ts.map +1 -1
- package/dist/lib/lib/terra/runtime/types.js +1 -0
- package/dist/lib/lib/terra/runtime/types.js.map +1 -1
- package/dist/lib/style.css +2 -2
- package/package.json +8 -12
- package/site/astro.config.mjs +27 -22
- package/site/docs-content-plugin.mjs +4 -1
- package/site/src/components/DocsSiteSearch.tsx +51 -33
- package/site/src/components/QuizDemo.tsx +62 -0
- package/site/src/lib/catalog.ts +12 -4
- package/site/src/pages/[...slug].astro +3 -9
- package/site/src/pages/quiz-demo.astro +50 -0
- package/src/components/navigation.tsx +2 -2
- package/src/components/quiz-demo-fixture.ts +23 -0
- package/bin/generate-skills.mjs +0 -188
- package/site/src/components/SkillsExplorer.tsx +0 -236
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@terra-symposium/docs",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "Docs workspace and Markdown site generator.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
"bin",
|
|
17
17
|
"site",
|
|
18
18
|
"src/components/navigation.tsx",
|
|
19
|
+
"src/components/quiz-demo-fixture.ts",
|
|
19
20
|
"src/components/SiteLayout.astro",
|
|
20
21
|
"src/components/NotFound.astro",
|
|
21
22
|
"src/components/NotFound.tsx"
|
|
@@ -35,11 +36,7 @@
|
|
|
35
36
|
"import": "./dist/lib/components/LocalDocsWorkspace.js"
|
|
36
37
|
},
|
|
37
38
|
"./site-layout.astro": "./src/components/SiteLayout.astro",
|
|
38
|
-
"./not-found.astro": "./src/components/NotFound.astro"
|
|
39
|
-
"./skills": {
|
|
40
|
-
"types": "./site/src/components/SkillsExplorer.tsx",
|
|
41
|
-
"import": "./site/src/components/SkillsExplorer.tsx"
|
|
42
|
-
}
|
|
39
|
+
"./not-found.astro": "./src/components/NotFound.astro"
|
|
43
40
|
},
|
|
44
41
|
"bin": {
|
|
45
42
|
"terra-docs": "bin/terra-docs.mjs"
|
|
@@ -47,8 +44,8 @@
|
|
|
47
44
|
"scripts": {
|
|
48
45
|
"dev": "terra-quality-dev -- vite --host 127.0.0.1 --open",
|
|
49
46
|
"docs:dev": "pnpm build && node bin/terra-docs.mjs dev --title 'Docs'",
|
|
50
|
-
"docs:build": "pnpm build && node bin/terra-docs.mjs build --title 'Docs'",
|
|
51
|
-
"docs:preview": "pnpm docs:build && node bin/terra-docs.mjs preview --title 'Docs'",
|
|
47
|
+
"docs:build": "pnpm build && node bin/terra-docs.mjs build --title 'Docs' --out dist/docs",
|
|
48
|
+
"docs:preview": "pnpm docs:build && node bin/terra-docs.mjs preview --title 'Docs' --out dist/docs",
|
|
52
49
|
"dev:library": "tsc --watch",
|
|
53
50
|
"prebuild": "pnpm exec terra-quality error-boundaries --all",
|
|
54
51
|
"build": "rm -rf dist/lib && tsc && tailwindcss --postcss tailwind.postcss.config.cjs -c tailwind.docs.config.mjs -i src/styles/style.css -o dist/lib/style.css --minify && tailwindcss --postcss tailwind.postcss.config.cjs -c tailwind.docs.config.mjs -i src/styles/workspace.css -o dist/lib/workspace.css --minify && node scripts/copy-runtime.mjs",
|
|
@@ -71,7 +68,6 @@
|
|
|
71
68
|
"@playwright/test": "^1.64.1",
|
|
72
69
|
"@terra-symposium/standards-quality": "2.1.3",
|
|
73
70
|
"@terra-symposium/standards-reporting": "0.6.2",
|
|
74
|
-
"@types/katex": "^0.16.8",
|
|
75
71
|
"@types/node": "^24.19.2",
|
|
76
72
|
"@types/react": "19.3.0",
|
|
77
73
|
"@types/react-dom": "19.3.0",
|
|
@@ -80,6 +76,7 @@
|
|
|
80
76
|
"eslint": "10.13.0",
|
|
81
77
|
"globals": "^16.5.0",
|
|
82
78
|
"husky": "^9.1.7",
|
|
79
|
+
"knip": "^6.44.1",
|
|
83
80
|
"postcss": "8.5.31",
|
|
84
81
|
"postcss-import": "15.1.0",
|
|
85
82
|
"prettier": "3.9.10",
|
|
@@ -104,14 +101,13 @@
|
|
|
104
101
|
"@lexical/rich-text": "^0.35.0",
|
|
105
102
|
"@portabletext/editor": "7.9.0",
|
|
106
103
|
"@radix-ui/react-popover": "^1.1.15",
|
|
107
|
-
"@radix-ui/react-select": "2.4.1",
|
|
108
104
|
"@terra-symposium/standards-error-boundaries": "0.1.2",
|
|
109
105
|
"@terra-symposium/styling": "0.1.34",
|
|
110
|
-
"bezier-easing": "2.1.0",
|
|
111
|
-
"@xstate/react": "6.1.0",
|
|
112
106
|
"@uiw/codemirror-theme-github": "^4.25.9",
|
|
107
|
+
"@xstate/react": "6.1.0",
|
|
113
108
|
"@xyflow/react": "^12.3.6",
|
|
114
109
|
"astro": "^7.4.2",
|
|
110
|
+
"bezier-easing": "2.1.0",
|
|
115
111
|
"html-to-image": "1.11.11",
|
|
116
112
|
"jszip": "^3.10.1",
|
|
117
113
|
"katex": "^0.19.1",
|
package/site/astro.config.mjs
CHANGED
|
@@ -56,14 +56,14 @@ function astroPackageExportAliases() {
|
|
|
56
56
|
replacement: resolve(astroPackageRoot, 'dist/runtime/$1'),
|
|
57
57
|
},
|
|
58
58
|
...Object.keys(astroManifest.exports)
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
59
|
+
.filter((key) => key.startsWith('./') && !key.includes('*'))
|
|
60
|
+
.map((key) => {
|
|
61
|
+
const specifier = `astro${key.slice(1)}`;
|
|
62
|
+
return {
|
|
63
|
+
find: new RegExp(`^${specifier.replace(/[|\\{}()[\]^$+?.]/g, '\\$&')}$`),
|
|
64
|
+
replacement: requireFromPackage.resolve(specifier),
|
|
65
|
+
};
|
|
66
|
+
}),
|
|
67
67
|
];
|
|
68
68
|
}
|
|
69
69
|
|
|
@@ -119,7 +119,12 @@ function stylingDependencyAliases() {
|
|
|
119
119
|
: dependencyManifest('@terra-symposium/styling', requireFromProject);
|
|
120
120
|
if (!stylingManifest) return [];
|
|
121
121
|
return Object.keys(stylingManifest.dependencies ?? {})
|
|
122
|
-
.filter(
|
|
122
|
+
.filter(
|
|
123
|
+
(name) =>
|
|
124
|
+
name !== 'react' &&
|
|
125
|
+
name !== 'react-dom' &&
|
|
126
|
+
(name.includes('react') || ['cmdk', 'vaul'].includes(name)),
|
|
127
|
+
)
|
|
123
128
|
.flatMap((name) => {
|
|
124
129
|
const manifest = dependencyManifest(name, requireFromProject);
|
|
125
130
|
if (!manifest) return [];
|
|
@@ -152,19 +157,19 @@ function sharedReactAliases() {
|
|
|
152
157
|
];
|
|
153
158
|
return [
|
|
154
159
|
...specifiers.map((specifier) => {
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
160
|
+
let replacement;
|
|
161
|
+
try {
|
|
162
|
+
// Externalized component dependencies resolve React from the consumer's
|
|
163
|
+
// installation during SSR. Prefer that same copy for bundled imports.
|
|
164
|
+
replacement = requireFromProject.resolve(specifier);
|
|
165
|
+
} catch {
|
|
166
|
+
// Content-only repositories can rely on the React runtime shipped by Docs.
|
|
167
|
+
replacement = requireFromPackage.resolve(specifier);
|
|
168
|
+
}
|
|
169
|
+
return {
|
|
170
|
+
find: new RegExp(`^${specifier.replace(/[|\\{}()[\]^$+?.]/g, '\\$&')}$`),
|
|
171
|
+
replacement,
|
|
172
|
+
};
|
|
168
173
|
}),
|
|
169
174
|
{
|
|
170
175
|
// The Docs editor imports `react-dom/server` for Markdown previews. Its
|
|
@@ -8,7 +8,10 @@ function publicRoute(file, docsRoot, base) {
|
|
|
8
8
|
.split(sep)
|
|
9
9
|
.join('/')
|
|
10
10
|
.replace(/\.(?:md|mdx)$/i, '');
|
|
11
|
-
const route = path
|
|
11
|
+
const route = path
|
|
12
|
+
.replace(/(?:^|\/)SKILL$/i, '')
|
|
13
|
+
.replace(/(?:^|\/)index$/i, '')
|
|
14
|
+
.replace(/^\/+|\/+$/g, '');
|
|
12
15
|
return `${base}${route ? `${route}/` : ''}`;
|
|
13
16
|
}
|
|
14
17
|
|
|
@@ -7,7 +7,15 @@ IMPORTS
|
|
|
7
7
|
//////////////////////////////////////////////////*/
|
|
8
8
|
|
|
9
9
|
// API
|
|
10
|
-
import { useEffect, useMemo,
|
|
10
|
+
import { useEffect, useMemo, useState } from 'react';
|
|
11
|
+
import {
|
|
12
|
+
CommandDialog,
|
|
13
|
+
CommandEmpty,
|
|
14
|
+
CommandGroup,
|
|
15
|
+
CommandInput,
|
|
16
|
+
CommandItem,
|
|
17
|
+
CommandList,
|
|
18
|
+
} from '@terra-symposium/styling/ui';
|
|
11
19
|
|
|
12
20
|
/*//////////////////////////////////////////////////
|
|
13
21
|
CONFIG
|
|
@@ -54,8 +62,6 @@ COMPONENTS
|
|
|
54
62
|
* @return Search controls, loading and error states, and links to matching pages.
|
|
55
63
|
*/
|
|
56
64
|
export function DocsSiteSearch({ base = '/' }: Props) {
|
|
57
|
-
const dialog = useRef<HTMLDialogElement>(null);
|
|
58
|
-
const input = useRef<HTMLInputElement>(null);
|
|
59
65
|
const [query, setQuery] = useState('');
|
|
60
66
|
const [documents, setDocuments] = useState<SearchDocument[]>([]);
|
|
61
67
|
const [loaded, setLoaded] = useState(false);
|
|
@@ -68,9 +74,7 @@ export function DocsSiteSearch({ base = '/' }: Props) {
|
|
|
68
74
|
* @return Nothing; the callback updates dialog state and browser focus.
|
|
69
75
|
*/
|
|
70
76
|
const open = () => {
|
|
71
|
-
if (!dialog.current?.open) dialog.current?.showModal();
|
|
72
77
|
setOpened(true);
|
|
73
|
-
window.setTimeout(() => input.current?.focus(), 0);
|
|
74
78
|
};
|
|
75
79
|
useEffect(() => {
|
|
76
80
|
/**
|
|
@@ -137,35 +141,49 @@ export function DocsSiteSearch({ base = '/' }: Props) {
|
|
|
137
141
|
.slice(0, 10);
|
|
138
142
|
}, [documents, query]);
|
|
139
143
|
return (
|
|
140
|
-
<
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
<
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
144
|
+
<CommandDialog
|
|
145
|
+
open={opened}
|
|
146
|
+
onOpenChange={(nextOpen) => {
|
|
147
|
+
setOpened(nextOpen);
|
|
148
|
+
if (!nextOpen) setQuery('');
|
|
149
|
+
}}
|
|
150
|
+
size="lg"
|
|
151
|
+
className="max-w-2xl"
|
|
152
|
+
aria-label="Search documentation"
|
|
153
|
+
>
|
|
154
|
+
<CommandInput value={query} onValueChange={setQuery} placeholder="Search documentation…" />
|
|
155
|
+
<CommandList className="max-h-[min(60vh,32rem)] p-2">
|
|
156
|
+
{failed ? <CommandEmpty>Search is unavailable right now.</CommandEmpty> : null}
|
|
157
|
+
{!loaded && !failed ? <CommandEmpty>Loading search…</CommandEmpty> : null}
|
|
158
|
+
{loaded && query.trim() && results.length === 0 ? (
|
|
159
|
+
<CommandEmpty>No matching pages.</CommandEmpty>
|
|
160
|
+
) : null}
|
|
161
|
+
{results.length > 0 ? (
|
|
162
|
+
<CommandGroup>
|
|
159
163
|
{results.map(({ document }) => (
|
|
160
|
-
<
|
|
161
|
-
|
|
162
|
-
{document.
|
|
163
|
-
|
|
164
|
-
|
|
164
|
+
<CommandItem
|
|
165
|
+
key={document.href}
|
|
166
|
+
value={`${document.title} ${document.description} ${document.text}`}
|
|
167
|
+
onSelect={() => {
|
|
168
|
+
window.location.assign(document.href);
|
|
169
|
+
setOpened(false);
|
|
170
|
+
}}
|
|
171
|
+
className="items-start py-3"
|
|
172
|
+
>
|
|
173
|
+
<span className="flex min-w-0 flex-col gap-1">
|
|
174
|
+
<strong>{document.title}</strong>
|
|
175
|
+
{document.description ? (
|
|
176
|
+
<span className="text-sm text-primary-11">{document.description}</span>
|
|
177
|
+
) : null}
|
|
178
|
+
<small className="line-clamp-2 text-xs text-primary-10">
|
|
179
|
+
{excerpt(document.text, query.trim().split(S_REGEX)[0] ?? query)}
|
|
180
|
+
</small>
|
|
181
|
+
</span>
|
|
182
|
+
</CommandItem>
|
|
165
183
|
))}
|
|
166
|
-
</
|
|
167
|
-
|
|
168
|
-
</
|
|
169
|
-
</
|
|
184
|
+
</CommandGroup>
|
|
185
|
+
) : null}
|
|
186
|
+
</CommandList>
|
|
187
|
+
</CommandDialog>
|
|
170
188
|
);
|
|
171
189
|
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { DocsSiteIsland } from './DocsSiteIsland.js';
|
|
2
|
+
import type { DocsSection } from '../../../dist/lib/lib/workspace-types.js';
|
|
3
|
+
import type { DocsQuizConfig, DocsQuizGenerationInput } from '../../../dist/lib/components/quiz.js';
|
|
4
|
+
import { quizDemoLeaf, quizDemoResponse } from '../../../src/components/quiz-demo-fixture.js';
|
|
5
|
+
|
|
6
|
+
const markdown = quizDemoLeaf.markdown;
|
|
7
|
+
const visibleLeafText = markdown.split('\n\n', 1)[0] ?? markdown;
|
|
8
|
+
|
|
9
|
+
const sections: DocsSection[] = [
|
|
10
|
+
{
|
|
11
|
+
id: 'course',
|
|
12
|
+
title: 'Course',
|
|
13
|
+
groups: [
|
|
14
|
+
{
|
|
15
|
+
id: 'lessons',
|
|
16
|
+
title: 'Lessons',
|
|
17
|
+
leaves: [
|
|
18
|
+
{
|
|
19
|
+
id: quizDemoLeaf.id,
|
|
20
|
+
title: quizDemoLeaf.title,
|
|
21
|
+
href: '/quiz-demo/',
|
|
22
|
+
description: 'The routing leaf shared with the quiz browser tests.',
|
|
23
|
+
},
|
|
24
|
+
],
|
|
25
|
+
},
|
|
26
|
+
],
|
|
27
|
+
},
|
|
28
|
+
];
|
|
29
|
+
|
|
30
|
+
function genDemoQuiz(input: DocsQuizGenerationInput): Promise<unknown> {
|
|
31
|
+
return Promise.resolve({
|
|
32
|
+
title: `${quizDemoResponse.title} · sample`,
|
|
33
|
+
questions: Array.from({ length: input.count }, (_, i) => {
|
|
34
|
+
const type = input.types[i % input.types.length];
|
|
35
|
+
const question =
|
|
36
|
+
quizDemoResponse.questions.find((candidate) => candidate.type === type) ??
|
|
37
|
+
quizDemoResponse.questions[0];
|
|
38
|
+
return { ...question };
|
|
39
|
+
}),
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const quiz: DocsQuizConfig = { toolbar: true, generate: genDemoQuiz };
|
|
44
|
+
|
|
45
|
+
/** A package-safe interactive demo for the host-configurable leaf quiz flow. */
|
|
46
|
+
export function QuizDemo() {
|
|
47
|
+
return (
|
|
48
|
+
<DocsSiteIsland
|
|
49
|
+
title="Docs quiz demo"
|
|
50
|
+
description="The published Docs workspace with sample leaf quiz generation."
|
|
51
|
+
hue={145}
|
|
52
|
+
sections={sections}
|
|
53
|
+
currentPath="/quiz-demo/"
|
|
54
|
+
rootPath="/quiz-demo/"
|
|
55
|
+
staticContent
|
|
56
|
+
markdown={markdown}
|
|
57
|
+
renderContent={<p className="leading-7">{visibleLeafText}</p>}
|
|
58
|
+
quiz={quiz}
|
|
59
|
+
searchBase="/"
|
|
60
|
+
/>
|
|
61
|
+
);
|
|
62
|
+
}
|
package/site/src/lib/catalog.ts
CHANGED
|
@@ -72,10 +72,17 @@ const sources = import.meta.glob<string>('/docs/**/*.{md,mdx}', {
|
|
|
72
72
|
eager: true,
|
|
73
73
|
});
|
|
74
74
|
const base = import.meta.env.BASE_URL;
|
|
75
|
+
const includeAgents = import.meta.env.PUBLIC_TERRA_DOCS_INCLUDE_AGENTS !== 'false';
|
|
75
76
|
const routes = new Map<string, string>();
|
|
76
77
|
/** Visible Docs pages sorted by configured sidebar order and source path. */
|
|
77
78
|
export const sitePages: SitePage[] = Object.entries(modules)
|
|
79
|
+
.filter(([file]) => includeAgents || !file.startsWith('/docs/agents/'))
|
|
78
80
|
.map(([file, module]) => {
|
|
81
|
+
const relativeFile = file.replace(/^\/docs\//, '');
|
|
82
|
+
const isRootIndex = ['index.md', 'index.mdx'].includes(relativeFile.toLowerCase());
|
|
83
|
+
if (!isRootIndex && !relativeFile.includes('/')) {
|
|
84
|
+
throw new Error(`Markdown pages must be grouped in folders directly under docs/: ${file}`);
|
|
85
|
+
}
|
|
79
86
|
const slug = routeForFile(file);
|
|
80
87
|
const previous = routes.get(slug);
|
|
81
88
|
if (previous) throw new Error(`Duplicate Docs route "${slug || '/'}": ${previous} and ${file}`);
|
|
@@ -131,7 +138,10 @@ function titleFromSource(source: string, slug: string): string {
|
|
|
131
138
|
*/
|
|
132
139
|
function routeForFile(file: string): string {
|
|
133
140
|
const relative = file.replace(/^\/?docs\//, '').replace(/\.(?:md|mdx)$/i, '');
|
|
134
|
-
return relative
|
|
141
|
+
return relative
|
|
142
|
+
.replace(/(?:^|\/)SKILL$/i, '')
|
|
143
|
+
.replace(/(?:^|\/)index$/i, '')
|
|
144
|
+
.replace(G_CLASS_2(), '');
|
|
135
145
|
}
|
|
136
146
|
|
|
137
147
|
/**
|
|
@@ -201,9 +211,7 @@ export function pageForSlug(slug: string): SitePage | undefined {
|
|
|
201
211
|
return sitePages.find((page) => page.slug === slug);
|
|
202
212
|
}
|
|
203
213
|
if (sitePages.length === 0)
|
|
204
|
-
throw new Error(
|
|
205
|
-
'No Markdown files found in docs/. Add docs/index.md to start a Docs site.',
|
|
206
|
-
);
|
|
214
|
+
throw new Error('No Markdown files found in docs/. Add docs/index.md to start a Docs site.');
|
|
207
215
|
for (const page of sitePages.filter((i) => !i.hidden && i.slug !== '404')) {
|
|
208
216
|
const segments = page.slug.split('/').filter(Boolean);
|
|
209
217
|
let currentNodes = rootNodes;
|
|
@@ -15,11 +15,10 @@ export function getStaticPaths() {
|
|
|
15
15
|
|
|
16
16
|
const { slug = '' } = Astro.props;
|
|
17
17
|
const page = pageForSlug(slug);
|
|
18
|
-
const PageContent = page?.content;
|
|
19
18
|
const currentPath = pageHref(slug, base);
|
|
20
19
|
---
|
|
21
20
|
|
|
22
|
-
{page
|
|
21
|
+
{page ? (
|
|
23
22
|
<html lang="en">
|
|
24
23
|
<head>
|
|
25
24
|
<meta charset="utf-8" />
|
|
@@ -37,14 +36,9 @@ const currentPath = pageHref(slug, base);
|
|
|
37
36
|
nodes={siteNavigation}
|
|
38
37
|
currentPath={currentPath}
|
|
39
38
|
rootPath={pageHref('', base)}
|
|
39
|
+
markdown={page.markdown}
|
|
40
40
|
searchBase={base}
|
|
41
|
-
|
|
42
|
-
<div class="terra-docs-page-content"><PageContent /></div>
|
|
43
|
-
</DocsSiteLayout>
|
|
41
|
+
/>
|
|
44
42
|
</body>
|
|
45
43
|
</html>
|
|
46
44
|
) : null}
|
|
47
|
-
|
|
48
|
-
<style is:global>
|
|
49
|
-
.terra-docs-page-content { max-width: 100%; }
|
|
50
|
-
</style>
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
---
|
|
2
|
+
import { QuizDemo } from '../components/QuizDemo.js';
|
|
3
|
+
import '@terra-symposium/docs/style.css';
|
|
4
|
+
---
|
|
5
|
+
<!doctype html>
|
|
6
|
+
<html lang="en" class="light">
|
|
7
|
+
<head>
|
|
8
|
+
<meta charset="utf-8" />
|
|
9
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
10
|
+
<meta name="description" content="Try the shared Docs leaf quiz flow with the Playwright workspace fixture." />
|
|
11
|
+
<title>Leaf quiz demo · Docs</title>
|
|
12
|
+
</head>
|
|
13
|
+
<body>
|
|
14
|
+
<header class="demo-intro">
|
|
15
|
+
<p>Docs component demo</p>
|
|
16
|
+
<h1>Generate a quiz from a leaf</h1>
|
|
17
|
+
<p>Select a leaf, then choose <strong>Generate quiz</strong>. This fixture returns clearly marked sample questions and never sends content to an AI service.</p>
|
|
18
|
+
</header>
|
|
19
|
+
<QuizDemo client:load />
|
|
20
|
+
</body>
|
|
21
|
+
</html>
|
|
22
|
+
|
|
23
|
+
<style>
|
|
24
|
+
.demo-intro {
|
|
25
|
+
margin-left: 22rem;
|
|
26
|
+
padding: 1.25rem clamp(1rem, 4vw, 3rem);
|
|
27
|
+
background: #f7f4fb;
|
|
28
|
+
color: #24172f;
|
|
29
|
+
}
|
|
30
|
+
.demo-intro > p:first-child {
|
|
31
|
+
margin: 0 0 0.35rem;
|
|
32
|
+
font-size: 0.75rem;
|
|
33
|
+
font-weight: 700;
|
|
34
|
+
letter-spacing: 0.08em;
|
|
35
|
+
text-transform: uppercase;
|
|
36
|
+
}
|
|
37
|
+
.demo-intro h1 {
|
|
38
|
+
margin: 0;
|
|
39
|
+
font-size: clamp(1.25rem, 2.5vw, 1.8rem);
|
|
40
|
+
}
|
|
41
|
+
.demo-intro > p:last-child {
|
|
42
|
+
margin: 0.35rem 0 0;
|
|
43
|
+
font-size: 0.9rem;
|
|
44
|
+
}
|
|
45
|
+
@media (max-width: 767px) {
|
|
46
|
+
.demo-intro {
|
|
47
|
+
margin-left: 0;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
</style>
|
|
@@ -27,8 +27,8 @@ export function DocsNavigation({
|
|
|
27
27
|
const style = { '--docs-accent': `rgb(${accent.light[8]})` } as CSSProperties;
|
|
28
28
|
const render = (items: DocsNavNode[]): JSX.Element => (
|
|
29
29
|
<ul className="terra-docs-nav-list">
|
|
30
|
-
{items.map((node,
|
|
31
|
-
<li key={`${node.href ?? node.title}-${
|
|
30
|
+
{items.map((node, i) => (
|
|
31
|
+
<li key={`${node.href ?? node.title}-${i}`}>
|
|
32
32
|
{node.href ? (
|
|
33
33
|
<a href={node.href} aria-current={node.href === currentPath ? 'page' : undefined}>
|
|
34
34
|
{node.title}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/** Shared quiz leaf data used by the public demo and its Playwright fixture. */
|
|
2
|
+
export const quizDemoLeaf = {
|
|
3
|
+
id: 'quiz-leaf',
|
|
4
|
+
path: 'content/course/quiz-leaf/index.md',
|
|
5
|
+
title: 'Course Leaf',
|
|
6
|
+
markdown:
|
|
7
|
+
'Leaf source: routing sends packets between networks.\n\n:::terra-docs quiz\n_type: quiz\n:::',
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
/** Stable sample response for review, run, and score coverage. */
|
|
11
|
+
export const quizDemoResponse = {
|
|
12
|
+
title: 'Routing quiz',
|
|
13
|
+
questions: [
|
|
14
|
+
{
|
|
15
|
+
type: 'multipleChoice',
|
|
16
|
+
prompt: 'What does a router do?',
|
|
17
|
+
opts: ['Routes packets', 'Stores files'],
|
|
18
|
+
answer: 'Routes packets',
|
|
19
|
+
explanation: 'It forwards packets between networks.',
|
|
20
|
+
},
|
|
21
|
+
{ type: 'keyword', prompt: 'What does it forward?', answers: ['packets'] },
|
|
22
|
+
],
|
|
23
|
+
} as const;
|