@terra-symposium/docs 0.1.17 → 0.1.71
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 +3 -3
- package/lib-dist/assets/fonts/AUTHENTICSans-130.woff +0 -0
- package/lib-dist/assets/fonts/AUTHENTICSans-130.woff2 +0 -0
- package/lib-dist/assets/fonts/AUTHENTICSans-150.woff +0 -0
- package/lib-dist/assets/fonts/AUTHENTICSans-150.woff2 +0 -0
- package/lib-dist/assets/fonts/AUTHENTICSans-90.woff +0 -0
- package/lib-dist/assets/fonts/AUTHENTICSans-90.woff2 +0 -0
- package/lib-dist/assets/fonts/Avara-Bold.woff +0 -0
- package/lib-dist/assets/fonts/Avara-BoldItalic.woff +0 -0
- package/lib-dist/assets/fonts/InterVariable-Italic-latin-20260728.woff2 +0 -0
- package/lib-dist/assets/fonts/InterVariable-latin-20260728.woff2 +0 -0
- package/lib-dist/assets/fonts/README.md +7 -0
- package/lib-dist/assets/fonts/licenses/Inter-OFL-1.1.txt +92 -0
- package/lib-dist/assets/fonts/licenses/OFL-1.1.txt +93 -0
- package/lib-dist/{Docs.d.ts → components/Docs.d.ts} +1 -1
- package/lib-dist/components/Docs.d.ts.map +1 -0
- package/lib-dist/components/Docs.js +9 -0
- package/lib-dist/components/Docs.js.map +1 -0
- package/lib-dist/{LocalDocsWorkspace.d.ts → components/LocalDocsWorkspace.d.ts} +9 -2
- package/lib-dist/components/LocalDocsWorkspace.d.ts.map +1 -0
- package/lib-dist/{LocalDocsWorkspace.js → components/LocalDocsWorkspace.js} +83 -24
- package/lib-dist/components/LocalDocsWorkspace.js.map +1 -0
- package/lib-dist/components/NotFound.d.ts +8 -0
- package/lib-dist/components/NotFound.d.ts.map +1 -0
- package/lib-dist/components/NotFound.js +6 -0
- package/lib-dist/components/NotFound.js.map +1 -0
- package/lib-dist/components/SiteLayout.d.ts +25 -0
- package/lib-dist/components/SiteLayout.d.ts.map +1 -0
- package/lib-dist/components/SiteLayout.js +12 -0
- package/lib-dist/components/SiteLayout.js.map +1 -0
- package/lib-dist/{StaticWorkspace.d.ts → components/StaticWorkspace.d.ts} +7 -3
- package/lib-dist/components/StaticWorkspace.d.ts.map +1 -0
- package/lib-dist/{StaticWorkspace.js → components/StaticWorkspace.js} +100 -34
- package/lib-dist/components/StaticWorkspace.js.map +1 -0
- package/lib-dist/components/StrictLocalWorkspaceHarness.d.ts +10 -0
- package/lib-dist/components/StrictLocalWorkspaceHarness.d.ts.map +1 -0
- package/lib-dist/components/StrictLocalWorkspaceHarness.js +12 -0
- package/lib-dist/components/StrictLocalWorkspaceHarness.js.map +1 -0
- package/lib-dist/components/blocks.d.ts.map +1 -0
- package/lib-dist/{blocks.js → components/blocks.js} +88 -13
- package/lib-dist/components/blocks.js.map +1 -0
- package/lib-dist/{navigation.d.ts → components/navigation.d.ts} +2 -1
- package/lib-dist/components/navigation.d.ts.map +1 -0
- package/lib-dist/components/navigation.js.map +1 -0
- package/lib-dist/{terra → components/terra}/Workspace.d.ts +1 -1
- package/lib-dist/components/terra/Workspace.d.ts.map +1 -0
- package/lib-dist/components/terra/Workspace.js +190 -0
- package/lib-dist/components/terra/Workspace.js.map +1 -0
- package/lib-dist/components/terra/editor/TerraContentEditor.d.ts +15 -0
- package/lib-dist/components/terra/editor/TerraContentEditor.d.ts.map +1 -0
- package/lib-dist/components/terra/editor/TerraContentEditor.js +358 -0
- package/lib-dist/components/terra/editor/TerraContentEditor.js.map +1 -0
- package/lib-dist/{terra → components/terra}/editor/_blocks.d.ts +3 -4
- package/lib-dist/components/terra/editor/_blocks.d.ts.map +1 -0
- package/lib-dist/components/terra/editor/_blocks.js +120 -0
- package/lib-dist/components/terra/editor/_blocks.js.map +1 -0
- package/lib-dist/components/terra/editor/docs/BlockContext.d.ts +7 -0
- package/lib-dist/components/terra/editor/docs/BlockContext.d.ts.map +1 -0
- package/lib-dist/components/terra/editor/docs/BlockContext.js +60 -0
- package/lib-dist/components/terra/editor/docs/BlockContext.js.map +1 -0
- package/lib-dist/components/terra/editor/docs/DocsAttachmentPicker.d.ts +12 -0
- package/lib-dist/components/terra/editor/docs/DocsAttachmentPicker.d.ts.map +1 -0
- package/lib-dist/components/terra/editor/docs/DocsAttachmentPicker.js +66 -0
- package/lib-dist/components/terra/editor/docs/DocsAttachmentPicker.js.map +1 -0
- package/lib-dist/components/terra/editor/docs/TerraToolbar.d.ts +12 -0
- package/lib-dist/components/terra/editor/docs/TerraToolbar.d.ts.map +1 -0
- package/lib-dist/components/terra/editor/docs/TerraToolbar.js +169 -0
- package/lib-dist/components/terra/editor/docs/TerraToolbar.js.map +1 -0
- package/lib-dist/{terra → components/terra}/editor/docs/_Callout.d.ts +1 -1
- package/lib-dist/components/terra/editor/docs/_Callout.d.ts.map +1 -0
- package/lib-dist/{terra → components/terra}/editor/docs/_Callout.js +10 -6
- package/lib-dist/components/terra/editor/docs/_Callout.js.map +1 -0
- package/lib-dist/components/terra/editor/docs/_CodeBlock.d.ts.map +1 -0
- package/lib-dist/{terra → components/terra}/editor/docs/_CodeBlock.js +110 -44
- package/lib-dist/components/terra/editor/docs/_CodeBlock.js.map +1 -0
- package/lib-dist/{terra → components/terra}/editor/docs/_DocsCode.d.ts +1 -1
- package/lib-dist/components/terra/editor/docs/_DocsCode.d.ts.map +1 -0
- package/lib-dist/{terra → components/terra}/editor/docs/_DocsCode.js +44 -11
- package/lib-dist/components/terra/editor/docs/_DocsCode.js.map +1 -0
- package/lib-dist/{terra → components/terra}/editor/docs/_DocsImage.d.ts +1 -1
- package/lib-dist/components/terra/editor/docs/_DocsImage.d.ts.map +1 -0
- package/lib-dist/components/terra/editor/docs/_DocsImage.js +62 -0
- package/lib-dist/components/terra/editor/docs/_DocsImage.js.map +1 -0
- package/lib-dist/{terra → components/terra}/editor/docs/_Embed.d.ts +3 -1
- package/lib-dist/components/terra/editor/docs/_Embed.d.ts.map +1 -0
- package/lib-dist/components/terra/editor/docs/_Embed.js +73 -0
- package/lib-dist/components/terra/editor/docs/_Embed.js.map +1 -0
- package/lib-dist/{terra → components/terra}/editor/docs/_Math.d.ts +2 -2
- package/lib-dist/components/terra/editor/docs/_Math.d.ts.map +1 -0
- package/lib-dist/{terra → components/terra}/editor/docs/_Math.js +26 -14
- package/lib-dist/components/terra/editor/docs/_Math.js.map +1 -0
- package/lib-dist/{terra → components/terra}/editor/docs/_Nodes.d.ts +1 -1
- package/lib-dist/components/terra/editor/docs/_Nodes.d.ts.map +1 -0
- package/lib-dist/components/terra/editor/docs/_Nodes.js +62 -0
- package/lib-dist/components/terra/editor/docs/_Nodes.js.map +1 -0
- package/lib-dist/{terra → components/terra}/editor/docs/_Raw.d.ts +1 -1
- package/lib-dist/components/terra/editor/docs/_Raw.d.ts.map +1 -0
- package/lib-dist/{terra → components/terra}/editor/docs/_Raw.js +8 -3
- package/lib-dist/components/terra/editor/docs/_Raw.js.map +1 -0
- package/lib-dist/{terra → components/terra}/editor/docs/_Table.d.ts +1 -1
- package/lib-dist/components/terra/editor/docs/_Table.d.ts.map +1 -0
- package/lib-dist/components/terra/editor/docs/_Table.js +99 -0
- package/lib-dist/components/terra/editor/docs/_Table.js.map +1 -0
- package/lib-dist/{terra → components/terra}/editor/docs/_Tabs.d.ts +1 -1
- package/lib-dist/components/terra/editor/docs/_Tabs.d.ts.map +1 -0
- package/lib-dist/{terra → components/terra}/editor/docs/_Tabs.js +35 -14
- package/lib-dist/components/terra/editor/docs/_Tabs.js.map +1 -0
- package/lib-dist/{terra → components/terra}/editor/docs/_TsDocs.d.ts +1 -1
- package/lib-dist/components/terra/editor/docs/_TsDocs.d.ts.map +1 -0
- package/lib-dist/{terra → components/terra}/editor/docs/_TsDocs.js +15 -13
- package/lib-dist/components/terra/editor/docs/_TsDocs.js.map +1 -0
- package/lib-dist/{terra → components/terra}/editor/docs/_math_inline.d.ts +1 -1
- package/lib-dist/components/terra/editor/docs/_math_inline.d.ts.map +1 -0
- package/lib-dist/{terra → components/terra}/editor/docs/_math_inline.js +2 -2
- package/lib-dist/components/terra/editor/docs/_math_inline.js.map +1 -0
- package/lib-dist/{terra → components/terra}/editor/docs/heading.d.ts +1 -1
- package/lib-dist/components/terra/editor/docs/heading.d.ts.map +1 -0
- package/lib-dist/{terra → components/terra}/editor/docs/heading.js +8 -5
- package/lib-dist/components/terra/editor/docs/heading.js.map +1 -0
- package/lib-dist/components/terra/editor/docs/index.d.ts.map +1 -0
- package/lib-dist/components/terra/editor/docs/index.js.map +1 -0
- package/lib-dist/components/terra/editor/terra-content.styles.d.ts +3 -0
- package/lib-dist/components/terra/editor/terra-content.styles.d.ts.map +1 -0
- package/lib-dist/components/terra/editor/terra-content.styles.js +3 -0
- package/lib-dist/components/terra/editor/terra-content.styles.js.map +1 -0
- package/lib-dist/{terra → components/terra}/editor/types.d.ts +2 -2
- package/lib-dist/components/terra/editor/types.d.ts.map +1 -0
- package/lib-dist/{terra → components/terra}/editor/types.js +1 -1
- package/lib-dist/components/terra/editor/types.js.map +1 -0
- package/lib-dist/{terra → components/terra}/flow/Nodes.d.ts +3 -3
- package/lib-dist/components/terra/flow/Nodes.d.ts.map +1 -0
- package/lib-dist/{terra → components/terra}/flow/Nodes.js +211 -104
- package/lib-dist/components/terra/flow/Nodes.js.map +1 -0
- package/lib-dist/{terra → components/terra}/flow/_chrome.d.ts +9 -9
- package/lib-dist/components/terra/flow/_chrome.d.ts.map +1 -0
- package/lib-dist/{terra → components/terra}/flow/_chrome.js +325 -114
- package/lib-dist/components/terra/flow/_chrome.js.map +1 -0
- package/lib-dist/components/terra/flow/menuContext.d.ts.map +1 -0
- package/lib-dist/components/terra/flow/menuContext.js.map +1 -0
- package/lib-dist/{terra → components/terra}/pages/docs/_attachments.d.ts +1 -1
- package/lib-dist/components/terra/pages/docs/_attachments.d.ts.map +1 -0
- package/lib-dist/{terra → components/terra}/pages/docs/_attachments.js +371 -127
- package/lib-dist/components/terra/pages/docs/_attachments.js.map +1 -0
- package/lib-dist/components/terra/pages/docs/_blocks.d.ts.map +1 -0
- package/lib-dist/{terra → components/terra}/pages/docs/_blocks.js +39 -28
- package/lib-dist/components/terra/pages/docs/_blocks.js.map +1 -0
- package/lib-dist/{terra → components/terra}/pages/docs/_editable.d.ts +3 -3
- package/lib-dist/components/terra/pages/docs/_editable.d.ts.map +1 -0
- package/lib-dist/{terra → components/terra}/pages/docs/_editable.js +81 -43
- package/lib-dist/components/terra/pages/docs/_editable.js.map +1 -0
- package/lib-dist/{terra → components/terra}/pages/docs/_export-dialog.d.ts +1 -1
- package/lib-dist/components/terra/pages/docs/_export-dialog.d.ts.map +1 -0
- package/lib-dist/{terra → components/terra}/pages/docs/_export-dialog.js +13 -13
- package/lib-dist/components/terra/pages/docs/_export-dialog.js.map +1 -0
- package/lib-dist/components/terra/pages/docs/_icons.d.ts.map +1 -0
- package/lib-dist/components/terra/pages/docs/_icons.js.map +1 -0
- package/lib-dist/{terra → components/terra}/pages/docs/_main.d.ts +10 -7
- package/lib-dist/components/terra/pages/docs/_main.d.ts.map +1 -0
- package/lib-dist/components/terra/pages/docs/_main.js +710 -0
- package/lib-dist/components/terra/pages/docs/_main.js.map +1 -0
- package/lib-dist/components/terra/pages/docs/_manage-attachments-dialog.d.ts +10 -0
- package/lib-dist/components/terra/pages/docs/_manage-attachments-dialog.d.ts.map +1 -0
- package/lib-dist/components/terra/pages/docs/_manage-attachments-dialog.js +597 -0
- package/lib-dist/components/terra/pages/docs/_manage-attachments-dialog.js.map +1 -0
- package/lib-dist/{terra → components/terra}/pages/docs/_sidebar.d.ts +3 -12
- package/lib-dist/components/terra/pages/docs/_sidebar.d.ts.map +1 -0
- package/lib-dist/components/terra/pages/docs/_sidebar.js +1437 -0
- package/lib-dist/components/terra/pages/docs/_sidebar.js.map +1 -0
- package/lib-dist/components/terra/pages/docs/_toc.d.ts +4 -0
- package/lib-dist/components/terra/pages/docs/_toc.d.ts.map +1 -0
- package/lib-dist/components/terra/pages/docs/_toc.js +212 -0
- package/lib-dist/components/terra/pages/docs/_toc.js.map +1 -0
- package/lib-dist/components/terra/pages/docs/_toolbar-find-replace.d.ts +15 -0
- package/lib-dist/components/terra/pages/docs/_toolbar-find-replace.d.ts.map +1 -0
- package/lib-dist/components/terra/pages/docs/_toolbar-find-replace.js +207 -0
- package/lib-dist/components/terra/pages/docs/_toolbar-find-replace.js.map +1 -0
- package/lib-dist/{terra → components/terra}/pages/docs/_toolbar.d.ts +4 -5
- package/lib-dist/components/terra/pages/docs/_toolbar.d.ts.map +1 -0
- package/lib-dist/{terra → components/terra}/pages/docs/_toolbar.js +312 -343
- package/lib-dist/components/terra/pages/docs/_toolbar.js.map +1 -0
- package/lib-dist/{terra → components/terra}/pages/docs/_tree.d.ts +4 -4
- package/lib-dist/components/terra/pages/docs/_tree.d.ts.map +1 -0
- package/lib-dist/{terra → components/terra}/pages/docs/_tree.js +219 -264
- package/lib-dist/components/terra/pages/docs/_tree.js.map +1 -0
- package/lib-dist/components/terra/pages/docs/use-block-nav.d.ts +5 -0
- package/lib-dist/components/terra/pages/docs/use-block-nav.d.ts.map +1 -0
- package/lib-dist/components/terra/pages/docs/use-block-nav.js +1306 -0
- package/lib-dist/components/terra/pages/docs/use-block-nav.js.map +1 -0
- package/lib-dist/components/terra/pages/docs/use-media-paste.d.ts +5 -0
- package/lib-dist/components/terra/pages/docs/use-media-paste.d.ts.map +1 -0
- package/lib-dist/components/terra/pages/docs/use-media-paste.js +391 -0
- package/lib-dist/components/terra/pages/docs/use-media-paste.js.map +1 -0
- package/lib-dist/components/terra/pages/docs/use-render-tripwire.d.ts +2 -0
- package/lib-dist/components/terra/pages/docs/use-render-tripwire.d.ts.map +1 -0
- package/lib-dist/components/terra/pages/docs/use-render-tripwire.js +25 -0
- package/lib-dist/components/terra/pages/docs/use-render-tripwire.js.map +1 -0
- package/lib-dist/{terra/runtime → components/terra}/ui.d.ts +2 -5
- package/lib-dist/components/terra/ui.d.ts.map +1 -0
- package/lib-dist/components/terra/ui.js +20 -0
- package/lib-dist/components/terra/ui.js.map +1 -0
- package/lib-dist/components/workspace-demo-fixture.d.ts +35 -0
- package/lib-dist/components/workspace-demo-fixture.d.ts.map +1 -0
- package/lib-dist/components/workspace-demo-fixture.js +820 -0
- package/lib-dist/components/workspace-demo-fixture.js.map +1 -0
- package/lib-dist/fonts/KaTeX_AMS-Regular.ttf +0 -0
- package/lib-dist/fonts/KaTeX_AMS-Regular.woff +0 -0
- package/lib-dist/fonts/KaTeX_AMS-Regular.woff2 +0 -0
- package/lib-dist/fonts/KaTeX_Caligraphic-Bold.ttf +0 -0
- package/lib-dist/fonts/KaTeX_Caligraphic-Bold.woff +0 -0
- package/lib-dist/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
- package/lib-dist/fonts/KaTeX_Caligraphic-Regular.ttf +0 -0
- package/lib-dist/fonts/KaTeX_Caligraphic-Regular.woff +0 -0
- package/lib-dist/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
- package/lib-dist/fonts/KaTeX_Fraktur-Bold.ttf +0 -0
- package/lib-dist/fonts/KaTeX_Fraktur-Bold.woff +0 -0
- package/lib-dist/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
- package/lib-dist/fonts/KaTeX_Fraktur-Regular.ttf +0 -0
- package/lib-dist/fonts/KaTeX_Fraktur-Regular.woff +0 -0
- package/lib-dist/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
- package/lib-dist/fonts/KaTeX_Main-Bold.ttf +0 -0
- package/lib-dist/fonts/KaTeX_Main-Bold.woff +0 -0
- package/lib-dist/fonts/KaTeX_Main-Bold.woff2 +0 -0
- package/lib-dist/fonts/KaTeX_Main-BoldItalic.ttf +0 -0
- package/lib-dist/fonts/KaTeX_Main-BoldItalic.woff +0 -0
- package/lib-dist/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
- package/lib-dist/fonts/KaTeX_Main-Italic.ttf +0 -0
- package/lib-dist/fonts/KaTeX_Main-Italic.woff +0 -0
- package/lib-dist/fonts/KaTeX_Main-Italic.woff2 +0 -0
- package/lib-dist/fonts/KaTeX_Main-Regular.ttf +0 -0
- package/lib-dist/fonts/KaTeX_Main-Regular.woff +0 -0
- package/lib-dist/fonts/KaTeX_Main-Regular.woff2 +0 -0
- package/lib-dist/fonts/KaTeX_Math-BoldItalic.ttf +0 -0
- package/lib-dist/fonts/KaTeX_Math-BoldItalic.woff +0 -0
- package/lib-dist/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
- package/lib-dist/fonts/KaTeX_Math-Italic.ttf +0 -0
- package/lib-dist/fonts/KaTeX_Math-Italic.woff +0 -0
- package/lib-dist/fonts/KaTeX_Math-Italic.woff2 +0 -0
- package/lib-dist/fonts/KaTeX_SansSerif-Bold.ttf +0 -0
- package/lib-dist/fonts/KaTeX_SansSerif-Bold.woff +0 -0
- package/lib-dist/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
- package/lib-dist/fonts/KaTeX_SansSerif-Italic.ttf +0 -0
- package/lib-dist/fonts/KaTeX_SansSerif-Italic.woff +0 -0
- package/lib-dist/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
- package/lib-dist/fonts/KaTeX_SansSerif-Regular.ttf +0 -0
- package/lib-dist/fonts/KaTeX_SansSerif-Regular.woff +0 -0
- package/lib-dist/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
- package/lib-dist/fonts/KaTeX_Script-Regular.ttf +0 -0
- package/lib-dist/fonts/KaTeX_Script-Regular.woff +0 -0
- package/lib-dist/fonts/KaTeX_Script-Regular.woff2 +0 -0
- package/lib-dist/fonts/KaTeX_Size1-Regular.ttf +0 -0
- package/lib-dist/fonts/KaTeX_Size1-Regular.woff +0 -0
- package/lib-dist/fonts/KaTeX_Size1-Regular.woff2 +0 -0
- package/lib-dist/fonts/KaTeX_Size2-Regular.ttf +0 -0
- package/lib-dist/fonts/KaTeX_Size2-Regular.woff +0 -0
- package/lib-dist/fonts/KaTeX_Size2-Regular.woff2 +0 -0
- package/lib-dist/fonts/KaTeX_Size3-Regular.ttf +0 -0
- package/lib-dist/fonts/KaTeX_Size3-Regular.woff +0 -0
- package/lib-dist/fonts/KaTeX_Size3-Regular.woff2 +0 -0
- package/lib-dist/fonts/KaTeX_Size4-Regular.ttf +0 -0
- package/lib-dist/fonts/KaTeX_Size4-Regular.woff +0 -0
- package/lib-dist/fonts/KaTeX_Size4-Regular.woff2 +0 -0
- package/lib-dist/fonts/KaTeX_Typewriter-Regular.ttf +0 -0
- package/lib-dist/fonts/KaTeX_Typewriter-Regular.woff +0 -0
- package/lib-dist/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
- package/lib-dist/lib/astro.d.ts +8 -0
- package/lib-dist/lib/astro.d.ts.map +1 -0
- package/lib-dist/lib/astro.js +27 -0
- package/lib-dist/lib/astro.js.map +1 -0
- package/lib-dist/{docs-catalog.d.ts → lib/docs-catalog.d.ts} +1 -1
- package/lib-dist/lib/docs-catalog.d.ts.map +1 -0
- package/lib-dist/lib/docs-catalog.js +75 -0
- package/lib-dist/lib/docs-catalog.js.map +1 -0
- package/lib-dist/lib/docs-theme.d.ts +7 -0
- package/lib-dist/lib/docs-theme.d.ts.map +1 -0
- package/lib-dist/lib/docs-theme.js +51 -0
- package/lib-dist/lib/docs-theme.js.map +1 -0
- package/lib-dist/lib/host-runtime.d.ts.map +1 -0
- package/lib-dist/{host-runtime.js → lib/host-runtime.js} +4 -2
- package/lib-dist/lib/host-runtime.js.map +1 -0
- package/lib-dist/{host.d.ts → lib/host.d.ts} +20 -0
- package/lib-dist/lib/host.d.ts.map +1 -0
- package/lib-dist/lib/host.js.map +1 -0
- package/lib-dist/lib/index.d.ts +34 -0
- package/lib-dist/lib/index.d.ts.map +1 -0
- package/lib-dist/lib/index.js +27 -0
- package/lib-dist/lib/index.js.map +1 -0
- package/lib-dist/{markdown-model.d.ts → lib/markdown-model.d.ts} +3 -3
- package/lib-dist/lib/markdown-model.d.ts.map +1 -0
- package/lib-dist/lib/markdown-model.js +2031 -0
- package/lib-dist/lib/markdown-model.js.map +1 -0
- package/lib-dist/lib/markdown.d.ts +3 -0
- package/lib-dist/lib/markdown.d.ts.map +1 -0
- package/lib-dist/lib/markdown.js +222 -0
- package/lib-dist/lib/markdown.js.map +1 -0
- package/lib-dist/{schema.d.ts → lib/schema.d.ts} +55 -23
- package/lib-dist/lib/schema.d.ts.map +1 -0
- package/lib-dist/{schema.js → lib/schema.js} +26 -18
- package/lib-dist/lib/schema.js.map +1 -0
- package/lib-dist/{terra/pages/docs/_custom.d.ts → lib/terra/custom-components.d.ts} +2 -2
- package/lib-dist/lib/terra/custom-components.d.ts.map +1 -0
- package/lib-dist/{terra/pages/docs/_custom.js → lib/terra/custom-components.js} +1 -1
- package/lib-dist/lib/terra/custom-components.js.map +1 -0
- package/lib-dist/lib/terra/docs/archive.d.ts +3 -0
- package/lib-dist/lib/terra/docs/archive.d.ts.map +1 -0
- package/lib-dist/lib/terra/docs/archive.js +654 -0
- package/lib-dist/lib/terra/docs/archive.js.map +1 -0
- package/lib-dist/lib/terra/docs/assets.d.ts +26 -0
- package/lib-dist/lib/terra/docs/assets.d.ts.map +1 -0
- package/lib-dist/lib/terra/docs/assets.js +74 -0
- package/lib-dist/lib/terra/docs/assets.js.map +1 -0
- package/lib-dist/lib/terra/docs/attachments.d.ts +4 -0
- package/lib-dist/lib/terra/docs/attachments.d.ts.map +1 -0
- package/lib-dist/lib/terra/docs/attachments.js +5 -0
- package/lib-dist/lib/terra/docs/attachments.js.map +1 -0
- package/lib-dist/lib/terra/docs/editor-dom.d.ts +50 -0
- package/lib-dist/lib/terra/docs/editor-dom.d.ts.map +1 -0
- package/lib-dist/lib/terra/docs/editor-dom.js +236 -0
- package/lib-dist/lib/terra/docs/editor-dom.js.map +1 -0
- package/lib-dist/lib/terra/docs/mutations.d.ts +10 -0
- package/lib-dist/lib/terra/docs/mutations.d.ts.map +1 -0
- package/lib-dist/lib/terra/docs/mutations.js +105 -0
- package/lib-dist/lib/terra/docs/mutations.js.map +1 -0
- package/lib-dist/lib/terra/docs/navigation.d.ts +6 -0
- package/lib-dist/lib/terra/docs/navigation.d.ts.map +1 -0
- package/lib-dist/lib/terra/docs/navigation.js +21 -0
- package/lib-dist/lib/terra/docs/navigation.js.map +1 -0
- package/lib-dist/lib/terra/docs/state.d.ts +186 -0
- package/lib-dist/lib/terra/docs/state.d.ts.map +1 -0
- package/lib-dist/lib/terra/docs/state.js +255 -0
- package/lib-dist/lib/terra/docs/state.js.map +1 -0
- package/lib-dist/lib/terra/docs/toolbar.d.ts +11 -0
- package/lib-dist/lib/terra/docs/toolbar.d.ts.map +1 -0
- package/lib-dist/lib/terra/docs/toolbar.js +41 -0
- package/lib-dist/lib/terra/docs/toolbar.js.map +1 -0
- package/lib-dist/lib/terra/docs/tree.d.ts +15 -0
- package/lib-dist/lib/terra/docs/tree.d.ts.map +1 -0
- package/lib-dist/lib/terra/docs/tree.js +61 -0
- package/lib-dist/lib/terra/docs/tree.js.map +1 -0
- package/lib-dist/{terra/pages/docs/_helpers.d.ts → lib/terra/docs/workspace.d.ts} +7 -6
- package/lib-dist/lib/terra/docs/workspace.d.ts.map +1 -0
- package/lib-dist/{terra/pages/docs/_helpers.js → lib/terra/docs/workspace.js} +39 -27
- package/lib-dist/lib/terra/docs/workspace.js.map +1 -0
- package/lib-dist/lib/terra/flow/_layout.d.ts.map +1 -0
- package/lib-dist/{terra → lib/terra}/flow/_layout.js +16 -6
- package/lib-dist/lib/terra/flow/_layout.js.map +1 -0
- package/lib-dist/lib/terra/flow/powerSource.d.ts.map +1 -0
- package/lib-dist/{terra → lib/terra}/flow/powerSource.js +10 -4
- package/lib-dist/lib/terra/flow/powerSource.js.map +1 -0
- package/lib-dist/{terra → lib/terra}/regex.mjs +11 -6
- package/lib-dist/lib/terra/runtime/action-proxy.d.ts +45 -0
- package/lib-dist/lib/terra/runtime/action-proxy.d.ts.map +1 -0
- package/lib-dist/{terra → lib/terra}/runtime/action-proxy.js +1 -1
- package/lib-dist/lib/terra/runtime/action-proxy.js.map +1 -0
- package/lib-dist/lib/terra/runtime/content/block-jsx.d.ts +23 -0
- package/lib-dist/lib/terra/runtime/content/block-jsx.d.ts.map +1 -0
- package/lib-dist/lib/terra/runtime/content/block-jsx.js +225 -0
- package/lib-dist/lib/terra/runtime/content/block-jsx.js.map +1 -0
- package/lib-dist/lib/terra/runtime/content/document-markdown.d.ts +41 -0
- package/lib-dist/lib/terra/runtime/content/document-markdown.d.ts.map +1 -0
- package/lib-dist/lib/terra/runtime/content/document-markdown.js +536 -0
- package/lib-dist/lib/terra/runtime/content/document-markdown.js.map +1 -0
- package/lib-dist/lib/terra/runtime/content/markdown.d.ts +109 -0
- package/lib-dist/lib/terra/runtime/content/markdown.d.ts.map +1 -0
- package/lib-dist/lib/terra/runtime/content/markdown.js +428 -0
- package/lib-dist/lib/terra/runtime/content/markdown.js.map +1 -0
- package/lib-dist/lib/terra/runtime/content.d.ts.map +1 -0
- package/lib-dist/{terra → lib/terra}/runtime/content.js +147 -62
- package/lib-dist/lib/terra/runtime/content.js.map +1 -0
- package/lib-dist/lib/terra/runtime/leaf.d.ts.map +1 -0
- package/lib-dist/{terra → lib/terra}/runtime/leaf.js +1 -1
- package/lib-dist/lib/terra/runtime/leaf.js.map +1 -0
- package/lib-dist/lib/terra/runtime/nodes.d.ts.map +1 -0
- package/lib-dist/{terra → lib/terra}/runtime/nodes.js +103 -31
- package/lib-dist/lib/terra/runtime/nodes.js.map +1 -0
- package/lib-dist/{terra → lib/terra}/runtime/runtime.d.ts +8 -2
- package/lib-dist/lib/terra/runtime/runtime.d.ts.map +1 -0
- package/lib-dist/lib/terra/runtime/runtime.js +86 -0
- package/lib-dist/lib/terra/runtime/runtime.js.map +1 -0
- package/lib-dist/lib/terra/runtime/shared.d.ts.map +1 -0
- package/lib-dist/{terra → lib/terra}/runtime/shared.js +56 -11
- package/lib-dist/lib/terra/runtime/shared.js.map +1 -0
- package/lib-dist/lib/terra/runtime/types.d.ts +529 -0
- package/lib-dist/lib/terra/runtime/types.d.ts.map +1 -0
- package/lib-dist/{terra → lib/terra}/runtime/types.js +28 -2
- package/lib-dist/lib/terra/runtime/types.js.map +1 -0
- package/lib-dist/lib/workspace-types.d.ts +29 -0
- package/lib-dist/lib/workspace-types.d.ts.map +1 -0
- package/lib-dist/lib/workspace-types.js +2 -0
- package/lib-dist/lib/workspace-types.js.map +1 -0
- package/lib-dist/style.css +237 -1
- package/package.json +34 -16
- package/src/components/NotFound.astro +6 -0
- package/src/components/NotFound.tsx +48 -0
- package/src/{SiteLayout.astro → components/SiteLayout.astro} +8 -4
- package/src/{navigation.tsx → components/navigation.tsx} +2 -1
- package/lib-dist/Docs.d.ts.map +0 -1
- package/lib-dist/Docs.js +0 -60
- package/lib-dist/Docs.js.map +0 -1
- package/lib-dist/LocalDocsWorkspace.d.ts.map +0 -1
- package/lib-dist/LocalDocsWorkspace.js.map +0 -1
- package/lib-dist/SiteLayout.d.ts +0 -30
- package/lib-dist/SiteLayout.d.ts.map +0 -1
- package/lib-dist/SiteLayout.js +0 -34
- package/lib-dist/SiteLayout.js.map +0 -1
- package/lib-dist/StaticWorkspace.d.ts.map +0 -1
- package/lib-dist/StaticWorkspace.js.map +0 -1
- package/lib-dist/_Toolbar.d.ts +0 -7
- package/lib-dist/_Toolbar.d.ts.map +0 -1
- package/lib-dist/_Toolbar.js +0 -85
- package/lib-dist/_Toolbar.js.map +0 -1
- package/lib-dist/blocks.d.ts.map +0 -1
- package/lib-dist/blocks.js.map +0 -1
- package/lib-dist/docs-catalog.d.ts.map +0 -1
- package/lib-dist/docs-catalog.js +0 -38
- package/lib-dist/docs-catalog.js.map +0 -1
- package/lib-dist/docs-style.css +0 -31
- package/lib-dist/fonts/README.md +0 -5
- package/lib-dist/host-runtime.d.ts.map +0 -1
- package/lib-dist/host-runtime.js.map +0 -1
- package/lib-dist/host.d.ts.map +0 -1
- package/lib-dist/host.js.map +0 -1
- package/lib-dist/index.d.ts +0 -35
- package/lib-dist/index.d.ts.map +0 -1
- package/lib-dist/index.js +0 -28
- package/lib-dist/index.js.map +0 -1
- package/lib-dist/markdown-model.d.ts.map +0 -1
- package/lib-dist/markdown-model.js +0 -181
- package/lib-dist/markdown-model.js.map +0 -1
- package/lib-dist/markdown.d.ts +0 -3
- package/lib-dist/markdown.d.ts.map +0 -1
- package/lib-dist/markdown.js +0 -83
- package/lib-dist/markdown.js.map +0 -1
- package/lib-dist/navigation.d.ts.map +0 -1
- package/lib-dist/navigation.js.map +0 -1
- package/lib-dist/schema.d.ts.map +0 -1
- package/lib-dist/schema.js.map +0 -1
- package/lib-dist/terra/Workspace.d.ts.map +0 -1
- package/lib-dist/terra/Workspace.js +0 -9
- package/lib-dist/terra/Workspace.js.map +0 -1
- package/lib-dist/terra/editor/TerraContentEditor.d.ts +0 -10
- package/lib-dist/terra/editor/TerraContentEditor.d.ts.map +0 -1
- package/lib-dist/terra/editor/TerraContentEditor.js +0 -47
- package/lib-dist/terra/editor/TerraContentEditor.js.map +0 -1
- package/lib-dist/terra/editor/_blocks.d.ts.map +0 -1
- package/lib-dist/terra/editor/_blocks.js +0 -110
- package/lib-dist/terra/editor/_blocks.js.map +0 -1
- package/lib-dist/terra/editor/docs/_Callout.d.ts.map +0 -1
- package/lib-dist/terra/editor/docs/_Callout.js.map +0 -1
- package/lib-dist/terra/editor/docs/_CodeBlock.d.ts.map +0 -1
- package/lib-dist/terra/editor/docs/_CodeBlock.js.map +0 -1
- package/lib-dist/terra/editor/docs/_DocsCode.d.ts.map +0 -1
- package/lib-dist/terra/editor/docs/_DocsCode.js.map +0 -1
- package/lib-dist/terra/editor/docs/_DocsImage.d.ts.map +0 -1
- package/lib-dist/terra/editor/docs/_DocsImage.js +0 -62
- package/lib-dist/terra/editor/docs/_DocsImage.js.map +0 -1
- package/lib-dist/terra/editor/docs/_Embed.d.ts.map +0 -1
- package/lib-dist/terra/editor/docs/_Embed.js +0 -27
- package/lib-dist/terra/editor/docs/_Embed.js.map +0 -1
- package/lib-dist/terra/editor/docs/_Math.d.ts.map +0 -1
- package/lib-dist/terra/editor/docs/_Math.js.map +0 -1
- package/lib-dist/terra/editor/docs/_Nodes.d.ts.map +0 -1
- package/lib-dist/terra/editor/docs/_Nodes.js +0 -52
- package/lib-dist/terra/editor/docs/_Nodes.js.map +0 -1
- package/lib-dist/terra/editor/docs/_Raw.d.ts.map +0 -1
- package/lib-dist/terra/editor/docs/_Raw.js.map +0 -1
- package/lib-dist/terra/editor/docs/_Table.d.ts.map +0 -1
- package/lib-dist/terra/editor/docs/_Table.js +0 -71
- package/lib-dist/terra/editor/docs/_Table.js.map +0 -1
- package/lib-dist/terra/editor/docs/_Tabs.d.ts.map +0 -1
- package/lib-dist/terra/editor/docs/_Tabs.js.map +0 -1
- package/lib-dist/terra/editor/docs/_TsDocs.d.ts.map +0 -1
- package/lib-dist/terra/editor/docs/_TsDocs.js.map +0 -1
- package/lib-dist/terra/editor/docs/_math_inline.d.ts.map +0 -1
- package/lib-dist/terra/editor/docs/_math_inline.js.map +0 -1
- package/lib-dist/terra/editor/docs/heading.d.ts.map +0 -1
- package/lib-dist/terra/editor/docs/heading.js.map +0 -1
- package/lib-dist/terra/editor/docs/index.d.ts.map +0 -1
- package/lib-dist/terra/editor/docs/index.js.map +0 -1
- package/lib-dist/terra/editor/types.d.ts.map +0 -1
- package/lib-dist/terra/editor/types.js.map +0 -1
- package/lib-dist/terra/flow/Nodes.d.ts.map +0 -1
- package/lib-dist/terra/flow/Nodes.js.map +0 -1
- package/lib-dist/terra/flow/_chrome.d.ts.map +0 -1
- package/lib-dist/terra/flow/_chrome.js.map +0 -1
- package/lib-dist/terra/flow/_layout.d.ts.map +0 -1
- package/lib-dist/terra/flow/_layout.js.map +0 -1
- package/lib-dist/terra/flow/menuContext.d.ts.map +0 -1
- package/lib-dist/terra/flow/menuContext.js.map +0 -1
- package/lib-dist/terra/flow/powerSource.d.ts.map +0 -1
- package/lib-dist/terra/flow/powerSource.js.map +0 -1
- package/lib-dist/terra/pages/docs/_attachments.d.ts.map +0 -1
- package/lib-dist/terra/pages/docs/_attachments.js.map +0 -1
- package/lib-dist/terra/pages/docs/_blocks.d.ts.map +0 -1
- package/lib-dist/terra/pages/docs/_blocks.js.map +0 -1
- package/lib-dist/terra/pages/docs/_custom.d.ts.map +0 -1
- package/lib-dist/terra/pages/docs/_custom.js.map +0 -1
- package/lib-dist/terra/pages/docs/_editable.d.ts.map +0 -1
- package/lib-dist/terra/pages/docs/_editable.js.map +0 -1
- package/lib-dist/terra/pages/docs/_export-dialog.d.ts.map +0 -1
- package/lib-dist/terra/pages/docs/_export-dialog.js.map +0 -1
- package/lib-dist/terra/pages/docs/_helpers.d.ts.map +0 -1
- package/lib-dist/terra/pages/docs/_helpers.js.map +0 -1
- package/lib-dist/terra/pages/docs/_icons.d.ts.map +0 -1
- package/lib-dist/terra/pages/docs/_icons.js.map +0 -1
- package/lib-dist/terra/pages/docs/_main.d.ts.map +0 -1
- package/lib-dist/terra/pages/docs/_main.js +0 -1959
- package/lib-dist/terra/pages/docs/_main.js.map +0 -1
- package/lib-dist/terra/pages/docs/_sidebar.d.ts.map +0 -1
- package/lib-dist/terra/pages/docs/_sidebar.js +0 -2450
- package/lib-dist/terra/pages/docs/_sidebar.js.map +0 -1
- package/lib-dist/terra/pages/docs/_toolbar.d.ts.map +0 -1
- package/lib-dist/terra/pages/docs/_toolbar.js.map +0 -1
- package/lib-dist/terra/pages/docs/_tree.d.ts.map +0 -1
- package/lib-dist/terra/pages/docs/_tree.js.map +0 -1
- package/lib-dist/terra/runtime/action-proxy.d.ts +0 -5
- package/lib-dist/terra/runtime/action-proxy.d.ts.map +0 -1
- package/lib-dist/terra/runtime/action-proxy.js.map +0 -1
- package/lib-dist/terra/runtime/content.d.ts.map +0 -1
- package/lib-dist/terra/runtime/content.js.map +0 -1
- package/lib-dist/terra/runtime/leaf.d.ts.map +0 -1
- package/lib-dist/terra/runtime/leaf.js.map +0 -1
- package/lib-dist/terra/runtime/nodes.d.ts.map +0 -1
- package/lib-dist/terra/runtime/nodes.js.map +0 -1
- package/lib-dist/terra/runtime/runtime.d.ts.map +0 -1
- package/lib-dist/terra/runtime/runtime.js +0 -50
- package/lib-dist/terra/runtime/runtime.js.map +0 -1
- package/lib-dist/terra/runtime/shared.d.ts.map +0 -1
- package/lib-dist/terra/runtime/shared.js.map +0 -1
- package/lib-dist/terra/runtime/types.d.ts +0 -266
- package/lib-dist/terra/runtime/types.d.ts.map +0 -1
- package/lib-dist/terra/runtime/types.js.map +0 -1
- package/lib-dist/terra/runtime/ui.d.ts.map +0 -1
- package/lib-dist/terra/runtime/ui.js +0 -16
- package/lib-dist/terra/runtime/ui.js.map +0 -1
- package/lib-dist/workspace.d.ts +0 -78
- package/lib-dist/workspace.d.ts.map +0 -1
- package/lib-dist/workspace.js +0 -151
- package/lib-dist/workspace.js.map +0 -1
- package/src/style.css +0 -733
- /package/lib-dist/{fonts → assets/fonts}/Avara-Bold.woff2 +0 -0
- /package/lib-dist/{fonts → assets/fonts}/Avara-BoldItalic.woff2 +0 -0
- /package/lib-dist/{fonts → assets/fonts}/OFL-1.1.txt +0 -0
- /package/lib-dist/{blocks.d.ts → components/blocks.d.ts} +0 -0
- /package/lib-dist/{navigation.js → components/navigation.js} +0 -0
- /package/lib-dist/{terra → components/terra}/editor/docs/_CodeBlock.d.ts +0 -0
- /package/lib-dist/{terra → components/terra}/editor/docs/index.d.ts +0 -0
- /package/lib-dist/{terra → components/terra}/editor/docs/index.js +0 -0
- /package/lib-dist/{terra → components/terra}/flow/menuContext.d.ts +0 -0
- /package/lib-dist/{terra → components/terra}/flow/menuContext.js +0 -0
- /package/lib-dist/{terra → components/terra}/pages/docs/_blocks.d.ts +0 -0
- /package/lib-dist/{terra → components/terra}/pages/docs/_icons.d.ts +0 -0
- /package/lib-dist/{terra → components/terra}/pages/docs/_icons.js +0 -0
- /package/lib-dist/{host-runtime.d.ts → lib/host-runtime.d.ts} +0 -0
- /package/lib-dist/{host.js → lib/host.js} +0 -0
- /package/lib-dist/{terra → lib/terra}/flow/_layout.d.ts +0 -0
- /package/lib-dist/{terra → lib/terra}/flow/powerSource.d.ts +0 -0
- /package/lib-dist/{terra → lib/terra}/runtime/content.d.ts +0 -0
- /package/lib-dist/{terra → lib/terra}/runtime/leaf.d.ts +0 -0
- /package/lib-dist/{terra → lib/terra}/runtime/nodes.d.ts +0 -0
- /package/lib-dist/{terra → lib/terra}/runtime/shared.d.ts +0 -0
|
@@ -9,48 +9,57 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
|
|
|
9
9
|
IMPORTS
|
|
10
10
|
//////////////////////////////////////////////////*/
|
|
11
11
|
// API
|
|
12
|
-
import {
|
|
12
|
+
import { clearTransition, setTransition, useAtom } from '../../../../lib/terra/docs/state.js';
|
|
13
|
+
import { $attachmentFilter } from '../../../../lib/terra/docs/attachments.js';
|
|
14
|
+
import { codeViewOf } from '../../../../lib/terra/docs/editor-dom.js';
|
|
15
|
+
import { FindReplace } from './_toolbar-find-replace.js';
|
|
16
|
+
import { toolbarFocusValue } from '../../../../lib/terra/docs/toolbar.js';
|
|
17
|
+
import { isDocBody } from '../../../../lib/terra/runtime/types.js';
|
|
13
18
|
import { $createHeadingNode } from '@lexical/rich-text';
|
|
14
19
|
import { $createParagraphNode, $getNearestNodeFromDOMNode, $isElementNode } from 'lexical';
|
|
15
|
-
import { actions } from '
|
|
16
|
-
import { docsRootPath } from '
|
|
17
|
-
import { cn, notify } from '
|
|
18
|
-
import { components as repoComponents } from '
|
|
19
|
-
import { dirname, toPascal } from '
|
|
20
|
+
import { actions } from '../../../../lib/terra/runtime/action-proxy.js';
|
|
21
|
+
import { docsRootPath } from '../../../../lib/terra/runtime/shared.js';
|
|
22
|
+
import { cn, notify } from '../../../../lib/terra/runtime/runtime.js';
|
|
23
|
+
import { components as repoComponents } from '../../../../lib/terra/custom-components.js';
|
|
24
|
+
import { dirname, toPascal } from '../../../../lib/terra/runtime/shared.js';
|
|
20
25
|
import { redo, redoDepth, undo, undoDepth } from '@codemirror/commands';
|
|
21
|
-
import { stringifyDocBody } from '
|
|
26
|
+
import { stringifyDocBody } from '../../../../lib/terra/runtime/content/document-markdown.js';
|
|
22
27
|
import { toast } from 'sonner';
|
|
23
28
|
import { useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react';
|
|
24
|
-
import { getDocsHostAdapter } from '
|
|
29
|
+
import { getDocsHostAdapter } from '../../../../lib/host-runtime.js';
|
|
25
30
|
// COMPONENTS
|
|
26
|
-
import * as TerraQualityRegex from '
|
|
31
|
+
import * as TerraQualityRegex from '../../../../lib/terra/regex.mjs';
|
|
27
32
|
import React from 'react';
|
|
28
33
|
import { TextTooltip, TooltipProvider } from '@terra-symposium/styling/ui/terra-original';
|
|
29
|
-
import {
|
|
34
|
+
import { ArrowUpRight as PopOutIcon, CaretDown as CaretDownIcon, DataShare as ShareIcon, Image as ImageIcon, Link as LinkIcon, ListBulleted as BulletListIcon, ListNumbered as NumberListIcon, Paste as PasteIcon, Redo as RedoIcon, RepoSourceCode as ModuleIcon, Search as SearchIcon, Task as CheckListIcon, TextBold as BoldIcon, TextFont as TextFontIcon, TextItalic as ItalicIcon, TextStrikethrough as StrikethroughIcon, TextUnderline as UnderlineIcon, Undo as UndoIcon, } from '@carbon/icons-react';
|
|
30
35
|
import { Button as UiButton } from '@terra-symposium/styling/ui/terra-original';
|
|
31
36
|
import { ButtonGroup } from '@terra-symposium/styling/ui/terra-original';
|
|
32
37
|
import { CodeBlock } from '../../editor/docs/_CodeBlock.js';
|
|
33
|
-
import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from '@terra-symposium/styling/ui/terra-original';
|
|
34
|
-
import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger } from '@terra-symposium/styling/ui/terra-original';
|
|
35
|
-
import { EditStateCtx } from '
|
|
36
|
-
import { ErrorBoundary } from '../../
|
|
38
|
+
import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from '@terra-symposium/styling/ui/terra-original';
|
|
39
|
+
import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, } from '@terra-symposium/styling/ui/terra-original';
|
|
40
|
+
import { EditStateCtx } from '../../../../lib/terra/docs/state.js';
|
|
41
|
+
import { ErrorBoundary } from '../../ui.js';
|
|
37
42
|
import { Input } from '@terra-symposium/styling/ui/terra-original';
|
|
38
43
|
import { Label } from '@terra-symposium/styling/ui/terra-original';
|
|
39
|
-
import { Popover, PopoverContent, PopoverTrigger } from '@terra-symposium/styling/ui/terra-original';
|
|
44
|
+
import { Popover, PopoverContent, PopoverTrigger, } from '@terra-symposium/styling/ui/terra-original';
|
|
40
45
|
import { SearchEmpty } from '@terra-symposium/styling/ui/terra-original';
|
|
41
|
-
import { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectSeparator, SelectTrigger, SelectValue } from '@terra-symposium/styling/ui/terra-original';
|
|
42
|
-
import { Textarea } from '@terra-symposium/styling/ui/terra-original';
|
|
43
|
-
import { Toggle } from '@terra-symposium/styling/ui/terra-original';
|
|
46
|
+
import { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectSeparator, SelectTrigger, SelectValue, } from '@terra-symposium/styling/ui/terra-original';
|
|
44
47
|
import { ToggleGroup, ToggleGroupItem } from '@terra-symposium/styling/ui/terra-original';
|
|
45
48
|
// DATA
|
|
46
|
-
import { ATTCH_TYPES } from '
|
|
49
|
+
import { ATTCH_TYPES } from '../../../../lib/terra/docs/attachments.js';
|
|
47
50
|
import { DOCS_BLOCK_ICONS } from './_icons.js';
|
|
48
|
-
import { EMPTY_NODES } from '
|
|
51
|
+
import { EMPTY_NODES } from '../../../../lib/terra/runtime/nodes.js';
|
|
49
52
|
/*//////////////////////////////////////////////////
|
|
50
53
|
CONFIG
|
|
51
54
|
//////////////////////////////////////////////////*/
|
|
52
55
|
const FIND_WORD = String.raw `[\p{L}\p{N}_]`;
|
|
53
|
-
const BLIND_REGEX = [
|
|
56
|
+
const BLIND_REGEX = [
|
|
57
|
+
/<[^>]+>/gu,
|
|
58
|
+
/^[\t ]*(?:#{1,6}|>+|[-+*]|\d+\.)[\t ]*/gmu,
|
|
59
|
+
/:::[^\n]*|===|\|\|\|/gu,
|
|
60
|
+
/[`*_~[\]()]/gu,
|
|
61
|
+
/\s+/gu,
|
|
62
|
+
];
|
|
54
63
|
const ICON_CLASS = 'size-4 text-primary-11';
|
|
55
64
|
const SECONDARY_TEXT_CLASS = 'text-xs text-primary-11';
|
|
56
65
|
const MENU_GAP_CLASS = 'gap-2';
|
|
@@ -149,7 +158,7 @@ COMPONENTS
|
|
|
149
158
|
//////////////////////////////////////////////////*/
|
|
150
159
|
const Button = React.forwardRef(function Button({ children: c, className: v, disabled: d, lbl: l, shortcut: s, onClick: o, onMouseDown: r, active: a, ...p }, x) {
|
|
151
160
|
void a;
|
|
152
|
-
return (_jsx(TextTooltip, { content: s ? `${l} (${s})` : l, side:
|
|
161
|
+
return (_jsx(TextTooltip, { content: s ? `${l} (${s})` : l, side: "top", align: "center", delayDuration: 400, children: _jsx(UiButton, { ref: x, variant: "ghost", size: "xs", "aria-label": l, disabled: d, onClick: o, onMouseDown: r, className: cn('inline-flex h-6 !p-0.5 shadow-none', v), ...p, children: c }) }));
|
|
153
162
|
});
|
|
154
163
|
Button.displayName = 'Button';
|
|
155
164
|
/**
|
|
@@ -165,13 +174,16 @@ Button.displayName = 'Button';
|
|
|
165
174
|
*/
|
|
166
175
|
function Mode({ mode, onModeChange, disabled, editable, size = 'xs', }) {
|
|
167
176
|
void editable;
|
|
168
|
-
return (_jsxs(Select, { size: size, disabled: disabled, value: mode, onValueChange: v => {
|
|
177
|
+
return (_jsxs(Select, { size: size, disabled: disabled, value: mode, onValueChange: (v) => {
|
|
169
178
|
const n = (v || 'view');
|
|
170
179
|
if (mode === n)
|
|
171
180
|
return;
|
|
172
181
|
setTransition(`to-${n}`);
|
|
173
182
|
onModeChange(n);
|
|
174
|
-
}, children: [_jsx(SelectTrigger, {
|
|
183
|
+
}, children: [_jsx(SelectTrigger, { "aria-label": "Mode",
|
|
184
|
+
// Match the original full-row selector in View/Edit. Attachments adds
|
|
185
|
+
// its type filters beside this control, so only that mode sizes to fit.
|
|
186
|
+
className: mode === 'attachments' ? 'w-fit' : undefined, children: _jsx(SelectValue, { placeholder: "Mode" }) }), _jsx(SelectContent, { align: 'start', children: (editable ? ['view', 'edit', 'attachments'] : ['view', 'attachments']).map(o => _jsx(SelectItem, { value: o, children: o[0].toUpperCase() + o.slice(1) }, o)) })] }));
|
|
175
187
|
}
|
|
176
188
|
/**
|
|
177
189
|
* Renders Docs-specific controls beside a content editor toolbar.
|
|
@@ -184,17 +196,17 @@ function Mode({ mode, onModeChange, disabled, editable, size = 'xs', }) {
|
|
|
184
196
|
* @return The mode, history, save, or version actions supported by the active Docs editor toolbar.
|
|
185
197
|
*/
|
|
186
198
|
const TOOLBAR_COMPONENTS = {
|
|
187
|
-
DocsToolbarActions({ activeMode
|
|
199
|
+
DocsToolbarActions({ activeMode, editable, size = 'xs', toolbar, }) {
|
|
188
200
|
const edit = useContext(EditStateCtx);
|
|
189
201
|
const [versions, setVersions] = useState([]);
|
|
190
202
|
const [historyOpen, setHistoryOpen] = useState(false);
|
|
191
203
|
const [selectedVersionId, setSelectedVersionId] = useState('');
|
|
192
|
-
const
|
|
193
|
-
const selectedVersion = versions.find(
|
|
204
|
+
const historyEnabled = getDocsHostAdapter()?.capabilities.history !== false;
|
|
205
|
+
const selectedVersion = versions.find((version) => version.savedAt === selectedVersionId);
|
|
194
206
|
const preview = useMemo(() => parseVerBody(selectedVersion), [selectedVersion]);
|
|
195
207
|
useEffect(() => {
|
|
196
208
|
let live = true;
|
|
197
|
-
if (!editable || !toolbar?.path || !historyOpen) {
|
|
209
|
+
if (!editable || !historyEnabled || !toolbar?.path || !historyOpen) {
|
|
198
210
|
setVersions([]);
|
|
199
211
|
return;
|
|
200
212
|
}
|
|
@@ -216,65 +228,71 @@ const TOOLBAR_COMPONENTS = {
|
|
|
216
228
|
if (live && Array.isArray(data))
|
|
217
229
|
setVersions(data);
|
|
218
230
|
}
|
|
219
|
-
catch (
|
|
220
|
-
console.error('[Toolbar:versions] load-failed', { path, error
|
|
221
|
-
toast.error(
|
|
231
|
+
catch (error) {
|
|
232
|
+
console.error('[Toolbar:versions] load-failed', { path, error });
|
|
233
|
+
toast.error(error instanceof Error ? error.message : 'Failed to load doc versions.');
|
|
222
234
|
}
|
|
223
235
|
})();
|
|
224
236
|
return () => {
|
|
225
237
|
live = false;
|
|
226
238
|
};
|
|
227
|
-
}, [editable, historyOpen, toolbar?.path]);
|
|
239
|
+
}, [editable, historyEnabled, historyOpen, toolbar?.path]);
|
|
228
240
|
useEffect(() => {
|
|
229
241
|
if (historyOpen && !selectedVersionId && versions[0])
|
|
230
242
|
setSelectedVersionId(versions[0].savedAt);
|
|
231
243
|
}, [historyOpen, selectedVersionId, versions]);
|
|
232
|
-
const save = async (
|
|
233
|
-
|
|
244
|
+
const save = async (event) => {
|
|
245
|
+
event.preventDefault();
|
|
234
246
|
if (!toolbar?.save)
|
|
235
247
|
return;
|
|
236
248
|
try {
|
|
237
|
-
await toolbar.save();
|
|
249
|
+
await Promise.resolve(toolbar.save());
|
|
238
250
|
}
|
|
239
|
-
catch (
|
|
240
|
-
console.error('[Docs:save] failed',
|
|
241
|
-
toast.error(
|
|
251
|
+
catch (error) {
|
|
252
|
+
console.error('[Docs:save] failed', error);
|
|
253
|
+
toast.error(error instanceof Error ? error.message : 'Unable to save document.');
|
|
242
254
|
}
|
|
243
255
|
};
|
|
244
256
|
useEffect(() => {
|
|
245
|
-
if (
|
|
257
|
+
if (activeMode === 'view')
|
|
246
258
|
return;
|
|
247
|
-
const onKeyDown = (
|
|
248
|
-
if ((
|
|
249
|
-
void save(
|
|
259
|
+
const onKeyDown = (event) => {
|
|
260
|
+
if ((event.metaKey || event.ctrlKey) && event.key.toLowerCase() === 's')
|
|
261
|
+
void save(event);
|
|
250
262
|
};
|
|
251
263
|
document.addEventListener('keydown', onKeyDown);
|
|
252
|
-
return () =>
|
|
253
|
-
|
|
254
|
-
};
|
|
255
|
-
}, [aMode, toolbar]);
|
|
264
|
+
return () => document.removeEventListener('keydown', onKeyDown);
|
|
265
|
+
}, [activeMode, toolbar]);
|
|
256
266
|
if (!editable)
|
|
257
267
|
return null;
|
|
258
|
-
return (_jsx(TooltipProvider, { children: _jsxs("div", { className:
|
|
268
|
+
return (_jsx(TooltipProvider, { children: _jsxs("div", { className: "flex items-center gap-1", "data-docs-toolbar-actions": true, children: [_jsx(Mode, { editable: editable, mode: activeMode, size: size, disabled: !toolbar, onModeChange: (mode) => {
|
|
259
269
|
if (!toolbar)
|
|
260
270
|
return;
|
|
261
|
-
toolbar.setMode(
|
|
262
|
-
console.error('[Toolbar:mode] change-failed', {
|
|
263
|
-
toast.error(
|
|
271
|
+
void toolbar.setMode(mode).catch((error) => {
|
|
272
|
+
console.error('[Toolbar:mode] change-failed', { mode, error });
|
|
273
|
+
toast.error(error instanceof Error ? error.message : 'Failed to change mode.');
|
|
264
274
|
clearTransition();
|
|
265
275
|
});
|
|
266
|
-
} }),
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
276
|
+
} }), activeMode === 'edit' && (_jsxs(ButtonGroup, { children: [_jsx(TextTooltip, { content: "Save (\u2318S)", side: "top", align: "center", delayDuration: 400, children: _jsx(UiButton, { size: size, disabled: !toolbar || !toolbar.dirty, loading: toolbar?.busy === 'saving', onMouseDown: preserveSel, onClick: (event) => void save(event), children: "Save" }) }), historyEnabled && (_jsx(TextTooltip, { content: "Version History", side: "top", align: "center", delayDuration: 400, children: _jsx(UiButton, { size: size, className: "px-0.5", disabled: !toolbar, "aria-label": "Version History", onMouseDown: preserveSel, onClick: () => {
|
|
277
|
+
if (versions.length > 0 && !selectedVersionId)
|
|
278
|
+
setSelectedVersionId(versions[0].savedAt);
|
|
279
|
+
setHistoryOpen(true);
|
|
280
|
+
}, children: _jsx(CaretDownIcon, {}) }) })), _jsx(Dialog, { open: historyOpen, onOpenChange: setHistoryOpen, children: _jsxs(DialogContent, { children: [_jsxs(DialogHeader, { children: [_jsx(DialogTitle, { children: "Version History" }), _jsx(DialogDescription, { className: "sr-only", children: "Select a version to preview and restore." }), _jsxs(Select, { value: selectedVersionId, onValueChange: setSelectedVersionId, children: [_jsx(SelectTrigger, { className: "h-14", "aria-label": "Select a version", children: _jsx(SelectValue, { placeholder: "Select a version" }) }), _jsx(SelectContent, { children: versions.map((version) => (_jsx(SelectItem, { value: version.savedAt, children: _jsxs("span", { className: "flex flex-col text-left", children: [_jsxs("span", { children: [version.title, " (", new Date(version.savedAt).toLocaleString(), ")"] }), _jsx("span", { className: SECONDARY_TEXT_CLASS, children: version.description })] }) }, version.savedAt))) })] })] }), _jsx("div", { className: "min-h-0 flex-1 overflow-y-auto", children: _jsx(CodeBlock, { tone: "view", language: "mdx", docsSource: true, code: preview.markdown.trim() || ' ' }) }), _jsxs(DialogFooter, { children: [_jsx(UiButton, { variant: "ghost", onClick: () => setHistoryOpen(false), children: "Cancel" }), _jsx(UiButton, { disabled: !selectedVersion, onClick: () => {
|
|
281
|
+
if (!edit || !selectedVersionId)
|
|
282
|
+
return;
|
|
283
|
+
edit.update({
|
|
284
|
+
content: preview.body,
|
|
285
|
+
description: selectedVersion?.description || '',
|
|
286
|
+
source: preview.markdown,
|
|
287
|
+
title: selectedVersion?.title || '',
|
|
288
|
+
});
|
|
289
|
+
(edit.setCode ?? edit.setSrc)?.(preview.markdown);
|
|
290
|
+
setHistoryOpen(false);
|
|
291
|
+
notify({
|
|
292
|
+
error: null,
|
|
293
|
+
fallback: 'Restored version to local draft. Save to apply.',
|
|
294
|
+
});
|
|
295
|
+
}, children: "Restore" })] })] }) })] }))] }) }));
|
|
278
296
|
},
|
|
279
297
|
/**
|
|
280
298
|
* Undo and Redo control group dynamically checking CodeMirror depth levels.
|
|
@@ -286,9 +304,12 @@ const TOOLBAR_COMPONENTS = {
|
|
|
286
304
|
*
|
|
287
305
|
* @return {JSX.Element} The paired undo/redo button group.
|
|
288
306
|
*/
|
|
289
|
-
Undo({ onMouseDown, disabled, adapter }) {
|
|
307
|
+
Undo({ onMouseDown, disabled, adapter, }) {
|
|
290
308
|
// STATES
|
|
291
|
-
const [state, setState] = useState({
|
|
309
|
+
const [state, setState] = useState({
|
|
310
|
+
redo: false,
|
|
311
|
+
undo: false,
|
|
312
|
+
});
|
|
292
313
|
// INIT
|
|
293
314
|
useEffect(() => {
|
|
294
315
|
let frame = 0;
|
|
@@ -297,8 +318,10 @@ const TOOLBAR_COMPONENTS = {
|
|
|
297
318
|
*/
|
|
298
319
|
const sync = () => {
|
|
299
320
|
const view = codeViewOf();
|
|
300
|
-
const n = view
|
|
301
|
-
|
|
321
|
+
const n = view
|
|
322
|
+
? { redo: redoDepth(view.state) > 0, undo: undoDepth(view.state) > 0 }
|
|
323
|
+
: { redo: false, undo: false };
|
|
324
|
+
setState((c) => (c.undo === n.undo && c.redo === n.redo ? c : n));
|
|
302
325
|
};
|
|
303
326
|
sync();
|
|
304
327
|
/**
|
|
@@ -308,21 +331,33 @@ const TOOLBAR_COMPONENTS = {
|
|
|
308
331
|
cancelAnimationFrame(frame);
|
|
309
332
|
frame = requestAnimationFrame(sync);
|
|
310
333
|
};
|
|
311
|
-
['focusin', 'keyup', 'mouseup'].forEach(e => {
|
|
334
|
+
['focusin', 'keyup', 'mouseup'].forEach((e) => {
|
|
312
335
|
document.addEventListener(e, refresh, true);
|
|
313
336
|
});
|
|
314
337
|
return () => {
|
|
315
338
|
cancelAnimationFrame(frame);
|
|
316
|
-
['focusin', 'keyup', 'mouseup'].forEach(e => {
|
|
339
|
+
['focusin', 'keyup', 'mouseup'].forEach((e) => {
|
|
317
340
|
document.removeEventListener(e, refresh, true);
|
|
318
341
|
});
|
|
319
342
|
};
|
|
320
343
|
}, []);
|
|
321
344
|
// RENDER
|
|
322
345
|
return (_jsx(ButtonGroup, { children: [
|
|
323
|
-
{
|
|
324
|
-
|
|
325
|
-
|
|
346
|
+
{
|
|
347
|
+
lbl: 'Undo',
|
|
348
|
+
canFire: adapter?.undoable ?? state.undo,
|
|
349
|
+
action: adapter?.undo ?? undo,
|
|
350
|
+
icon: UndoIcon,
|
|
351
|
+
shortcut: '⌘Z',
|
|
352
|
+
},
|
|
353
|
+
{
|
|
354
|
+
lbl: 'Redo',
|
|
355
|
+
canFire: adapter?.redoable ?? state.redo,
|
|
356
|
+
action: adapter?.redo ?? redo,
|
|
357
|
+
icon: RedoIcon,
|
|
358
|
+
shortcut: '⌘Y',
|
|
359
|
+
},
|
|
360
|
+
].map((b) => (_jsx(Button, { lbl: b.lbl, shortcut: b.shortcut, disabled: disabled || !b.canFire, onMouseDown: onMouseDown, onClick: () => {
|
|
326
361
|
if (adapter) {
|
|
327
362
|
if (b.lbl === 'Undo')
|
|
328
363
|
adapter.undo?.();
|
|
@@ -337,180 +372,6 @@ const TOOLBAR_COMPONENTS = {
|
|
|
337
372
|
view.focus();
|
|
338
373
|
}, children: _jsx(b.icon, {}) }, b.lbl))) }));
|
|
339
374
|
},
|
|
340
|
-
/**
|
|
341
|
-
* Complex Popover enabling blind/case-sensitive searches and sequential replacement inside active viewports.
|
|
342
|
-
*
|
|
343
|
-
* @param props - Active editing mode and toolbar state used to find text and apply replacements in the current editor.
|
|
344
|
-
* @param {ToolbarMode} props.mode - The active interface mode determining search limits.
|
|
345
|
-
* @param {ToolbarState | null} props.toolbar - System toolbar state reference to execute replacements.
|
|
346
|
-
*
|
|
347
|
-
* @return {JSX.Element | null} The Find and Replace popover or null in view mode.
|
|
348
|
-
*/
|
|
349
|
-
FindReplace({ mode, toolbar }) {
|
|
350
|
-
// STATES
|
|
351
|
-
const ref = useRef(null);
|
|
352
|
-
const [cfg, setCfg] = useState({ blind: false, case: false, find: '', full: false, open: false, replace: '' });
|
|
353
|
-
const [idx, setIdx] = useState(0);
|
|
354
|
-
const [content, setContent] = useState('');
|
|
355
|
-
// INIT
|
|
356
|
-
useEffect(() => {
|
|
357
|
-
if (!cfg.open || !toolbar)
|
|
358
|
-
return;
|
|
359
|
-
let a = true;
|
|
360
|
-
void toolbar.readSearchText().then(r => {
|
|
361
|
-
if (a)
|
|
362
|
-
setContent(r || '');
|
|
363
|
-
});
|
|
364
|
-
return () => {
|
|
365
|
-
a = false;
|
|
366
|
-
};
|
|
367
|
-
}, [cfg.open, cfg.find, toolbar]);
|
|
368
|
-
// PROCESS
|
|
369
|
-
const searchable = useMemo(() => {
|
|
370
|
-
return cfg.blind ? BLIND_REGEX.reduce((a, r) => a.replace(r, ''), content) : content;
|
|
371
|
-
}, [cfg.blind, content]);
|
|
372
|
-
const matcher = useMemo(() => {
|
|
373
|
-
if (!cfg.find)
|
|
374
|
-
return null;
|
|
375
|
-
const v = cfg.blind ? BLIND_REGEX.reduce((a, r) => a.replace(r, ''), cfg.find) : cfg.find;
|
|
376
|
-
if (!v)
|
|
377
|
-
return null;
|
|
378
|
-
const body = v.replace(TerraQualityRegex.REGEX_G_REGEX_9(), '\\$&');
|
|
379
|
-
return new RegExp(cfg.full ? `(?<!${FIND_WORD})${body}(?!${FIND_WORD})` : body, `${cfg.case ? 'g' : 'gi'}u`);
|
|
380
|
-
}, [cfg]);
|
|
381
|
-
const matches = useMemo(() => (matcher && searchable ? Array.from(searchable.matchAll(matcher), m => m.index ?? 0) : []), [matcher, searchable]);
|
|
382
|
-
const jsonBlocked = looksLikeJsonBlob(cfg.find) || looksLikeJsonBlob(cfg.replace);
|
|
383
|
-
// HELPERS
|
|
384
|
-
/**
|
|
385
|
-
* Handles focus find.
|
|
386
|
-
*/
|
|
387
|
-
const focusFind = () => {
|
|
388
|
-
requestAnimationFrame(() => {
|
|
389
|
-
ref.current?.focus();
|
|
390
|
-
ref.current?.select();
|
|
391
|
-
});
|
|
392
|
-
};
|
|
393
|
-
/**
|
|
394
|
-
* Handles open sel.
|
|
395
|
-
*/
|
|
396
|
-
const openSel = () => {
|
|
397
|
-
setCfg(((selectedText) => (prev) => ({ ...prev, find: selectedText || prev.find, open: true }))(window.getSelection()?.toString().replace(/\r\n?/gu, '\n') ?? ''));
|
|
398
|
-
focusFind();
|
|
399
|
-
};
|
|
400
|
-
/**
|
|
401
|
-
* Handles navigate.
|
|
402
|
-
*
|
|
403
|
-
* @param backward - Whether navigation should move toward the previous item.
|
|
404
|
-
*/
|
|
405
|
-
const navigate = (backward = false) => {
|
|
406
|
-
const browser = window;
|
|
407
|
-
const finder = typeof browser.find === 'function' ? browser.find.bind(browser) : null;
|
|
408
|
-
if (cfg.find && !cfg.blind && matches.length)
|
|
409
|
-
setIdx(p => (p + (backward ? -1 : 1) + matches.length) % matches.length);
|
|
410
|
-
if (cfg.find && !cfg.blind && finder) {
|
|
411
|
-
finder(cfg.find, cfg.case, backward, true, false, true, cfg.full);
|
|
412
|
-
requestAnimationFrame(() => {
|
|
413
|
-
const sel = window.getSelection();
|
|
414
|
-
if (!sel || !sel.rangeCount)
|
|
415
|
-
return;
|
|
416
|
-
let rect = sel.getRangeAt(0).getBoundingClientRect();
|
|
417
|
-
if (rect.width === 0 && rect.height === 0) {
|
|
418
|
-
const codemirrorSel = document.querySelector('.docs-code-block .cm-selectionBackground, .docs-code-block .cm-search-match');
|
|
419
|
-
if (codemirrorSel)
|
|
420
|
-
rect = codemirrorSel.getBoundingClientRect();
|
|
421
|
-
}
|
|
422
|
-
if (rect.width === 0 && rect.height === 0)
|
|
423
|
-
return;
|
|
424
|
-
const toolbarEl = document.querySelector('[data-docs-toolbar-frame]');
|
|
425
|
-
const top = toolbarEl ? toolbarEl.getBoundingClientRect().bottom : 60;
|
|
426
|
-
if (rect.top < top + 40) {
|
|
427
|
-
window.scrollBy({ top: rect.top - top - 60, behavior: 'auto' });
|
|
428
|
-
}
|
|
429
|
-
else if (rect.bottom > window.innerHeight - 40) {
|
|
430
|
-
window.scrollBy({ top: rect.bottom - window.innerHeight + 60, behavior: 'auto' });
|
|
431
|
-
}
|
|
432
|
-
});
|
|
433
|
-
}
|
|
434
|
-
};
|
|
435
|
-
// INIT
|
|
436
|
-
useEffect(() => {
|
|
437
|
-
if (cfg.open)
|
|
438
|
-
focusFind();
|
|
439
|
-
}, [cfg.open]);
|
|
440
|
-
useEffect(() => {
|
|
441
|
-
setIdx(0);
|
|
442
|
-
}, [cfg.find]);
|
|
443
|
-
useEffect(() => {
|
|
444
|
-
if (!matches.length) {
|
|
445
|
-
setIdx(0);
|
|
446
|
-
return;
|
|
447
|
-
}
|
|
448
|
-
setIdx(p => Math.min(p, matches.length - 1));
|
|
449
|
-
}, [matches.length]);
|
|
450
|
-
useEffect(() => {
|
|
451
|
-
if (mode === 'view')
|
|
452
|
-
return;
|
|
453
|
-
/**
|
|
454
|
-
* Handles on key down.
|
|
455
|
-
*
|
|
456
|
-
* @param e - Pointer event received from the toolbar control.
|
|
457
|
-
*/
|
|
458
|
-
const onKeyDown = (e) => {
|
|
459
|
-
if ((e.metaKey || e.ctrlKey) && e.key?.toLowerCase() === 'f') {
|
|
460
|
-
e.preventDefault();
|
|
461
|
-
openSel();
|
|
462
|
-
return;
|
|
463
|
-
}
|
|
464
|
-
if (cfg.open && e.key === 'Enter') {
|
|
465
|
-
e.preventDefault();
|
|
466
|
-
navigate(e.shiftKey);
|
|
467
|
-
}
|
|
468
|
-
};
|
|
469
|
-
document.addEventListener('keydown', onKeyDown, true);
|
|
470
|
-
return () => {
|
|
471
|
-
document.removeEventListener('keydown', onKeyDown, true);
|
|
472
|
-
};
|
|
473
|
-
}, [cfg, mode]);
|
|
474
|
-
// RENDER
|
|
475
|
-
// validation
|
|
476
|
-
if (mode === 'view')
|
|
477
|
-
return null;
|
|
478
|
-
// component
|
|
479
|
-
return (_jsxs(Popover, { open: cfg.open, onOpenChange: o => {
|
|
480
|
-
setCfg(p => ({ ...p, open: o }));
|
|
481
|
-
}, children: [_jsx(PopoverTrigger, { asChild: true, children: _jsxs(UiButton, { size: 'xs', variant: 'ghost', onMouseDown: e => {
|
|
482
|
-
e.preventDefault();
|
|
483
|
-
}, onClick: openSel, children: [_jsx(SearchIcon, {}), " Find"] }) }), _jsxs(PopoverContent, { align: 'end', className: 'w-80 space-y-2', children: [[
|
|
484
|
-
{ title: 'Find', val: cfg.find, key: 'find', ref, placeholder: 'Search text' },
|
|
485
|
-
{ title: 'Replace', val: cfg.replace, key: 'replace', placeholder: 'Replace' },
|
|
486
|
-
].map(f => (_jsxs("div", { className: 'space-y-1', children: [_jsx(Label, { children: f.title }), _jsx(Textarea, { ref: 'ref' in f ? f.ref : undefined, value: f.val, onChange: e => {
|
|
487
|
-
const inputChange = { field: f.key, value: e.currentTarget?.value ?? '' };
|
|
488
|
-
setCfg(p => ({ ...p, [inputChange.field]: inputChange.value }));
|
|
489
|
-
}, placeholder: f.placeholder, rows: Math.max(2, f.val.split('\n').length), onKeyDown: e => {
|
|
490
|
-
if (e.key === 'Enter') {
|
|
491
|
-
e.preventDefault();
|
|
492
|
-
navigate(e.shiftKey);
|
|
493
|
-
}
|
|
494
|
-
} })] }, f.title))), _jsxs("div", { className: 'flex items-center justify-between text-xs text-primary-11', children: [_jsxs("span", { children: [" ", cfg.find && (matches.length ? `Result ${idx + 1}/${matches.length}` : 'No matches')] }), cfg.blind && _jsx("span", { children: "Text only" })] }), _jsxs("div", { className: 'flex flex-wrap gap-2', children: [[
|
|
495
|
-
{ icon: _jsx(LeftArrowIcon, {}), backward: true, lbl: 'Previous match' },
|
|
496
|
-
{ icon: _jsx(RightArrowIcon, {}), backward: false, lbl: 'Next match' },
|
|
497
|
-
].map(b => (_jsx(UiButton, { size: 'xs', variant: 'tonal', disabled: !cfg.find || cfg.blind, onClick: () => {
|
|
498
|
-
navigate(b.backward);
|
|
499
|
-
}, "aria-label": b.lbl, title: b.lbl, children: b.icon }, String(b.backward)))), [
|
|
500
|
-
{ key: 'case', title: 'Case sensitive', content: _jsx(CaseIcon, {}) },
|
|
501
|
-
{ key: 'full', title: 'Full words', content: _jsx(FullWordIcon, {}) },
|
|
502
|
-
{ key: 'blind', title: 'Markdown blind', content: 'Blind' },
|
|
503
|
-
].map(t => (_jsx(Toggle, { size: 'xs', variant: 'tonal', "aria-label": t.title, title: t.title, pressed: cfg[t.key], onPressedChange: v => {
|
|
504
|
-
setCfg(p => ({ ...p, [t.key]: v }));
|
|
505
|
-
}, children: t.content }, t.key))), _jsx(UiButton, { size: 'xs', disabled: !matches.length || !toolbar || toolbar.busy === 'saving' || cfg.blind || jsonBlocked, onClick: () => {
|
|
506
|
-
if (jsonBlocked) {
|
|
507
|
-
toast.error('Paste markdown, not JSON, into find or replace.');
|
|
508
|
-
return;
|
|
509
|
-
}
|
|
510
|
-
if (matcher && toolbar)
|
|
511
|
-
toolbar.applySearchText(content.replace(matcher, cfg.replace));
|
|
512
|
-
}, "aria-label": 'Replace', title: 'Replace', children: _jsx(ReplaceIcon, {}) }), jsonBlocked && _jsx("span", { className: 'text-red-11 text-xs', children: "JSON input blocked" })] })] })] }));
|
|
513
|
-
},
|
|
514
375
|
/**
|
|
515
376
|
* Dropdown dialog facilitating attachment uploads or selecting document attachments natively bound to the leaf.
|
|
516
377
|
*
|
|
@@ -544,7 +405,7 @@ const TOOLBAR_COMPONENTS = {
|
|
|
544
405
|
name: typeof a.name === 'string' ? a.name : a.path.split('/').pop() || 'attachment',
|
|
545
406
|
})));
|
|
546
407
|
})
|
|
547
|
-
.catch(e => {
|
|
408
|
+
.catch((e) => {
|
|
548
409
|
console.error('[Toolbar:attachments] load-failed', { path: ctx, error: e });
|
|
549
410
|
toast.error(e instanceof Error ? e.message : 'Failed to load attachments.');
|
|
550
411
|
});
|
|
@@ -565,9 +426,9 @@ const TOOLBAR_COMPONENTS = {
|
|
|
565
426
|
submit: async () => {
|
|
566
427
|
if (!cfg.attachment || cfg.attachment === 'none' || !insert)
|
|
567
428
|
return;
|
|
568
|
-
setCfg(p => ({ ...p, busy: true }));
|
|
429
|
+
setCfg((p) => ({ ...p, busy: true }));
|
|
569
430
|
try {
|
|
570
|
-
const att = atts.find(a => a.path === cfg.attachment);
|
|
431
|
+
const att = atts.find((a) => a.path === cfg.attachment);
|
|
571
432
|
if (!att)
|
|
572
433
|
throw new Error('Attachment not found');
|
|
573
434
|
const lbl = att.name
|
|
@@ -575,7 +436,8 @@ const TOOLBAR_COMPONENTS = {
|
|
|
575
436
|
.pop()
|
|
576
437
|
?.split('.')[0]
|
|
577
438
|
?.replace(TerraQualityRegex.REGEX_G_REGEX_7(), ' ')
|
|
578
|
-
.replace(TerraQualityRegex.REGEX_B_W_G_REGEX(), c => c.toUpperCase()) ||
|
|
439
|
+
.replace(TerraQualityRegex.REGEX_B_W_G_REGEX(), (c) => c.toUpperCase()) ||
|
|
440
|
+
'attachment';
|
|
579
441
|
const c = (att.path.startsWith('http') ? att.path : att.name).replace(TerraQualityRegex.REGEX_G_REGEX(), '%20');
|
|
580
442
|
let fmt = '';
|
|
581
443
|
if (insertMode === 'link')
|
|
@@ -590,19 +452,19 @@ const TOOLBAR_COMPONENTS = {
|
|
|
590
452
|
uploaderActions.reset();
|
|
591
453
|
}
|
|
592
454
|
catch {
|
|
593
|
-
setCfg(p => ({ ...p, busy: false }));
|
|
455
|
+
setCfg((p) => ({ ...p, busy: false }));
|
|
594
456
|
}
|
|
595
457
|
},
|
|
596
458
|
};
|
|
597
459
|
// RENDER
|
|
598
|
-
return (_jsxs(Popover, { open: cfg.open, onOpenChange: o => {
|
|
460
|
+
return (_jsxs(Popover, { open: cfg.open, onOpenChange: (o) => {
|
|
599
461
|
if (!o)
|
|
600
462
|
uploaderActions.reset();
|
|
601
463
|
else
|
|
602
|
-
setCfg(p => ({ ...p, open: o }));
|
|
603
|
-
}, children: [_jsx(PopoverTrigger, { asChild: true, children: _jsx(Button, { disabled: disabled, lbl: 'Insert attachment', onMouseDown: onMouseDown, children: _jsx(Icon, {}) }) }), _jsxs(PopoverContent, { align:
|
|
604
|
-
setCfg(v => ({ ...v, attachment: p }));
|
|
605
|
-
}, children: [_jsx(SelectTrigger, { "aria-label":
|
|
464
|
+
setCfg((p) => ({ ...p, open: o }));
|
|
465
|
+
}, children: [_jsx(PopoverTrigger, { asChild: true, children: _jsx(Button, { disabled: disabled, lbl: 'Insert attachment', onMouseDown: onMouseDown, children: _jsx(Icon, {}) }) }), _jsxs(PopoverContent, { align: "start", className: "w-80 space-y-4", children: [_jsxs("div", { className: FIELD_GAP_CLASS, children: [_jsx(Label, { className: SECONDARY_TEXT_CLASS, children: "Document Attachments" }), _jsxs(Select, { value: cfg.attachment, onValueChange: (p) => {
|
|
466
|
+
setCfg((v) => ({ ...v, attachment: p }));
|
|
467
|
+
}, children: [_jsx(SelectTrigger, { "aria-label": "Document Attachment", children: _jsx(SelectValue, { placeholder: "Select an attachment" }) }), _jsx(SelectContent, { children: atts.length === 0 ? (_jsx(SelectItem, { value: 'none', disabled: true, children: "No attachments found" })) : (atts.map(a => (_jsx(SelectItem, { value: a.path, children: a.name }, a.path)))) })] })] }), _jsxs("div", { className: FIELD_GAP_CLASS, children: [_jsx(Label, { children: "Format" }), _jsx(ToggleGroup, { type: 'single', value: insertMode, onValueChange: v => v && setInsertMode(v), className: 'justify-start', children: [['embed', 'Visual Embed'], ['link', 'Text Link']].map(([v, l]) => (_jsx(ToggleGroupItem, { value: v, size: 'sm', className: 'h-7 px-3 text-xs', children: l }, v))) })] }), _jsx(UiButton, { className: "w-full", disabled: !cfg.attachment || cfg.attachment === 'none' || cfg.busy, loading: cfg.busy, onClick: () => void uploaderActions.submit(), children: "Insert" })] })] }));
|
|
606
468
|
},
|
|
607
469
|
/**
|
|
608
470
|
* Recursive structural map converting component tree branches into native interactive dropdown triggers natively.
|
|
@@ -615,11 +477,13 @@ const TOOLBAR_COMPONENTS = {
|
|
|
615
477
|
*
|
|
616
478
|
* @return {JSX.Element} React rendered menu node explicitly containing nested branches cleanly.
|
|
617
479
|
*/
|
|
618
|
-
GlobalComponentMenuNode({ name, tree, onCopy }) {
|
|
619
|
-
return (_jsxs(DropdownMenuSub, { children: [_jsx(DropdownMenuSubTrigger, { className:
|
|
480
|
+
GlobalComponentMenuNode({ name, tree, onCopy, }) {
|
|
481
|
+
return (_jsxs(DropdownMenuSub, { children: [_jsx(DropdownMenuSubTrigger, { className: "capitalize", children: name.replace(TerraQualityRegex.REGEX_G_REGEX_7(), ' ') }), _jsxs(DropdownMenuSubContent, { children: [tree.components.map((c) => (_jsx(DropdownMenuItem, { onMouseDown: preserveSel, onSelect: (e) => {
|
|
620
482
|
e.preventDefault();
|
|
621
483
|
onCopy?.(c);
|
|
622
|
-
}, children: c.displayLabel
|
|
484
|
+
}, children: c.displayLabel
|
|
485
|
+
.replace(TerraQualityRegex.REGEX_G_REGEX_7(), ' ')
|
|
486
|
+
.replace(TerraQualityRegex.REGEX_B_W_G_REGEX(), (c) => c.toUpperCase()) }, `${c.path}:${c.name}`))), Object.entries(tree.folders).map(([f, s]) => (_jsx(TOOLBAR_COMPONENTS.GlobalComponentMenuNode, { name: f, tree: s, onCopy: onCopy }, f)))] })] }));
|
|
623
487
|
},
|
|
624
488
|
/**
|
|
625
489
|
* Complex unified insertion menu tracking local sister references alongside globally configured repo components.
|
|
@@ -640,14 +504,21 @@ const TOOLBAR_COMPONENTS = {
|
|
|
640
504
|
Custom({ onInsert, onInsertMd, onMouseDown, disabled, ctx, }) {
|
|
641
505
|
// STATES
|
|
642
506
|
const [sis, setSis] = useState([]);
|
|
643
|
-
const [search, setSearch] = useState({
|
|
507
|
+
const [search, setSearch] = useState({
|
|
508
|
+
open: false,
|
|
509
|
+
query: '',
|
|
510
|
+
tree: [],
|
|
511
|
+
busy: false,
|
|
512
|
+
});
|
|
644
513
|
const savedSel = useRef(null);
|
|
645
514
|
const copyLock = useRef(null);
|
|
646
515
|
// 1. FETCH LOCAL FILES (Allows ALL leaves as valid attachments)
|
|
647
516
|
useEffect(() => {
|
|
648
517
|
if (!ctx)
|
|
649
518
|
return;
|
|
650
|
-
const dir = dirname(TerraQualityRegex.REGEX_INDEX_MD_MDX_I_REGEX_2().test(ctx.split('/').pop() || '')
|
|
519
|
+
const dir = dirname(TerraQualityRegex.REGEX_INDEX_MD_MDX_I_REGEX_2().test(ctx.split('/').pop() || '')
|
|
520
|
+
? dirname(ctx)
|
|
521
|
+
: ctx);
|
|
651
522
|
actions.read.doc
|
|
652
523
|
.list({ type: 'folderEntries', path: dir })
|
|
653
524
|
.then(({ data: d }) => {
|
|
@@ -655,7 +526,7 @@ const TOOLBAR_COMPONENTS = {
|
|
|
655
526
|
if (Array.isArray(d))
|
|
656
527
|
setSis(d.filter((p) => p !== ctx && dirname(p) === dir && /\.(md|mdx|astro|tsx)$/i.test(p.split('/').pop() || '')).map((p) => ({ path: p, name: p.split('/').pop() || '' })));
|
|
657
528
|
})
|
|
658
|
-
.catch(e => {
|
|
529
|
+
.catch((e) => {
|
|
659
530
|
console.error('[Toolbar:insert.load-failed]', { path: dir, error: e });
|
|
660
531
|
toast.error(e instanceof Error ? e.message : 'Failed to load insert targets.');
|
|
661
532
|
});
|
|
@@ -664,8 +535,8 @@ const TOOLBAR_COMPONENTS = {
|
|
|
664
535
|
const componentTree = useMemo(() => {
|
|
665
536
|
const root = { components: [], folders: {} };
|
|
666
537
|
const counts = new Map();
|
|
667
|
-
repoComponents.forEach(c => counts.set(c.path, (counts.get(c.path) ?? 0) + 1));
|
|
668
|
-
repoComponents.forEach(c => {
|
|
538
|
+
repoComponents.forEach((c) => counts.set(c.path, (counts.get(c.path) ?? 0) + 1));
|
|
539
|
+
repoComponents.forEach((c) => {
|
|
669
540
|
const parts = c.path.split('/_custom/');
|
|
670
541
|
if (parts.length <= 1) {
|
|
671
542
|
root.components.push({ ...c, displayLabel: c.name });
|
|
@@ -676,7 +547,7 @@ const TOOLBAR_COMPONENTS = {
|
|
|
676
547
|
if (file !== 'index' && (counts.get(c.path) ?? 0) > 1)
|
|
677
548
|
segs.push(file);
|
|
678
549
|
let cur = root;
|
|
679
|
-
segs.forEach(s => {
|
|
550
|
+
segs.forEach((s) => {
|
|
680
551
|
cur = cur.folders[s] ??= { components: [], folders: {} };
|
|
681
552
|
});
|
|
682
553
|
// prettier-ignore
|
|
@@ -730,17 +601,23 @@ const TOOLBAR_COMPONENTS = {
|
|
|
730
601
|
return;
|
|
731
602
|
let a = true;
|
|
732
603
|
if (search.tree.length === 0) {
|
|
733
|
-
setSearch(s => ({ ...s, busy: true }));
|
|
604
|
+
setSearch((s) => ({ ...s, busy: true }));
|
|
734
605
|
actions.read.doc
|
|
735
606
|
.list({ type: 'nav', pathname: docsRootPath() })
|
|
736
607
|
.then(({ data: d }) => {
|
|
737
608
|
if (a)
|
|
738
|
-
setSearch(
|
|
609
|
+
setSearch((s) => ({
|
|
610
|
+
...s,
|
|
611
|
+
tree: Array.isArray(d)
|
|
612
|
+
? d.filter((n) => Boolean(n && typeof n === 'object' && 'type' in n))
|
|
613
|
+
: [],
|
|
614
|
+
busy: false,
|
|
615
|
+
}));
|
|
739
616
|
})
|
|
740
|
-
.catch(_err => {
|
|
617
|
+
.catch((_err) => {
|
|
741
618
|
console.error(`[Toolbar:Embed] Failed to fetch document tree:`, _err);
|
|
742
619
|
if (a)
|
|
743
|
-
setSearch(s => ({ ...s, busy: false }));
|
|
620
|
+
setSearch((s) => ({ ...s, busy: false }));
|
|
744
621
|
});
|
|
745
622
|
}
|
|
746
623
|
return () => {
|
|
@@ -754,7 +631,9 @@ const TOOLBAR_COMPONENTS = {
|
|
|
754
631
|
// contains the same node referenced from multiple locations.
|
|
755
632
|
const seen = new Set();
|
|
756
633
|
const lowerQuery = search.query.trim().toLowerCase();
|
|
757
|
-
const searchFrames = [
|
|
634
|
+
const searchFrames = [
|
|
635
|
+
{ nodes: search.tree, index: 0, path: '' },
|
|
636
|
+
];
|
|
758
637
|
while (searchFrames.length) {
|
|
759
638
|
const frame = searchFrames[searchFrames.length - 1];
|
|
760
639
|
if (!frame)
|
|
@@ -778,7 +657,11 @@ const TOOLBAR_COMPONENTS = {
|
|
|
778
657
|
}
|
|
779
658
|
}
|
|
780
659
|
else if (n.type === 'branch' && n.children) {
|
|
781
|
-
searchFrames.push({
|
|
660
|
+
searchFrames.push({
|
|
661
|
+
nodes: n.children,
|
|
662
|
+
index: 0,
|
|
663
|
+
path: frame.path ? `${frame.path} / ${currTitle}` : currTitle,
|
|
664
|
+
});
|
|
782
665
|
}
|
|
783
666
|
}
|
|
784
667
|
return leaves;
|
|
@@ -794,18 +677,24 @@ const TOOLBAR_COMPONENTS = {
|
|
|
794
677
|
let finalPath = tgtPath;
|
|
795
678
|
let leafId = tgtPath;
|
|
796
679
|
// 1. Close Modal immediately to prevent multiple submissions
|
|
797
|
-
setSearch(s => ({ ...s, open: false, busy: true }));
|
|
680
|
+
setSearch((s) => ({ ...s, open: false, busy: true }));
|
|
798
681
|
setTransition('p');
|
|
799
682
|
try {
|
|
800
683
|
if (isNew) {
|
|
801
684
|
// scope the new document natively UNDER the current document's path.
|
|
802
685
|
// this ensures string-based `verifyWrite` auth checks pass by matching the prefix of the inherited warrant.
|
|
803
686
|
const basePath = ctx ? ctx.replace(TerraQualityRegex.REGEX_PATTERN_REGEX_2(), '') : '';
|
|
804
|
-
const sName = search.query.trim()
|
|
805
|
-
|
|
687
|
+
const sName = search.query.trim()
|
|
688
|
+
? search.query.replace(TerraQualityRegex.REGEX_A_Z0_9_GI_REGEX_2(), '-').toLowerCase()
|
|
689
|
+
: 'untitled';
|
|
690
|
+
const nId = basePath
|
|
691
|
+
? `${basePath}/${sName}-${Date.now()}.mdx`
|
|
692
|
+
: `${sName}-${Date.now()}.mdx`;
|
|
806
693
|
finalPath = nId;
|
|
807
694
|
// create the page purely as a stand-alone document without anchoring to the group
|
|
808
|
-
const writeRes = await actions.write.doc
|
|
695
|
+
const writeRes = await actions.write.doc
|
|
696
|
+
.editor({ path: nId, title: search.query, source: 'This page is empty.' })
|
|
697
|
+
.catch((_err) => ({ data: null, error: _err }));
|
|
809
698
|
if (writeRes.error) {
|
|
810
699
|
console.error(`[Toolbar:Embed] write.doc.editor action failed:`, writeRes.error);
|
|
811
700
|
throw writeRes.error;
|
|
@@ -814,19 +703,25 @@ const TOOLBAR_COMPONENTS = {
|
|
|
814
703
|
}
|
|
815
704
|
// map leaf explicitly to the editor's attachment array unconditionally
|
|
816
705
|
if (ctx) {
|
|
817
|
-
const attRes = await actions.write.attachment
|
|
706
|
+
const attRes = await actions.write.attachment
|
|
707
|
+
.docRef({ path: ctx, refId: finalPath, title: search.query || 'Embedded Page' })
|
|
708
|
+
.catch((_err) => {
|
|
818
709
|
console.error(`[Toolbar:Embed] write.attachment.docRef action failed:`, _err);
|
|
819
710
|
return { data: null, error: _err };
|
|
820
711
|
});
|
|
821
712
|
if (attRes && attRes.data) {
|
|
822
713
|
// Resolves the exact Sanity UUID returned to map directly into the React AST parameter
|
|
823
714
|
const attachment = {
|
|
824
|
-
leafId: typeof attRes.data === 'object' &&
|
|
715
|
+
leafId: typeof attRes.data === 'object' &&
|
|
716
|
+
'refId' in attRes.data &&
|
|
717
|
+
typeof attRes.data.refId === 'string'
|
|
718
|
+
? attRes.data.refId
|
|
719
|
+
: leafId,
|
|
825
720
|
sister: { path: finalPath, name: finalPath.split('/').pop() || finalPath },
|
|
826
721
|
};
|
|
827
722
|
leafId = attachment.leafId;
|
|
828
|
-
setSis(p => {
|
|
829
|
-
if (!p.some(s => s.path === finalPath))
|
|
723
|
+
setSis((p) => {
|
|
724
|
+
if (!p.some((s) => s.path === finalPath))
|
|
830
725
|
return [...p, attachment.sister];
|
|
831
726
|
return p;
|
|
832
727
|
});
|
|
@@ -834,10 +729,10 @@ const TOOLBAR_COMPONENTS = {
|
|
|
834
729
|
}
|
|
835
730
|
// delay AST injection to allow Sanity CDN replica propagation to finish
|
|
836
731
|
if (isNew || ctx)
|
|
837
|
-
await new Promise(r => setTimeout(r, 1500));
|
|
732
|
+
await new Promise((r) => setTimeout(r, 1500));
|
|
838
733
|
clearTransition();
|
|
839
734
|
// 2. Yield to event loop to allow DOM reconciliation
|
|
840
|
-
await new Promise(r => setTimeout(r, 200));
|
|
735
|
+
await new Promise((r) => setTimeout(r, 200));
|
|
841
736
|
// 3. Force focus back into the active editor securely
|
|
842
737
|
const aEditor = document.querySelector('[contenteditable="true"], .cm-content');
|
|
843
738
|
if (aEditor) {
|
|
@@ -862,8 +757,8 @@ const TOOLBAR_COMPONENTS = {
|
|
|
862
757
|
}
|
|
863
758
|
}
|
|
864
759
|
// clean up busy state and search query now that injection is ready
|
|
865
|
-
setSearch(s => ({ ...s, query: '', busy: false }));
|
|
866
|
-
await new Promise(r => requestAnimationFrame(r));
|
|
760
|
+
setSearch((s) => ({ ...s, query: '', busy: false }));
|
|
761
|
+
await new Promise((r) => requestAnimationFrame(r));
|
|
867
762
|
// 4. Inject purely as AST text (bypassing the import statement injection)
|
|
868
763
|
// This mirrors how globally configured components like <Nodes /> and <DocsMath /> are inserted.
|
|
869
764
|
if (onInsertMd) {
|
|
@@ -880,8 +775,11 @@ const TOOLBAR_COMPONENTS = {
|
|
|
880
775
|
catch (_err) {
|
|
881
776
|
clearTransition();
|
|
882
777
|
console.error(`[Toolbar:Embed] Critical pipeline failure during leaf embed process:`, _err);
|
|
883
|
-
notify({
|
|
884
|
-
|
|
778
|
+
notify({
|
|
779
|
+
error: _err instanceof Error ? _err : new Error('Embed failed'),
|
|
780
|
+
fallback: 'Failed to embed leaf.',
|
|
781
|
+
});
|
|
782
|
+
setSearch((s) => ({ ...s, query: '', busy: false }));
|
|
885
783
|
}
|
|
886
784
|
};
|
|
887
785
|
// 6. LOCAL MENUS
|
|
@@ -913,21 +811,23 @@ const TOOLBAR_COMPONENTS = {
|
|
|
913
811
|
},
|
|
914
812
|
],
|
|
915
813
|
};
|
|
916
|
-
return (_jsxs(_Fragment, { children: [_jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsx(Button, { disabled: disabled, lbl:
|
|
814
|
+
return (_jsxs(_Fragment, { children: [_jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsx(Button, { disabled: disabled, lbl: "Insert component", onMouseDown: onMouseDown, children: _jsx(DOCS_BLOCK_ICONS.code, {}) }) }), _jsxs(DropdownMenuContent, { align: "start", className: MENU_WIDTH_CLASS, children: [_jsxs(DropdownMenuItem, { onMouseDown: preserveSel, onSelect: (e) => {
|
|
917
815
|
e.preventDefault();
|
|
918
816
|
const sel = window.getSelection();
|
|
919
817
|
if (sel && sel.rangeCount > 0)
|
|
920
818
|
savedSel.current = sel.getRangeAt(0).cloneRange();
|
|
921
|
-
setSearch(s => ({ ...s, open: true }));
|
|
922
|
-
}, className: MENU_GAP_CLASS, children: [_jsx(PopOutIcon, { className: ICON_CLASS }), " Embed Page"] }), _jsx(DropdownMenuSeparator, {}), _jsxs(DropdownMenuSub, { children: [_jsxs(DropdownMenuSubTrigger, { className: MENU_GAP_CLASS, children: [_jsx(ModuleIcon, { className: ICON_CLASS }), " Modules"] }), _jsxs(DropdownMenuSubContent, { className: MENU_WIDTH_CLASS, children: [menuGroups.globalComponents.map(c => (_jsx(DropdownMenuItem, { onMouseDown: preserveSel, onSelect: e => {
|
|
819
|
+
setSearch((s) => ({ ...s, open: true }));
|
|
820
|
+
}, className: MENU_GAP_CLASS, children: [_jsx(PopOutIcon, { className: ICON_CLASS }), " Embed Page"] }), _jsx(DropdownMenuSeparator, {}), _jsxs(DropdownMenuSub, { children: [_jsxs(DropdownMenuSubTrigger, { className: MENU_GAP_CLASS, children: [_jsx(ModuleIcon, { className: ICON_CLASS }), " Modules"] }), _jsxs(DropdownMenuSubContent, { className: MENU_WIDTH_CLASS, children: [menuGroups.globalComponents.map((c) => (_jsx(DropdownMenuItem, { onMouseDown: preserveSel, onSelect: (e) => {
|
|
923
821
|
e.preventDefault();
|
|
924
822
|
void copyComponent(c);
|
|
925
|
-
}, children: c.displayLabel
|
|
823
|
+
}, children: c.displayLabel
|
|
824
|
+
.replace(TerraQualityRegex.REGEX_G_REGEX_7(), ' ')
|
|
825
|
+
.replace(TerraQualityRegex.REGEX_B_W_G_REGEX(), (c) => c.toUpperCase()) }, c.path))), Object.entries(menuGroups.globalFolders).map(([f, s]) => (_jsx(TOOLBAR_COMPONENTS.GlobalComponentMenuNode, { name: f, tree: s, onCopy: copyComponent }, f)))] })] }), menuGroups.local.map((m) => (_jsx(React.Fragment, { children: _jsxs(DropdownMenuSub, { children: [_jsxs(DropdownMenuSubTrigger, { disabled: !m.items.length, className: MENU_GAP_CLASS, children: [m.icon, " ", m.label] }), _jsx(DropdownMenuSubContent, { children: m.items.map((s) => (_jsx(DropdownMenuItem, { onMouseDown: preserveSel, onSelect: (e) => {
|
|
926
826
|
e.preventDefault();
|
|
927
827
|
m.onSelect(s);
|
|
928
|
-
}, children: s.name }, s.path))) })] }) }, m.label)))] })] }), _jsx(Dialog, { open: search.open, onOpenChange: o => {
|
|
929
|
-
setSearch(s => ({ ...s, open: o }));
|
|
930
|
-
}, children: _jsxs(DialogContent, { children: [_jsxs(DialogHeader, { children: [_jsx(DialogTitle, { children: "Embed Document" }), _jsx(DialogDescription, { className:
|
|
828
|
+
}, children: s.name }, s.path))) })] }) }, m.label)))] })] }), _jsx(Dialog, { open: search.open, onOpenChange: (o) => {
|
|
829
|
+
setSearch((s) => ({ ...s, open: o }));
|
|
830
|
+
}, children: _jsxs(DialogContent, { children: [_jsxs(DialogHeader, { children: [_jsx(DialogTitle, { children: "Embed Document" }), _jsx(DialogDescription, { className: "sr-only", children: "Browse the document tree or search to embed a page." })] }), _jsxs("div", { className: 'space-y-4 pt-2', children: [_jsx(Input, { icon: _jsx(SearchIcon, { className: ICON_CLASS }), autoFocus: true, placeholder: 'Search or type to create...', value: search.query, onChange: e => { setSearch(s => ({ ...s, query: e.target.value })); } }), _jsxs("div", { className: 'flex max-h-64 min-h-24 flex-col gap-1 overflow-y-auto pr-2', children: [search.busy && search.tree.length === 0 && _jsx("p", { className: 'py-4 text-center text-sm text-primary-11', children: "Loading..." }), search.query.trim() && (_jsxs(UiButton, { variant: 'outline', className: 'mb-2 flex-col items-start gap-y-0 border-dashed py-6', onClick: () => void embed('', true), disabled: search.busy, children: [_jsx("span", { className: 'text-sm font-medium', children: search.busy ? 'Creating...' : `Create "${search.query}"` }), _jsx("span", { className: SECONDARY_TEXT_CLASS, children: "Create page and embed as attachment" })] })), search.query.trim() && !search.busy && filteredLeaves.length === 0 && _jsx(SearchEmpty, { query: search.query }), filteredLeaves.map(l => (_jsxs(UiButton, { variant: 'ghost', className: 'flex-col items-start gap-y-0 py-6', onClick: () => embed(l.path), children: [_jsx("span", { className: 'text-sm font-medium capitalize', children: l.title }), _jsxs("span", { className: SECONDARY_TEXT_CLASS, children: [l.breadcrumb ? `${l.breadcrumb} / ` : '', l.title] })] }, l.path)))] })] })] }) })] }));
|
|
931
831
|
},
|
|
932
832
|
/**
|
|
933
833
|
* Dropdown control for quickly converting a block or inserting a supported block template.
|
|
@@ -963,9 +863,9 @@ const TOOLBAR_COMPONENTS = {
|
|
|
963
863
|
const sel = window.getSelection();
|
|
964
864
|
const blockCursor = document.querySelector('[data-docs-block-cursor="true"]');
|
|
965
865
|
if (blockCursor && sel?.anchorNode && !blockCursor.contains(sel.anchorNode)) {
|
|
966
|
-
const blockVal = toolbarFocusValue(blockCursor, opts.map(o => o.value));
|
|
866
|
+
const blockVal = toolbarFocusValue(blockCursor, opts.map((o) => o.value));
|
|
967
867
|
if (blockVal) {
|
|
968
|
-
setVal(c => (c === blockVal ? c : blockVal));
|
|
868
|
+
setVal((c) => (c === blockVal ? c : blockVal));
|
|
969
869
|
return;
|
|
970
870
|
}
|
|
971
871
|
}
|
|
@@ -978,13 +878,15 @@ const TOOLBAR_COMPONENTS = {
|
|
|
978
878
|
const textBlock = el?.closest('h1, h2, h3, h4, h5, h6, p');
|
|
979
879
|
if (textBlock)
|
|
980
880
|
savedBlock.current = textBlock;
|
|
981
|
-
else if (el
|
|
881
|
+
else if (el
|
|
882
|
+
?.closest('td, th')
|
|
883
|
+
?.closest('[data-docs-editor-block="DocsTable"], [data-terra-block="table"]'))
|
|
982
884
|
savedBlock.current = null;
|
|
983
885
|
const blockVal = el
|
|
984
|
-
? toolbarFocusValue(el, opts.map(o => o.value))
|
|
886
|
+
? toolbarFocusValue(el, opts.map((o) => o.value))
|
|
985
887
|
: null;
|
|
986
888
|
if (blockVal) {
|
|
987
|
-
setVal(c => (c === blockVal ? c : blockVal));
|
|
889
|
+
setVal((c) => (c === blockVal ? c : blockVal));
|
|
988
890
|
return;
|
|
989
891
|
}
|
|
990
892
|
}
|
|
@@ -1001,7 +903,7 @@ const TOOLBAR_COMPONENTS = {
|
|
|
1001
903
|
n = 'h4';
|
|
1002
904
|
else if (TerraQualityRegex.REGEX_S_REGEX_4().test(text))
|
|
1003
905
|
n = 'h2';
|
|
1004
|
-
setVal(c => (c === n ? c : n));
|
|
906
|
+
setVal((c) => (c === n ? c : n));
|
|
1005
907
|
};
|
|
1006
908
|
sync();
|
|
1007
909
|
/**
|
|
@@ -1024,21 +926,21 @@ const TOOLBAR_COMPONENTS = {
|
|
|
1024
926
|
? decorator.querySelector('[data-docs-editor-block], .docs-math-wrapper, [data-math-code], [data-docs-view-root="true"]')
|
|
1025
927
|
: null;
|
|
1026
928
|
const blockVal = block
|
|
1027
|
-
? toolbarFocusValue(block, opts.map(o => o.value))
|
|
929
|
+
? toolbarFocusValue(block, opts.map((o) => o.value))
|
|
1028
930
|
: null;
|
|
1029
931
|
if (!blockVal)
|
|
1030
932
|
return;
|
|
1031
933
|
savedBlock.current = null;
|
|
1032
|
-
setVal(c => (c === blockVal ? c : blockVal));
|
|
934
|
+
setVal((c) => (c === blockVal ? c : blockVal));
|
|
1033
935
|
};
|
|
1034
|
-
['focusin', 'keyup', 'mouseup', 'selectionchange'].forEach(e => {
|
|
936
|
+
['focusin', 'keyup', 'mouseup', 'selectionchange'].forEach((e) => {
|
|
1035
937
|
document.addEventListener(e, refresh, true);
|
|
1036
938
|
});
|
|
1037
939
|
document.addEventListener('docs:block-select', onBlockSelect);
|
|
1038
940
|
document.addEventListener('docs:block-selected', onBlockSelect);
|
|
1039
941
|
return () => {
|
|
1040
942
|
cancelAnimationFrame(frame);
|
|
1041
|
-
['focusin', 'keyup', 'mouseup', 'selectionchange'].forEach(e => {
|
|
943
|
+
['focusin', 'keyup', 'mouseup', 'selectionchange'].forEach((e) => {
|
|
1042
944
|
document.removeEventListener(e, refresh, true);
|
|
1043
945
|
});
|
|
1044
946
|
document.removeEventListener('docs:block-select', onBlockSelect);
|
|
@@ -1046,13 +948,15 @@ const TOOLBAR_COMPONENTS = {
|
|
|
1046
948
|
};
|
|
1047
949
|
}, [disabled, toolbar]);
|
|
1048
950
|
// RENDER
|
|
1049
|
-
return (_jsxs(Select, { disabled: disabled || !toolbar, value: val, onValueChange: v => {
|
|
1050
|
-
const item = opts.find(i => i.value === v);
|
|
951
|
+
return (_jsxs(Select, { disabled: disabled || !toolbar, value: val, onValueChange: (v) => {
|
|
952
|
+
const item = opts.find((i) => i.value === v);
|
|
1051
953
|
if (!item)
|
|
1052
954
|
return;
|
|
1053
955
|
if (item.group === 'type') {
|
|
1054
956
|
if (json) {
|
|
1055
|
-
window.dispatchEvent(new CustomEvent('docs:json-command', {
|
|
957
|
+
window.dispatchEvent(new CustomEvent('docs:json-command', {
|
|
958
|
+
detail: { type: 'style', style: v === 'p' ? 'normal' : v },
|
|
959
|
+
}));
|
|
1056
960
|
setVal(v);
|
|
1057
961
|
return;
|
|
1058
962
|
}
|
|
@@ -1066,7 +970,7 @@ const TOOLBAR_COMPONENTS = {
|
|
|
1066
970
|
const { head } = view.state.selection.main;
|
|
1067
971
|
const line = view.state.doc.lineAt(head);
|
|
1068
972
|
const text = line.text;
|
|
1069
|
-
let n
|
|
973
|
+
let n;
|
|
1070
974
|
let prefix = '';
|
|
1071
975
|
if (v === 'h2') {
|
|
1072
976
|
prefix = '## ';
|
|
@@ -1083,7 +987,10 @@ const TOOLBAR_COMPONENTS = {
|
|
|
1083
987
|
else
|
|
1084
988
|
n = text.replace(/^#{1,6}\s+/, '').trimStart() || 'Text';
|
|
1085
989
|
const replacementStr = `${prefix}${n}`;
|
|
1086
|
-
view.dispatch({
|
|
990
|
+
view.dispatch({
|
|
991
|
+
changes: { from: line.from, to: line.to, insert: replacementStr },
|
|
992
|
+
selection: { anchor: line.from + replacementStr.length },
|
|
993
|
+
});
|
|
1087
994
|
view.focus();
|
|
1088
995
|
setVal(v);
|
|
1089
996
|
return;
|
|
@@ -1105,7 +1012,7 @@ const TOOLBAR_COMPONENTS = {
|
|
|
1105
1012
|
else if (v === 'h2' || v === 'h3' || v === 'h4')
|
|
1106
1013
|
replacementNode = $createHeadingNode(v);
|
|
1107
1014
|
if (replacementNode) {
|
|
1108
|
-
blockNode.getChildren().forEach(c => {
|
|
1015
|
+
blockNode.getChildren().forEach((c) => {
|
|
1109
1016
|
replacementNode.append(c);
|
|
1110
1017
|
});
|
|
1111
1018
|
blockNode.replace(replacementNode);
|
|
@@ -1128,8 +1035,8 @@ const TOOLBAR_COMPONENTS = {
|
|
|
1128
1035
|
return;
|
|
1129
1036
|
}
|
|
1130
1037
|
item.onSelect();
|
|
1131
|
-
}, size:
|
|
1132
|
-
.filter(o => o.group === 'insert')
|
|
1038
|
+
}, size: "xs", children: [_jsx(SelectTrigger, { "aria-label": "Block type", className: "w-40", onMouseDown: preserveSel, children: _jsx(SelectValue, {}) }), _jsxs(SelectContent, { align: "start", children: [_jsxs(SelectGroup, { children: [_jsx(SelectLabel, { children: "Block Type" }), opts.filter(o => o.group === 'type').map(({ value: v, label: l, icon: i }) => (_jsx(SelectItem, { value: v, icon: React.createElement(i, { className: ICON_CLASS }), children: l }, v)))] }), _jsx(SelectSeparator, {}), _jsxs(SelectGroup, { children: [_jsx(SelectLabel, { children: "Insert Block" }), opts
|
|
1039
|
+
.filter((o) => o.group === 'insert')
|
|
1133
1040
|
.map(({ value: v, label: l, icon: i }) => (_jsx(SelectItem, { value: v, icon: React.createElement(i, { className: ICON_CLASS }), children: l }, v)))] })] })] }));
|
|
1134
1041
|
},
|
|
1135
1042
|
/**
|
|
@@ -1148,7 +1055,10 @@ const TOOLBAR_COMPONENTS = {
|
|
|
1148
1055
|
*/
|
|
1149
1056
|
Toolbar({ activeMode: aMode, editable, toolbar, blocks, adapter, docs = true, }) {
|
|
1150
1057
|
// STATES
|
|
1151
|
-
const toolbarCtx = {
|
|
1058
|
+
const toolbarCtx = {
|
|
1059
|
+
edit: useContext(EditStateCtx),
|
|
1060
|
+
attachmentFilter: useAtom($attachmentFilter),
|
|
1061
|
+
};
|
|
1152
1062
|
const mode = aMode ?? 'view';
|
|
1153
1063
|
const [vers, setVers] = useState([]);
|
|
1154
1064
|
const [verDialogOpen, setVerDialogOpen] = useState(false);
|
|
@@ -1166,7 +1076,11 @@ const TOOLBAR_COMPONENTS = {
|
|
|
1166
1076
|
return;
|
|
1167
1077
|
const { from, to } = view.state.selection.main;
|
|
1168
1078
|
codeLength.current = view.state.doc.length;
|
|
1169
|
-
codeSel.current = {
|
|
1079
|
+
codeSel.current = {
|
|
1080
|
+
code: { from: Math.min(from, to), to: Math.max(from, to) },
|
|
1081
|
+
dom: null,
|
|
1082
|
+
visible: true,
|
|
1083
|
+
};
|
|
1170
1084
|
codeAtEnd.current = false;
|
|
1171
1085
|
};
|
|
1172
1086
|
document.addEventListener('selectionchange', sync);
|
|
@@ -1245,7 +1159,7 @@ const TOOLBAR_COMPONENTS = {
|
|
|
1245
1159
|
}
|
|
1246
1160
|
}
|
|
1247
1161
|
: undefined;
|
|
1248
|
-
const selVer = vers.find(v => v.savedAt === selVerId);
|
|
1162
|
+
const selVer = vers.find((v) => v.savedAt === selVerId);
|
|
1249
1163
|
useEffect(() => {
|
|
1250
1164
|
if (verDialogOpen && !selVerId && vers[0])
|
|
1251
1165
|
setSelVerId(vers[0].savedAt);
|
|
@@ -1282,7 +1196,12 @@ const TOOLBAR_COMPONENTS = {
|
|
|
1282
1196
|
sourceTail: previewPack.markdown.slice(-120),
|
|
1283
1197
|
}));
|
|
1284
1198
|
if (toolbarCtx.edit.update)
|
|
1285
|
-
toolbarCtx.edit.update({
|
|
1199
|
+
toolbarCtx.edit.update({
|
|
1200
|
+
content: previewPack.body,
|
|
1201
|
+
title: selVer?.title || '',
|
|
1202
|
+
description: selVer?.description || '',
|
|
1203
|
+
source: previewPack.markdown,
|
|
1204
|
+
});
|
|
1286
1205
|
const setCode = toolbarCtx.edit.setCode ?? toolbarCtx.edit.setSrc;
|
|
1287
1206
|
if (setCode)
|
|
1288
1207
|
setCode(previewPack.markdown);
|
|
@@ -1308,7 +1227,11 @@ const TOOLBAR_COMPONENTS = {
|
|
|
1308
1227
|
* @param _type - Sanity field type associated with the value.
|
|
1309
1228
|
* @param value - Field value being normalized for the toolbar.
|
|
1310
1229
|
*/
|
|
1311
|
-
const jsonBlock = (_type, val) => ({
|
|
1230
|
+
const jsonBlock = (_type, val) => ({
|
|
1231
|
+
_key: crypto.randomUUID(),
|
|
1232
|
+
_type,
|
|
1233
|
+
...val,
|
|
1234
|
+
});
|
|
1312
1235
|
// SELECTION HANDLER
|
|
1313
1236
|
/**
|
|
1314
1237
|
* Safe sel.
|
|
@@ -1391,13 +1314,23 @@ const TOOLBAR_COMPONENTS = {
|
|
|
1391
1314
|
*/
|
|
1392
1315
|
const insertionActions = {
|
|
1393
1316
|
insertLocalCode: () => {
|
|
1394
|
-
if (jsonCmd({
|
|
1317
|
+
if (jsonCmd({
|
|
1318
|
+
type: 'insert',
|
|
1319
|
+
block: jsonBlock('code', { language: 'text', value: 'Code...' }),
|
|
1320
|
+
}))
|
|
1395
1321
|
return;
|
|
1396
1322
|
insert?.(`\n\n<Code language="text">\n{\`\nCode...\n\`}\n</Code>\n\n`);
|
|
1397
1323
|
},
|
|
1398
1324
|
insertCode: (src, endpoint = '') => {
|
|
1399
|
-
const code = src === 'received'
|
|
1400
|
-
|
|
1325
|
+
const code = src === 'received'
|
|
1326
|
+
? `\n\n<Code language="json" source=${JSON.stringify(endpoint)} />\n\n`
|
|
1327
|
+
: '\n\n<Code language="text">\n{`\nCode...\n`}\n</Code>\n\n';
|
|
1328
|
+
if (jsonCmd({
|
|
1329
|
+
type: 'insert',
|
|
1330
|
+
block: jsonBlock('code', src === 'received'
|
|
1331
|
+
? { language: 'json', source: endpoint, value: '' }
|
|
1332
|
+
: { language: 'text', value: 'Code...' }),
|
|
1333
|
+
}))
|
|
1401
1334
|
return;
|
|
1402
1335
|
if (insert) {
|
|
1403
1336
|
const srcLength = codeLength.current;
|
|
@@ -1408,7 +1341,9 @@ const TOOLBAR_COMPONENTS = {
|
|
|
1408
1341
|
}
|
|
1409
1342
|
const curr = toolbarCtx.edit?.code ?? toolbarCtx.edit?.source ?? '';
|
|
1410
1343
|
const sel = codeSel.current?.code;
|
|
1411
|
-
const range = codeAtEnd.current || !sel
|
|
1344
|
+
const range = codeAtEnd.current || !sel
|
|
1345
|
+
? { from: curr.length, to: curr.length }
|
|
1346
|
+
: { from: Math.min(sel.from, curr.length), to: Math.min(sel.to, curr.length) };
|
|
1412
1347
|
const n = `${curr.slice(0, range.from)}${code}${curr.slice(range.to)}`;
|
|
1413
1348
|
toolbarCtx.edit?.update({ source: n });
|
|
1414
1349
|
toolbarCtx.edit?.setCode(n);
|
|
@@ -1419,8 +1354,14 @@ const TOOLBAR_COMPONENTS = {
|
|
|
1419
1354
|
}
|
|
1420
1355
|
const view = codeViewOf();
|
|
1421
1356
|
if (view) {
|
|
1422
|
-
const range = codeAtEnd.current
|
|
1423
|
-
|
|
1357
|
+
const range = codeAtEnd.current
|
|
1358
|
+
? { from: view.state.doc.length, to: view.state.doc.length }
|
|
1359
|
+
: (codeSel.current?.code ?? view.state.selection.main);
|
|
1360
|
+
view.dispatch({
|
|
1361
|
+
changes: { from: range.from, insert: code, to: range.to },
|
|
1362
|
+
scrollIntoView: true,
|
|
1363
|
+
selection: { anchor: range.from + code.length },
|
|
1364
|
+
});
|
|
1424
1365
|
view.focus();
|
|
1425
1366
|
codeAtEnd.current = false;
|
|
1426
1367
|
codeSel.current = null;
|
|
@@ -1462,78 +1403,106 @@ const TOOLBAR_COMPONENTS = {
|
|
|
1462
1403
|
};
|
|
1463
1404
|
}, [mode, onSave]);
|
|
1464
1405
|
// RENDER
|
|
1465
|
-
return (_jsx(ErrorBoundary, { name:
|
|
1406
|
+
return (_jsx(ErrorBoundary, { name: "Toolbar", children: _jsxs("div", { className: "docs-toolbar-scroll not-prose pointer-events-auto sticky top-10 isolate z-50 -mx-3 -mt-5 mb-5 w-[calc(100%+1.5rem)] max-w-[calc(100%+1.5rem)] overflow-visible text-primary-12 print:hidden", "data-docs-toolbar-frame": true, "data-docs-toolbar-scroll": true, "data-can-edit": editable ? 'true' : 'false', children: [_jsx("div", { "aria-hidden": "true", className: "docs-toolbar-backdrop pointer-events-none absolute -inset-x-4 -bottom-12 -top-16 z-0" }), _jsx("div", { className: "relative z-10 rounded-lg border border-primary-6 bg-primary-3", children: _jsx(TooltipProvider, { children: _jsx("div", { className: "mdxeditor-toolbar not-prose relative z-10 box-border flex w-full min-w-0 flex-wrap items-center justify-between gap-1.5 gap-x-3 px-2 py-1 text-primary-12 print:hidden", "data-docs-main-toolbar": true, children: mode === 'view' ? (docs && (_jsx(Mode, { editable: editable, mode: mode, disabled: !ready, onModeChange: (v) => {
|
|
1466
1407
|
if (!toolbar)
|
|
1467
1408
|
return;
|
|
1468
|
-
toolbar.setMode(v).catch(e => {
|
|
1409
|
+
toolbar.setMode(v).catch((e) => {
|
|
1469
1410
|
console.error('[Toolbar:mode] change-failed', { mode: v, error: e });
|
|
1470
1411
|
toast.error(e instanceof Error ? e.message : 'Failed to change mode.');
|
|
1471
1412
|
clearTransition();
|
|
1472
1413
|
});
|
|
1473
1414
|
} }))) : mode === 'attachments' ? (
|
|
1474
1415
|
// ATTACHMENT FILTERS
|
|
1475
|
-
_jsxs(_Fragment, { children: [docs && (_jsx(Mode, { editable: editable, mode: mode, disabled: !ready, onModeChange: v => {
|
|
1416
|
+
_jsxs(_Fragment, { children: [docs && (_jsx(Mode, { editable: editable, mode: mode, disabled: !ready, onModeChange: (v) => {
|
|
1476
1417
|
if (!toolbar)
|
|
1477
1418
|
return;
|
|
1478
|
-
toolbar.setMode(v).catch(e => {
|
|
1419
|
+
toolbar.setMode(v).catch((e) => {
|
|
1479
1420
|
console.error('[Toolbar:mode] change-failed', { mode: v, error: e });
|
|
1480
1421
|
toast.error(e instanceof Error ? e.message : 'Failed to change mode.');
|
|
1481
1422
|
clearTransition();
|
|
1482
1423
|
});
|
|
1483
|
-
} })), _jsx(ToggleGroup, { type:
|
|
1424
|
+
} })), _jsx(ToggleGroup, { type: "multiple", value: [...toolbarCtx.attachmentFilter], onValueChange: (v) => {
|
|
1484
1425
|
if (v)
|
|
1485
1426
|
$attachmentFilter.set(v);
|
|
1486
|
-
}, className:
|
|
1427
|
+
}, className: "ml-auto max-w-full flex-wrap justify-end", children: ATTCH_TYPES.map((f) => (_jsx(ToggleGroupItem, { value: f, size: "sm", className: "h-6 px-2 text-xs capitalize", onMouseDown: preserveSel, children: f }, f))) })] })) : (_jsxs(_Fragment, { children: [_jsxs(ButtonGroup, { children: [_jsx(TOOLBAR_COMPONENTS.BlockType, { disabled: !ready, toolbar: toolbar, adapter: adapter, options: toolbarOpts.blocks, json: mode === 'edit' }), toolbarOpts.formats
|
|
1487
1428
|
.map(({ key: k, lbl: l, icon: i, shortcut: s, format: f }) => ({
|
|
1488
1429
|
key: k,
|
|
1489
1430
|
lbl: l,
|
|
1490
1431
|
icon: i,
|
|
1491
1432
|
shortcut: s,
|
|
1492
|
-
onClick: () => jsonCmd({
|
|
1493
|
-
|
|
1433
|
+
onClick: () => jsonCmd({
|
|
1434
|
+
type: 'decorator',
|
|
1435
|
+
decorator: k === 'strikethrough' ? 'strike-through' : k,
|
|
1436
|
+
}) ||
|
|
1437
|
+
(adapter?.format
|
|
1438
|
+
? adapter.format(k === 'strikethrough'
|
|
1439
|
+
? 'strike'
|
|
1440
|
+
: k)
|
|
1441
|
+
: insert?.(f(sSel('text', true)))),
|
|
1494
1442
|
}))
|
|
1495
|
-
.map(({ key: k, lbl: l, icon: i, shortcut: s, onClick: o }) => (_jsx(Button, { lbl: l, shortcut: s, disabled: !ready, onMouseDown: preserveSel, onClick: o, children: React.createElement(i) }, k))), _jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsx(Button, { lbl:
|
|
1496
|
-
{
|
|
1497
|
-
|
|
1498
|
-
|
|
1443
|
+
.map(({ key: k, lbl: l, icon: i, shortcut: s, onClick: o }) => (_jsx(Button, { lbl: l, shortcut: s, disabled: !ready, onMouseDown: preserveSel, onClick: o, children: React.createElement(i) }, k))), _jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsx(Button, { lbl: "Insert list", disabled: !ready, onMouseDown: preserveSel, children: _jsx(BulletListIcon, {}) }) }), _jsx(DropdownMenuContent, { align: "start", children: [
|
|
1444
|
+
{
|
|
1445
|
+
key: 'bullet',
|
|
1446
|
+
lbl: 'Bulleted list',
|
|
1447
|
+
icon: BulletListIcon,
|
|
1448
|
+
prefix: '\n- ',
|
|
1449
|
+
fallback: 'Item',
|
|
1450
|
+
},
|
|
1451
|
+
{
|
|
1452
|
+
key: 'number',
|
|
1453
|
+
lbl: 'Numbered list',
|
|
1454
|
+
icon: NumberListIcon,
|
|
1455
|
+
prefix: '\n1. ',
|
|
1456
|
+
fallback: 'Item',
|
|
1457
|
+
},
|
|
1458
|
+
{
|
|
1459
|
+
key: 'check',
|
|
1460
|
+
lbl: 'Checklist',
|
|
1461
|
+
icon: CheckListIcon,
|
|
1462
|
+
prefix: '\n- [ ] ',
|
|
1463
|
+
fallback: 'Task',
|
|
1464
|
+
},
|
|
1499
1465
|
]
|
|
1500
1466
|
.map(({ key: k, lbl: l, icon: i, prefix: p, fallback: f }) => ({
|
|
1501
1467
|
key: k,
|
|
1502
1468
|
lbl: l,
|
|
1503
1469
|
icon: i,
|
|
1504
1470
|
onClick: () => jsonCmd({ type: 'list', list: k === 'check' ? 'bullet' : k }) ||
|
|
1505
|
-
(adapter?.toggleList
|
|
1471
|
+
(adapter?.toggleList
|
|
1472
|
+
? adapter.toggleList(k)
|
|
1473
|
+
: toolbar?.toggleList
|
|
1474
|
+
? toolbar.toggleList(k)
|
|
1475
|
+
: insert?.(`${p}${sSel(f)}\n`)),
|
|
1506
1476
|
}))
|
|
1507
1477
|
.map(({ key: k, lbl: l, icon: i, onClick: o }) => (_jsxs(DropdownMenuItem, { disabled: !ready, onSelect: () => {
|
|
1508
1478
|
if (o)
|
|
1509
1479
|
o();
|
|
1510
|
-
}, className: MENU_GAP_CLASS, children: [React.createElement(i, { className: ICON_CLASS }), _jsx("span", { children: l })] }, k))) })] })] }), _jsxs("div", { className:
|
|
1480
|
+
}, className: MENU_GAP_CLASS, children: [React.createElement(i, { className: ICON_CLASS }), _jsx("span", { children: l })] }, k))) })] })] }), _jsxs("div", { className: "flex items-center gap-1", children: [docs && (_jsx(Mode, { editable: editable, mode: mode, disabled: !ready, onModeChange: (v) => {
|
|
1511
1481
|
if (!editable || !toolbar)
|
|
1512
1482
|
return;
|
|
1513
|
-
toolbar.setMode(v).catch(e => {
|
|
1483
|
+
toolbar.setMode(v).catch((e) => {
|
|
1514
1484
|
console.error('[Toolbar:mode] change-failed', { mode: v, error: e });
|
|
1515
1485
|
toast.error(e instanceof Error ? e.message : 'Failed to change mode.');
|
|
1516
1486
|
clearTransition();
|
|
1517
1487
|
});
|
|
1518
|
-
} })), _jsx(TextTooltip, { content:
|
|
1488
|
+
} })), _jsx(TextTooltip, { content: "Find (\u2318F)", side: "top", align: "center", delayDuration: 400, children: docs && _jsx(FindReplace, { mode: mode, toolbar: toolbar }) }), _jsx(TOOLBAR_COMPONENTS.Undo, { onMouseDown: preserveSel, disabled: !ready, adapter: adapter }), docs && (_jsxs(_Fragment, { children: [_jsx(UiButton, { size: "xs", variant: "tonal", disabled: !ready || !dirty || saving !== null || (toolbar?.optimistic ?? false), onMouseDown: (e) => {
|
|
1519
1489
|
e.preventDefault();
|
|
1520
|
-
}, onClick: e => void toolbarActions.discard?.(e), children: "Discard" }), _jsxs(ButtonGroup, { children: [_jsx(TextTooltip, { content:
|
|
1490
|
+
}, onClick: (e) => void toolbarActions.discard?.(e), children: "Discard" }), _jsxs(ButtonGroup, { children: [_jsx(TextTooltip, { content: "Save (\u2318S)", side: "top", align: "center", delayDuration: 400, children: _jsx(UiButton, { size: "xs", disabled: !ready || !dirty, loading: saving === 'saving', onMouseDown: (e) => {
|
|
1521
1491
|
e.preventDefault();
|
|
1522
|
-
}, onClick: e => void onSave?.(e), children: "Save" }) }), _jsx(TextTooltip, { content:
|
|
1492
|
+
}, onClick: (e) => void onSave?.(e), children: "Save" }) }), _jsx(TextTooltip, { content: "Version History", side: "top", align: "center", delayDuration: 400, children: _jsx(UiButton, { size: "xs", className: "px-0.5", disabled: !ready, "aria-label": "Version History", onMouseDown: (e) => {
|
|
1523
1493
|
e.preventDefault();
|
|
1524
1494
|
}, onClick: () => {
|
|
1525
1495
|
if (vers.length > 0 && !selVerId)
|
|
1526
1496
|
setSelVerId(vers[0].savedAt);
|
|
1527
1497
|
setVerDialogOpen(true);
|
|
1528
|
-
}, children: _jsx(CaretDownIcon, {}) }) }), _jsx(Dialog, { open: verDialogOpen, onOpenChange: setVerDialogOpen, children: _jsxs(DialogContent, { children: [_jsxs(DialogHeader, { children: [_jsx(DialogTitle, { children: "Version History" }), _jsx(DialogDescription, { className:
|
|
1498
|
+
}, children: _jsx(CaretDownIcon, {}) }) }), _jsx(Dialog, { open: verDialogOpen, onOpenChange: setVerDialogOpen, children: _jsxs(DialogContent, { children: [_jsxs(DialogHeader, { children: [_jsx(DialogTitle, { children: "Version History" }), _jsx(DialogDescription, { className: "sr-only", children: "Select a version to preview and restore." }), _jsxs(Select, { value: selVerId, onValueChange: setSelVerId, children: [_jsx(SelectTrigger, { className: "h-14", "aria-label": "Select a version...", children: _jsx(SelectValue, { placeholder: "Select a version..." }) }), _jsx(SelectContent, { children: vers.map((v) => (_jsx(SelectItem, { value: v.savedAt, children: _jsxs("span", { className: "flex flex-col text-left", children: [_jsxs("span", { children: [v.title, " (", new Date(v.savedAt).toLocaleString(), ")"] }), _jsx("span", { className: SECONDARY_TEXT_CLASS, children: v.description })] }) }, v.savedAt))) })] })] }), _jsx("div", { className: "min-h-0 flex-1 overflow-y-auto", children: _jsx(CodeBlock, { tone: "view", language: "mdx", docsSource: true, code: previewPack.markdown.trim() || ' ' }) }), _jsxs(DialogFooter, { children: [_jsx(UiButton, { variant: 'ghost', onClick: () => { setVerDialogOpen(false); }, children: "Cancel" }), _jsx(UiButton, { disabled: !selVer, onClick: toolbarActions.restorePreview, children: "Restore" })] })] }) })] }), docs && publishDraft && (_jsx(UiButton, { size: "xs", disabled: !ready || saving === 'saving', onMouseDown: (e) => e.preventDefault(), onClick: () => void publish(), children: "Publish" }))] }))] }), _jsxs("div", { className: "flex items-center gap-0.5", children: [_jsx(TOOLBAR_COMPONENTS.Uploader, { icon: ImageIcon, insert: insert, onMouseDown: preserveSel, disabled: !ready, ctx: toolbar?.path }), _jsx(TOOLBAR_COMPONENTS.Custom, { onInsert: (_statement, v) => insert?.(v, true), onInsertMd: insert, onMouseDown: preserveSel, disabled: !ready, ctx: toolbar?.path })] }), _jsx(Dialog, { open: endpointOpen, onOpenChange: (o) => {
|
|
1529
1499
|
setEndpointOpen(o);
|
|
1530
1500
|
if (!o)
|
|
1531
1501
|
setEndpoint('');
|
|
1532
|
-
}, children: _jsxs(DialogContent, { children: [_jsxs(DialogHeader, { children: [_jsx(DialogTitle, { children: "Receive value" }), _jsx(DialogDescription, { className:
|
|
1502
|
+
}, children: _jsxs(DialogContent, { children: [_jsxs(DialogHeader, { children: [_jsx(DialogTitle, { children: "Receive value" }), _jsx(DialogDescription, { className: "sr-only", children: "Enter an API endpoint to receive code value into the editor." })] }), _jsx(Label, { htmlFor: "docs-received-code-endpoint", children: "API endpoint" }), _jsx(Input, { id: "docs-received-code-endpoint", value: endpoint, onChange: (e) => {
|
|
1533
1503
|
setEndpoint(e.target.value);
|
|
1534
|
-
}, placeholder:
|
|
1504
|
+
}, placeholder: "/api/docs?action=testimonials" }), _jsxs("div", { className: 'flex justify-end gap-2', children: [_jsx(UiButton, { variant: 'outline', onClick: () => { setEndpointOpen(false); }, children: "Cancel" }), _jsx(UiButton, { disabled: !endpoint.trim(), onClick: insertionActions.receiveCode, children: "Receive value" })] })] }) })] })) }) }) })] }) }));
|
|
1535
1505
|
},
|
|
1536
1506
|
};
|
|
1537
|
-
export const { DocsToolbarActions } = TOOLBAR_COMPONENTS;
|
|
1538
|
-
export const { Toolbar } = TOOLBAR_COMPONENTS;
|
|
1507
|
+
export const { DocsToolbarActions, Toolbar } = TOOLBAR_COMPONENTS;
|
|
1539
1508
|
//# sourceMappingURL=_toolbar.js.map
|