@restless-dreams/orbit 0.0.0-stage → 0.2.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/LICENSE +21 -0
- package/README.md +168 -2
- package/dist/bin/orbit.js +11666 -0
- package/dist/bin/orbit.js.map +60 -0
- package/dist/chunk-fkdfgtx9.js +17295 -0
- package/dist/chunk-fkdfgtx9.js.map +75 -0
- package/dist/chunk-y748hzcr.js +82 -0
- package/dist/chunk-y748hzcr.js.map +10 -0
- package/dist/chunk-zze4tc9n.js +408 -0
- package/dist/chunk-zze4tc9n.js.map +10 -0
- package/dist/core/auto-render.d.ts +85 -0
- package/dist/core/branch-colors.d.ts +57 -0
- package/dist/core/browser.d.ts +23 -0
- package/dist/core/create.d.ts +23 -0
- package/dist/core/diagnostics.d.ts +40 -0
- package/dist/core/dispatch.d.ts +23 -0
- package/dist/core/document-options.d.ts +18 -0
- package/dist/core/document-source.d.ts +128 -0
- package/dist/core/editing.d.ts +66 -0
- package/dist/core/engine/animation-clock.d.ts +40 -0
- package/dist/core/engine/camera.d.ts +70 -0
- package/dist/core/engine/colors.d.ts +51 -0
- package/dist/core/engine/display.d.ts +125 -0
- package/dist/core/engine/export.d.ts +32 -0
- package/dist/core/engine/glide.d.ts +34 -0
- package/dist/core/engine/labels.d.ts +106 -0
- package/dist/core/engine/node-drag.d.ts +49 -0
- package/dist/core/engine/scene.d.ts +160 -0
- package/dist/core/engine/spin.d.ts +62 -0
- package/dist/core/engine/surface-pattern.d.ts +20 -0
- package/dist/core/engine/text-measure.d.ts +116 -0
- package/dist/core/engine/views.d.ts +361 -0
- package/dist/core/extensions.d.ts +155 -0
- package/dist/core/format-upgrades.d.ts +33 -0
- package/dist/core/index.d.ts +46 -0
- package/dist/core/input-controller.d.ts +116 -0
- package/dist/core/languages.d.ts +201 -0
- package/dist/core/layout.d.ts +61 -0
- package/dist/core/map-tools/definitions.d.ts +71 -0
- package/dist/core/map-tools/input.d.ts +62 -0
- package/dist/core/map-tools/reading.d.ts +40 -0
- package/dist/core/map-tools/tools.d.ts +51 -0
- package/dist/core/markdown-writing.d.ts +87 -0
- package/dist/core/material.d.ts +25 -0
- package/dist/core/media.d.ts +42 -0
- package/dist/core/node-attributes.d.ts +31 -0
- package/dist/core/node-links.d.ts +25 -0
- package/dist/core/other-apps/freemind.d.ts +8 -0
- package/dist/core/other-apps/icons.d.ts +16 -0
- package/dist/core/other-apps/ideas.d.ts +76 -0
- package/dist/core/other-apps/import.d.ts +28 -0
- package/dist/core/other-apps/inflate.d.ts +22 -0
- package/dist/core/other-apps/markup.d.ts +51 -0
- package/dist/core/other-apps/notes.d.ts +80 -0
- package/dist/core/other-apps/opml.d.ts +26 -0
- package/dist/core/other-apps/reading.d.ts +36 -0
- package/dist/core/other-apps/xmind.d.ts +14 -0
- package/dist/core/other-apps/zip.d.ts +37 -0
- package/dist/core/parser-markdown.d.ts +42 -0
- package/dist/core/parser-yaml.d.ts +8 -0
- package/dist/core/print-layout.d.ts +70 -0
- package/dist/core/render-to-svg.d.ts +57 -0
- package/dist/core/renderer/content-painter.d.ts +30 -0
- package/dist/core/renderer/dom.d.ts +15 -0
- package/dist/core/renderer/families.d.ts +35 -0
- package/dist/core/renderer/label-painter.d.ts +93 -0
- package/dist/core/renderer/node-painter.d.ts +113 -0
- package/dist/core/renderer/numbers.d.ts +2 -0
- package/dist/core/renderer/options.d.ts +12 -0
- package/dist/core/renderer/rings-and-links.d.ts +23 -0
- package/dist/core/renderer/scene-helpers.d.ts +33 -0
- package/dist/core/renderer/trees.d.ts +22 -0
- package/dist/core/serializer-markdown.d.ts +18 -0
- package/dist/core/serializer-yaml.d.ts +2 -0
- package/dist/core/source-patch.d.ts +24 -0
- package/dist/core/source.d.ts +27 -0
- package/dist/core/styles.d.ts +6 -0
- package/dist/core/suggest.d.ts +8 -0
- package/dist/core/svg-renderer.d.ts +626 -0
- package/dist/core/text-layout.d.ts +54 -0
- package/dist/core/themes.d.ts +62 -0
- package/dist/core/types.d.ts +471 -0
- package/dist/core/ui/actions.d.ts +75 -0
- package/dist/core/ui/controls.d.ts +61 -0
- package/dist/core/ui/detail-sheet.d.ts +88 -0
- package/dist/core/ui/frames.d.ts +11 -0
- package/dist/core/ui/icons.d.ts +14 -0
- package/dist/core/ui/inline-editor.d.ts +79 -0
- package/dist/core/ui/media-players.d.ts +65 -0
- package/dist/core/ui/media-viewer.d.ts +169 -0
- package/dist/core/ui/media-zoom.d.ts +51 -0
- package/dist/core/ui/note-markdown.d.ts +19 -0
- package/dist/core/ui/outline.d.ts +44 -0
- package/dist/core/url-guard.d.ts +40 -0
- package/dist/core/utils.d.ts +23 -0
- package/dist/core/web-page/page.d.ts +59 -0
- package/dist/core/web-page/runtime.d.ts +13 -0
- package/dist/core/web-page/start.d.ts +1 -0
- package/dist/core/yaml-mini.d.ts +54 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +4357 -0
- package/dist/index.js.map +29 -0
- package/dist/marked/index.d.ts +31 -0
- package/dist/marked/index.js +110 -0
- package/dist/marked/index.js.map +10 -0
- package/dist/react/index.d.ts +55 -0
- package/dist/react/index.js +352 -0
- package/dist/react/index.js.map +1 -0
- package/dist/web-page.d.ts +2 -0
- package/dist/web-page.js +130 -0
- package/llms-full.txt +2785 -0
- package/llms.txt +36 -0
- package/package.json +118 -4
- package/skills/orbit/SKILL.md +140 -0
- package/skills/orbit/references/editing.md +195 -0
- package/skills/orbit/references/extending.md +247 -0
- package/skills/orbit/references/format.md +331 -0
- package/skills/orbit/references/guide.md +546 -0
- package/skills/orbit/references/import-export.md +115 -0
- package/skills/orbit/references/languages.md +160 -0
- package/skills/orbit/references/map-tools.md +188 -0
- package/skills/orbit/references/media.md +160 -0
- package/skills/orbit/references/recipes.md +236 -0
- package/skills/orbit/references/theming.md +199 -0
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import {
|
|
2
|
+
findNodeById2,
|
|
3
|
+
hasMediaSource,
|
|
4
|
+
themeName,
|
|
5
|
+
expandTheme,
|
|
6
|
+
mergeThemes,
|
|
7
|
+
resolveThemeTokens,
|
|
8
|
+
resolvePalette,
|
|
9
|
+
documentToRendererOptions2,
|
|
10
|
+
parseOrbit2,
|
|
11
|
+
assignNodeColors,
|
|
12
|
+
buildFocusScene,
|
|
13
|
+
buildOverviewScene,
|
|
14
|
+
sceneDisplay,
|
|
15
|
+
OrbitWords,
|
|
16
|
+
resolveColor,
|
|
17
|
+
exportDisplay,
|
|
18
|
+
escapeXml,
|
|
19
|
+
MapExtensions
|
|
20
|
+
} from "./chunk-fkdfgtx9.js";
|
|
21
|
+
|
|
22
|
+
// src/core/render-to-svg.ts
|
|
23
|
+
var MAX_SVG_EXPORT_SIZE = 1e6;
|
|
24
|
+
var renderToSVGString2 = (input, options = {}) => {
|
|
25
|
+
const words = new OrbitWords(options.language, options.strings);
|
|
26
|
+
const doc = typeof input === "string" ? parseOrbit2(input, { untitled: words.text("untitledMap") }) : isDocument(input) ? input : null;
|
|
27
|
+
const tree = doc ? doc.root : input;
|
|
28
|
+
const fromDocument = doc ? documentToRendererOptions2(doc.options) : {};
|
|
29
|
+
const viewport = { width: readSize(options.width, 800, "width"), height: readSize(options.height, 600, "height") };
|
|
30
|
+
const theme = expandTheme(mergeThemes(fromDocument.theme, options.theme));
|
|
31
|
+
const tokens = resolveThemeTokens(themeName(theme), typeof theme === "object" ? theme : undefined);
|
|
32
|
+
const title = options.title ?? fromDocument.ariaLabel ?? (tree.text || words.text("mindMap"));
|
|
33
|
+
const extensions = new MapExtensions({ nodeTypes: options.nodeTypes, statuses: options.statuses, nodeTypeFor: options.nodeTypeFor });
|
|
34
|
+
const exportOptions = {
|
|
35
|
+
viewport,
|
|
36
|
+
extensions,
|
|
37
|
+
tokens,
|
|
38
|
+
showRings: options.showRings ?? fromDocument.showRings ?? true,
|
|
39
|
+
title,
|
|
40
|
+
baseUrl: options.baseUrl ?? fromDocument.baseUrl,
|
|
41
|
+
responsive: options.responsive,
|
|
42
|
+
idPrefix: options.idPrefix,
|
|
43
|
+
words
|
|
44
|
+
};
|
|
45
|
+
if (isEmptyTree(tree)) {
|
|
46
|
+
return emptyMap(exportOptions.title, words.text("emptyMap"), viewport, tokens, options.responsive);
|
|
47
|
+
}
|
|
48
|
+
const sceneOptions = {
|
|
49
|
+
viewport,
|
|
50
|
+
colors: assignNodeColors(tree, resolvePalette(options.palette ?? fromDocument.palette), (node) => extensions.color(node)),
|
|
51
|
+
maxDepth: options.maxDepth ?? fromDocument.maxDepth
|
|
52
|
+
};
|
|
53
|
+
const viewMode = options.viewMode ?? fromDocument.viewMode ?? "focus";
|
|
54
|
+
const focusId = options.focus && findNodeById2(tree, options.focus) ? options.focus : tree.id;
|
|
55
|
+
const scene = viewMode === "all" ? buildOverviewScene(tree, sceneOptions) : buildFocusScene(tree, focusId, sceneOptions);
|
|
56
|
+
return exportDisplay(sceneDisplay(scene, 0, scene.frame), exportOptions);
|
|
57
|
+
};
|
|
58
|
+
var isDocument = (input) => {
|
|
59
|
+
return typeof input.root === "object" && input.root !== null && !("children" in input);
|
|
60
|
+
};
|
|
61
|
+
var readSize = (value, fallback, name) => {
|
|
62
|
+
const size = value ?? fallback;
|
|
63
|
+
if (!Number.isFinite(size) || size <= 0 || size > MAX_SVG_EXPORT_SIZE) {
|
|
64
|
+
throw new Error(`RenderToSVGOptions.${name} must be a positive number no larger than ${MAX_SVG_EXPORT_SIZE}: got ${size}.`);
|
|
65
|
+
}
|
|
66
|
+
return size;
|
|
67
|
+
};
|
|
68
|
+
var isEmptyTree = (tree) => {
|
|
69
|
+
return tree.text.trim() === "" && !tree.icon && tree.children.length === 0 && !hasMediaSource(tree.image) && !hasMediaSource(tree.video) && !hasMediaSource(tree.embed);
|
|
70
|
+
};
|
|
71
|
+
var emptyMap = (title, message, viewport, tokens, responsive) => {
|
|
72
|
+
const { width, height } = viewport;
|
|
73
|
+
const size = responsive ? 'width="100%" height="100%"' : `width="${width}" height="${height}"`;
|
|
74
|
+
const color = resolveColor(tokens["muted-text"] ?? "#5F6B7D", tokens);
|
|
75
|
+
const font = escapeXml(tokens["font-family"] ?? "sans-serif");
|
|
76
|
+
return `<svg xmlns="http://www.w3.org/2000/svg" ${size} viewBox="0 0 ${width} ${height}" role="img" aria-label="${escapeXml(title)}">` + `<text x="${width / 2}" y="${height / 2}" text-anchor="middle" font-family="${font}" font-size="15" fill="${color}">${escapeXml(message)}</text></svg>`;
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
export { renderToSVGString2 };
|
|
80
|
+
|
|
81
|
+
//# debugId=FAD148488126235164756E2164756E21
|
|
82
|
+
//# sourceMappingURL=chunk-y748hzcr.js.map
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/core/render-to-svg.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import { MapExtensions, type OrbitNodeType, type OrbitStatusStyle } from './extensions.js';\nimport type { OrbitDocument, OrbitNode, OrbitRendererTheme, OrbitThemePreset, ViewMode } from './types.js';\nimport { parseOrbit } from './dispatch.js';\nimport { documentToRendererOptions } from './document-options.js';\nimport { findNodeById } from './utils.js';\nimport { hasMediaSource } from './media.js';\nimport { expandTheme, mergeThemes, resolvePalette, resolveThemeTokens, themeName } from './themes.js';\nimport { assignNodeColors, buildFocusScene, buildOverviewScene } from './engine/scene.js';\nimport { sceneDisplay } from './engine/display.js';\nimport { escapeXml, exportDisplay } from './engine/export.js';\nimport { resolveColor } from './engine/colors.js';\nimport { OrbitWords, type OrbitStrings } from './languages.js';\n\n/**\n * The largest width or height the exporter accepts: a million pixels, far\n * past any drawing. The label grid numbers its 64 px cells, and past about\n * 6 × 10⁹ px a side those numbers stop being exact; past about 6 × 10¹⁷ its\n * loops stop advancing and the export never finishes.\n */\nexport const MAX_SVG_EXPORT_SIZE = 1_000_000;\n\nexport interface RenderToSVGOptions {\n /** Width of the drawing, in pixels: positive, at most `MAX_SVG_EXPORT_SIZE`. Default 800. */\n width?: number;\n\n /** Height of the drawing, in pixels: positive, at most `MAX_SVG_EXPORT_SIZE`. Default 600. */\n height?: number;\n\n /** `focus` (default) or `all` for the overview. */\n viewMode?: ViewMode;\n\n /** The node at the center in focus mode, by id. Default: the root. */\n focus?: string;\n\n /** A theme name or an object of theme values. Default: the document's theme, or `paper`. */\n theme?: OrbitThemePreset | (string & {}) | OrbitRendererTheme;\n\n palette?: string[];\n maxDepth?: number;\n showRings?: boolean;\n\n /** The SVG's title and accessible name. Default: the document's title, or the root's text. */\n title?: string;\n\n /** The language of the few words the drawing has (an untitled idea, the empty map): a BCP 47 tag. Default: English. */\n language?: string;\n\n /** Words to change, over the language's. */\n strings?: Partial<OrbitStrings>;\n\n /** Resolves relative image URLs. */\n baseUrl?: string;\n\n /** Size the SVG to its container (100% wide and tall) instead of in pixels. */\n responsive?: boolean;\n\n /** Prefix for the SVG's ids; give each SVG inlined in one page its own. */\n idPrefix?: string;\n\n /** Node types by name, before the registered ones: their icons, colors and tokens. */\n nodeTypes?: Record<string, OrbitNodeType>;\n\n /** Status words and how they look, before the registered ones. */\n statuses?: Record<string, OrbitStatusStyle>;\n\n /** The type a node that names none is drawn as, for display only (see `RendererOptions.nodeTypeFor`). */\n nodeTypeFor?: (node: OrbitNode) => string | undefined;\n}\n\n/**\n * Renders a map to a standalone SVG string, without a browser: for files,\n * the command line, static sites and server rendering. It draws what the\n * renderer shows at rest, with the theme's colors resolved to plain values\n * and the labels as SVG text.\n *\n * @example\n * ```ts\n * import { renderToSVGString } from '@restless-dreams/orbit';\n *\n * const svg = renderToSVGString('# Launch\\n## Research\\n## Build', { width: 1200, height: 800, theme: 'cosmos' });\n * ```\n */\nexport const renderToSVGString = (input: string | OrbitDocument | OrbitNode, options: RenderToSVGOptions = {}): string => {\n const words = new OrbitWords(options.language, options.strings);\n const doc: OrbitDocument | null = typeof input === 'string' ? parseOrbit(input, { untitled: words.text('untitledMap') }) : isDocument(input) ? input : null;\n const tree = doc ? doc.root : (input as OrbitNode);\n const fromDocument = doc ? documentToRendererOptions(doc.options) : {};\n const viewport = { width: readSize(options.width, 800, 'width'), height: readSize(options.height, 600, 'height') };\n const theme = expandTheme(mergeThemes(fromDocument.theme, options.theme));\n const tokens: Record<string, string> = resolveThemeTokens(themeName(theme), typeof theme === 'object' ? theme : undefined);\n const title = options.title ?? fromDocument.ariaLabel ?? (tree.text || words.text('mindMap'));\n const extensions = new MapExtensions({ nodeTypes: options.nodeTypes, statuses: options.statuses, nodeTypeFor: options.nodeTypeFor });\n const exportOptions = {\n viewport,\n extensions,\n tokens,\n showRings: options.showRings ?? fromDocument.showRings ?? true,\n title,\n baseUrl: options.baseUrl ?? fromDocument.baseUrl,\n responsive: options.responsive,\n idPrefix: options.idPrefix,\n words,\n };\n\n if (isEmptyTree(tree)) {\n return emptyMap(exportOptions.title, words.text('emptyMap'), viewport, tokens, options.responsive);\n }\n\n const sceneOptions = {\n viewport,\n colors: assignNodeColors(tree, resolvePalette(options.palette ?? fromDocument.palette), (node) => extensions.color(node)),\n maxDepth: options.maxDepth ?? fromDocument.maxDepth,\n };\n const viewMode = options.viewMode ?? fromDocument.viewMode ?? 'focus';\n const focusId = options.focus && findNodeById(tree, options.focus) ? options.focus : tree.id;\n const scene = viewMode === 'all' ? buildOverviewScene(tree, sceneOptions) : buildFocusScene(tree, focusId, sceneOptions);\n return exportDisplay(sceneDisplay(scene, 0, scene.frame), exportOptions);\n};\n\nconst isDocument = (input: OrbitDocument | OrbitNode): input is OrbitDocument => {\n return typeof (input as OrbitDocument).root === 'object' && (input as OrbitDocument).root !== null && !('children' in input);\n};\n\nconst readSize = (value: number | undefined, fallback: number, name: 'width' | 'height'): number => {\n const size = value ?? fallback;\n\n if (!Number.isFinite(size) || size <= 0 || size > MAX_SVG_EXPORT_SIZE) {\n throw new Error(`RenderToSVGOptions.${name} must be a positive number no larger than ${MAX_SVG_EXPORT_SIZE}: got ${size}.`);\n }\n\n return size;\n};\n\nconst isEmptyTree = (tree: OrbitNode): boolean => {\n return tree.text.trim() === '' && !tree.icon && tree.children.length === 0\n && !hasMediaSource(tree.image) && !hasMediaSource(tree.video) && !hasMediaSource(tree.embed);\n};\n\nconst emptyMap = (title: string, message: string, viewport: { width: number; height: number }, tokens: Record<string, string>, responsive?: boolean): string => {\n const { width, height } = viewport;\n const size = responsive ? 'width=\"100%\" height=\"100%\"' : `width=\"${width}\" height=\"${height}\"`;\n const color = resolveColor(tokens['muted-text'] ?? '#5F6B7D', tokens);\n const font = escapeXml(tokens['font-family'] ?? 'sans-serif');\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" ${size} viewBox=\"0 0 ${width} ${height}\" role=\"img\" aria-label=\"${escapeXml(title)}\">`\n + `<text x=\"${width / 2}\" y=\"${height / 2}\" text-anchor=\"middle\" font-family=\"${font}\" font-size=\"15\" fill=\"${color}\">${escapeXml(message)}</text></svg>`;\n};\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "FAD148488126235164756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -0,0 +1,408 @@
|
|
|
1
|
+
import {
|
|
2
|
+
OrbitParseError2,
|
|
3
|
+
reportParseDiagnostics,
|
|
4
|
+
didYouMean,
|
|
5
|
+
isThemeName2,
|
|
6
|
+
themeNames2,
|
|
7
|
+
mergeThemes,
|
|
8
|
+
THEME_SYNONYMS,
|
|
9
|
+
parseOrbit2,
|
|
10
|
+
wordsFor,
|
|
11
|
+
OrbitSVGRenderer2
|
|
12
|
+
} from "./chunk-fkdfgtx9.js";
|
|
13
|
+
|
|
14
|
+
// src/core/auto-render.ts
|
|
15
|
+
var DEFAULT_SELECTOR = ".orbit-mind-map[data-orbit], pre > code.language-orbit, pre.orbit-rendered[data-orbit-source], orbit-map";
|
|
16
|
+
var DEFAULT_HEIGHT = 420;
|
|
17
|
+
var ELEMENT_STYLES = `
|
|
18
|
+
:host {
|
|
19
|
+
display: block;
|
|
20
|
+
position: relative;
|
|
21
|
+
height: var(--orbit-map-height, ${DEFAULT_HEIGHT}px);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
:host([hidden]) {
|
|
25
|
+
display: none;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
.map {
|
|
29
|
+
width: 100%;
|
|
30
|
+
height: 100%;
|
|
31
|
+
}
|
|
32
|
+
`;
|
|
33
|
+
var renderOrbitElement2 = (element, options = {}) => {
|
|
34
|
+
if (isOrbitMapElement(element)) {
|
|
35
|
+
element.refresh();
|
|
36
|
+
return element.renderer;
|
|
37
|
+
}
|
|
38
|
+
const target = getRenderTarget(element);
|
|
39
|
+
const source = getOrbitSource(element, target);
|
|
40
|
+
if (!source.trim()) {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
OrbitSVGRenderer2.unmount(target);
|
|
44
|
+
target.setAttribute("data-orbit-source", source);
|
|
45
|
+
const elementOptions = readElementOptions(element);
|
|
46
|
+
const settings = { ...elementOptions, ...definedOnly(options), theme: mergeThemes(elementOptions.theme, options.theme) };
|
|
47
|
+
return renderSource(target, source, settings, element, (doc, settings) => {
|
|
48
|
+
target.classList.add("orbit-rendered");
|
|
49
|
+
applyClassNames(target, settings.className ?? doc.options.className);
|
|
50
|
+
if (typeof getComputedStyle === "function" && getComputedStyle(target).display === "inline") {
|
|
51
|
+
target.style.display = "block";
|
|
52
|
+
}
|
|
53
|
+
const height = settings.height ?? doc.options.height;
|
|
54
|
+
if (height) {
|
|
55
|
+
target.style.minHeight = `${height}px`;
|
|
56
|
+
} else if (!target.style.minHeight) {
|
|
57
|
+
target.style.minHeight = `${DEFAULT_HEIGHT}px`;
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
};
|
|
61
|
+
var renderOrbitMarkdownBlocks2 = (root, options = {}) => {
|
|
62
|
+
const searchRoot = root ?? (typeof document === "undefined" ? undefined : document);
|
|
63
|
+
if (!searchRoot) {
|
|
64
|
+
return [];
|
|
65
|
+
}
|
|
66
|
+
const renderers = [];
|
|
67
|
+
for (const element of Array.from(searchRoot.querySelectorAll(options.selector || DEFAULT_SELECTOR))) {
|
|
68
|
+
try {
|
|
69
|
+
const renderer = renderOrbitElement2(element, options);
|
|
70
|
+
if (renderer) {
|
|
71
|
+
renderers.push(renderer);
|
|
72
|
+
}
|
|
73
|
+
} catch (error) {
|
|
74
|
+
showRenderError(getRenderTarget(element), element, error, [], wordsFor(options.language, element, options.strings));
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return renderers;
|
|
78
|
+
};
|
|
79
|
+
var defineOrbitMapElement2 = (tagName = "orbit-map") => {
|
|
80
|
+
if (typeof window === "undefined" || typeof customElements === "undefined") {
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
if (customElements.get(tagName)) {
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
customElements.define(tagName, createOrbitMapElementClass());
|
|
87
|
+
};
|
|
88
|
+
var createOrbitMapElementClass = () => {
|
|
89
|
+
return class OrbitMapElementImplementation extends HTMLElement {
|
|
90
|
+
#renderer = null;
|
|
91
|
+
#mapContainer = null;
|
|
92
|
+
#observer = null;
|
|
93
|
+
#refreshQueued = false;
|
|
94
|
+
#renderedSource = null;
|
|
95
|
+
#documentHeight;
|
|
96
|
+
static get observedAttributes() {
|
|
97
|
+
const options = ["view-mode", "height", "palette", "interactive", "animation", "theme", "max-depth", "editable", "editing-keys"];
|
|
98
|
+
return ["data-orbit", "source", "lang", ...options.flatMap((name) => [name, `data-${name}`])];
|
|
99
|
+
}
|
|
100
|
+
get renderer() {
|
|
101
|
+
return this.#renderer;
|
|
102
|
+
}
|
|
103
|
+
flyTo(nodeId) {
|
|
104
|
+
return this.#renderer?.flyTo(nodeId) ?? false;
|
|
105
|
+
}
|
|
106
|
+
overview() {
|
|
107
|
+
this.#renderer?.overview();
|
|
108
|
+
}
|
|
109
|
+
openMedia(nodeId, options) {
|
|
110
|
+
return this.#renderer?.openMedia(nodeId, options) ?? false;
|
|
111
|
+
}
|
|
112
|
+
closeMedia() {
|
|
113
|
+
this.#renderer?.closeMedia();
|
|
114
|
+
}
|
|
115
|
+
playMedia() {
|
|
116
|
+
return this.#renderer?.playMedia() ?? false;
|
|
117
|
+
}
|
|
118
|
+
pauseMedia() {
|
|
119
|
+
return this.#renderer?.pauseMedia() ?? false;
|
|
120
|
+
}
|
|
121
|
+
seekMedia(seconds) {
|
|
122
|
+
return this.#renderer?.seekMedia(seconds) ?? false;
|
|
123
|
+
}
|
|
124
|
+
unmuteMedia() {
|
|
125
|
+
return this.#renderer?.unmuteMedia() ?? false;
|
|
126
|
+
}
|
|
127
|
+
get source() {
|
|
128
|
+
return readOrbitMapSource(this);
|
|
129
|
+
}
|
|
130
|
+
set source(value) {
|
|
131
|
+
this.setAttribute("source", value);
|
|
132
|
+
}
|
|
133
|
+
connectedCallback() {
|
|
134
|
+
this.#ensureShadowRoot();
|
|
135
|
+
this.#observeContent();
|
|
136
|
+
this.refresh();
|
|
137
|
+
}
|
|
138
|
+
disconnectedCallback() {
|
|
139
|
+
this.#observer?.disconnect();
|
|
140
|
+
this.#observer = null;
|
|
141
|
+
this.#renderer?.destroy();
|
|
142
|
+
this.#renderer = null;
|
|
143
|
+
this.#renderedSource = null;
|
|
144
|
+
}
|
|
145
|
+
attributeChangedCallback(name, oldValue, newValue) {
|
|
146
|
+
if (!this.isConnected || oldValue === newValue) {
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
if (name === "height" || name === "data-height") {
|
|
150
|
+
this.#applyHeight(this.#documentHeight);
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
if (name === "data-orbit" || name === "source" || !this.#renderer) {
|
|
154
|
+
this.refresh();
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
this.#renderer.setOptions(readElementOptions(this));
|
|
158
|
+
}
|
|
159
|
+
refresh() {
|
|
160
|
+
const container = this.#mapContainer;
|
|
161
|
+
if (!container) {
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
const source = readOrbitMapSource(this);
|
|
165
|
+
if (source === this.#renderedSource && (this.#renderer || container.hasChildNodes())) {
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
this.#renderedSource = source;
|
|
169
|
+
const applyDocument = (doc) => {
|
|
170
|
+
this.#documentHeight = doc.options.height;
|
|
171
|
+
this.#applyHeight(doc.options.height);
|
|
172
|
+
applyClassNames(this, doc.options.className);
|
|
173
|
+
};
|
|
174
|
+
const renderer = this.#renderer;
|
|
175
|
+
if (renderer && source.trim()) {
|
|
176
|
+
const options = readElementOptions(this);
|
|
177
|
+
const parsed = parseSource(source, options, wordsFor(options.language, this, options.strings));
|
|
178
|
+
if (parsed.doc) {
|
|
179
|
+
applyDocument(parsed.doc);
|
|
180
|
+
renderer.render(parsed.doc);
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
this.#renderer?.destroy();
|
|
185
|
+
this.#renderer = null;
|
|
186
|
+
container.replaceChildren();
|
|
187
|
+
if (!source.trim()) {
|
|
188
|
+
this.#documentHeight = undefined;
|
|
189
|
+
this.#applyHeight(undefined);
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
this.#renderer = renderSource(container, source, readElementOptions(this), this, applyDocument);
|
|
193
|
+
}
|
|
194
|
+
#ensureShadowRoot() {
|
|
195
|
+
if (this.#mapContainer) {
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
const root = this.shadowRoot ?? this.attachShadow({ mode: "open" });
|
|
199
|
+
const style = document.createElement("style");
|
|
200
|
+
style.textContent = ELEMENT_STYLES;
|
|
201
|
+
const container = document.createElement("div");
|
|
202
|
+
container.className = "map";
|
|
203
|
+
container.setAttribute("part", "map");
|
|
204
|
+
root.replaceChildren(style, container);
|
|
205
|
+
this.#mapContainer = container;
|
|
206
|
+
}
|
|
207
|
+
#observeContent() {
|
|
208
|
+
if (this.#observer || typeof MutationObserver === "undefined") {
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
this.#observer = new MutationObserver(() => this.#queueRefresh());
|
|
212
|
+
this.#observer.observe(this, { childList: true, characterData: true, subtree: true });
|
|
213
|
+
}
|
|
214
|
+
#queueRefresh() {
|
|
215
|
+
if (this.#refreshQueued) {
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
this.#refreshQueued = true;
|
|
219
|
+
queueMicrotask(() => {
|
|
220
|
+
this.#refreshQueued = false;
|
|
221
|
+
if (this.isConnected) {
|
|
222
|
+
this.refresh();
|
|
223
|
+
}
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
#applyHeight(documentHeight) {
|
|
227
|
+
const height = readNumber(this.getAttribute("height") ?? this.getAttribute("data-height")) ?? documentHeight;
|
|
228
|
+
if (height) {
|
|
229
|
+
this.style.setProperty("--orbit-map-height", `${height}px`);
|
|
230
|
+
} else {
|
|
231
|
+
this.style.removeProperty("--orbit-map-height");
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
};
|
|
235
|
+
};
|
|
236
|
+
var isOrbitMapElement = (element) => {
|
|
237
|
+
return typeof element.refresh === "function" && "renderer" in element;
|
|
238
|
+
};
|
|
239
|
+
var parseSource = (source, options, words) => {
|
|
240
|
+
let doc;
|
|
241
|
+
try {
|
|
242
|
+
doc = parseOrbit2(source, { strict: options.strict ?? false, untitled: words.text("untitledMap") });
|
|
243
|
+
} catch (error) {
|
|
244
|
+
return { error, diagnostics: [] };
|
|
245
|
+
}
|
|
246
|
+
const blocking = (doc.diagnostics ?? []).filter((diagnostic) => diagnostic.severity === "error");
|
|
247
|
+
if (blocking.length > 0 && doc.root.children.length === 0 && doc.root.text === "") {
|
|
248
|
+
return { error: null, diagnostics: blocking };
|
|
249
|
+
}
|
|
250
|
+
reportParseDiagnostics(doc);
|
|
251
|
+
return { doc };
|
|
252
|
+
};
|
|
253
|
+
var renderSource = (target, source, options, eventTarget, applyDocument) => {
|
|
254
|
+
const words = wordsFor(options.language, eventTarget, options.strings);
|
|
255
|
+
const parsed = parseSource(source, options, words);
|
|
256
|
+
if (!parsed.doc) {
|
|
257
|
+
showRenderError(target, eventTarget, parsed.error, parsed.diagnostics, words);
|
|
258
|
+
return null;
|
|
259
|
+
}
|
|
260
|
+
const doc = parsed.doc;
|
|
261
|
+
target.replaceChildren();
|
|
262
|
+
target.removeAttribute("data-orbit-error");
|
|
263
|
+
applyDocument(doc, options);
|
|
264
|
+
const renderer = new OrbitSVGRenderer2(target, options);
|
|
265
|
+
renderer.render(doc);
|
|
266
|
+
return renderer;
|
|
267
|
+
};
|
|
268
|
+
var showRenderError = (target, eventTarget, error, diagnostics, words) => {
|
|
269
|
+
const first = diagnostics[0];
|
|
270
|
+
const line = error instanceof OrbitParseError2 ? error.line : first?.line;
|
|
271
|
+
const message = error ? error.message.replace(/ at line \d+$/, "") : first?.message ?? words.text("mapNotDrawnReason");
|
|
272
|
+
const detail = { message, line, error, diagnostics };
|
|
273
|
+
target.replaceChildren(buildErrorCard(message, line, words));
|
|
274
|
+
target.setAttribute("data-orbit-error", "");
|
|
275
|
+
if (typeof console !== "undefined") {
|
|
276
|
+
console.error(`[orbit] ${line === undefined ? "" : `line ${line}: `}${message}`);
|
|
277
|
+
}
|
|
278
|
+
eventTarget.dispatchEvent(new CustomEvent("orbit-error", { detail, bubbles: true, composed: true }));
|
|
279
|
+
};
|
|
280
|
+
var buildErrorCard = (message, line, words) => {
|
|
281
|
+
const card = document.createElement("div");
|
|
282
|
+
card.setAttribute("role", "alert");
|
|
283
|
+
card.className = "orbit-error";
|
|
284
|
+
card.style.cssText = [
|
|
285
|
+
"box-sizing:border-box",
|
|
286
|
+
"margin:12px",
|
|
287
|
+
"padding:14px 16px",
|
|
288
|
+
"border:1px dashed var(--orbit-error-border, #E58A8A)",
|
|
289
|
+
"border-radius:12px",
|
|
290
|
+
"background:var(--orbit-error-background, #FFF6F5)",
|
|
291
|
+
"color:var(--orbit-error-text, #7A1F1F)",
|
|
292
|
+
"font:14px/1.45 var(--orbit-font-family, var(--orbit-sans-font, ui-sans-serif, system-ui, sans-serif))"
|
|
293
|
+
].join(";");
|
|
294
|
+
const title = document.createElement("strong");
|
|
295
|
+
title.textContent = words.text("mapNotDrawn");
|
|
296
|
+
title.style.display = "block";
|
|
297
|
+
const description = document.createElement("span");
|
|
298
|
+
description.textContent = line === undefined ? message : words.text("problemOnLine", { line, message });
|
|
299
|
+
card.append(title, description);
|
|
300
|
+
return card;
|
|
301
|
+
};
|
|
302
|
+
var readOrbitMapSource = (element) => {
|
|
303
|
+
const attribute = element.getAttribute("source") ?? element.getAttribute("data-orbit");
|
|
304
|
+
if (attribute !== null) {
|
|
305
|
+
return attribute;
|
|
306
|
+
}
|
|
307
|
+
const script = Array.from(element.children).find((child) => child.tagName === "SCRIPT" && /orbit|markdown|yaml/i.test(child.getAttribute("type") ?? ""));
|
|
308
|
+
if (script) {
|
|
309
|
+
return script.textContent ?? "";
|
|
310
|
+
}
|
|
311
|
+
return serializeContent(element);
|
|
312
|
+
};
|
|
313
|
+
var getOrbitSource = (element, target) => {
|
|
314
|
+
return element.getAttribute("data-orbit") || element.getAttribute("source") || target.getAttribute("data-orbit-source") || serializeContent(element);
|
|
315
|
+
};
|
|
316
|
+
var serializeContent = (element) => {
|
|
317
|
+
let source = "";
|
|
318
|
+
for (const node of Array.from(element.childNodes)) {
|
|
319
|
+
if (node.nodeType === 3) {
|
|
320
|
+
source += node.data;
|
|
321
|
+
} else if (node.nodeType === 8) {
|
|
322
|
+
source += `<!--${node.data}-->`;
|
|
323
|
+
} else if (node.nodeType === 1) {
|
|
324
|
+
source += node.outerHTML;
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
return source;
|
|
328
|
+
};
|
|
329
|
+
var getRenderTarget = (element) => {
|
|
330
|
+
if (element.matches("code.language-orbit") && element.parentElement) {
|
|
331
|
+
return element.parentElement;
|
|
332
|
+
}
|
|
333
|
+
return element;
|
|
334
|
+
};
|
|
335
|
+
var readViewMode = (value) => {
|
|
336
|
+
return value === "focus" || value === "all" ? value : undefined;
|
|
337
|
+
};
|
|
338
|
+
var readTheme = (value) => {
|
|
339
|
+
if (isThemeName2(value)) {
|
|
340
|
+
return value;
|
|
341
|
+
}
|
|
342
|
+
if (typeof value === "string" && value !== "") {
|
|
343
|
+
console.warn(`[orbit] Unknown theme "${value}" on <orbit-map>, so it's left out. Themes: ${themeNames2().join(", ")}.${didYouMean(value, themeNames2(), THEME_SYNONYMS)}`);
|
|
344
|
+
}
|
|
345
|
+
return;
|
|
346
|
+
};
|
|
347
|
+
var readElementOptions = (element) => {
|
|
348
|
+
const attribute = (name) => element.getAttribute(name) ?? element.getAttribute(`data-${name}`);
|
|
349
|
+
return {
|
|
350
|
+
viewMode: readViewMode(attribute("view-mode") || undefined),
|
|
351
|
+
theme: readTheme(attribute("theme")),
|
|
352
|
+
height: readNumber(attribute("height")),
|
|
353
|
+
maxDepth: readNumber(attribute("max-depth")),
|
|
354
|
+
palette: readList(attribute("palette")),
|
|
355
|
+
interactive: readBoolean(attribute("interactive")),
|
|
356
|
+
orbitAnimation: readBoolean(attribute("animation")),
|
|
357
|
+
editable: readBoolean(attribute("editable")),
|
|
358
|
+
editingKeys: readBoolean(attribute("editing-keys"))
|
|
359
|
+
};
|
|
360
|
+
};
|
|
361
|
+
var readNumber = (value) => {
|
|
362
|
+
if (!value) {
|
|
363
|
+
return;
|
|
364
|
+
}
|
|
365
|
+
const number = Number(value);
|
|
366
|
+
return Number.isFinite(number) ? number : undefined;
|
|
367
|
+
};
|
|
368
|
+
var readBoolean = (value) => {
|
|
369
|
+
if (value === null) {
|
|
370
|
+
return;
|
|
371
|
+
}
|
|
372
|
+
const normalized = value.trim().toLowerCase();
|
|
373
|
+
if (normalized === "" || normalized === "true" || normalized === "1") {
|
|
374
|
+
return true;
|
|
375
|
+
}
|
|
376
|
+
if (normalized === "false" || normalized === "0") {
|
|
377
|
+
return false;
|
|
378
|
+
}
|
|
379
|
+
return;
|
|
380
|
+
};
|
|
381
|
+
var readList = (value) => {
|
|
382
|
+
if (!value) {
|
|
383
|
+
return;
|
|
384
|
+
}
|
|
385
|
+
return value.split(",").map((item) => item.trim()).filter(Boolean);
|
|
386
|
+
};
|
|
387
|
+
var definedOnly = (options) => {
|
|
388
|
+
return Object.fromEntries(Object.entries(options).filter(([, value]) => value !== undefined));
|
|
389
|
+
};
|
|
390
|
+
var appliedClassNames = new WeakMap;
|
|
391
|
+
var applyClassNames = (element, className) => {
|
|
392
|
+
const previous = appliedClassNames.get(element) ?? [];
|
|
393
|
+
const next = className?.split(/\s+/).filter(Boolean) ?? [];
|
|
394
|
+
const added = next.filter((name) => previous.includes(name) || !element.classList.contains(name));
|
|
395
|
+
const stale = previous.filter((name) => !next.includes(name));
|
|
396
|
+
if (stale.length > 0) {
|
|
397
|
+
element.classList.remove(...stale);
|
|
398
|
+
}
|
|
399
|
+
if (next.length > 0) {
|
|
400
|
+
element.classList.add(...next);
|
|
401
|
+
}
|
|
402
|
+
appliedClassNames.set(element, added);
|
|
403
|
+
};
|
|
404
|
+
|
|
405
|
+
export { renderOrbitElement2, renderOrbitMarkdownBlocks2, defineOrbitMapElement2 };
|
|
406
|
+
|
|
407
|
+
//# debugId=46D6FAE5FFE8EFBC64756E2164756E21
|
|
408
|
+
//# sourceMappingURL=chunk-zze4tc9n.js.map
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/core/auto-render.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import { parseOrbit } from './dispatch.js';\nimport { OrbitSVGRenderer } from './svg-renderer.js';\nimport type { OrbitDocument, OrbitMediaOptions, RendererOptions } from './types.js';\nimport { OrbitParseError, reportParseDiagnostics, type OrbitDiagnostic } from './diagnostics.js';\nimport { isThemeName, mergeThemes, themeNames } from './themes.js';\nimport { THEME_SYNONYMS } from './document-options.js';\nimport { didYouMean } from './suggest.js';\nimport { wordsFor, type OrbitWords } from './languages.js';\n\nexport interface AutoRenderOptions extends RendererOptions {\n selector?: string;\n height?: number;\n strict?: boolean;\n className?: string;\n}\n\n/** Detail of the `orbit-error` event dispatched on an element whose map couldn't be drawn. */\nexport interface OrbitRenderErrorDetail {\n message: string;\n line?: number;\n error: Error | null;\n diagnostics: OrbitDiagnostic[];\n}\n\n/**\n * The `<orbit-map>` element's API, for code that holds a reference to one.\n * It also dispatches the map's events (`orbit-focus-change`,\n * `orbit-view-mode-change`, `orbit-node-click`, `orbit-action`,\n * `orbit-spin-settle`, `orbit-media-open`, `orbit-media-close`,\n * `orbit-media-state` and the rest) and `orbit-error`.\n */\nexport interface OrbitMapElement extends HTMLElement {\n /** The markdown or YAML the map is drawn from. Setting it updates the `source` attribute. */\n source: string;\n\n /** The renderer drawing the map, or null before the first render or after an error. */\n readonly renderer: OrbitSVGRenderer | null;\n\n /** Re-reads the source and redraws the map, keeping the reader's place when it can. */\n refresh(): void;\n\n /** Flies to a node by id, in focus mode. Returns false when the map has no such node. */\n flyTo(nodeId: string): boolean;\n\n /** Flies out to the overview of the whole map. */\n overview(): void;\n\n /** Shows a node's picture or video in the media viewer (see `OrbitSVGRenderer.openMedia`). Returns false when there's nothing to show. */\n openMedia(nodeId: string, options?: OrbitMediaOptions): boolean;\n\n /** Closes the media viewer. */\n closeMedia(): void;\n\n /** Plays the video in the media viewer. Returns false when it shows none it can play. */\n playMedia(): boolean;\n\n /** Pauses the video in the media viewer. Returns false when it shows none it can pause. */\n pauseMedia(): boolean;\n\n /** Moves the video in the media viewer to `seconds` from its start. Returns false when it shows none it can move. */\n seekMedia(seconds: number): boolean;\n\n /** Turns on the sound of the video in the media viewer, from a press. Returns false when it shows none it can drive. */\n unmuteMedia(): boolean;\n}\n\nconst DEFAULT_SELECTOR = '.orbit-mind-map[data-orbit], pre > code.language-orbit, pre.orbit-rendered[data-orbit-source], orbit-map';\nconst DEFAULT_HEIGHT = 420;\n\nconst ELEMENT_STYLES = `\n:host {\n display: block;\n position: relative;\n height: var(--orbit-map-height, ${DEFAULT_HEIGHT}px);\n}\n\n:host([hidden]) {\n display: none;\n}\n\n.map {\n width: 100%;\n height: 100%;\n}\n`;\n\n/**\n * Renders an orbit map into the given element. Problems in the document never\n * throw: parse warnings go to the console, and a map that can't be drawn is\n * replaced by an error card and an `orbit-error` event on the element.\n *\n * Callers who later detach the element should invoke\n * `OrbitSVGRenderer.unmount(element)` to release RAF loops and the\n * ResizeObserver. The `<orbit-map>` web component does this automatically.\n */\nexport const renderOrbitElement = (element: Element, options: AutoRenderOptions = {}): OrbitSVGRenderer | null => {\n if (isOrbitMapElement(element)) {\n element.refresh();\n return element.renderer;\n }\n\n const target = getRenderTarget(element) as HTMLElement;\n const source = getOrbitSource(element, target);\n\n if (!source.trim()) {\n return null;\n }\n\n OrbitSVGRenderer.unmount(target);\n target.setAttribute('data-orbit-source', source);\n const elementOptions = readElementOptions(element);\n const settings = { ...elementOptions, ...definedOnly(options), theme: mergeThemes(elementOptions.theme, options.theme) };\n\n return renderSource(target, source, settings, element, (doc, settings) => {\n target.classList.add('orbit-rendered');\n applyClassNames(target, settings.className ?? doc.options.className);\n\n if (typeof getComputedStyle === 'function' && getComputedStyle(target).display === 'inline') {\n target.style.display = 'block';\n }\n\n const height = settings.height ?? doc.options.height;\n\n if (height) {\n target.style.minHeight = `${height}px`;\n } else if (!target.style.minHeight) {\n target.style.minHeight = `${DEFAULT_HEIGHT}px`;\n }\n });\n};\n\n/**\n * Renders every orbit block under `root` (default: the whole document). Each\n * block is independent: one that fails shows its error card and the rest\n * still render.\n */\nexport const renderOrbitMarkdownBlocks = (root?: ParentNode, options: AutoRenderOptions = {}): OrbitSVGRenderer[] => {\n const searchRoot = root ?? (typeof document === 'undefined' ? undefined : document);\n\n if (!searchRoot) {\n return [];\n }\n\n const renderers: OrbitSVGRenderer[] = [];\n\n for (const element of Array.from(searchRoot.querySelectorAll(options.selector || DEFAULT_SELECTOR))) {\n try {\n const renderer = renderOrbitElement(element, options);\n\n if (renderer) {\n renderers.push(renderer);\n }\n } catch (error) {\n showRenderError(getRenderTarget(element), element, error as Error, [], wordsFor(options.language, element, options.strings));\n }\n }\n\n return renderers;\n};\n\n/**\n * Registers the `<orbit-map>` element. Write the map as the element's\n * content (indent it however you like, `<!-- orbit … -->` comments included),\n * inside a `<script type=\"text/orbit\">` child, or in a `source` attribute.\n * The map renders in a shadow root, so the raw markdown is never displayed,\n * and it redraws when the content or an attribute changes.\n *\n * @example\n * ```html\n * <script type=\"module\">\n * import { defineOrbitMapElement } from '@restless-dreams/orbit';\n * defineOrbitMapElement();\n * </script>\n *\n * <orbit-map height=\"420\" theme=\"night\">\n * # Launch\n * ## Research <!-- orbit status: active -->\n * ## Build\n * </orbit-map>\n * ```\n */\nexport const defineOrbitMapElement = (tagName = 'orbit-map'): void => {\n if (typeof window === 'undefined' || typeof customElements === 'undefined') {\n return;\n }\n\n if (customElements.get(tagName)) {\n return;\n }\n\n customElements.define(tagName, createOrbitMapElementClass());\n};\n\nconst createOrbitMapElementClass = (): CustomElementConstructor => {\n // Declared lazily so importing this module never touches HTMLElement on a server.\n return class OrbitMapElementImplementation extends HTMLElement implements OrbitMapElement {\n #renderer: OrbitSVGRenderer | null = null;\n #mapContainer: HTMLDivElement | null = null;\n #observer: MutationObserver | null = null;\n #refreshQueued = false;\n #renderedSource: string | null = null;\n #documentHeight: number | undefined;\n\n static get observedAttributes(): string[] {\n const options = ['view-mode', 'height', 'palette', 'interactive', 'animation', 'theme', 'max-depth', 'editable', 'editing-keys'];\n // `lang` changes the language the map speaks, as on any element.\n return ['data-orbit', 'source', 'lang', ...options.flatMap((name) => [name, `data-${name}`])];\n }\n\n get renderer(): OrbitSVGRenderer | null {\n return this.#renderer;\n }\n\n flyTo(nodeId: string): boolean {\n return this.#renderer?.flyTo(nodeId) ?? false;\n }\n\n overview(): void {\n this.#renderer?.overview();\n }\n\n openMedia(nodeId: string, options?: OrbitMediaOptions): boolean {\n return this.#renderer?.openMedia(nodeId, options) ?? false;\n }\n\n closeMedia(): void {\n this.#renderer?.closeMedia();\n }\n\n playMedia(): boolean {\n return this.#renderer?.playMedia() ?? false;\n }\n\n pauseMedia(): boolean {\n return this.#renderer?.pauseMedia() ?? false;\n }\n\n seekMedia(seconds: number): boolean {\n return this.#renderer?.seekMedia(seconds) ?? false;\n }\n\n unmuteMedia(): boolean {\n return this.#renderer?.unmuteMedia() ?? false;\n }\n\n get source(): string {\n return readOrbitMapSource(this);\n }\n\n set source(value: string) {\n this.setAttribute('source', value);\n }\n\n connectedCallback(): void {\n this.#ensureShadowRoot();\n this.#observeContent();\n this.refresh();\n }\n\n disconnectedCallback(): void {\n this.#observer?.disconnect();\n this.#observer = null;\n this.#renderer?.destroy();\n this.#renderer = null;\n this.#renderedSource = null;\n }\n\n attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void {\n if (!this.isConnected || oldValue === newValue) {\n return;\n }\n\n if (name === 'height' || name === 'data-height') {\n this.#applyHeight(this.#documentHeight);\n return;\n }\n\n if (name === 'data-orbit' || name === 'source' || !this.#renderer) {\n this.refresh();\n return;\n }\n\n // An absent attribute reads as undefined, which falls back to the\n // document's frontmatter instead of wiping it.\n this.#renderer.setOptions(readElementOptions(this));\n }\n\n refresh(): void {\n const container = this.#mapContainer;\n\n if (!container) {\n return;\n }\n\n const source = readOrbitMapSource(this);\n\n if (source === this.#renderedSource && (this.#renderer || container.hasChildNodes())) {\n return;\n }\n\n this.#renderedSource = source;\n\n const applyDocument = (doc: OrbitDocument) => {\n this.#documentHeight = doc.options.height;\n this.#applyHeight(doc.options.height);\n applyClassNames(this, doc.options.className);\n };\n\n // An edit redraws the existing map, so the reader keeps their place.\n const renderer = this.#renderer;\n\n if (renderer && source.trim()) {\n const options = readElementOptions(this);\n const parsed = parseSource(source, options, wordsFor(options.language, this, options.strings));\n\n if (parsed.doc) {\n applyDocument(parsed.doc);\n renderer.render(parsed.doc);\n return;\n }\n }\n\n this.#renderer?.destroy();\n this.#renderer = null;\n container.replaceChildren();\n\n if (!source.trim()) {\n this.#documentHeight = undefined;\n this.#applyHeight(undefined);\n return;\n }\n\n this.#renderer = renderSource(container, source, readElementOptions(this), this, applyDocument);\n }\n\n #ensureShadowRoot(): void {\n if (this.#mapContainer) {\n return;\n }\n\n const root = this.shadowRoot ?? this.attachShadow({ mode: 'open' });\n const style = document.createElement('style');\n style.textContent = ELEMENT_STYLES;\n const container = document.createElement('div');\n container.className = 'map';\n container.setAttribute('part', 'map');\n root.replaceChildren(style, container);\n this.#mapContainer = container;\n }\n\n #observeContent(): void {\n if (this.#observer || typeof MutationObserver === 'undefined') {\n return;\n }\n\n // Also covers an element upgraded before the parser reached its content.\n this.#observer = new MutationObserver(() => this.#queueRefresh());\n this.#observer.observe(this, { childList: true, characterData: true, subtree: true });\n }\n\n #queueRefresh(): void {\n if (this.#refreshQueued) {\n return;\n }\n\n this.#refreshQueued = true;\n\n queueMicrotask(() => {\n this.#refreshQueued = false;\n\n if (this.isConnected) {\n this.refresh();\n }\n });\n }\n\n /** The `height` attribute wins over the document's frontmatter; author CSS wins over both. */\n #applyHeight(documentHeight: number | undefined): void {\n const height = readNumber(this.getAttribute('height') ?? this.getAttribute('data-height')) ?? documentHeight;\n\n if (height) {\n this.style.setProperty('--orbit-map-height', `${height}px`);\n } else {\n this.style.removeProperty('--orbit-map-height');\n }\n }\n };\n};\n\nconst isOrbitMapElement = (element: Element): element is OrbitMapElement => {\n return typeof (element as Partial<OrbitMapElement>).refresh === 'function' && 'renderer' in element;\n};\n\n/** Parses a map's source; a document that can't be drawn comes back as an error instead. */\nconst parseSource = (\n source: string,\n options: AutoRenderOptions,\n words: OrbitWords,\n): { doc: OrbitDocument; error?: undefined; diagnostics?: undefined } | { doc?: undefined; error: Error | null; diagnostics: OrbitDiagnostic[] } => {\n let doc: OrbitDocument;\n\n try {\n doc = parseOrbit(source, { strict: options.strict ?? false, untitled: words.text('untitledMap') });\n } catch (error) {\n return { error: error as Error, diagnostics: [] };\n }\n\n const blocking = (doc.diagnostics ?? []).filter((diagnostic) => diagnostic.severity === 'error');\n\n if (blocking.length > 0 && doc.root.children.length === 0 && doc.root.text === '') {\n return { error: null, diagnostics: blocking };\n }\n\n reportParseDiagnostics(doc);\n return { doc };\n};\n\nconst renderSource = (\n target: HTMLElement,\n source: string,\n options: AutoRenderOptions,\n eventTarget: Element,\n applyDocument: (doc: OrbitDocument, options: AutoRenderOptions) => void,\n): OrbitSVGRenderer | null => {\n const words = wordsFor(options.language, eventTarget, options.strings);\n const parsed = parseSource(source, options, words);\n\n if (!parsed.doc) {\n showRenderError(target, eventTarget, parsed.error, parsed.diagnostics, words);\n return null;\n }\n\n const doc = parsed.doc;\n\n target.replaceChildren();\n target.removeAttribute('data-orbit-error');\n applyDocument(doc, options);\n // Element attributes and explicit options win over the document's own;\n // the renderer layers them over the frontmatter when it renders `doc`.\n const renderer = new OrbitSVGRenderer(target, options);\n renderer.render(doc);\n return renderer;\n};\n\nconst showRenderError = (target: Element, eventTarget: Element, error: Error | null, diagnostics: OrbitDiagnostic[], words: OrbitWords): void => {\n const first = diagnostics[0];\n const line = error instanceof OrbitParseError ? error.line : first?.line;\n const message = error\n ? error.message.replace(/ at line \\d+$/, '')\n : first?.message ?? words.text('mapNotDrawnReason');\n const detail: OrbitRenderErrorDetail = { message, line, error, diagnostics };\n\n target.replaceChildren(buildErrorCard(message, line, words));\n target.setAttribute('data-orbit-error', '');\n\n if (typeof console !== 'undefined') {\n console.error(`[orbit] ${line === undefined ? '' : `line ${line}: `}${message}`);\n }\n\n eventTarget.dispatchEvent(new CustomEvent<OrbitRenderErrorDetail>('orbit-error', { detail, bubbles: true, composed: true }));\n};\n\nconst buildErrorCard = (message: string, line: number | undefined, words: OrbitWords): HTMLElement => {\n const card = document.createElement('div');\n card.setAttribute('role', 'alert');\n card.className = 'orbit-error';\n card.style.cssText = [\n 'box-sizing:border-box',\n 'margin:12px',\n 'padding:14px 16px',\n 'border:1px dashed var(--orbit-error-border, #E58A8A)',\n 'border-radius:12px',\n 'background:var(--orbit-error-background, #FFF6F5)',\n 'color:var(--orbit-error-text, #7A1F1F)',\n 'font:14px/1.45 var(--orbit-font-family, var(--orbit-sans-font, ui-sans-serif, system-ui, sans-serif))',\n ].join(';');\n const title = document.createElement('strong');\n title.textContent = words.text('mapNotDrawn');\n title.style.display = 'block';\n const description = document.createElement('span');\n description.textContent = line === undefined ? message : words.text('problemOnLine', { line, message });\n card.append(title, description);\n return card;\n};\n\n/** `<orbit-map>` source: the `source` / `data-orbit` attribute, a `<script type=\"text/orbit\">` child, or the content itself. */\nconst readOrbitMapSource = (element: Element): string => {\n const attribute = element.getAttribute('source') ?? element.getAttribute('data-orbit');\n\n if (attribute !== null) {\n return attribute;\n }\n\n const script = Array.from(element.children).find(\n (child) => child.tagName === 'SCRIPT' && /orbit|markdown|yaml/i.test(child.getAttribute('type') ?? ''),\n );\n\n if (script) {\n return script.textContent ?? '';\n }\n\n return serializeContent(element);\n};\n\nconst getOrbitSource = (element: Element, target: Element): string => {\n return (\n element.getAttribute('data-orbit') ||\n element.getAttribute('source') ||\n target.getAttribute('data-orbit-source') ||\n serializeContent(element)\n );\n};\n\n/**\n * The element's content as written: text, plus HTML comments (`<!-- orbit\n * … -->` attribute blocks are comments to the HTML parser and would\n * otherwise be lost).\n */\nconst serializeContent = (element: Element): string => {\n let source = '';\n\n for (const node of Array.from(element.childNodes)) {\n if (node.nodeType === 3) {\n source += (node as Text).data;\n } else if (node.nodeType === 8) {\n source += `<!--${(node as Comment).data}-->`;\n } else if (node.nodeType === 1) {\n source += (node as Element).outerHTML;\n }\n }\n\n return source;\n};\n\nconst getRenderTarget = (element: Element): Element => {\n if (element.matches('code.language-orbit') && element.parentElement) {\n return element.parentElement;\n }\n\n return element;\n};\n\nconst readViewMode = (value: string | undefined): RendererOptions['viewMode'] => {\n return value === 'focus' || value === 'all' ? value : undefined;\n};\n\n/** A `theme` attribute that names a theme. One that doesn't is left out, so the document's own theme applies, and the console says so. */\nconst readTheme = (value: unknown): string | undefined => {\n if (isThemeName(value)) {\n return value;\n }\n\n if (typeof value === 'string' && value !== '') {\n console.warn(`[orbit] Unknown theme \"${value}\" on <orbit-map>, so it's left out. Themes: ${themeNames().join(', ')}.${didYouMean(value, themeNames(), THEME_SYNONYMS)}`);\n }\n\n return undefined;\n};\n\n/** Display options from attributes: `view-mode` or `data-view-mode`, and so on. */\nconst readElementOptions = (element: Element): AutoRenderOptions => {\n const attribute = (name: string) => element.getAttribute(name) ?? element.getAttribute(`data-${name}`);\n return {\n viewMode: readViewMode(attribute('view-mode') || undefined),\n theme: readTheme(attribute('theme')),\n height: readNumber(attribute('height')),\n maxDepth: readNumber(attribute('max-depth')),\n palette: readList(attribute('palette')),\n interactive: readBoolean(attribute('interactive')),\n orbitAnimation: readBoolean(attribute('animation')),\n editable: readBoolean(attribute('editable')),\n editingKeys: readBoolean(attribute('editing-keys')),\n };\n};\n\nconst readNumber = (value: string | null): number | undefined => {\n if (!value) {\n return undefined;\n }\n\n const number = Number(value);\n return Number.isFinite(number) ? number : undefined;\n};\n\nconst readBoolean = (value: string | null): boolean | undefined => {\n if (value === null) {\n return undefined;\n }\n\n const normalized = value.trim().toLowerCase();\n\n if (normalized === '' || normalized === 'true' || normalized === '1') {\n return true;\n }\n\n if (normalized === 'false' || normalized === '0') {\n return false;\n }\n\n return undefined;\n};\n\nconst readList = (value: string | null): string[] | undefined => {\n if (!value) {\n return undefined;\n }\n\n return value.split(',').map((item) => item.trim()).filter(Boolean);\n};\n\nconst definedOnly = <T extends object>(options: T): Partial<T> => {\n return Object.fromEntries(Object.entries(options).filter(([, value]) => value !== undefined)) as Partial<T>;\n};\n\n/**\n * Class names a map's `className` added to an element, so the next render can\n * drop the ones it no longer asks for. A class the element already had is\n * the page's, and never counted.\n */\nconst appliedClassNames = new WeakMap<Element, string[]>();\n\n/** Adds the class names a map asks for, and removes the ones an earlier render of it added. */\nconst applyClassNames = (element: Element, className: string | undefined): void => {\n const previous = appliedClassNames.get(element) ?? [];\n const next = className?.split(/\\s+/).filter(Boolean) ?? [];\n const added = next.filter((name) => previous.includes(name) || !element.classList.contains(name));\n const stale = previous.filter((name) => !next.includes(name));\n\n if (stale.length > 0) {\n element.classList.remove(...stale);\n }\n\n if (next.length > 0) {\n element.classList.add(...next);\n }\n\n appliedClassNames.set(element, added);\n};\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "46D6FAE5FFE8EFBC64756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|