@terra-symposium/docs 0.1.17 → 0.1.72
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 +26 -7
- package/bin/terra-docs.mjs +187 -0
- 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} +106 -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} +3 -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 +16 -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 +11 -7
- 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 +111 -46
- 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 +47 -14
- 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 +29 -17
- 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 +36 -15
- 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 +16 -14
- 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 +2 -3
- package/lib-dist/components/terra/flow/Nodes.d.ts.map +1 -0
- package/lib-dist/{terra → components/terra}/flow/Nodes.js +213 -106
- package/lib-dist/components/terra/flow/Nodes.js.map +1 -0
- package/lib-dist/{terra → components/terra}/flow/_chrome.d.ts +7 -9
- package/lib-dist/components/terra/flow/_chrome.d.ts.map +1 -0
- package/lib-dist/{terra → components/terra}/flow/_chrome.js +329 -118
- 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 +375 -131
- 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 +42 -31
- package/lib-dist/components/terra/pages/docs/_blocks.js.map +1 -0
- package/lib-dist/{terra → components/terra}/pages/docs/_editable.d.ts +2 -3
- package/lib-dist/components/terra/pages/docs/_editable.d.ts.map +1 -0
- package/lib-dist/{terra → components/terra}/pages/docs/_editable.js +82 -44
- 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 +17 -17
- 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 +3 -5
- package/lib-dist/components/terra/pages/docs/_toolbar.d.ts.map +1 -0
- package/lib-dist/{terra → components/terra}/pages/docs/_toolbar.js +318 -350
- package/lib-dist/components/terra/pages/docs/_toolbar.js.map +1 -0
- package/lib-dist/{terra → components/terra}/pages/docs/_tree.d.ts +1 -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/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 +2030 -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 +185 -0
- package/lib-dist/lib/terra/docs/state.d.ts.map +1 -0
- package/lib-dist/lib/terra/docs/state.js +254 -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} +6 -8
- 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 -28
- 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/{terra → lib/terra}/flow/powerSource.d.ts +1 -2
- 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 +32 -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 +63 -38
- package/site/astro.config.mjs +67 -0
- package/site/docs-content-plugin.mjs +62 -0
- package/site/src/components/DocsSiteSearch.tsx +108 -0
- package/site/src/lib/catalog.ts +151 -0
- package/site/src/pages/404.astro +38 -0
- package/site/src/pages/[...slug].astro +49 -0
- package/site/src/styles/search.css +56 -0
- package/src/components/NotFound.astro +6 -0
- package/src/components/NotFound.tsx +48 -0
- package/src/{SiteLayout.astro → components/SiteLayout.astro} +17 -5
- package/src/{navigation.tsx → components/navigation.tsx} +3 -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 +0 -5
- 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}/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,56 @@ 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 '../../runtime/shared.js';
|
|
20
|
+
import { actions } from '../../../../lib/terra/runtime/action-proxy.js';
|
|
21
|
+
import { dirname, docsRootPath, toPascal } 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';
|
|
20
24
|
import { redo, redoDepth, undo, undoDepth } from '@codemirror/commands';
|
|
21
|
-
import { stringifyDocBody } from '
|
|
25
|
+
import { stringifyDocBody } from '../../../../lib/terra/runtime/content/document-markdown.js';
|
|
22
26
|
import { toast } from 'sonner';
|
|
23
27
|
import { useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react';
|
|
24
|
-
import { getDocsHostAdapter } from '
|
|
28
|
+
import { getDocsHostAdapter } from '../../../../lib/host-runtime.js';
|
|
25
29
|
// COMPONENTS
|
|
26
|
-
import * as TerraQualityRegex from '
|
|
30
|
+
import * as TerraQualityRegex from '../../../../lib/terra/regex.mjs';
|
|
27
31
|
import React from 'react';
|
|
28
|
-
import { TextTooltip, TooltipProvider } from '@terra-symposium/styling/ui
|
|
29
|
-
import {
|
|
30
|
-
import { Button as UiButton } from '@terra-symposium/styling/ui
|
|
31
|
-
import { ButtonGroup } from '@terra-symposium/styling/ui
|
|
32
|
+
import { TextTooltip, TooltipProvider } from '@terra-symposium/styling/ui';
|
|
33
|
+
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';
|
|
34
|
+
import { Button as UiButton } from '@terra-symposium/styling/ui';
|
|
35
|
+
import { ButtonGroup } from '@terra-symposium/styling/ui';
|
|
32
36
|
import { CodeBlock } from '../../editor/docs/_CodeBlock.js';
|
|
33
|
-
import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from '@terra-symposium/styling/ui
|
|
34
|
-
import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger } from '@terra-symposium/styling/ui
|
|
35
|
-
import { EditStateCtx } from '
|
|
36
|
-
import { ErrorBoundary } from '../../
|
|
37
|
-
import { Input } from '@terra-symposium/styling/ui
|
|
38
|
-
import { Label } from '@terra-symposium/styling/ui
|
|
39
|
-
import { Popover, PopoverContent, PopoverTrigger } from '@terra-symposium/styling/ui
|
|
40
|
-
import { SearchEmpty } from '@terra-symposium/styling/ui
|
|
41
|
-
import { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectSeparator, SelectTrigger, SelectValue } from '@terra-symposium/styling/ui
|
|
42
|
-
import {
|
|
43
|
-
import { Toggle } from '@terra-symposium/styling/ui/terra-original';
|
|
44
|
-
import { ToggleGroup, ToggleGroupItem } from '@terra-symposium/styling/ui/terra-original';
|
|
37
|
+
import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from '@terra-symposium/styling/ui';
|
|
38
|
+
import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, } from '@terra-symposium/styling/ui';
|
|
39
|
+
import { EditStateCtx } from '../../../../lib/terra/docs/state.js';
|
|
40
|
+
import { ErrorBoundary } from '../../ui.js';
|
|
41
|
+
import { Input } from '@terra-symposium/styling/ui';
|
|
42
|
+
import { Label } from '@terra-symposium/styling/ui';
|
|
43
|
+
import { Popover, PopoverContent, PopoverTrigger } from '@terra-symposium/styling/ui';
|
|
44
|
+
import { SearchEmpty } from '@terra-symposium/styling/ui';
|
|
45
|
+
import { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectSeparator, SelectTrigger, SelectValue, } from '@terra-symposium/styling/ui';
|
|
46
|
+
import { ToggleGroup, ToggleGroupItem } from '@terra-symposium/styling/ui';
|
|
45
47
|
// DATA
|
|
46
|
-
import { ATTCH_TYPES } from '
|
|
48
|
+
import { ATTCH_TYPES } from '../../../../lib/terra/docs/attachments.js';
|
|
47
49
|
import { DOCS_BLOCK_ICONS } from './_icons.js';
|
|
48
|
-
import { EMPTY_NODES } from '
|
|
50
|
+
import { EMPTY_NODES } from '../../../../lib/terra/runtime/nodes.js';
|
|
49
51
|
/*//////////////////////////////////////////////////
|
|
50
52
|
CONFIG
|
|
51
53
|
//////////////////////////////////////////////////*/
|
|
52
54
|
const FIND_WORD = String.raw `[\p{L}\p{N}_]`;
|
|
53
|
-
const BLIND_REGEX = [
|
|
55
|
+
const BLIND_REGEX = [
|
|
56
|
+
/<[^>]+>/gu,
|
|
57
|
+
/^[\t ]*(?:#{1,6}|>+|[-+*]|\d+\.)[\t ]*/gmu,
|
|
58
|
+
/:::[^\n]*|===|\|\|\|/gu,
|
|
59
|
+
/[`*_~[\]()]/gu,
|
|
60
|
+
/\s+/gu,
|
|
61
|
+
];
|
|
54
62
|
const ICON_CLASS = 'size-4 text-primary-11';
|
|
55
63
|
const SECONDARY_TEXT_CLASS = 'text-xs text-primary-11';
|
|
56
64
|
const MENU_GAP_CLASS = 'gap-2';
|
|
@@ -149,7 +157,7 @@ COMPONENTS
|
|
|
149
157
|
//////////////////////////////////////////////////*/
|
|
150
158
|
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
159
|
void a;
|
|
152
|
-
return (_jsx(TextTooltip, { content: s ? `${l} (${s})` : l, side:
|
|
160
|
+
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
161
|
});
|
|
154
162
|
Button.displayName = 'Button';
|
|
155
163
|
/**
|
|
@@ -165,13 +173,16 @@ Button.displayName = 'Button';
|
|
|
165
173
|
*/
|
|
166
174
|
function Mode({ mode, onModeChange, disabled, editable, size = 'xs', }) {
|
|
167
175
|
void editable;
|
|
168
|
-
return (_jsxs(Select, { size: size, disabled: disabled, value: mode, onValueChange: v => {
|
|
176
|
+
return (_jsxs(Select, { size: size, disabled: disabled, value: mode, onValueChange: (v) => {
|
|
169
177
|
const n = (v || 'view');
|
|
170
178
|
if (mode === n)
|
|
171
179
|
return;
|
|
172
180
|
setTransition(`to-${n}`);
|
|
173
181
|
onModeChange(n);
|
|
174
|
-
}, children: [_jsx(SelectTrigger, {
|
|
182
|
+
}, children: [_jsx(SelectTrigger, { "aria-label": "Mode",
|
|
183
|
+
// Match the original full-row selector in View/Edit. Attachments adds
|
|
184
|
+
// its type filters beside this control, so only that mode sizes to fit.
|
|
185
|
+
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
186
|
}
|
|
176
187
|
/**
|
|
177
188
|
* Renders Docs-specific controls beside a content editor toolbar.
|
|
@@ -184,17 +195,17 @@ function Mode({ mode, onModeChange, disabled, editable, size = 'xs', }) {
|
|
|
184
195
|
* @return The mode, history, save, or version actions supported by the active Docs editor toolbar.
|
|
185
196
|
*/
|
|
186
197
|
const TOOLBAR_COMPONENTS = {
|
|
187
|
-
DocsToolbarActions({ activeMode
|
|
198
|
+
DocsToolbarActions({ activeMode, editable, size = 'xs', toolbar, }) {
|
|
188
199
|
const edit = useContext(EditStateCtx);
|
|
189
200
|
const [versions, setVersions] = useState([]);
|
|
190
201
|
const [historyOpen, setHistoryOpen] = useState(false);
|
|
191
202
|
const [selectedVersionId, setSelectedVersionId] = useState('');
|
|
192
|
-
const
|
|
193
|
-
const selectedVersion = versions.find(
|
|
203
|
+
const historyEnabled = getDocsHostAdapter()?.capabilities.history !== false;
|
|
204
|
+
const selectedVersion = versions.find((version) => version.savedAt === selectedVersionId);
|
|
194
205
|
const preview = useMemo(() => parseVerBody(selectedVersion), [selectedVersion]);
|
|
195
206
|
useEffect(() => {
|
|
196
207
|
let live = true;
|
|
197
|
-
if (!editable || !toolbar?.path || !historyOpen) {
|
|
208
|
+
if (!editable || !historyEnabled || !toolbar?.path || !historyOpen) {
|
|
198
209
|
setVersions([]);
|
|
199
210
|
return;
|
|
200
211
|
}
|
|
@@ -216,65 +227,71 @@ const TOOLBAR_COMPONENTS = {
|
|
|
216
227
|
if (live && Array.isArray(data))
|
|
217
228
|
setVersions(data);
|
|
218
229
|
}
|
|
219
|
-
catch (
|
|
220
|
-
console.error('[Toolbar:versions] load-failed', { path, error
|
|
221
|
-
toast.error(
|
|
230
|
+
catch (error) {
|
|
231
|
+
console.error('[Toolbar:versions] load-failed', { path, error });
|
|
232
|
+
toast.error(error instanceof Error ? error.message : 'Failed to load doc versions.');
|
|
222
233
|
}
|
|
223
234
|
})();
|
|
224
235
|
return () => {
|
|
225
236
|
live = false;
|
|
226
237
|
};
|
|
227
|
-
}, [editable, historyOpen, toolbar?.path]);
|
|
238
|
+
}, [editable, historyEnabled, historyOpen, toolbar?.path]);
|
|
228
239
|
useEffect(() => {
|
|
229
240
|
if (historyOpen && !selectedVersionId && versions[0])
|
|
230
241
|
setSelectedVersionId(versions[0].savedAt);
|
|
231
242
|
}, [historyOpen, selectedVersionId, versions]);
|
|
232
|
-
const save = async (
|
|
233
|
-
|
|
243
|
+
const save = async (event) => {
|
|
244
|
+
event.preventDefault();
|
|
234
245
|
if (!toolbar?.save)
|
|
235
246
|
return;
|
|
236
247
|
try {
|
|
237
|
-
await toolbar.save();
|
|
248
|
+
await Promise.resolve(toolbar.save());
|
|
238
249
|
}
|
|
239
|
-
catch (
|
|
240
|
-
console.error('[Docs:save] failed',
|
|
241
|
-
toast.error(
|
|
250
|
+
catch (error) {
|
|
251
|
+
console.error('[Docs:save] failed', error);
|
|
252
|
+
toast.error(error instanceof Error ? error.message : 'Unable to save document.');
|
|
242
253
|
}
|
|
243
254
|
};
|
|
244
255
|
useEffect(() => {
|
|
245
|
-
if (
|
|
256
|
+
if (activeMode === 'view')
|
|
246
257
|
return;
|
|
247
|
-
const onKeyDown = (
|
|
248
|
-
if ((
|
|
249
|
-
void save(
|
|
258
|
+
const onKeyDown = (event) => {
|
|
259
|
+
if ((event.metaKey || event.ctrlKey) && event.key.toLowerCase() === 's')
|
|
260
|
+
void save(event);
|
|
250
261
|
};
|
|
251
262
|
document.addEventListener('keydown', onKeyDown);
|
|
252
|
-
return () =>
|
|
253
|
-
|
|
254
|
-
};
|
|
255
|
-
}, [aMode, toolbar]);
|
|
263
|
+
return () => document.removeEventListener('keydown', onKeyDown);
|
|
264
|
+
}, [activeMode, toolbar]);
|
|
256
265
|
if (!editable)
|
|
257
266
|
return null;
|
|
258
|
-
return (_jsx(TooltipProvider, { children: _jsxs("div", { className:
|
|
267
|
+
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
268
|
if (!toolbar)
|
|
260
269
|
return;
|
|
261
|
-
toolbar.setMode(
|
|
262
|
-
console.error('[Toolbar:mode] change-failed', {
|
|
263
|
-
toast.error(
|
|
270
|
+
void toolbar.setMode(mode).catch((error) => {
|
|
271
|
+
console.error('[Toolbar:mode] change-failed', { mode, error });
|
|
272
|
+
toast.error(error instanceof Error ? error.message : 'Failed to change mode.');
|
|
264
273
|
clearTransition();
|
|
265
274
|
});
|
|
266
|
-
} }),
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
275
|
+
} }), 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: () => {
|
|
276
|
+
if (versions.length > 0 && !selectedVersionId)
|
|
277
|
+
setSelectedVersionId(versions[0].savedAt);
|
|
278
|
+
setHistoryOpen(true);
|
|
279
|
+
}, 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: () => {
|
|
280
|
+
if (!edit || !selectedVersionId)
|
|
281
|
+
return;
|
|
282
|
+
edit.update({
|
|
283
|
+
content: preview.body,
|
|
284
|
+
description: selectedVersion?.description || '',
|
|
285
|
+
source: preview.markdown,
|
|
286
|
+
title: selectedVersion?.title || '',
|
|
287
|
+
});
|
|
288
|
+
(edit.setCode ?? edit.setSrc)?.(preview.markdown);
|
|
289
|
+
setHistoryOpen(false);
|
|
290
|
+
notify({
|
|
291
|
+
error: null,
|
|
292
|
+
fallback: 'Restored version to local draft. Save to apply.',
|
|
293
|
+
});
|
|
294
|
+
}, children: "Restore" })] })] }) })] }))] }) }));
|
|
278
295
|
},
|
|
279
296
|
/**
|
|
280
297
|
* Undo and Redo control group dynamically checking CodeMirror depth levels.
|
|
@@ -286,9 +303,12 @@ const TOOLBAR_COMPONENTS = {
|
|
|
286
303
|
*
|
|
287
304
|
* @return {JSX.Element} The paired undo/redo button group.
|
|
288
305
|
*/
|
|
289
|
-
Undo({ onMouseDown, disabled, adapter }) {
|
|
306
|
+
Undo({ onMouseDown, disabled, adapter, }) {
|
|
290
307
|
// STATES
|
|
291
|
-
const [state, setState] = useState({
|
|
308
|
+
const [state, setState] = useState({
|
|
309
|
+
redo: false,
|
|
310
|
+
undo: false,
|
|
311
|
+
});
|
|
292
312
|
// INIT
|
|
293
313
|
useEffect(() => {
|
|
294
314
|
let frame = 0;
|
|
@@ -297,8 +317,10 @@ const TOOLBAR_COMPONENTS = {
|
|
|
297
317
|
*/
|
|
298
318
|
const sync = () => {
|
|
299
319
|
const view = codeViewOf();
|
|
300
|
-
const n = view
|
|
301
|
-
|
|
320
|
+
const n = view
|
|
321
|
+
? { redo: redoDepth(view.state) > 0, undo: undoDepth(view.state) > 0 }
|
|
322
|
+
: { redo: false, undo: false };
|
|
323
|
+
setState((c) => (c.undo === n.undo && c.redo === n.redo ? c : n));
|
|
302
324
|
};
|
|
303
325
|
sync();
|
|
304
326
|
/**
|
|
@@ -308,21 +330,33 @@ const TOOLBAR_COMPONENTS = {
|
|
|
308
330
|
cancelAnimationFrame(frame);
|
|
309
331
|
frame = requestAnimationFrame(sync);
|
|
310
332
|
};
|
|
311
|
-
['focusin', 'keyup', 'mouseup'].forEach(e => {
|
|
333
|
+
['focusin', 'keyup', 'mouseup'].forEach((e) => {
|
|
312
334
|
document.addEventListener(e, refresh, true);
|
|
313
335
|
});
|
|
314
336
|
return () => {
|
|
315
337
|
cancelAnimationFrame(frame);
|
|
316
|
-
['focusin', 'keyup', 'mouseup'].forEach(e => {
|
|
338
|
+
['focusin', 'keyup', 'mouseup'].forEach((e) => {
|
|
317
339
|
document.removeEventListener(e, refresh, true);
|
|
318
340
|
});
|
|
319
341
|
};
|
|
320
342
|
}, []);
|
|
321
343
|
// RENDER
|
|
322
344
|
return (_jsx(ButtonGroup, { children: [
|
|
323
|
-
{
|
|
324
|
-
|
|
325
|
-
|
|
345
|
+
{
|
|
346
|
+
lbl: 'Undo',
|
|
347
|
+
canFire: adapter?.undoable ?? state.undo,
|
|
348
|
+
action: adapter?.undo ?? undo,
|
|
349
|
+
icon: UndoIcon,
|
|
350
|
+
shortcut: '⌘Z',
|
|
351
|
+
},
|
|
352
|
+
{
|
|
353
|
+
lbl: 'Redo',
|
|
354
|
+
canFire: adapter?.redoable ?? state.redo,
|
|
355
|
+
action: adapter?.redo ?? redo,
|
|
356
|
+
icon: RedoIcon,
|
|
357
|
+
shortcut: '⌘Y',
|
|
358
|
+
},
|
|
359
|
+
].map((b) => (_jsx(Button, { lbl: b.lbl, shortcut: b.shortcut, disabled: disabled || !b.canFire, onMouseDown: onMouseDown, onClick: () => {
|
|
326
360
|
if (adapter) {
|
|
327
361
|
if (b.lbl === 'Undo')
|
|
328
362
|
adapter.undo?.();
|
|
@@ -337,180 +371,6 @@ const TOOLBAR_COMPONENTS = {
|
|
|
337
371
|
view.focus();
|
|
338
372
|
}, children: _jsx(b.icon, {}) }, b.lbl))) }));
|
|
339
373
|
},
|
|
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
374
|
/**
|
|
515
375
|
* Dropdown dialog facilitating attachment uploads or selecting document attachments natively bound to the leaf.
|
|
516
376
|
*
|
|
@@ -544,7 +404,7 @@ const TOOLBAR_COMPONENTS = {
|
|
|
544
404
|
name: typeof a.name === 'string' ? a.name : a.path.split('/').pop() || 'attachment',
|
|
545
405
|
})));
|
|
546
406
|
})
|
|
547
|
-
.catch(e => {
|
|
407
|
+
.catch((e) => {
|
|
548
408
|
console.error('[Toolbar:attachments] load-failed', { path: ctx, error: e });
|
|
549
409
|
toast.error(e instanceof Error ? e.message : 'Failed to load attachments.');
|
|
550
410
|
});
|
|
@@ -565,9 +425,9 @@ const TOOLBAR_COMPONENTS = {
|
|
|
565
425
|
submit: async () => {
|
|
566
426
|
if (!cfg.attachment || cfg.attachment === 'none' || !insert)
|
|
567
427
|
return;
|
|
568
|
-
setCfg(p => ({ ...p, busy: true }));
|
|
428
|
+
setCfg((p) => ({ ...p, busy: true }));
|
|
569
429
|
try {
|
|
570
|
-
const att = atts.find(a => a.path === cfg.attachment);
|
|
430
|
+
const att = atts.find((a) => a.path === cfg.attachment);
|
|
571
431
|
if (!att)
|
|
572
432
|
throw new Error('Attachment not found');
|
|
573
433
|
const lbl = att.name
|
|
@@ -575,7 +435,8 @@ const TOOLBAR_COMPONENTS = {
|
|
|
575
435
|
.pop()
|
|
576
436
|
?.split('.')[0]
|
|
577
437
|
?.replace(TerraQualityRegex.REGEX_G_REGEX_7(), ' ')
|
|
578
|
-
.replace(TerraQualityRegex.REGEX_B_W_G_REGEX(), c => c.toUpperCase()) ||
|
|
438
|
+
.replace(TerraQualityRegex.REGEX_B_W_G_REGEX(), (c) => c.toUpperCase()) ||
|
|
439
|
+
'attachment';
|
|
579
440
|
const c = (att.path.startsWith('http') ? att.path : att.name).replace(TerraQualityRegex.REGEX_G_REGEX(), '%20');
|
|
580
441
|
let fmt = '';
|
|
581
442
|
if (insertMode === 'link')
|
|
@@ -590,19 +451,19 @@ const TOOLBAR_COMPONENTS = {
|
|
|
590
451
|
uploaderActions.reset();
|
|
591
452
|
}
|
|
592
453
|
catch {
|
|
593
|
-
setCfg(p => ({ ...p, busy: false }));
|
|
454
|
+
setCfg((p) => ({ ...p, busy: false }));
|
|
594
455
|
}
|
|
595
456
|
},
|
|
596
457
|
};
|
|
597
458
|
// RENDER
|
|
598
|
-
return (_jsxs(Popover, { open: cfg.open, onOpenChange: o => {
|
|
459
|
+
return (_jsxs(Popover, { open: cfg.open, onOpenChange: (o) => {
|
|
599
460
|
if (!o)
|
|
600
461
|
uploaderActions.reset();
|
|
601
462
|
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":
|
|
463
|
+
setCfg((p) => ({ ...p, open: o }));
|
|
464
|
+
}, 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) => {
|
|
465
|
+
setCfg((v) => ({ ...v, attachment: p }));
|
|
466
|
+
}, 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
467
|
},
|
|
607
468
|
/**
|
|
608
469
|
* Recursive structural map converting component tree branches into native interactive dropdown triggers natively.
|
|
@@ -615,11 +476,13 @@ const TOOLBAR_COMPONENTS = {
|
|
|
615
476
|
*
|
|
616
477
|
* @return {JSX.Element} React rendered menu node explicitly containing nested branches cleanly.
|
|
617
478
|
*/
|
|
618
|
-
GlobalComponentMenuNode({ name, tree, onCopy }) {
|
|
619
|
-
return (_jsxs(DropdownMenuSub, { children: [_jsx(DropdownMenuSubTrigger, { className:
|
|
479
|
+
GlobalComponentMenuNode({ name, tree, onCopy, }) {
|
|
480
|
+
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
481
|
e.preventDefault();
|
|
621
482
|
onCopy?.(c);
|
|
622
|
-
}, children: c.displayLabel
|
|
483
|
+
}, children: c.displayLabel
|
|
484
|
+
.replace(TerraQualityRegex.REGEX_G_REGEX_7(), ' ')
|
|
485
|
+
.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
486
|
},
|
|
624
487
|
/**
|
|
625
488
|
* Complex unified insertion menu tracking local sister references alongside globally configured repo components.
|
|
@@ -640,14 +503,21 @@ const TOOLBAR_COMPONENTS = {
|
|
|
640
503
|
Custom({ onInsert, onInsertMd, onMouseDown, disabled, ctx, }) {
|
|
641
504
|
// STATES
|
|
642
505
|
const [sis, setSis] = useState([]);
|
|
643
|
-
const [search, setSearch] = useState({
|
|
506
|
+
const [search, setSearch] = useState({
|
|
507
|
+
open: false,
|
|
508
|
+
query: '',
|
|
509
|
+
tree: [],
|
|
510
|
+
busy: false,
|
|
511
|
+
});
|
|
644
512
|
const savedSel = useRef(null);
|
|
645
513
|
const copyLock = useRef(null);
|
|
646
514
|
// 1. FETCH LOCAL FILES (Allows ALL leaves as valid attachments)
|
|
647
515
|
useEffect(() => {
|
|
648
516
|
if (!ctx)
|
|
649
517
|
return;
|
|
650
|
-
const dir = dirname(TerraQualityRegex.REGEX_INDEX_MD_MDX_I_REGEX_2().test(ctx.split('/').pop() || '')
|
|
518
|
+
const dir = dirname(TerraQualityRegex.REGEX_INDEX_MD_MDX_I_REGEX_2().test(ctx.split('/').pop() || '')
|
|
519
|
+
? dirname(ctx)
|
|
520
|
+
: ctx);
|
|
651
521
|
actions.read.doc
|
|
652
522
|
.list({ type: 'folderEntries', path: dir })
|
|
653
523
|
.then(({ data: d }) => {
|
|
@@ -655,7 +525,7 @@ const TOOLBAR_COMPONENTS = {
|
|
|
655
525
|
if (Array.isArray(d))
|
|
656
526
|
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
527
|
})
|
|
658
|
-
.catch(e => {
|
|
528
|
+
.catch((e) => {
|
|
659
529
|
console.error('[Toolbar:insert.load-failed]', { path: dir, error: e });
|
|
660
530
|
toast.error(e instanceof Error ? e.message : 'Failed to load insert targets.');
|
|
661
531
|
});
|
|
@@ -664,8 +534,8 @@ const TOOLBAR_COMPONENTS = {
|
|
|
664
534
|
const componentTree = useMemo(() => {
|
|
665
535
|
const root = { components: [], folders: {} };
|
|
666
536
|
const counts = new Map();
|
|
667
|
-
repoComponents.forEach(c => counts.set(c.path, (counts.get(c.path) ?? 0) + 1));
|
|
668
|
-
repoComponents.forEach(c => {
|
|
537
|
+
repoComponents.forEach((c) => counts.set(c.path, (counts.get(c.path) ?? 0) + 1));
|
|
538
|
+
repoComponents.forEach((c) => {
|
|
669
539
|
const parts = c.path.split('/_custom/');
|
|
670
540
|
if (parts.length <= 1) {
|
|
671
541
|
root.components.push({ ...c, displayLabel: c.name });
|
|
@@ -676,7 +546,7 @@ const TOOLBAR_COMPONENTS = {
|
|
|
676
546
|
if (file !== 'index' && (counts.get(c.path) ?? 0) > 1)
|
|
677
547
|
segs.push(file);
|
|
678
548
|
let cur = root;
|
|
679
|
-
segs.forEach(s => {
|
|
549
|
+
segs.forEach((s) => {
|
|
680
550
|
cur = cur.folders[s] ??= { components: [], folders: {} };
|
|
681
551
|
});
|
|
682
552
|
// prettier-ignore
|
|
@@ -730,17 +600,23 @@ const TOOLBAR_COMPONENTS = {
|
|
|
730
600
|
return;
|
|
731
601
|
let a = true;
|
|
732
602
|
if (search.tree.length === 0) {
|
|
733
|
-
setSearch(s => ({ ...s, busy: true }));
|
|
603
|
+
setSearch((s) => ({ ...s, busy: true }));
|
|
734
604
|
actions.read.doc
|
|
735
605
|
.list({ type: 'nav', pathname: docsRootPath() })
|
|
736
606
|
.then(({ data: d }) => {
|
|
737
607
|
if (a)
|
|
738
|
-
setSearch(
|
|
608
|
+
setSearch((s) => ({
|
|
609
|
+
...s,
|
|
610
|
+
tree: Array.isArray(d)
|
|
611
|
+
? d.filter((n) => Boolean(n && typeof n === 'object' && 'type' in n))
|
|
612
|
+
: [],
|
|
613
|
+
busy: false,
|
|
614
|
+
}));
|
|
739
615
|
})
|
|
740
|
-
.catch(_err => {
|
|
616
|
+
.catch((_err) => {
|
|
741
617
|
console.error(`[Toolbar:Embed] Failed to fetch document tree:`, _err);
|
|
742
618
|
if (a)
|
|
743
|
-
setSearch(s => ({ ...s, busy: false }));
|
|
619
|
+
setSearch((s) => ({ ...s, busy: false }));
|
|
744
620
|
});
|
|
745
621
|
}
|
|
746
622
|
return () => {
|
|
@@ -754,7 +630,9 @@ const TOOLBAR_COMPONENTS = {
|
|
|
754
630
|
// contains the same node referenced from multiple locations.
|
|
755
631
|
const seen = new Set();
|
|
756
632
|
const lowerQuery = search.query.trim().toLowerCase();
|
|
757
|
-
const searchFrames = [
|
|
633
|
+
const searchFrames = [
|
|
634
|
+
{ nodes: search.tree, index: 0, path: '' },
|
|
635
|
+
];
|
|
758
636
|
while (searchFrames.length) {
|
|
759
637
|
const frame = searchFrames[searchFrames.length - 1];
|
|
760
638
|
if (!frame)
|
|
@@ -778,7 +656,11 @@ const TOOLBAR_COMPONENTS = {
|
|
|
778
656
|
}
|
|
779
657
|
}
|
|
780
658
|
else if (n.type === 'branch' && n.children) {
|
|
781
|
-
searchFrames.push({
|
|
659
|
+
searchFrames.push({
|
|
660
|
+
nodes: n.children,
|
|
661
|
+
index: 0,
|
|
662
|
+
path: frame.path ? `${frame.path} / ${currTitle}` : currTitle,
|
|
663
|
+
});
|
|
782
664
|
}
|
|
783
665
|
}
|
|
784
666
|
return leaves;
|
|
@@ -794,18 +676,24 @@ const TOOLBAR_COMPONENTS = {
|
|
|
794
676
|
let finalPath = tgtPath;
|
|
795
677
|
let leafId = tgtPath;
|
|
796
678
|
// 1. Close Modal immediately to prevent multiple submissions
|
|
797
|
-
setSearch(s => ({ ...s, open: false, busy: true }));
|
|
679
|
+
setSearch((s) => ({ ...s, open: false, busy: true }));
|
|
798
680
|
setTransition('p');
|
|
799
681
|
try {
|
|
800
682
|
if (isNew) {
|
|
801
683
|
// scope the new document natively UNDER the current document's path.
|
|
802
684
|
// this ensures string-based `verifyWrite` auth checks pass by matching the prefix of the inherited warrant.
|
|
803
685
|
const basePath = ctx ? ctx.replace(TerraQualityRegex.REGEX_PATTERN_REGEX_2(), '') : '';
|
|
804
|
-
const sName = search.query.trim()
|
|
805
|
-
|
|
686
|
+
const sName = search.query.trim()
|
|
687
|
+
? search.query.replace(TerraQualityRegex.REGEX_A_Z0_9_GI_REGEX_2(), '-').toLowerCase()
|
|
688
|
+
: 'untitled';
|
|
689
|
+
const nId = basePath
|
|
690
|
+
? `${basePath}/${sName}-${Date.now()}.mdx`
|
|
691
|
+
: `${sName}-${Date.now()}.mdx`;
|
|
806
692
|
finalPath = nId;
|
|
807
693
|
// create the page purely as a stand-alone document without anchoring to the group
|
|
808
|
-
const writeRes = await actions.write.doc
|
|
694
|
+
const writeRes = await actions.write.doc
|
|
695
|
+
.editor({ path: nId, title: search.query, source: 'This page is empty.' })
|
|
696
|
+
.catch((_err) => ({ data: null, error: _err }));
|
|
809
697
|
if (writeRes.error) {
|
|
810
698
|
console.error(`[Toolbar:Embed] write.doc.editor action failed:`, writeRes.error);
|
|
811
699
|
throw writeRes.error;
|
|
@@ -814,19 +702,25 @@ const TOOLBAR_COMPONENTS = {
|
|
|
814
702
|
}
|
|
815
703
|
// map leaf explicitly to the editor's attachment array unconditionally
|
|
816
704
|
if (ctx) {
|
|
817
|
-
const attRes = await actions.write.attachment
|
|
705
|
+
const attRes = await actions.write.attachment
|
|
706
|
+
.docRef({ path: ctx, refId: finalPath, title: search.query || 'Embedded Page' })
|
|
707
|
+
.catch((_err) => {
|
|
818
708
|
console.error(`[Toolbar:Embed] write.attachment.docRef action failed:`, _err);
|
|
819
709
|
return { data: null, error: _err };
|
|
820
710
|
});
|
|
821
711
|
if (attRes && attRes.data) {
|
|
822
712
|
// Resolves the exact Sanity UUID returned to map directly into the React AST parameter
|
|
823
713
|
const attachment = {
|
|
824
|
-
leafId: typeof attRes.data === 'object' &&
|
|
714
|
+
leafId: typeof attRes.data === 'object' &&
|
|
715
|
+
'refId' in attRes.data &&
|
|
716
|
+
typeof attRes.data.refId === 'string'
|
|
717
|
+
? attRes.data.refId
|
|
718
|
+
: leafId,
|
|
825
719
|
sister: { path: finalPath, name: finalPath.split('/').pop() || finalPath },
|
|
826
720
|
};
|
|
827
721
|
leafId = attachment.leafId;
|
|
828
|
-
setSis(p => {
|
|
829
|
-
if (!p.some(s => s.path === finalPath))
|
|
722
|
+
setSis((p) => {
|
|
723
|
+
if (!p.some((s) => s.path === finalPath))
|
|
830
724
|
return [...p, attachment.sister];
|
|
831
725
|
return p;
|
|
832
726
|
});
|
|
@@ -834,10 +728,10 @@ const TOOLBAR_COMPONENTS = {
|
|
|
834
728
|
}
|
|
835
729
|
// delay AST injection to allow Sanity CDN replica propagation to finish
|
|
836
730
|
if (isNew || ctx)
|
|
837
|
-
await new Promise(r => setTimeout(r, 1500));
|
|
731
|
+
await new Promise((r) => setTimeout(r, 1500));
|
|
838
732
|
clearTransition();
|
|
839
733
|
// 2. Yield to event loop to allow DOM reconciliation
|
|
840
|
-
await new Promise(r => setTimeout(r, 200));
|
|
734
|
+
await new Promise((r) => setTimeout(r, 200));
|
|
841
735
|
// 3. Force focus back into the active editor securely
|
|
842
736
|
const aEditor = document.querySelector('[contenteditable="true"], .cm-content');
|
|
843
737
|
if (aEditor) {
|
|
@@ -862,8 +756,8 @@ const TOOLBAR_COMPONENTS = {
|
|
|
862
756
|
}
|
|
863
757
|
}
|
|
864
758
|
// 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));
|
|
759
|
+
setSearch((s) => ({ ...s, query: '', busy: false }));
|
|
760
|
+
await new Promise((r) => requestAnimationFrame(r));
|
|
867
761
|
// 4. Inject purely as AST text (bypassing the import statement injection)
|
|
868
762
|
// This mirrors how globally configured components like <Nodes /> and <DocsMath /> are inserted.
|
|
869
763
|
if (onInsertMd) {
|
|
@@ -880,8 +774,11 @@ const TOOLBAR_COMPONENTS = {
|
|
|
880
774
|
catch (_err) {
|
|
881
775
|
clearTransition();
|
|
882
776
|
console.error(`[Toolbar:Embed] Critical pipeline failure during leaf embed process:`, _err);
|
|
883
|
-
notify({
|
|
884
|
-
|
|
777
|
+
notify({
|
|
778
|
+
error: _err instanceof Error ? _err : new Error('Embed failed'),
|
|
779
|
+
fallback: 'Failed to embed leaf.',
|
|
780
|
+
});
|
|
781
|
+
setSearch((s) => ({ ...s, query: '', busy: false }));
|
|
885
782
|
}
|
|
886
783
|
};
|
|
887
784
|
// 6. LOCAL MENUS
|
|
@@ -913,21 +810,23 @@ const TOOLBAR_COMPONENTS = {
|
|
|
913
810
|
},
|
|
914
811
|
],
|
|
915
812
|
};
|
|
916
|
-
return (_jsxs(_Fragment, { children: [_jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsx(Button, { disabled: disabled, lbl:
|
|
813
|
+
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
814
|
e.preventDefault();
|
|
918
815
|
const sel = window.getSelection();
|
|
919
816
|
if (sel && sel.rangeCount > 0)
|
|
920
817
|
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 => {
|
|
818
|
+
setSearch((s) => ({ ...s, open: true }));
|
|
819
|
+
}, 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
820
|
e.preventDefault();
|
|
924
821
|
void copyComponent(c);
|
|
925
|
-
}, children: c.displayLabel
|
|
822
|
+
}, children: c.displayLabel
|
|
823
|
+
.replace(TerraQualityRegex.REGEX_G_REGEX_7(), ' ')
|
|
824
|
+
.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
825
|
e.preventDefault();
|
|
927
826
|
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:
|
|
827
|
+
}, children: s.name }, s.path))) })] }) }, m.label)))] })] }), _jsx(Dialog, { open: search.open, onOpenChange: (o) => {
|
|
828
|
+
setSearch((s) => ({ ...s, open: o }));
|
|
829
|
+
}, 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
830
|
},
|
|
932
831
|
/**
|
|
933
832
|
* Dropdown control for quickly converting a block or inserting a supported block template.
|
|
@@ -963,9 +862,9 @@ const TOOLBAR_COMPONENTS = {
|
|
|
963
862
|
const sel = window.getSelection();
|
|
964
863
|
const blockCursor = document.querySelector('[data-docs-block-cursor="true"]');
|
|
965
864
|
if (blockCursor && sel?.anchorNode && !blockCursor.contains(sel.anchorNode)) {
|
|
966
|
-
const blockVal = toolbarFocusValue(blockCursor, opts.map(o => o.value));
|
|
865
|
+
const blockVal = toolbarFocusValue(blockCursor, opts.map((o) => o.value));
|
|
967
866
|
if (blockVal) {
|
|
968
|
-
setVal(c => (c === blockVal ? c : blockVal));
|
|
867
|
+
setVal((c) => (c === blockVal ? c : blockVal));
|
|
969
868
|
return;
|
|
970
869
|
}
|
|
971
870
|
}
|
|
@@ -978,13 +877,15 @@ const TOOLBAR_COMPONENTS = {
|
|
|
978
877
|
const textBlock = el?.closest('h1, h2, h3, h4, h5, h6, p');
|
|
979
878
|
if (textBlock)
|
|
980
879
|
savedBlock.current = textBlock;
|
|
981
|
-
else if (el
|
|
880
|
+
else if (el
|
|
881
|
+
?.closest('td, th')
|
|
882
|
+
?.closest('[data-docs-editor-block="DocsTable"], [data-terra-block="table"]'))
|
|
982
883
|
savedBlock.current = null;
|
|
983
884
|
const blockVal = el
|
|
984
|
-
? toolbarFocusValue(el, opts.map(o => o.value))
|
|
885
|
+
? toolbarFocusValue(el, opts.map((o) => o.value))
|
|
985
886
|
: null;
|
|
986
887
|
if (blockVal) {
|
|
987
|
-
setVal(c => (c === blockVal ? c : blockVal));
|
|
888
|
+
setVal((c) => (c === blockVal ? c : blockVal));
|
|
988
889
|
return;
|
|
989
890
|
}
|
|
990
891
|
}
|
|
@@ -1001,7 +902,7 @@ const TOOLBAR_COMPONENTS = {
|
|
|
1001
902
|
n = 'h4';
|
|
1002
903
|
else if (TerraQualityRegex.REGEX_S_REGEX_4().test(text))
|
|
1003
904
|
n = 'h2';
|
|
1004
|
-
setVal(c => (c === n ? c : n));
|
|
905
|
+
setVal((c) => (c === n ? c : n));
|
|
1005
906
|
};
|
|
1006
907
|
sync();
|
|
1007
908
|
/**
|
|
@@ -1024,21 +925,21 @@ const TOOLBAR_COMPONENTS = {
|
|
|
1024
925
|
? decorator.querySelector('[data-docs-editor-block], .docs-math-wrapper, [data-math-code], [data-docs-view-root="true"]')
|
|
1025
926
|
: null;
|
|
1026
927
|
const blockVal = block
|
|
1027
|
-
? toolbarFocusValue(block, opts.map(o => o.value))
|
|
928
|
+
? toolbarFocusValue(block, opts.map((o) => o.value))
|
|
1028
929
|
: null;
|
|
1029
930
|
if (!blockVal)
|
|
1030
931
|
return;
|
|
1031
932
|
savedBlock.current = null;
|
|
1032
|
-
setVal(c => (c === blockVal ? c : blockVal));
|
|
933
|
+
setVal((c) => (c === blockVal ? c : blockVal));
|
|
1033
934
|
};
|
|
1034
|
-
['focusin', 'keyup', 'mouseup', 'selectionchange'].forEach(e => {
|
|
935
|
+
['focusin', 'keyup', 'mouseup', 'selectionchange'].forEach((e) => {
|
|
1035
936
|
document.addEventListener(e, refresh, true);
|
|
1036
937
|
});
|
|
1037
938
|
document.addEventListener('docs:block-select', onBlockSelect);
|
|
1038
939
|
document.addEventListener('docs:block-selected', onBlockSelect);
|
|
1039
940
|
return () => {
|
|
1040
941
|
cancelAnimationFrame(frame);
|
|
1041
|
-
['focusin', 'keyup', 'mouseup', 'selectionchange'].forEach(e => {
|
|
942
|
+
['focusin', 'keyup', 'mouseup', 'selectionchange'].forEach((e) => {
|
|
1042
943
|
document.removeEventListener(e, refresh, true);
|
|
1043
944
|
});
|
|
1044
945
|
document.removeEventListener('docs:block-select', onBlockSelect);
|
|
@@ -1046,13 +947,15 @@ const TOOLBAR_COMPONENTS = {
|
|
|
1046
947
|
};
|
|
1047
948
|
}, [disabled, toolbar]);
|
|
1048
949
|
// RENDER
|
|
1049
|
-
return (_jsxs(Select, { disabled: disabled || !toolbar, value: val, onValueChange: v => {
|
|
1050
|
-
const item = opts.find(i => i.value === v);
|
|
950
|
+
return (_jsxs(Select, { disabled: disabled || !toolbar, value: val, onValueChange: (v) => {
|
|
951
|
+
const item = opts.find((i) => i.value === v);
|
|
1051
952
|
if (!item)
|
|
1052
953
|
return;
|
|
1053
954
|
if (item.group === 'type') {
|
|
1054
955
|
if (json) {
|
|
1055
|
-
window.dispatchEvent(new CustomEvent('docs:json-command', {
|
|
956
|
+
window.dispatchEvent(new CustomEvent('docs:json-command', {
|
|
957
|
+
detail: { type: 'style', style: v === 'p' ? 'normal' : v },
|
|
958
|
+
}));
|
|
1056
959
|
setVal(v);
|
|
1057
960
|
return;
|
|
1058
961
|
}
|
|
@@ -1066,7 +969,7 @@ const TOOLBAR_COMPONENTS = {
|
|
|
1066
969
|
const { head } = view.state.selection.main;
|
|
1067
970
|
const line = view.state.doc.lineAt(head);
|
|
1068
971
|
const text = line.text;
|
|
1069
|
-
let n
|
|
972
|
+
let n;
|
|
1070
973
|
let prefix = '';
|
|
1071
974
|
if (v === 'h2') {
|
|
1072
975
|
prefix = '## ';
|
|
@@ -1083,7 +986,10 @@ const TOOLBAR_COMPONENTS = {
|
|
|
1083
986
|
else
|
|
1084
987
|
n = text.replace(/^#{1,6}\s+/, '').trimStart() || 'Text';
|
|
1085
988
|
const replacementStr = `${prefix}${n}`;
|
|
1086
|
-
view.dispatch({
|
|
989
|
+
view.dispatch({
|
|
990
|
+
changes: { from: line.from, to: line.to, insert: replacementStr },
|
|
991
|
+
selection: { anchor: line.from + replacementStr.length },
|
|
992
|
+
});
|
|
1087
993
|
view.focus();
|
|
1088
994
|
setVal(v);
|
|
1089
995
|
return;
|
|
@@ -1105,7 +1011,7 @@ const TOOLBAR_COMPONENTS = {
|
|
|
1105
1011
|
else if (v === 'h2' || v === 'h3' || v === 'h4')
|
|
1106
1012
|
replacementNode = $createHeadingNode(v);
|
|
1107
1013
|
if (replacementNode) {
|
|
1108
|
-
blockNode.getChildren().forEach(c => {
|
|
1014
|
+
blockNode.getChildren().forEach((c) => {
|
|
1109
1015
|
replacementNode.append(c);
|
|
1110
1016
|
});
|
|
1111
1017
|
blockNode.replace(replacementNode);
|
|
@@ -1128,8 +1034,8 @@ const TOOLBAR_COMPONENTS = {
|
|
|
1128
1034
|
return;
|
|
1129
1035
|
}
|
|
1130
1036
|
item.onSelect();
|
|
1131
|
-
}, size:
|
|
1132
|
-
.filter(o => o.group === 'insert')
|
|
1037
|
+
}, 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
|
|
1038
|
+
.filter((o) => o.group === 'insert')
|
|
1133
1039
|
.map(({ value: v, label: l, icon: i }) => (_jsx(SelectItem, { value: v, icon: React.createElement(i, { className: ICON_CLASS }), children: l }, v)))] })] })] }));
|
|
1134
1040
|
},
|
|
1135
1041
|
/**
|
|
@@ -1148,7 +1054,10 @@ const TOOLBAR_COMPONENTS = {
|
|
|
1148
1054
|
*/
|
|
1149
1055
|
Toolbar({ activeMode: aMode, editable, toolbar, blocks, adapter, docs = true, }) {
|
|
1150
1056
|
// STATES
|
|
1151
|
-
const toolbarCtx = {
|
|
1057
|
+
const toolbarCtx = {
|
|
1058
|
+
edit: useContext(EditStateCtx),
|
|
1059
|
+
attachmentFilter: useAtom($attachmentFilter),
|
|
1060
|
+
};
|
|
1152
1061
|
const mode = aMode ?? 'view';
|
|
1153
1062
|
const [vers, setVers] = useState([]);
|
|
1154
1063
|
const [verDialogOpen, setVerDialogOpen] = useState(false);
|
|
@@ -1166,7 +1075,11 @@ const TOOLBAR_COMPONENTS = {
|
|
|
1166
1075
|
return;
|
|
1167
1076
|
const { from, to } = view.state.selection.main;
|
|
1168
1077
|
codeLength.current = view.state.doc.length;
|
|
1169
|
-
codeSel.current = {
|
|
1078
|
+
codeSel.current = {
|
|
1079
|
+
code: { from: Math.min(from, to), to: Math.max(from, to) },
|
|
1080
|
+
dom: null,
|
|
1081
|
+
visible: true,
|
|
1082
|
+
};
|
|
1170
1083
|
codeAtEnd.current = false;
|
|
1171
1084
|
};
|
|
1172
1085
|
document.addEventListener('selectionchange', sync);
|
|
@@ -1245,7 +1158,7 @@ const TOOLBAR_COMPONENTS = {
|
|
|
1245
1158
|
}
|
|
1246
1159
|
}
|
|
1247
1160
|
: undefined;
|
|
1248
|
-
const selVer = vers.find(v => v.savedAt === selVerId);
|
|
1161
|
+
const selVer = vers.find((v) => v.savedAt === selVerId);
|
|
1249
1162
|
useEffect(() => {
|
|
1250
1163
|
if (verDialogOpen && !selVerId && vers[0])
|
|
1251
1164
|
setSelVerId(vers[0].savedAt);
|
|
@@ -1282,7 +1195,12 @@ const TOOLBAR_COMPONENTS = {
|
|
|
1282
1195
|
sourceTail: previewPack.markdown.slice(-120),
|
|
1283
1196
|
}));
|
|
1284
1197
|
if (toolbarCtx.edit.update)
|
|
1285
|
-
toolbarCtx.edit.update({
|
|
1198
|
+
toolbarCtx.edit.update({
|
|
1199
|
+
content: previewPack.body,
|
|
1200
|
+
title: selVer?.title || '',
|
|
1201
|
+
description: selVer?.description || '',
|
|
1202
|
+
source: previewPack.markdown,
|
|
1203
|
+
});
|
|
1286
1204
|
const setCode = toolbarCtx.edit.setCode ?? toolbarCtx.edit.setSrc;
|
|
1287
1205
|
if (setCode)
|
|
1288
1206
|
setCode(previewPack.markdown);
|
|
@@ -1308,7 +1226,11 @@ const TOOLBAR_COMPONENTS = {
|
|
|
1308
1226
|
* @param _type - Sanity field type associated with the value.
|
|
1309
1227
|
* @param value - Field value being normalized for the toolbar.
|
|
1310
1228
|
*/
|
|
1311
|
-
const jsonBlock = (_type, val) => ({
|
|
1229
|
+
const jsonBlock = (_type, val) => ({
|
|
1230
|
+
_key: crypto.randomUUID(),
|
|
1231
|
+
_type,
|
|
1232
|
+
...val,
|
|
1233
|
+
});
|
|
1312
1234
|
// SELECTION HANDLER
|
|
1313
1235
|
/**
|
|
1314
1236
|
* Safe sel.
|
|
@@ -1391,13 +1313,23 @@ const TOOLBAR_COMPONENTS = {
|
|
|
1391
1313
|
*/
|
|
1392
1314
|
const insertionActions = {
|
|
1393
1315
|
insertLocalCode: () => {
|
|
1394
|
-
if (jsonCmd({
|
|
1316
|
+
if (jsonCmd({
|
|
1317
|
+
type: 'insert',
|
|
1318
|
+
block: jsonBlock('code', { language: 'text', value: 'Code...' }),
|
|
1319
|
+
}))
|
|
1395
1320
|
return;
|
|
1396
1321
|
insert?.(`\n\n<Code language="text">\n{\`\nCode...\n\`}\n</Code>\n\n`);
|
|
1397
1322
|
},
|
|
1398
1323
|
insertCode: (src, endpoint = '') => {
|
|
1399
|
-
const code = src === 'received'
|
|
1400
|
-
|
|
1324
|
+
const code = src === 'received'
|
|
1325
|
+
? `\n\n<Code language="json" source=${JSON.stringify(endpoint)} />\n\n`
|
|
1326
|
+
: '\n\n<Code language="text">\n{`\nCode...\n`}\n</Code>\n\n';
|
|
1327
|
+
if (jsonCmd({
|
|
1328
|
+
type: 'insert',
|
|
1329
|
+
block: jsonBlock('code', src === 'received'
|
|
1330
|
+
? { language: 'json', source: endpoint, value: '' }
|
|
1331
|
+
: { language: 'text', value: 'Code...' }),
|
|
1332
|
+
}))
|
|
1401
1333
|
return;
|
|
1402
1334
|
if (insert) {
|
|
1403
1335
|
const srcLength = codeLength.current;
|
|
@@ -1408,7 +1340,9 @@ const TOOLBAR_COMPONENTS = {
|
|
|
1408
1340
|
}
|
|
1409
1341
|
const curr = toolbarCtx.edit?.code ?? toolbarCtx.edit?.source ?? '';
|
|
1410
1342
|
const sel = codeSel.current?.code;
|
|
1411
|
-
const range = codeAtEnd.current || !sel
|
|
1343
|
+
const range = codeAtEnd.current || !sel
|
|
1344
|
+
? { from: curr.length, to: curr.length }
|
|
1345
|
+
: { from: Math.min(sel.from, curr.length), to: Math.min(sel.to, curr.length) };
|
|
1412
1346
|
const n = `${curr.slice(0, range.from)}${code}${curr.slice(range.to)}`;
|
|
1413
1347
|
toolbarCtx.edit?.update({ source: n });
|
|
1414
1348
|
toolbarCtx.edit?.setCode(n);
|
|
@@ -1419,8 +1353,14 @@ const TOOLBAR_COMPONENTS = {
|
|
|
1419
1353
|
}
|
|
1420
1354
|
const view = codeViewOf();
|
|
1421
1355
|
if (view) {
|
|
1422
|
-
const range = codeAtEnd.current
|
|
1423
|
-
|
|
1356
|
+
const range = codeAtEnd.current
|
|
1357
|
+
? { from: view.state.doc.length, to: view.state.doc.length }
|
|
1358
|
+
: (codeSel.current?.code ?? view.state.selection.main);
|
|
1359
|
+
view.dispatch({
|
|
1360
|
+
changes: { from: range.from, insert: code, to: range.to },
|
|
1361
|
+
scrollIntoView: true,
|
|
1362
|
+
selection: { anchor: range.from + code.length },
|
|
1363
|
+
});
|
|
1424
1364
|
view.focus();
|
|
1425
1365
|
codeAtEnd.current = false;
|
|
1426
1366
|
codeSel.current = null;
|
|
@@ -1462,78 +1402,106 @@ const TOOLBAR_COMPONENTS = {
|
|
|
1462
1402
|
};
|
|
1463
1403
|
}, [mode, onSave]);
|
|
1464
1404
|
// RENDER
|
|
1465
|
-
return (_jsx(ErrorBoundary, { name:
|
|
1405
|
+
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
1406
|
if (!toolbar)
|
|
1467
1407
|
return;
|
|
1468
|
-
toolbar.setMode(v).catch(e => {
|
|
1408
|
+
toolbar.setMode(v).catch((e) => {
|
|
1469
1409
|
console.error('[Toolbar:mode] change-failed', { mode: v, error: e });
|
|
1470
1410
|
toast.error(e instanceof Error ? e.message : 'Failed to change mode.');
|
|
1471
1411
|
clearTransition();
|
|
1472
1412
|
});
|
|
1473
1413
|
} }))) : mode === 'attachments' ? (
|
|
1474
1414
|
// ATTACHMENT FILTERS
|
|
1475
|
-
_jsxs(_Fragment, { children: [docs && (_jsx(Mode, { editable: editable, mode: mode, disabled: !ready, onModeChange: v => {
|
|
1415
|
+
_jsxs(_Fragment, { children: [docs && (_jsx(Mode, { editable: editable, mode: mode, disabled: !ready, onModeChange: (v) => {
|
|
1476
1416
|
if (!toolbar)
|
|
1477
1417
|
return;
|
|
1478
|
-
toolbar.setMode(v).catch(e => {
|
|
1418
|
+
toolbar.setMode(v).catch((e) => {
|
|
1479
1419
|
console.error('[Toolbar:mode] change-failed', { mode: v, error: e });
|
|
1480
1420
|
toast.error(e instanceof Error ? e.message : 'Failed to change mode.');
|
|
1481
1421
|
clearTransition();
|
|
1482
1422
|
});
|
|
1483
|
-
} })), _jsx(ToggleGroup, { type:
|
|
1423
|
+
} })), _jsx(ToggleGroup, { type: "multiple", value: [...toolbarCtx.attachmentFilter], onValueChange: (v) => {
|
|
1484
1424
|
if (v)
|
|
1485
1425
|
$attachmentFilter.set(v);
|
|
1486
|
-
}, className:
|
|
1426
|
+
}, 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
1427
|
.map(({ key: k, lbl: l, icon: i, shortcut: s, format: f }) => ({
|
|
1488
1428
|
key: k,
|
|
1489
1429
|
lbl: l,
|
|
1490
1430
|
icon: i,
|
|
1491
1431
|
shortcut: s,
|
|
1492
|
-
onClick: () => jsonCmd({
|
|
1493
|
-
|
|
1432
|
+
onClick: () => jsonCmd({
|
|
1433
|
+
type: 'decorator',
|
|
1434
|
+
decorator: k === 'strikethrough' ? 'strike-through' : k,
|
|
1435
|
+
}) ||
|
|
1436
|
+
(adapter?.format
|
|
1437
|
+
? adapter.format(k === 'strikethrough'
|
|
1438
|
+
? 'strike'
|
|
1439
|
+
: k)
|
|
1440
|
+
: insert?.(f(sSel('text', true)))),
|
|
1494
1441
|
}))
|
|
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
|
-
|
|
1442
|
+
.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: [
|
|
1443
|
+
{
|
|
1444
|
+
key: 'bullet',
|
|
1445
|
+
lbl: 'Bulleted list',
|
|
1446
|
+
icon: BulletListIcon,
|
|
1447
|
+
prefix: '\n- ',
|
|
1448
|
+
fallback: 'Item',
|
|
1449
|
+
},
|
|
1450
|
+
{
|
|
1451
|
+
key: 'number',
|
|
1452
|
+
lbl: 'Numbered list',
|
|
1453
|
+
icon: NumberListIcon,
|
|
1454
|
+
prefix: '\n1. ',
|
|
1455
|
+
fallback: 'Item',
|
|
1456
|
+
},
|
|
1457
|
+
{
|
|
1458
|
+
key: 'check',
|
|
1459
|
+
lbl: 'Checklist',
|
|
1460
|
+
icon: CheckListIcon,
|
|
1461
|
+
prefix: '\n- [ ] ',
|
|
1462
|
+
fallback: 'Task',
|
|
1463
|
+
},
|
|
1499
1464
|
]
|
|
1500
1465
|
.map(({ key: k, lbl: l, icon: i, prefix: p, fallback: f }) => ({
|
|
1501
1466
|
key: k,
|
|
1502
1467
|
lbl: l,
|
|
1503
1468
|
icon: i,
|
|
1504
1469
|
onClick: () => jsonCmd({ type: 'list', list: k === 'check' ? 'bullet' : k }) ||
|
|
1505
|
-
(adapter?.toggleList
|
|
1470
|
+
(adapter?.toggleList
|
|
1471
|
+
? adapter.toggleList(k)
|
|
1472
|
+
: toolbar?.toggleList
|
|
1473
|
+
? toolbar.toggleList(k)
|
|
1474
|
+
: insert?.(`${p}${sSel(f)}\n`)),
|
|
1506
1475
|
}))
|
|
1507
1476
|
.map(({ key: k, lbl: l, icon: i, onClick: o }) => (_jsxs(DropdownMenuItem, { disabled: !ready, onSelect: () => {
|
|
1508
1477
|
if (o)
|
|
1509
1478
|
o();
|
|
1510
|
-
}, className: MENU_GAP_CLASS, children: [React.createElement(i, { className: ICON_CLASS }), _jsx("span", { children: l })] }, k))) })] })] }), _jsxs("div", { className:
|
|
1479
|
+
}, 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
1480
|
if (!editable || !toolbar)
|
|
1512
1481
|
return;
|
|
1513
|
-
toolbar.setMode(v).catch(e => {
|
|
1482
|
+
toolbar.setMode(v).catch((e) => {
|
|
1514
1483
|
console.error('[Toolbar:mode] change-failed', { mode: v, error: e });
|
|
1515
1484
|
toast.error(e instanceof Error ? e.message : 'Failed to change mode.');
|
|
1516
1485
|
clearTransition();
|
|
1517
1486
|
});
|
|
1518
|
-
} })), _jsx(TextTooltip, { content:
|
|
1487
|
+
} })), _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
1488
|
e.preventDefault();
|
|
1520
|
-
}, onClick: e => void toolbarActions.discard?.(e), children: "Discard" }), _jsxs(ButtonGroup, { children: [_jsx(TextTooltip, { content:
|
|
1489
|
+
}, 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
1490
|
e.preventDefault();
|
|
1522
|
-
}, onClick: e => void onSave?.(e), children: "Save" }) }), _jsx(TextTooltip, { content:
|
|
1491
|
+
}, 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
1492
|
e.preventDefault();
|
|
1524
1493
|
}, onClick: () => {
|
|
1525
1494
|
if (vers.length > 0 && !selVerId)
|
|
1526
1495
|
setSelVerId(vers[0].savedAt);
|
|
1527
1496
|
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:
|
|
1497
|
+
}, 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
1498
|
setEndpointOpen(o);
|
|
1530
1499
|
if (!o)
|
|
1531
1500
|
setEndpoint('');
|
|
1532
|
-
}, children: _jsxs(DialogContent, { children: [_jsxs(DialogHeader, { children: [_jsx(DialogTitle, { children: "Receive value" }), _jsx(DialogDescription, { className:
|
|
1501
|
+
}, 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
1502
|
setEndpoint(e.target.value);
|
|
1534
|
-
}, placeholder:
|
|
1503
|
+
}, 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
1504
|
},
|
|
1536
1505
|
};
|
|
1537
|
-
export const { DocsToolbarActions } = TOOLBAR_COMPONENTS;
|
|
1538
|
-
export const { Toolbar } = TOOLBAR_COMPONENTS;
|
|
1506
|
+
export const { DocsToolbarActions, Toolbar } = TOOLBAR_COMPONENTS;
|
|
1539
1507
|
//# sourceMappingURL=_toolbar.js.map
|