@omnitron-dev/prism 0.3.1 → 0.3.2
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 +68 -2
- package/THIRD-PARTY-NOTICES.txt +26 -0
- package/dist/accessibility/index.js +2 -0
- package/dist/accessibility/index.js.map +1 -1
- package/dist/auth/index.d.ts +4 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +4 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/blocks/auth-block/guards.d.ts +3 -2
- package/dist/blocks/auth-block/guards.d.ts.map +1 -1
- package/dist/blocks/dashboard-block/dashboard-block.d.ts.map +1 -1
- package/dist/blocks/dashboard-block/types.d.ts +4 -2
- package/dist/blocks/dashboard-block/types.d.ts.map +1 -1
- package/dist/blocks/dashboard-block/use-dashboard-block.d.ts +2 -2
- package/dist/blocks/dashboard-block/use-dashboard-block.d.ts.map +1 -1
- package/dist/blocks/data-grid-block/data-grid-block.d.ts.map +1 -1
- package/dist/blocks/data-grid-block/types.d.ts +3 -0
- package/dist/blocks/data-grid-block/types.d.ts.map +1 -1
- package/dist/blocks/index.js +80 -255
- package/dist/blocks/index.js.map +1 -1
- package/dist/chunk-2AB7VGPW.js +447 -0
- package/dist/chunk-2AB7VGPW.js.map +1 -0
- package/dist/{chunk-LOY2NPCO.js → chunk-2E67PQ4T.js} +3 -3
- package/dist/{chunk-LOY2NPCO.js.map → chunk-2E67PQ4T.js.map} +1 -1
- package/dist/chunk-2KG2NI73.js +84 -0
- package/dist/chunk-2KG2NI73.js.map +1 -0
- package/dist/chunk-2UYRW6X3.js +44 -0
- package/dist/chunk-2UYRW6X3.js.map +1 -0
- package/dist/chunk-36C5H56C.js +208 -0
- package/dist/chunk-36C5H56C.js.map +1 -0
- package/dist/chunk-36FOXX25.js +73 -0
- package/dist/chunk-36FOXX25.js.map +1 -0
- package/dist/{chunk-52PQL67Q.js → chunk-3VSM7NZG.js} +18 -15
- package/dist/chunk-3VSM7NZG.js.map +1 -0
- package/dist/{chunk-GUGTDURV.js → chunk-4B2LTPK2.js} +2 -2
- package/dist/{chunk-GUGTDURV.js.map → chunk-4B2LTPK2.js.map} +1 -1
- package/dist/chunk-4HUGZJKU.js +108 -0
- package/dist/chunk-4HUGZJKU.js.map +1 -0
- package/dist/{chunk-PXXPLHIY.js → chunk-4Q5L7LDG.js} +3 -3
- package/dist/{chunk-PXXPLHIY.js.map → chunk-4Q5L7LDG.js.map} +1 -1
- package/dist/{chunk-BRDWQVRT.js → chunk-4R7EZ7GQ.js} +3 -2
- package/dist/chunk-4R7EZ7GQ.js.map +1 -0
- package/dist/chunk-6IANOSMD.js +185 -0
- package/dist/chunk-6IANOSMD.js.map +1 -0
- package/dist/{chunk-YHE7HXSG.js → chunk-7ATBURW2.js} +3 -3
- package/dist/{chunk-YHE7HXSG.js.map → chunk-7ATBURW2.js.map} +1 -1
- package/dist/{chunk-7G5D5PTC.js → chunk-AATAOOSF.js} +4 -4
- package/dist/{chunk-7G5D5PTC.js.map → chunk-AATAOOSF.js.map} +1 -1
- package/dist/chunk-AKLRKCYH.js +128 -0
- package/dist/chunk-AKLRKCYH.js.map +1 -0
- package/dist/chunk-CT46KJOR.js +133 -0
- package/dist/chunk-CT46KJOR.js.map +1 -0
- package/dist/{chunk-LSPFFEJT.js → chunk-D4GFAJAZ.js} +298 -3900
- package/dist/chunk-D4GFAJAZ.js.map +1 -0
- package/dist/{chunk-BJE2AKD4.js → chunk-D5J3KW6Q.js} +3 -2
- package/dist/chunk-D5J3KW6Q.js.map +1 -0
- package/dist/chunk-DEPJRTVT.js +3 -0
- package/dist/{chunk-FU52GL2E.js.map → chunk-DEPJRTVT.js.map} +1 -1
- package/dist/{chunk-472SOF76.js → chunk-DHTYHUYI.js} +85 -107
- package/dist/chunk-DHTYHUYI.js.map +1 -0
- package/dist/{chunk-FF5RF32O.js → chunk-E7WM2RXA.js} +3 -2
- package/dist/chunk-E7WM2RXA.js.map +1 -0
- package/dist/chunk-F6RZ7LW6.js +1271 -0
- package/dist/chunk-F6RZ7LW6.js.map +1 -0
- package/dist/chunk-FOGY3HA4.js +217 -0
- package/dist/chunk-FOGY3HA4.js.map +1 -0
- package/dist/chunk-G2GANYMW.js +139 -0
- package/dist/chunk-G2GANYMW.js.map +1 -0
- package/dist/chunk-I6DILPFE.js +293 -0
- package/dist/chunk-I6DILPFE.js.map +1 -0
- package/dist/{chunk-HOXFSQUV.js → chunk-IRYU3NTG.js} +2 -2
- package/dist/{chunk-HOXFSQUV.js.map → chunk-IRYU3NTG.js.map} +1 -1
- package/dist/chunk-JTIUGPW5.js +284 -0
- package/dist/chunk-JTIUGPW5.js.map +1 -0
- package/dist/{chunk-GUFHFEPZ.js → chunk-JZBSPDED.js} +2 -2
- package/dist/{chunk-GUFHFEPZ.js.map → chunk-JZBSPDED.js.map} +1 -1
- package/dist/{chunk-PFT2BNYO.js → chunk-KPY7TA4D.js} +5 -5
- package/dist/{chunk-PFT2BNYO.js.map → chunk-KPY7TA4D.js.map} +1 -1
- package/dist/{chunk-GMIE6III.js → chunk-LFWKGNCX.js} +50 -623
- package/dist/chunk-LFWKGNCX.js.map +1 -0
- package/dist/chunk-LH4ZZZYB.js +37 -0
- package/dist/chunk-LH4ZZZYB.js.map +1 -0
- package/dist/chunk-NFJ7CPG3.js +13 -0
- package/dist/chunk-NFJ7CPG3.js.map +1 -0
- package/dist/chunk-NFPOIHD4.js +3 -0
- package/dist/{chunk-JSQTYDPG.js.map → chunk-NFPOIHD4.js.map} +1 -1
- package/dist/{chunk-XIXSSI3B.js → chunk-NJM5AVBM.js} +3 -2
- package/dist/chunk-NJM5AVBM.js.map +1 -0
- package/dist/{chunk-4Z5DE5GK.js → chunk-NSNM53WI.js} +133 -115
- package/dist/chunk-NSNM53WI.js.map +1 -0
- package/dist/chunk-NTREGTG7.js +31 -0
- package/dist/chunk-NTREGTG7.js.map +1 -0
- package/dist/{chunk-ADG4HZEP.js → chunk-OKJA6SJM.js} +4 -4
- package/dist/chunk-OKJA6SJM.js.map +1 -0
- package/dist/{chunk-SU3LVQ7N.js → chunk-Q6JDNFSG.js} +11 -226
- package/dist/chunk-Q6JDNFSG.js.map +1 -0
- package/dist/chunk-RPOGINR5.js +115 -0
- package/dist/chunk-RPOGINR5.js.map +1 -0
- package/dist/{chunk-KQ67XB6T.js → chunk-RSWVYIXK.js} +151 -114
- package/dist/chunk-RSWVYIXK.js.map +1 -0
- package/dist/chunk-SSEHL5VP.js +110 -0
- package/dist/chunk-SSEHL5VP.js.map +1 -0
- package/dist/chunk-TEIGUOWN.js +523 -0
- package/dist/chunk-TEIGUOWN.js.map +1 -0
- package/dist/{chunk-AYYFMTMI.js → chunk-TJ7DHXUX.js} +2 -2
- package/dist/{chunk-AYYFMTMI.js.map → chunk-TJ7DHXUX.js.map} +1 -1
- package/dist/{chunk-75FQ5IW3.js → chunk-TZHWYT34.js} +3 -3
- package/dist/{chunk-75FQ5IW3.js.map → chunk-TZHWYT34.js.map} +1 -1
- package/dist/chunk-TZWHELY4.js +45 -0
- package/dist/chunk-TZWHELY4.js.map +1 -0
- package/dist/{chunk-OKTLA23Q.js → chunk-UEINJFLS.js} +6 -6
- package/dist/chunk-UEINJFLS.js.map +1 -0
- package/dist/chunk-URFQX3I6.js +129 -0
- package/dist/chunk-URFQX3I6.js.map +1 -0
- package/dist/chunk-VG6FOMOH.js +187 -0
- package/dist/chunk-VG6FOMOH.js.map +1 -0
- package/dist/{chunk-PGHEP4JD.js → chunk-VQVVHMPG.js} +3 -3
- package/dist/{chunk-PGHEP4JD.js.map → chunk-VQVVHMPG.js.map} +1 -1
- package/dist/{chunk-DRFNMZLG.js → chunk-VUKOT432.js} +3 -2
- package/dist/chunk-VUKOT432.js.map +1 -0
- package/dist/chunk-WD4N72DL.js +315 -0
- package/dist/chunk-WD4N72DL.js.map +1 -0
- package/dist/chunk-XBYMG4QK.js +119 -0
- package/dist/chunk-XBYMG4QK.js.map +1 -0
- package/dist/chunk-YHM6GIHV.js +3 -0
- package/dist/chunk-YHM6GIHV.js.map +1 -0
- package/dist/{chunk-SNZK5X6F.js → chunk-Z2AN43YU.js} +4 -2
- package/dist/chunk-Z2AN43YU.js.map +1 -0
- package/dist/chunk-ZNWHMQRM.js +171 -0
- package/dist/chunk-ZNWHMQRM.js.map +1 -0
- package/dist/{chunk-YSIG2XYH.js → chunk-ZRJYQN6Y.js} +2 -2
- package/dist/{chunk-YSIG2XYH.js.map → chunk-ZRJYQN6Y.js.map} +1 -1
- package/dist/{chunk-AD4W7HYC.js → chunk-ZYI3MHLE.js} +3 -2
- package/dist/chunk-ZYI3MHLE.js.map +1 -0
- package/dist/cli/index.js +59 -421
- package/dist/cli/index.js.map +1 -1
- package/dist/components/admin-filters/admin-data-table.d.ts +7 -1
- package/dist/components/admin-filters/admin-data-table.d.ts.map +1 -1
- package/dist/components/admin-filters/filter-toolbar.d.ts.map +1 -1
- package/dist/components/admin-filters/index.js +8 -0
- package/dist/components/admin-filters/index.js.map +1 -0
- package/dist/components/alert/alert.d.ts.map +1 -1
- package/dist/components/alert/index.js +5 -0
- package/dist/components/alert/index.js.map +1 -0
- package/dist/components/animate/index.js +5 -0
- package/dist/components/animate/index.js.map +1 -0
- package/dist/components/breadcrumbs/breadcrumbs.d.ts.map +1 -1
- package/dist/components/breadcrumbs/index.js +4 -0
- package/dist/components/breadcrumbs/index.js.map +1 -0
- package/dist/components/card/index.js +4 -0
- package/dist/components/card/index.js.map +1 -0
- package/dist/components/chart/chart.d.ts.map +1 -1
- package/dist/components/chart/index.css +52 -0
- package/dist/components/chart/index.css.map +1 -0
- package/dist/components/chart/index.js +5 -0
- package/dist/components/chart/index.js.map +1 -0
- package/dist/components/chart/types.d.ts +3 -1
- package/dist/components/chart/types.d.ts.map +1 -1
- package/dist/components/chart/use-chart.d.ts.map +1 -1
- package/dist/components/command-palette/command-palette.d.ts +3 -1
- package/dist/components/command-palette/command-palette.d.ts.map +1 -1
- package/dist/components/command-palette/index.js +4 -0
- package/dist/components/command-palette/index.js.map +1 -0
- package/dist/components/confirm-dialog/index.js +4 -0
- package/dist/components/confirm-dialog/index.js.map +1 -0
- package/dist/components/date-input/date-input.d.ts +1 -0
- package/dist/components/date-input/date-input.d.ts.map +1 -1
- package/dist/components/date-input/index.d.ts +0 -1
- package/dist/components/date-input/index.d.ts.map +1 -1
- package/dist/components/doc-layout/index.js +5 -4
- package/dist/components/doc-layout/index.js.map +1 -1
- package/dist/components/editor/index.js +4 -3
- package/dist/components/editor/index.js.map +1 -1
- package/dist/components/emoji-picker/index.js +2 -1
- package/dist/components/emoji-picker/index.js.map +1 -1
- package/dist/components/empty-content/empty-content.d.ts.map +1 -1
- package/dist/components/empty-content/index.js +4 -0
- package/dist/components/empty-content/index.js.map +1 -0
- package/dist/components/error-boundary/index.js +6 -0
- package/dist/components/error-boundary/index.js.map +1 -0
- package/dist/components/index.css +13 -10
- package/dist/components/index.css.map +1 -1
- package/dist/components/index.d.ts +1 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +47 -21
- package/dist/components/index.js.map +1 -1
- package/dist/components/knowledge-graph/edge-labels.d.ts.map +1 -1
- package/dist/components/knowledge-graph/index.js +18 -16
- package/dist/components/knowledge-graph/index.js.map +1 -1
- package/dist/components/label/index.js +5 -0
- package/dist/components/label/index.js.map +1 -0
- package/dist/components/label/label.d.ts.map +1 -1
- package/dist/components/loading-screen/index.js +4 -0
- package/dist/components/loading-screen/index.js.map +1 -0
- package/dist/components/map/MapPointPicker.d.ts.map +1 -1
- package/dist/components/map/index.js +2 -1
- package/dist/components/map/index.js.map +1 -1
- package/dist/components/navigation-progress/index.js +4 -0
- package/dist/components/navigation-progress/index.js.map +1 -0
- package/dist/components/page-content/index.js +4 -0
- package/dist/components/page-content/index.js.map +1 -0
- package/dist/components/popover/index.js +4 -0
- package/dist/components/popover/index.js.map +1 -0
- package/dist/components/research/diagram.d.ts.map +1 -1
- package/dist/components/research/index.js +6 -4
- package/dist/components/research/index.js.map +1 -1
- package/dist/components/research-editor/extensions.d.ts +1 -1
- package/dist/components/research-editor/index.js +11 -10
- package/dist/components/research-editor/index.js.map +1 -1
- package/dist/components/research-editor/math-navigation.d.ts +2 -2
- package/dist/components/research-editor/math-navigation.d.ts.map +1 -1
- package/dist/components/scroll-to-top/index.js +4 -0
- package/dist/components/scroll-to-top/index.js.map +1 -0
- package/dist/components/search-input/index.js +7 -0
- package/dist/components/search-input/index.js.map +1 -0
- package/dist/components/search-input/search-input.d.ts +3 -1
- package/dist/components/search-input/search-input.d.ts.map +1 -1
- package/dist/components/skeleton/index.js +4 -0
- package/dist/components/skeleton/index.js.map +1 -0
- package/dist/components/snackbar/index.js +6 -0
- package/dist/components/snackbar/index.js.map +1 -0
- package/dist/components/stepper/index.js +4 -0
- package/dist/components/stepper/index.js.map +1 -0
- package/dist/components/table/index.d.ts +1 -0
- package/dist/components/table/index.d.ts.map +1 -1
- package/dist/components/table/index.js +5 -0
- package/dist/components/table/index.js.map +1 -0
- package/dist/components/table/table-viewport.d.ts +13 -0
- package/dist/components/table/table-viewport.d.ts.map +1 -0
- package/dist/components/table/table.d.ts +3 -1
- package/dist/components/table/table.d.ts.map +1 -1
- package/dist/components/tabs/index.js +6 -0
- package/dist/components/tabs/index.js.map +1 -0
- package/dist/components/tabs/tabs.d.ts +12 -1
- package/dist/components/tabs/tabs.d.ts.map +1 -1
- package/dist/core/index.js +12 -10
- package/dist/core/index.js.map +1 -1
- package/dist/forms/index.js +2 -0
- package/dist/forms/index.js.map +1 -1
- package/dist/hooks/index.js +14 -12
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/use-config-from-query.d.ts +2 -0
- package/dist/hooks/use-config-from-query.d.ts.map +1 -1
- package/dist/hooks/use-image-dimensions.d.ts.map +1 -1
- package/dist/hooks/use-keyboard-shortcut.d.ts.map +1 -1
- package/dist/hooks/use-scroll-position.d.ts.map +1 -1
- package/dist/hooks/use-window-size.d.ts.map +1 -1
- package/dist/icons/context.d.ts.map +1 -1
- package/dist/icons/index.js +3 -2
- package/dist/icons/index.js.map +1 -1
- package/dist/index.css +13 -10
- package/dist/index.css.map +1 -1
- package/dist/index.js +57 -31
- package/dist/index.js.map +1 -1
- package/dist/internal/research-parser.js +3 -0
- package/dist/internal/research-parser.js.map +1 -0
- package/dist/layouts/core/header-section.d.ts +1 -0
- package/dist/layouts/core/header-section.d.ts.map +1 -1
- package/dist/layouts/dashboard/layout.d.ts +3 -1
- package/dist/layouts/dashboard/layout.d.ts.map +1 -1
- package/dist/layouts/dashboard/sidenav.d.ts.map +1 -1
- package/dist/layouts/index.js +9 -8
- package/dist/layouts/index.js.map +1 -1
- package/dist/netron/index.js +2 -1
- package/dist/netron/index.js.map +1 -1
- package/dist/registry/index.js +1 -1
- package/dist/state/create-store.d.ts.map +1 -1
- package/dist/state/index.js +3 -2
- package/dist/state/index.js.map +1 -1
- package/dist/state/settings-version.d.ts.map +1 -1
- package/dist/theme/components/Chip.d.ts.map +1 -1
- package/dist/theme/components/Dialog.d.ts.map +1 -1
- package/dist/theme/components/TextField.d.ts.map +1 -1
- package/dist/theme/components/index.d.ts.map +1 -1
- package/dist/theme/components/theme-utils.d.ts +2 -2
- package/dist/theme/components/theme-utils.d.ts.map +1 -1
- package/dist/theme/index.js +8 -6
- package/dist/theme/index.js.map +1 -1
- package/dist/theme/palette/overrides.d.ts +1 -0
- package/dist/theme/palette/overrides.d.ts.map +1 -1
- package/dist/theme/semantic-surface.d.ts +8 -0
- package/dist/theme/semantic-surface.d.ts.map +1 -0
- package/dist/types/index.js +2 -2
- package/dist/ui/index.js +6 -5
- package/dist/ui/index.js.map +1 -1
- package/dist/utils/async-lock.d.ts.map +1 -1
- package/package.json +143 -37
- package/dist/chunk-472SOF76.js.map +0 -1
- package/dist/chunk-4Z5DE5GK.js.map +0 -1
- package/dist/chunk-52PQL67Q.js.map +0 -1
- package/dist/chunk-AD4W7HYC.js.map +0 -1
- package/dist/chunk-ADG4HZEP.js.map +0 -1
- package/dist/chunk-BJE2AKD4.js.map +0 -1
- package/dist/chunk-BRDWQVRT.js.map +0 -1
- package/dist/chunk-DRFNMZLG.js.map +0 -1
- package/dist/chunk-FF5RF32O.js.map +0 -1
- package/dist/chunk-FU52GL2E.js +0 -3
- package/dist/chunk-GMIE6III.js.map +0 -1
- package/dist/chunk-JSQTYDPG.js +0 -3
- package/dist/chunk-KQ67XB6T.js.map +0 -1
- package/dist/chunk-LSPFFEJT.js.map +0 -1
- package/dist/chunk-OKTLA23Q.js.map +0 -1
- package/dist/chunk-SNZK5X6F.js.map +0 -1
- package/dist/chunk-SU3LVQ7N.js.map +0 -1
- package/dist/chunk-XIXSSI3B.js.map +0 -1
|
@@ -1,227 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { gfm } from 'micromark-extension-gfm';
|
|
5
|
-
import { gfmFromMarkdown } from 'mdast-util-gfm';
|
|
6
|
-
import { directive } from 'micromark-extension-directive';
|
|
7
|
-
import { directiveFromMarkdown } from 'mdast-util-directive';
|
|
8
|
-
import { math } from 'micromark-extension-math';
|
|
9
|
-
import { mathFromMarkdown } from 'mdast-util-math';
|
|
1
|
+
import { parseResearchMarkdown, researchLimits } from './chunk-TEIGUOWN.js';
|
|
2
|
+
import { TipTapRenderer } from './chunk-4B2LTPK2.js';
|
|
3
|
+
import { ChevronDownIcon } from './chunk-VQVVHMPG.js';
|
|
10
4
|
import { useId, useMemo, Component, useRef, useState, useEffect } from 'react';
|
|
11
5
|
import katex from 'katex';
|
|
12
6
|
import { Box, Accordion, AccordionSummary, Typography, AccordionDetails } from '@mui/material';
|
|
13
7
|
import { useTheme } from '@mui/material/styles';
|
|
14
8
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
15
9
|
|
|
16
|
-
// src/components/research/frontmatter.ts
|
|
17
|
-
function splitFrontmatter(source) {
|
|
18
|
-
const opening = /^(?:\uFEFF)?---[ \t]*\r?\n/.exec(source);
|
|
19
|
-
if (!opening) return { body: source, metadata: void 0 };
|
|
20
|
-
let offset = opening[0].length;
|
|
21
|
-
while (offset < source.length) {
|
|
22
|
-
const newline = source.indexOf("\n", offset);
|
|
23
|
-
const end = newline < 0 ? source.length : newline + 1;
|
|
24
|
-
if (/^(?:---|\.\.\.)[ \t]*(?:\r?\n)?$/.test(source.slice(offset, end))) {
|
|
25
|
-
const raw = source.slice(0, end);
|
|
26
|
-
return {
|
|
27
|
-
body: raw.replace(/[^\r\n]/g, " ") + source.slice(end),
|
|
28
|
-
metadata: { format: "yaml", raw, start: 0, end }
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
offset = end;
|
|
32
|
-
}
|
|
33
|
-
return { body: source, metadata: void 0 };
|
|
34
|
-
}
|
|
35
|
-
var researchLimits = { source: 262144, nodes: 2e4, depth: 64, block: 2e4 };
|
|
36
|
-
var str = (v) => typeof v === "string" ? v : "";
|
|
37
|
-
var plain = (n) => str(n.value) || (n.children ?? []).map(plain).join("");
|
|
38
|
-
function parseResearchMarkdown(source, prefix = "research", sourceProfile = "research") {
|
|
39
|
-
if (source.length > researchLimits.source) throw new Error("document_limit");
|
|
40
|
-
if (!/^[a-zA-Z][\w-]{0,100}$/.test(prefix)) throw new Error("invalid_document_prefix");
|
|
41
|
-
const { body, metadata } = splitFrontmatter(source);
|
|
42
|
-
const tree = fromMarkdown(body, {
|
|
43
|
-
extensions: [gfm(), directive(), math()],
|
|
44
|
-
mdastExtensions: [gfmFromMarkdown(), directiveFromMarkdown(), mathFromMarkdown()]
|
|
45
|
-
});
|
|
46
|
-
const headings = [], diagnostics = [];
|
|
47
|
-
const ids = /* @__PURE__ */ new Set();
|
|
48
|
-
let count = 0;
|
|
49
|
-
const definitions = /* @__PURE__ */ new Map();
|
|
50
|
-
const collect = (n, depth) => {
|
|
51
|
-
if (++count > researchLimits.nodes || depth > researchLimits.depth) throw new Error("structure_limit");
|
|
52
|
-
if (n.type === "definition") definitions.set(str(n.identifier), n);
|
|
53
|
-
for (const c of n.children ?? []) collect(c, depth + 1);
|
|
54
|
-
};
|
|
55
|
-
collect(tree, 0);
|
|
56
|
-
const fallback = (n, code, inline = false) => {
|
|
57
|
-
diagnostics.push({ code, line: n.position?.start.line ?? 1 });
|
|
58
|
-
const raw = source.slice(n.position?.start.offset ?? 0, n.position?.end.offset ?? 0) || plain(n);
|
|
59
|
-
return inline ? { type: "text", text: raw } : { type: "codeBlock", content: [{ type: "text", text: raw }] };
|
|
60
|
-
};
|
|
61
|
-
const convert = (n, marks = []) => {
|
|
62
|
-
const children = () => (n.children ?? []).flatMap((c) => convert(c, marks));
|
|
63
|
-
const node = (type, attrs, content = children()) => [
|
|
64
|
-
{
|
|
65
|
-
type,
|
|
66
|
-
attrs: { ...attrs, source: n.position },
|
|
67
|
-
content
|
|
68
|
-
}
|
|
69
|
-
];
|
|
70
|
-
switch (n.type) {
|
|
71
|
-
case "root":
|
|
72
|
-
return children();
|
|
73
|
-
case "definition":
|
|
74
|
-
return [];
|
|
75
|
-
case "text":
|
|
76
|
-
return [{ type: "text", text: str(n.value), marks }];
|
|
77
|
-
case "inlineCode":
|
|
78
|
-
return [{ type: "text", text: str(n.value), marks: [...marks, { type: "code" }] }];
|
|
79
|
-
case "strong":
|
|
80
|
-
case "emphasis":
|
|
81
|
-
case "delete":
|
|
82
|
-
return (n.children ?? []).flatMap(
|
|
83
|
-
(c) => convert(c, [...marks, { type: { strong: "bold", emphasis: "italic", delete: "strike" }[n.type] }])
|
|
84
|
-
);
|
|
85
|
-
case "paragraph":
|
|
86
|
-
return node("paragraph");
|
|
87
|
-
case "heading": {
|
|
88
|
-
const explicit = sourceProfile === "docusaurus" ? /\s*\{#([^\s{}]+)\}\s*$/.exec(plain(n)) : null;
|
|
89
|
-
const title = explicit ? plain(n).slice(0, explicit.index) : plain(n);
|
|
90
|
-
const base = `${prefix}-${explicit?.[1] ?? (title.normalize("NFKC").toLowerCase().replace(/[^\p{L}\p{N}]+/gu, "-").replace(/^-|-$/g, "") || "section")}`;
|
|
91
|
-
let id = base, suffix = 1;
|
|
92
|
-
while (ids.has(id)) id = `${base}-${++suffix}`;
|
|
93
|
-
if (explicit && id !== base)
|
|
94
|
-
diagnostics.push({ code: "duplicate_heading_id", line: n.position?.start.line ?? 1 });
|
|
95
|
-
ids.add(id);
|
|
96
|
-
headings.push({ id, title, level: Number(n.depth) });
|
|
97
|
-
let content = n.children ?? [];
|
|
98
|
-
if (explicit) {
|
|
99
|
-
const last = content.at(-1);
|
|
100
|
-
if (last?.type === "text")
|
|
101
|
-
content = [
|
|
102
|
-
...content.slice(0, -1),
|
|
103
|
-
{ ...last, value: str(last.value).replace(/\s*\{#[^\s{}]+\}\s*$/, "") }
|
|
104
|
-
];
|
|
105
|
-
}
|
|
106
|
-
return node(
|
|
107
|
-
"heading",
|
|
108
|
-
{ level: n.depth, id },
|
|
109
|
-
content.flatMap((c) => convert(c, marks))
|
|
110
|
-
);
|
|
111
|
-
}
|
|
112
|
-
case "linkReference":
|
|
113
|
-
case "imageReference": {
|
|
114
|
-
const def = definitions.get(str(n.identifier));
|
|
115
|
-
if (!def) return [fallback(n, "unresolved_reference", true)];
|
|
116
|
-
return convert(
|
|
117
|
-
{ ...n, type: n.type === "linkReference" ? "link" : "image", url: def.url, title: def.title },
|
|
118
|
-
marks
|
|
119
|
-
);
|
|
120
|
-
}
|
|
121
|
-
case "link":
|
|
122
|
-
return (n.children ?? []).flatMap(
|
|
123
|
-
(c) => convert(c, [
|
|
124
|
-
...marks,
|
|
125
|
-
{
|
|
126
|
-
type: "link",
|
|
127
|
-
attrs: {
|
|
128
|
-
href: sourceProfile === "docusaurus" && str(n.url).startsWith("#") ? `#${prefix}-${str(n.url).slice(1)}` : str(n.url)
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
])
|
|
132
|
-
);
|
|
133
|
-
case "image":
|
|
134
|
-
return node("image", { src: str(n.url), alt: str(n.alt), title: str(n.title) }, []);
|
|
135
|
-
case "break":
|
|
136
|
-
return node("hardBreak", {}, []);
|
|
137
|
-
case "blockquote":
|
|
138
|
-
return node("blockquote");
|
|
139
|
-
case "thematicBreak":
|
|
140
|
-
return node("horizontalRule", {}, []);
|
|
141
|
-
case "list":
|
|
142
|
-
return node(
|
|
143
|
-
(n.children ?? []).some((c) => typeof c.checked === "boolean") ? "taskList" : n.ordered ? "orderedList" : "bulletList",
|
|
144
|
-
{ start: n.start }
|
|
145
|
-
);
|
|
146
|
-
case "listItem":
|
|
147
|
-
return node(typeof n.checked === "boolean" ? "taskItem" : "listItem", { checked: n.checked });
|
|
148
|
-
case "table":
|
|
149
|
-
return node(
|
|
150
|
-
"table",
|
|
151
|
-
{},
|
|
152
|
-
(n.children ?? []).map((row, i) => ({
|
|
153
|
-
type: "tableRow",
|
|
154
|
-
content: (row.children ?? []).map((cell) => ({
|
|
155
|
-
type: i === 0 ? "tableHeader" : "tableCell",
|
|
156
|
-
content: [{ type: "paragraph", content: (cell.children ?? []).flatMap((c) => convert(c)) }]
|
|
157
|
-
}))
|
|
158
|
-
}))
|
|
159
|
-
);
|
|
160
|
-
case "inlineMath":
|
|
161
|
-
case "math":
|
|
162
|
-
return node(n.type === "math" ? "mathBlock" : "mathInline", { tex: str(n.value) }, []).map((n2) => ({
|
|
163
|
-
...n2,
|
|
164
|
-
marks
|
|
165
|
-
}));
|
|
166
|
-
case "code": {
|
|
167
|
-
const language = str(n.lang).toLowerCase(), body2 = str(n.value);
|
|
168
|
-
if (["mermaid", "pintora", "prism"].includes(language) && body2.length > researchLimits.block)
|
|
169
|
-
return [fallback(n, "block_limit")];
|
|
170
|
-
if (language === "mermaid" || language === "pintora")
|
|
171
|
-
return node("diagram", { engine: language, code: body2 }, []);
|
|
172
|
-
if (language === "prism") {
|
|
173
|
-
try {
|
|
174
|
-
return node("researchWidget", { descriptor: JSON.parse(body2) }, []);
|
|
175
|
-
} catch {
|
|
176
|
-
return [fallback(n, "invalid_widget_json")];
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
return node("codeBlock", { language, title: str(n.meta) }, [{ type: "text", text: body2 }]);
|
|
180
|
-
}
|
|
181
|
-
case "containerDirective":
|
|
182
|
-
case "leafDirective": {
|
|
183
|
-
const name = str(n.name), attrs = n.attributes ?? {};
|
|
184
|
-
if (["note", "tip", "warning", "danger", "info", "caution"].includes(name))
|
|
185
|
-
return node("admonition", { kind: name, title: attrs.title || name });
|
|
186
|
-
if (name === "tabs") {
|
|
187
|
-
if ((n.children ?? []).some((c) => c.type !== "containerDirective" || c.name !== "tab"))
|
|
188
|
-
return [fallback(n, "invalid_tabs")];
|
|
189
|
-
return node(
|
|
190
|
-
"tabs",
|
|
191
|
-
{},
|
|
192
|
-
(n.children ?? []).flatMap((c) => convert(c))
|
|
193
|
-
);
|
|
194
|
-
}
|
|
195
|
-
if (name === "tab") return node("tabItem", { label: attrs.label || attrs.value || "Tab" });
|
|
196
|
-
if (name === "widget")
|
|
197
|
-
return node(
|
|
198
|
-
"researchWidget",
|
|
199
|
-
{
|
|
200
|
-
descriptor: {
|
|
201
|
-
type: attrs.type,
|
|
202
|
-
version: Number(attrs.version || 1),
|
|
203
|
-
props: Object.fromEntries(Object.entries(attrs).filter(([key]) => key !== "type" && key !== "version"))
|
|
204
|
-
}
|
|
205
|
-
},
|
|
206
|
-
[]
|
|
207
|
-
);
|
|
208
|
-
return [fallback(n, "unknown_directive")];
|
|
209
|
-
}
|
|
210
|
-
case "html":
|
|
211
|
-
return [fallback(n, "raw_html", true)];
|
|
212
|
-
default:
|
|
213
|
-
return [
|
|
214
|
-
fallback(
|
|
215
|
-
n,
|
|
216
|
-
`unsupported_${n.type}`,
|
|
217
|
-
n.type.startsWith("inline") || n.type === "textDirective" || n.type === "footnoteReference"
|
|
218
|
-
)
|
|
219
|
-
];
|
|
220
|
-
}
|
|
221
|
-
};
|
|
222
|
-
return { format: "prism-research/1", metadata, doc: { type: "doc", content: convert(tree) }, headings, diagnostics };
|
|
223
|
-
}
|
|
224
|
-
|
|
225
10
|
// src/components/research/diagram-image.ts
|
|
226
11
|
function diagramImage(source, purify) {
|
|
227
12
|
const fragment = purify.sanitize(source, {
|
|
@@ -310,9 +95,9 @@ function ResearchDiagram({
|
|
|
310
95
|
]
|
|
311
96
|
});
|
|
312
97
|
const result = await mermaid.render(id, source, scratch);
|
|
313
|
-
const
|
|
98
|
+
const renderedPicture = diagramImage(result.svg, purify);
|
|
314
99
|
if (!cancelled) {
|
|
315
|
-
setPicture(
|
|
100
|
+
setPicture(renderedPicture);
|
|
316
101
|
setState("ready");
|
|
317
102
|
}
|
|
318
103
|
} catch {
|
|
@@ -326,7 +111,7 @@ function ResearchDiagram({
|
|
|
326
111
|
cancelled = true;
|
|
327
112
|
target?.replaceChildren();
|
|
328
113
|
};
|
|
329
|
-
}, [source, engine, id, theme]);
|
|
114
|
+
}, [source, engine, id, theme, mode]);
|
|
330
115
|
return /* @__PURE__ */ jsxs("figure", { className: "prism-research__diagram", children: [
|
|
331
116
|
state !== "ready" && /* @__PURE__ */ jsx("p", { role: "status", children: state === "error" ? labels.invalid : labels.loading }),
|
|
332
117
|
/* @__PURE__ */ jsx("div", { ref: container, "aria-hidden": "true" }),
|
|
@@ -429,7 +214,7 @@ function ResearchDocument({
|
|
|
429
214
|
}) {
|
|
430
215
|
const uid = useId();
|
|
431
216
|
const prefix = documentId ?? `research-${uid.replace(/[^\w-]/g, "")}`;
|
|
432
|
-
const labels = { ...defaultResearchLabels, ...overrides };
|
|
217
|
+
const labels = useMemo(() => ({ ...defaultResearchLabels, ...overrides }), [overrides]);
|
|
433
218
|
const parsed = useMemo(() => {
|
|
434
219
|
try {
|
|
435
220
|
return { data: parseResearchMarkdown(source, prefix, sourceProfile) };
|
|
@@ -454,7 +239,7 @@ function ResearchDocument({
|
|
|
454
239
|
diagram: bounded((n) => /* @__PURE__ */ jsx(ResearchDiagram, { source: String(n.attrs?.code ?? ""), engine: String(n.attrs?.engine ?? ""), labels })),
|
|
455
240
|
researchWidget: bounded((n) => /* @__PURE__ */ jsx(Widget, { node: n, widgets, labels }))
|
|
456
241
|
};
|
|
457
|
-
}, [widgets, labels
|
|
242
|
+
}, [widgets, labels]);
|
|
458
243
|
if (!parsed.data) return /* @__PURE__ */ jsx("p", { role: "alert", children: labels.invalid });
|
|
459
244
|
return /* @__PURE__ */ jsxs(
|
|
460
245
|
Box,
|
|
@@ -513,6 +298,6 @@ function ResearchDocument({
|
|
|
513
298
|
);
|
|
514
299
|
}
|
|
515
300
|
|
|
516
|
-
export { ResearchDocument, defaultResearchLabels, defineResearchWidget
|
|
517
|
-
//# sourceMappingURL=chunk-
|
|
518
|
-
//# sourceMappingURL=chunk-
|
|
301
|
+
export { ResearchDocument, defaultResearchLabels, defineResearchWidget };
|
|
302
|
+
//# sourceMappingURL=chunk-Q6JDNFSG.js.map
|
|
303
|
+
//# sourceMappingURL=chunk-Q6JDNFSG.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/research/diagram-image.ts","../src/components/research/diagram.tsx","../src/components/research/document.tsx"],"names":["jsx","jsxs","useId"],"mappings":"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","file":"chunk-Q6JDNFSG.js","sourcesContent":["import type { DOMPurify } from 'dompurify';\n\n/** The returned SVG must be consumed only by <img>, never injected into HTML.\n * SVG image isolation preserves Mermaid's layout CSS without granting it DOM\n * capabilities or allowing its styles to affect the surrounding document.\n * https://developer.mozilla.org/en-US/docs/Web/SVG/Guides/SVG_as_an_image\n */\nexport function diagramImage(source: string, purify: DOMPurify) {\n const fragment = purify.sanitize(source, {\n USE_PROFILES: { svg: true, svgFilters: true },\n ADD_TAGS: ['style'],\n FORBID_TAGS: ['foreignObject', 'image', 'a', 'script', 'animate', 'animateMotion', 'animateTransform', 'set'],\n FORBID_ATTR: ['href', 'xlink:href'],\n RETURN_DOM_FRAGMENT: true,\n });\n const svg = fragment.querySelector('svg');\n if (!svg || !svg.getAttribute('viewBox')) throw new Error('invalid_diagram_svg');\n const title = svg.querySelector('title')?.textContent?.trim();\n const labels = [...svg.querySelectorAll('text')].map((node) => node.textContent?.trim()).filter(Boolean);\n const description = title || labels.join(' · ') || 'Diagram';\n return {\n src: 'data:image/svg+xml;charset=utf-8,' + encodeURIComponent(new XMLSerializer().serializeToString(svg)),\n description: description.slice(0, 2000),\n };\n}\n","'use client';\n\nimport { useEffect, useId, useRef, useState } from 'react';\nimport { useTheme } from '@mui/material/styles';\nimport type { ResearchLabels } from './document.js';\nimport { researchLimits } from './parse.js';\nimport { diagramImage } from './diagram-image.js';\n// Mermaid has mutable process-wide configuration. Serialise its configure/render\n// pair; document-local widgets and source code never get a configuration hook.\nlet pending: Promise<unknown> = Promise.resolve();\nexport function diagramSourceAllowed(source: string, engine: string) {\n return (\n engine === 'mermaid' && source.length <= researchLimits.block && !/^\\s*---/m.test(source) && !/%%\\s*\\{/.test(source)\n );\n}\nexport function ResearchDiagram({\n source,\n engine,\n labels,\n}: {\n source: string;\n engine: string;\n labels: ResearchLabels;\n}) {\n const id = `diagram-${useId().replace(/[^\\w-]/g, '')}`;\n const container = useRef<HTMLDivElement>(null);\n const [picture, setPicture] = useState<ReturnType<typeof diagramImage>>();\n const [state, setState] = useState<'loading' | 'ready' | 'error'>('loading');\n const theme = useTheme(),\n mode = theme.palette.mode;\n useEffect(() => {\n let cancelled = false;\n setState('loading');\n setPicture(undefined);\n const target = container.current;\n const run = async () => {\n if (cancelled || !target) return;\n if (!diagramSourceAllowed(source, engine)) {\n setState('error');\n return;\n }\n let scratch: HTMLDivElement | undefined;\n try {\n const [{ default: mermaid }, { default: purify }] = await Promise.all([import('mermaid'), import('dompurify')]);\n if (cancelled) return;\n scratch = document.createElement('div');\n scratch.style.cssText = 'position:absolute;visibility:hidden;pointer-events:none;width:1000px';\n target.append(scratch);\n mermaid.initialize({\n startOnLoad: false,\n securityLevel: 'strict',\n htmlLabels: false,\n maxTextSize: researchLimits.block,\n maxEdges: 256,\n suppressErrorRendering: true,\n look: 'classic',\n theme: 'base',\n fontFamily: 'system-ui, sans-serif',\n themeVariables: {\n darkMode: mode === 'dark',\n primaryColor: theme.palette.background.paper,\n primaryTextColor: theme.palette.text.primary,\n primaryBorderColor: theme.palette.text.secondary,\n secondaryColor: theme.palette.background.default,\n tertiaryColor: theme.palette.background.paper,\n lineColor: theme.palette.text.secondary,\n textColor: theme.palette.text.primary,\n fontFamily: 'system-ui, sans-serif',\n fontSize: '16px',\n },\n flowchart: { htmlLabels: false },\n secure: [\n 'securityLevel',\n 'startOnLoad',\n 'maxTextSize',\n 'maxEdges',\n 'htmlLabels',\n 'theme',\n 'look',\n 'fontFamily',\n 'themeCSS',\n 'themeVariables',\n ],\n });\n const result = await mermaid.render(id, source, scratch);\n const renderedPicture = diagramImage(result.svg, purify);\n if (!cancelled) {\n setPicture(renderedPicture);\n setState('ready');\n }\n } catch {\n if (!cancelled) setState('error');\n } finally {\n scratch?.remove();\n }\n };\n pending = pending.catch(() => undefined).then(run);\n return () => {\n cancelled = true;\n target?.replaceChildren();\n };\n }, [source, engine, id, theme, mode]);\n return (\n <figure className=\"prism-research__diagram\">\n {state !== 'ready' && <p role=\"status\">{state === 'error' ? labels.invalid : labels.loading}</p>}\n <div ref={container} aria-hidden=\"true\" />\n {picture && (\n <img\n className=\"prism-research__diagram-image\"\n src={picture.src}\n alt={picture.description}\n onError={() => setState('error')}\n />\n )}\n <details open={state === 'error'}>\n <summary>\n {labels.source} · {engine}\n </summary>\n <pre>{source}</pre>\n </details>\n </figure>\n );\n}\n","'use client';\n\nimport { ChevronDownIcon } from '../../icons/controls.js';\nimport { Component, useId, useMemo, type ReactNode, type ComponentType } from 'react';\nimport katex from 'katex';\nimport { Accordion, AccordionSummary, AccordionDetails, Box, Typography } from '@mui/material';\nimport type { SxProps, Theme } from '@mui/material/styles';\nimport { TipTapRenderer, type TipTapNode } from '../tiptap-renderer/index.js';\nimport { parseResearchMarkdown, researchLimits } from './parse.js';\nimport { ResearchDiagram } from './diagram.js';\nimport './research.css';\n\nexport interface ResearchWidget {\n version: number;\n render: (props: unknown) => ReactNode;\n}\nexport type ResearchWidgets = Readonly<Record<string, ResearchWidget>>;\nexport function defineResearchWidget<P>(\n version: number,\n parse: (input: unknown) => P,\n View: ComponentType<P & object>\n): ResearchWidget {\n return {\n version,\n render(input) {\n const props = parse(input);\n return <View {...(props as P & object)} />;\n },\n };\n}\nexport interface ResearchLabels {\n metadata: string;\n contents: string;\n source: string;\n unavailable: string;\n invalid: string;\n loading: string;\n diagnostics: string;\n}\nexport const defaultResearchLabels: ResearchLabels = {\n metadata: 'Source metadata',\n contents: 'On this page',\n source: 'Source',\n unavailable: 'This block is not available in this document.',\n invalid: 'This block could not be rendered. Its source is preserved.',\n loading: 'Rendering diagram…',\n diagnostics: 'Document diagnostics',\n};\nexport interface ResearchDocumentProps {\n /** Enables inert Docusaurus heading IDs and namespaced fragment links. */\n sourceProfile?: 'research' | 'docusaurus';\n source: string;\n /** Stable namespace for deep links. A revision identifier belongs to the host's document metadata. */\n documentId?: string;\n widgets?: ResearchWidgets;\n labels?: Partial<ResearchLabels>;\n contents?: boolean;\n className?: string;\n sx?: SxProps<Theme>;\n}\nclass BlockBoundary extends Component<{ children: ReactNode; fallback: ReactNode }, { failed: boolean }> {\n state = { failed: false };\n static getDerivedStateFromError() {\n return { failed: true };\n }\n render() {\n return this.state.failed ? this.props.fallback : this.props.children;\n }\n}\nfunction Formula({ node, labels }: { node: TipTapNode; labels: ResearchLabels }) {\n const tex = String(node.attrs?.tex ?? '');\n try {\n if (tex.length > researchLimits.block) throw new Error('formula_limit');\n const html = katex.renderToString(tex, {\n displayMode: node.type === 'mathBlock',\n trust: false,\n strict: 'error',\n throwOnError: true,\n maxExpand: 1000,\n maxSize: 20,\n output: 'htmlAndMathml',\n });\n return (\n <span\n className={node.type === 'mathBlock' ? 'prism-research__formula-block' : undefined}\n dangerouslySetInnerHTML={{ __html: html }}\n />\n );\n } catch {\n return (\n <code className=\"prism-research__invalid-math\" title={labels.invalid}>\n {tex}\n </code>\n );\n }\n}\nfunction Widget({ node, widgets, labels }: { node: TipTapNode; widgets: ResearchWidgets; labels: ResearchLabels }) {\n const d = node.attrs?.descriptor as { type?: unknown; version?: unknown; props?: unknown } | undefined;\n if (!d || typeof d.type !== 'string' || !Object.hasOwn(widgets, d.type) || widgets[d.type]?.version !== d.version)\n return (\n <details className=\"prism-research__failure\">\n <summary>{labels.unavailable}</summary>\n <pre>{JSON.stringify(d)}</pre>\n </details>\n );\n try {\n return widgets[d.type]!.render(d.props);\n } catch {\n return (\n <details className=\"prism-research__failure\">\n <summary>{labels.invalid}</summary>\n <pre>{JSON.stringify(d)}</pre>\n </details>\n );\n }\n}\nconst emptyWidgets: ResearchWidgets = Object.freeze({});\nexport function ResearchDocument({\n source,\n sourceProfile = 'research',\n documentId,\n widgets = emptyWidgets,\n labels: overrides,\n contents = false,\n className,\n sx,\n}: ResearchDocumentProps) {\n const uid = useId();\n const prefix = documentId ?? `research-${uid.replace(/[^\\w-]/g, '')}`;\n const labels = useMemo(() => ({ ...defaultResearchLabels, ...overrides }), [overrides]);\n const parsed = useMemo(() => {\n try {\n return { data: parseResearchMarkdown(source, prefix, sourceProfile) };\n } catch {\n return { error: true };\n }\n }, [source, prefix, sourceProfile]);\n const nodes = useMemo(() => {\n const failure = (raw: string) => (\n <details className=\"prism-research__failure\" open>\n <summary>{labels.invalid}</summary>\n <pre>{raw}</pre>\n </details>\n );\n const bounded = (render: (node: TipTapNode) => ReactNode) => (props: { node: TipTapNode }) => {\n const raw = String(\n props.node.attrs?.tex ?? props.node.attrs?.code ?? JSON.stringify(props.node.attrs?.descriptor ?? {})\n );\n return (\n <BlockBoundary key={raw} fallback={failure(raw)}>\n {render(props.node)}\n </BlockBoundary>\n );\n };\n return {\n mathInline: ({ node }: { node: TipTapNode }) => <Formula node={node} labels={labels} />,\n mathBlock: ({ node }: { node: TipTapNode }) => <Formula node={node} labels={labels} />,\n diagram: bounded((n) => (\n <ResearchDiagram source={String(n.attrs?.code ?? '')} engine={String(n.attrs?.engine ?? '')} labels={labels} />\n )),\n researchWidget: bounded((n) => <Widget node={n} widgets={widgets} labels={labels} />),\n };\n }, [widgets, labels]);\n if (!parsed.data) return <p role=\"alert\">{labels.invalid}</p>;\n return (\n <Box\n className={`prism-research ${className ?? ''}`}\n sx={(theme) => ({ '--prism-research-border': theme.palette.divider })}\n >\n {parsed.data.metadata && (\n <Accordion\n disableGutters\n elevation={0}\n sx={{ mb: 2, border: 1, borderColor: 'divider', '&:before': { display: 'none' } }}\n >\n <AccordionSummary expandIcon={<ChevronDownIcon fontSize=\"small\" />}>\n <Typography variant=\"caption\" color=\"text.secondary\">\n {labels.metadata} · YAML\n </Typography>\n </AccordionSummary>\n <AccordionDetails>\n <Box\n component=\"pre\"\n sx={{\n m: 0,\n maxHeight: 240,\n overflow: 'auto',\n whiteSpace: 'pre-wrap',\n overflowWrap: 'anywhere',\n fontSize: 12,\n }}\n >\n {parsed.data.metadata.raw}\n </Box>\n </AccordionDetails>\n </Accordion>\n )}\n {contents && parsed.data.headings.length > 0 && (\n <nav className=\"prism-research__contents\" aria-label={labels.contents}>\n <p>{labels.contents}</p>\n <ol>\n {parsed.data.headings.map((h) => (\n <li key={h.id}>\n <a href={`#${h.id}`}>{h.title}</a>\n </li>\n ))}\n </ol>\n </nav>\n )}\n <TipTapRenderer content={parsed.data.doc} nodeRenderers={nodes} inheritRegisteredNodes={false} sx={sx} />\n {parsed.data.diagnostics.length > 0 && (\n <details className=\"prism-research__diagnostics\">\n <summary>\n {labels.diagnostics} · {parsed.data.diagnostics.length}\n </summary>\n <ul>\n {parsed.data.diagnostics.map((d, i) => (\n <li key={i}>\n {d.line}: <code>{d.code}</code>\n </li>\n ))}\n </ul>\n </details>\n )}\n </Box>\n );\n}\n"]}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { useState, useCallback } from 'react';
|
|
2
|
+
import MuiStepper from '@mui/material/Stepper';
|
|
3
|
+
import Step from '@mui/material/Step';
|
|
4
|
+
import StepLabel from '@mui/material/StepLabel';
|
|
5
|
+
import StepContent from '@mui/material/StepContent';
|
|
6
|
+
import Box from '@mui/material/Box';
|
|
7
|
+
import Button from '@mui/material/Button';
|
|
8
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
9
|
+
|
|
10
|
+
// src/components/stepper/stepper.tsx
|
|
11
|
+
function Stepper({
|
|
12
|
+
steps,
|
|
13
|
+
activeStep = 0,
|
|
14
|
+
onStepChange,
|
|
15
|
+
orientation = "horizontal",
|
|
16
|
+
nonLinear = false,
|
|
17
|
+
alternativeLabel = false,
|
|
18
|
+
showContent = false,
|
|
19
|
+
...other
|
|
20
|
+
}) {
|
|
21
|
+
const handleStepClick = (index) => {
|
|
22
|
+
if (nonLinear && onStepChange) {
|
|
23
|
+
onStepChange(index);
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
return /* @__PURE__ */ jsx(
|
|
27
|
+
MuiStepper,
|
|
28
|
+
{
|
|
29
|
+
activeStep,
|
|
30
|
+
orientation,
|
|
31
|
+
nonLinear,
|
|
32
|
+
alternativeLabel,
|
|
33
|
+
...other,
|
|
34
|
+
children: steps.map((step, index) => /* @__PURE__ */ jsxs(Step, { completed: step.completed ?? index < activeStep, children: [
|
|
35
|
+
/* @__PURE__ */ jsx(
|
|
36
|
+
StepLabel,
|
|
37
|
+
{
|
|
38
|
+
optional: step.optional ? /* @__PURE__ */ jsx("span", { style: { fontSize: "0.75rem", color: "text.secondary" }, children: "Optional" }) : step.description ? /* @__PURE__ */ jsx("span", { style: { fontSize: "0.75rem", color: "text.secondary" }, children: step.description }) : void 0,
|
|
39
|
+
error: step.error,
|
|
40
|
+
icon: step.icon,
|
|
41
|
+
sx: {
|
|
42
|
+
cursor: nonLinear ? "pointer" : "default"
|
|
43
|
+
},
|
|
44
|
+
onClick: () => handleStepClick(index),
|
|
45
|
+
children: step.label
|
|
46
|
+
}
|
|
47
|
+
),
|
|
48
|
+
orientation === "vertical" && showContent && step.content && /* @__PURE__ */ jsx(StepContent, { children: step.content })
|
|
49
|
+
] }, index))
|
|
50
|
+
}
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
function useStepper({
|
|
54
|
+
initialStep = 0,
|
|
55
|
+
totalSteps,
|
|
56
|
+
onStepChange,
|
|
57
|
+
onComplete
|
|
58
|
+
}) {
|
|
59
|
+
const [activeStep, setActiveStep] = useState(initialStep);
|
|
60
|
+
const [isCompleted, setIsCompleted] = useState(false);
|
|
61
|
+
const goToStep = useCallback(
|
|
62
|
+
(step) => {
|
|
63
|
+
if (step >= 0 && step < totalSteps) {
|
|
64
|
+
setActiveStep(step);
|
|
65
|
+
onStepChange?.(step);
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
[totalSteps, onStepChange]
|
|
69
|
+
);
|
|
70
|
+
const nextStep = useCallback(() => {
|
|
71
|
+
if (activeStep === totalSteps - 1) {
|
|
72
|
+
setIsCompleted(true);
|
|
73
|
+
onComplete?.();
|
|
74
|
+
} else {
|
|
75
|
+
goToStep(activeStep + 1);
|
|
76
|
+
}
|
|
77
|
+
}, [activeStep, totalSteps, goToStep, onComplete]);
|
|
78
|
+
const prevStep = useCallback(() => {
|
|
79
|
+
goToStep(activeStep - 1);
|
|
80
|
+
}, [activeStep, goToStep]);
|
|
81
|
+
const reset = useCallback(() => {
|
|
82
|
+
setActiveStep(0);
|
|
83
|
+
setIsCompleted(false);
|
|
84
|
+
onStepChange?.(0);
|
|
85
|
+
}, [onStepChange]);
|
|
86
|
+
return {
|
|
87
|
+
activeStep,
|
|
88
|
+
nextStep,
|
|
89
|
+
prevStep,
|
|
90
|
+
goToStep,
|
|
91
|
+
reset,
|
|
92
|
+
isFirstStep: activeStep === 0,
|
|
93
|
+
isLastStep: activeStep === totalSteps - 1,
|
|
94
|
+
isCompleted
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
function StepperActions({
|
|
98
|
+
stepper,
|
|
99
|
+
backLabel = "Back",
|
|
100
|
+
nextLabel = "Next",
|
|
101
|
+
finishLabel = "Finish",
|
|
102
|
+
disableNext = false,
|
|
103
|
+
actions
|
|
104
|
+
}) {
|
|
105
|
+
return /* @__PURE__ */ jsxs(Box, { sx: { display: "flex", gap: 2, mt: 3 }, children: [
|
|
106
|
+
/* @__PURE__ */ jsx(Button, { variant: "outlined", onClick: stepper.prevStep, disabled: stepper.isFirstStep, children: backLabel }),
|
|
107
|
+
/* @__PURE__ */ jsx(Box, { sx: { flex: 1 } }),
|
|
108
|
+
actions,
|
|
109
|
+
/* @__PURE__ */ jsx(Button, { variant: "contained", onClick: stepper.nextStep, disabled: disableNext, children: stepper.isLastStep ? finishLabel : nextLabel })
|
|
110
|
+
] });
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export { Stepper, StepperActions, useStepper };
|
|
114
|
+
//# sourceMappingURL=chunk-RPOGINR5.js.map
|
|
115
|
+
//# sourceMappingURL=chunk-RPOGINR5.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/stepper/stepper.tsx"],"names":[],"mappings":"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","file":"chunk-RPOGINR5.js","sourcesContent":["'use client';\n\n/**\n * Stepper Component\n *\n * Multi-step wizard/stepper with custom styling.\n *\n * @module components/stepper\n */\n\nimport { useState, useCallback, type ReactNode } from 'react';\nimport MuiStepper from '@mui/material/Stepper';\nimport Step from '@mui/material/Step';\nimport StepLabel from '@mui/material/StepLabel';\nimport StepContent from '@mui/material/StepContent';\nimport Box from '@mui/material/Box';\nimport Button from '@mui/material/Button';\nimport type { StepperProps as MuiStepperProps } from '@mui/material/Stepper';\n\n/**\n * Step definition.\n */\nexport interface StepItem {\n /** Step label */\n label: string;\n /** Step description */\n description?: string;\n /** Step content */\n content?: ReactNode;\n /** Optional step (can be skipped) */\n optional?: boolean;\n /** Step icon */\n icon?: ReactNode;\n /** Step is completed */\n completed?: boolean;\n /** Step has error */\n error?: boolean;\n}\n\n/**\n * Props for Stepper component.\n */\nexport interface StepperProps extends Omit<MuiStepperProps, 'children'> {\n /** Steps to display */\n steps: StepItem[];\n /** Active step index */\n activeStep?: number;\n /** On step change */\n onStepChange?: (step: number) => void;\n /** Stepper orientation */\n orientation?: 'horizontal' | 'vertical';\n /** Allow non-linear navigation */\n nonLinear?: boolean;\n /** Alternative label placement (horizontal only) */\n alternativeLabel?: boolean;\n /** Show step content (vertical only) */\n showContent?: boolean;\n}\n\n/**\n * Stepper - Multi-step wizard/stepper.\n *\n * @example\n * ```tsx\n * <Stepper\n * steps={[\n * { label: 'Account', description: 'Create account' },\n * { label: 'Profile', description: 'Complete profile', optional: true },\n * { label: 'Verify', description: 'Verify email' },\n * ]}\n * activeStep={1}\n * onStepChange={(step) => setActiveStep(step)}\n * />\n * ```\n */\nexport function Stepper({\n steps,\n activeStep = 0,\n onStepChange,\n orientation = 'horizontal',\n nonLinear = false,\n alternativeLabel = false,\n showContent = false,\n ...other\n}: StepperProps): ReactNode {\n const handleStepClick = (index: number) => {\n if (nonLinear && onStepChange) {\n onStepChange(index);\n }\n };\n\n return (\n <MuiStepper\n activeStep={activeStep}\n orientation={orientation}\n nonLinear={nonLinear}\n alternativeLabel={alternativeLabel}\n {...other}\n >\n {steps.map((step, index) => (\n <Step key={index} completed={step.completed ?? index < activeStep}>\n <StepLabel\n optional={\n step.optional ? (\n <span style={{ fontSize: '0.75rem', color: 'text.secondary' }}>Optional</span>\n ) : step.description ? (\n <span style={{ fontSize: '0.75rem', color: 'text.secondary' }}>{step.description}</span>\n ) : undefined\n }\n error={step.error}\n icon={step.icon}\n sx={{\n cursor: nonLinear ? 'pointer' : 'default',\n }}\n onClick={() => handleStepClick(index)}\n >\n {step.label}\n </StepLabel>\n {orientation === 'vertical' && showContent && step.content && <StepContent>{step.content}</StepContent>}\n </Step>\n ))}\n </MuiStepper>\n );\n}\n\n/**\n * Return type for useStepper hook.\n */\nexport interface UseStepperReturn {\n /** Current active step */\n activeStep: number;\n /** Go to next step */\n nextStep: () => void;\n /** Go to previous step */\n prevStep: () => void;\n /** Go to specific step */\n goToStep: (step: number) => void;\n /** Reset to first step */\n reset: () => void;\n /** Is first step */\n isFirstStep: boolean;\n /** Is last step */\n isLastStep: boolean;\n /** Step is completed */\n isCompleted: boolean;\n}\n\n/**\n * Options for useStepper hook.\n */\nexport interface UseStepperOptions {\n /** Initial step */\n initialStep?: number;\n /** Total steps */\n totalSteps: number;\n /** On step change callback */\n onStepChange?: (step: number) => void;\n /** On complete callback */\n onComplete?: () => void;\n}\n\n/**\n * useStepper - Hook for managing stepper state.\n *\n * @example\n * ```tsx\n * const stepper = useStepper({\n * totalSteps: 3,\n * onComplete: () => console.log('Done!'),\n * });\n *\n * <Stepper steps={steps} activeStep={stepper.activeStep} />\n * <Button onClick={stepper.prevStep} disabled={stepper.isFirstStep}>\n * Back\n * </Button>\n * <Button onClick={stepper.nextStep}>\n * {stepper.isLastStep ? 'Finish' : 'Next'}\n * </Button>\n * ```\n */\nexport function useStepper({\n initialStep = 0,\n totalSteps,\n onStepChange,\n onComplete,\n}: UseStepperOptions): UseStepperReturn {\n const [activeStep, setActiveStep] = useState(initialStep);\n const [isCompleted, setIsCompleted] = useState(false);\n\n const goToStep = useCallback(\n (step: number) => {\n if (step >= 0 && step < totalSteps) {\n setActiveStep(step);\n onStepChange?.(step);\n }\n },\n [totalSteps, onStepChange]\n );\n\n const nextStep = useCallback(() => {\n if (activeStep === totalSteps - 1) {\n setIsCompleted(true);\n onComplete?.();\n } else {\n goToStep(activeStep + 1);\n }\n }, [activeStep, totalSteps, goToStep, onComplete]);\n\n const prevStep = useCallback(() => {\n goToStep(activeStep - 1);\n }, [activeStep, goToStep]);\n\n const reset = useCallback(() => {\n setActiveStep(0);\n setIsCompleted(false);\n onStepChange?.(0);\n }, [onStepChange]);\n\n return {\n activeStep,\n nextStep,\n prevStep,\n goToStep,\n reset,\n isFirstStep: activeStep === 0,\n isLastStep: activeStep === totalSteps - 1,\n isCompleted,\n };\n}\n\n/**\n * Props for StepperActions component.\n */\nexport interface StepperActionsProps {\n /** Stepper hook return */\n stepper: UseStepperReturn;\n /** Back button label */\n backLabel?: string;\n /** Next button label */\n nextLabel?: string;\n /** Finish button label */\n finishLabel?: string;\n /** Disable next button */\n disableNext?: boolean;\n /** Custom actions */\n actions?: ReactNode;\n}\n\n/**\n * StepperActions - Common action buttons for stepper.\n *\n * @example\n * ```tsx\n * <StepperActions stepper={stepper} />\n * ```\n */\nexport function StepperActions({\n stepper,\n backLabel = 'Back',\n nextLabel = 'Next',\n finishLabel = 'Finish',\n disableNext = false,\n actions,\n}: StepperActionsProps): ReactNode {\n return (\n <Box sx={{ display: 'flex', gap: 2, mt: 3 }}>\n <Button variant=\"outlined\" onClick={stepper.prevStep} disabled={stepper.isFirstStep}>\n {backLabel}\n </Button>\n <Box sx={{ flex: 1 }} />\n {actions}\n <Button variant=\"contained\" onClick={stepper.nextStep} disabled={disableNext}>\n {stepper.isLastStep ? finishLabel : nextLabel}\n </Button>\n </Box>\n );\n}\n"]}
|