@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.
Files changed (565) hide show
  1. package/README.md +26 -7
  2. package/bin/terra-docs.mjs +187 -0
  3. package/lib-dist/assets/fonts/AUTHENTICSans-130.woff +0 -0
  4. package/lib-dist/assets/fonts/AUTHENTICSans-130.woff2 +0 -0
  5. package/lib-dist/assets/fonts/AUTHENTICSans-150.woff +0 -0
  6. package/lib-dist/assets/fonts/AUTHENTICSans-150.woff2 +0 -0
  7. package/lib-dist/assets/fonts/AUTHENTICSans-90.woff +0 -0
  8. package/lib-dist/assets/fonts/AUTHENTICSans-90.woff2 +0 -0
  9. package/lib-dist/assets/fonts/Avara-Bold.woff +0 -0
  10. package/lib-dist/assets/fonts/Avara-BoldItalic.woff +0 -0
  11. package/lib-dist/assets/fonts/InterVariable-Italic-latin-20260728.woff2 +0 -0
  12. package/lib-dist/assets/fonts/InterVariable-latin-20260728.woff2 +0 -0
  13. package/lib-dist/assets/fonts/README.md +7 -0
  14. package/lib-dist/assets/fonts/licenses/Inter-OFL-1.1.txt +92 -0
  15. package/lib-dist/assets/fonts/licenses/OFL-1.1.txt +93 -0
  16. package/lib-dist/{Docs.d.ts → components/Docs.d.ts} +1 -1
  17. package/lib-dist/components/Docs.d.ts.map +1 -0
  18. package/lib-dist/components/Docs.js +9 -0
  19. package/lib-dist/components/Docs.js.map +1 -0
  20. package/lib-dist/{LocalDocsWorkspace.d.ts → components/LocalDocsWorkspace.d.ts} +9 -2
  21. package/lib-dist/components/LocalDocsWorkspace.d.ts.map +1 -0
  22. package/lib-dist/{LocalDocsWorkspace.js → components/LocalDocsWorkspace.js} +83 -24
  23. package/lib-dist/components/LocalDocsWorkspace.js.map +1 -0
  24. package/lib-dist/components/NotFound.d.ts +8 -0
  25. package/lib-dist/components/NotFound.d.ts.map +1 -0
  26. package/lib-dist/components/NotFound.js +6 -0
  27. package/lib-dist/components/NotFound.js.map +1 -0
  28. package/lib-dist/components/SiteLayout.d.ts +25 -0
  29. package/lib-dist/components/SiteLayout.d.ts.map +1 -0
  30. package/lib-dist/components/SiteLayout.js +12 -0
  31. package/lib-dist/components/SiteLayout.js.map +1 -0
  32. package/lib-dist/{StaticWorkspace.d.ts → components/StaticWorkspace.d.ts} +7 -3
  33. package/lib-dist/components/StaticWorkspace.d.ts.map +1 -0
  34. package/lib-dist/{StaticWorkspace.js → components/StaticWorkspace.js} +106 -34
  35. package/lib-dist/components/StaticWorkspace.js.map +1 -0
  36. package/lib-dist/components/StrictLocalWorkspaceHarness.d.ts +10 -0
  37. package/lib-dist/components/StrictLocalWorkspaceHarness.d.ts.map +1 -0
  38. package/lib-dist/components/StrictLocalWorkspaceHarness.js +12 -0
  39. package/lib-dist/components/StrictLocalWorkspaceHarness.js.map +1 -0
  40. package/lib-dist/components/blocks.d.ts.map +1 -0
  41. package/lib-dist/{blocks.js → components/blocks.js} +88 -13
  42. package/lib-dist/components/blocks.js.map +1 -0
  43. package/lib-dist/{navigation.d.ts → components/navigation.d.ts} +3 -1
  44. package/lib-dist/components/navigation.d.ts.map +1 -0
  45. package/lib-dist/components/navigation.js.map +1 -0
  46. package/lib-dist/{terra → components/terra}/Workspace.d.ts +1 -1
  47. package/lib-dist/components/terra/Workspace.d.ts.map +1 -0
  48. package/lib-dist/components/terra/Workspace.js +190 -0
  49. package/lib-dist/components/terra/Workspace.js.map +1 -0
  50. package/lib-dist/components/terra/editor/TerraContentEditor.d.ts +16 -0
  51. package/lib-dist/components/terra/editor/TerraContentEditor.d.ts.map +1 -0
  52. package/lib-dist/components/terra/editor/TerraContentEditor.js +358 -0
  53. package/lib-dist/components/terra/editor/TerraContentEditor.js.map +1 -0
  54. package/lib-dist/{terra → components/terra}/editor/_blocks.d.ts +3 -4
  55. package/lib-dist/components/terra/editor/_blocks.d.ts.map +1 -0
  56. package/lib-dist/components/terra/editor/_blocks.js +120 -0
  57. package/lib-dist/components/terra/editor/_blocks.js.map +1 -0
  58. package/lib-dist/components/terra/editor/docs/BlockContext.d.ts +7 -0
  59. package/lib-dist/components/terra/editor/docs/BlockContext.d.ts.map +1 -0
  60. package/lib-dist/components/terra/editor/docs/BlockContext.js +60 -0
  61. package/lib-dist/components/terra/editor/docs/BlockContext.js.map +1 -0
  62. package/lib-dist/components/terra/editor/docs/DocsAttachmentPicker.d.ts +12 -0
  63. package/lib-dist/components/terra/editor/docs/DocsAttachmentPicker.d.ts.map +1 -0
  64. package/lib-dist/components/terra/editor/docs/DocsAttachmentPicker.js +66 -0
  65. package/lib-dist/components/terra/editor/docs/DocsAttachmentPicker.js.map +1 -0
  66. package/lib-dist/components/terra/editor/docs/TerraToolbar.d.ts +12 -0
  67. package/lib-dist/components/terra/editor/docs/TerraToolbar.d.ts.map +1 -0
  68. package/lib-dist/components/terra/editor/docs/TerraToolbar.js +169 -0
  69. package/lib-dist/components/terra/editor/docs/TerraToolbar.js.map +1 -0
  70. package/lib-dist/{terra → components/terra}/editor/docs/_Callout.d.ts +1 -1
  71. package/lib-dist/components/terra/editor/docs/_Callout.d.ts.map +1 -0
  72. package/lib-dist/{terra → components/terra}/editor/docs/_Callout.js +11 -7
  73. package/lib-dist/components/terra/editor/docs/_Callout.js.map +1 -0
  74. package/lib-dist/components/terra/editor/docs/_CodeBlock.d.ts.map +1 -0
  75. package/lib-dist/{terra → components/terra}/editor/docs/_CodeBlock.js +111 -46
  76. package/lib-dist/components/terra/editor/docs/_CodeBlock.js.map +1 -0
  77. package/lib-dist/{terra → components/terra}/editor/docs/_DocsCode.d.ts +1 -1
  78. package/lib-dist/components/terra/editor/docs/_DocsCode.d.ts.map +1 -0
  79. package/lib-dist/{terra → components/terra}/editor/docs/_DocsCode.js +47 -14
  80. package/lib-dist/components/terra/editor/docs/_DocsCode.js.map +1 -0
  81. package/lib-dist/{terra → components/terra}/editor/docs/_DocsImage.d.ts +1 -1
  82. package/lib-dist/components/terra/editor/docs/_DocsImage.d.ts.map +1 -0
  83. package/lib-dist/components/terra/editor/docs/_DocsImage.js +62 -0
  84. package/lib-dist/components/terra/editor/docs/_DocsImage.js.map +1 -0
  85. package/lib-dist/{terra → components/terra}/editor/docs/_Embed.d.ts +3 -1
  86. package/lib-dist/components/terra/editor/docs/_Embed.d.ts.map +1 -0
  87. package/lib-dist/components/terra/editor/docs/_Embed.js +73 -0
  88. package/lib-dist/components/terra/editor/docs/_Embed.js.map +1 -0
  89. package/lib-dist/{terra → components/terra}/editor/docs/_Math.d.ts +2 -2
  90. package/lib-dist/components/terra/editor/docs/_Math.d.ts.map +1 -0
  91. package/lib-dist/{terra → components/terra}/editor/docs/_Math.js +29 -17
  92. package/lib-dist/components/terra/editor/docs/_Math.js.map +1 -0
  93. package/lib-dist/{terra → components/terra}/editor/docs/_Nodes.d.ts +1 -1
  94. package/lib-dist/components/terra/editor/docs/_Nodes.d.ts.map +1 -0
  95. package/lib-dist/components/terra/editor/docs/_Nodes.js +62 -0
  96. package/lib-dist/components/terra/editor/docs/_Nodes.js.map +1 -0
  97. package/lib-dist/{terra → components/terra}/editor/docs/_Raw.d.ts +1 -1
  98. package/lib-dist/components/terra/editor/docs/_Raw.d.ts.map +1 -0
  99. package/lib-dist/{terra → components/terra}/editor/docs/_Raw.js +8 -3
  100. package/lib-dist/components/terra/editor/docs/_Raw.js.map +1 -0
  101. package/lib-dist/{terra → components/terra}/editor/docs/_Table.d.ts +1 -1
  102. package/lib-dist/components/terra/editor/docs/_Table.d.ts.map +1 -0
  103. package/lib-dist/components/terra/editor/docs/_Table.js +99 -0
  104. package/lib-dist/components/terra/editor/docs/_Table.js.map +1 -0
  105. package/lib-dist/{terra → components/terra}/editor/docs/_Tabs.d.ts +1 -1
  106. package/lib-dist/components/terra/editor/docs/_Tabs.d.ts.map +1 -0
  107. package/lib-dist/{terra → components/terra}/editor/docs/_Tabs.js +36 -15
  108. package/lib-dist/components/terra/editor/docs/_Tabs.js.map +1 -0
  109. package/lib-dist/{terra → components/terra}/editor/docs/_TsDocs.d.ts +1 -1
  110. package/lib-dist/components/terra/editor/docs/_TsDocs.d.ts.map +1 -0
  111. package/lib-dist/{terra → components/terra}/editor/docs/_TsDocs.js +16 -14
  112. package/lib-dist/components/terra/editor/docs/_TsDocs.js.map +1 -0
  113. package/lib-dist/{terra → components/terra}/editor/docs/_math_inline.d.ts +1 -1
  114. package/lib-dist/components/terra/editor/docs/_math_inline.d.ts.map +1 -0
  115. package/lib-dist/{terra → components/terra}/editor/docs/_math_inline.js +2 -2
  116. package/lib-dist/components/terra/editor/docs/_math_inline.js.map +1 -0
  117. package/lib-dist/{terra → components/terra}/editor/docs/heading.d.ts +1 -1
  118. package/lib-dist/components/terra/editor/docs/heading.d.ts.map +1 -0
  119. package/lib-dist/{terra → components/terra}/editor/docs/heading.js +8 -5
  120. package/lib-dist/components/terra/editor/docs/heading.js.map +1 -0
  121. package/lib-dist/components/terra/editor/docs/index.d.ts.map +1 -0
  122. package/lib-dist/components/terra/editor/docs/index.js.map +1 -0
  123. package/lib-dist/components/terra/editor/terra-content.styles.d.ts +3 -0
  124. package/lib-dist/components/terra/editor/terra-content.styles.d.ts.map +1 -0
  125. package/lib-dist/components/terra/editor/terra-content.styles.js +3 -0
  126. package/lib-dist/components/terra/editor/terra-content.styles.js.map +1 -0
  127. package/lib-dist/{terra → components/terra}/editor/types.d.ts +2 -2
  128. package/lib-dist/components/terra/editor/types.d.ts.map +1 -0
  129. package/lib-dist/{terra → components/terra}/editor/types.js +1 -1
  130. package/lib-dist/components/terra/editor/types.js.map +1 -0
  131. package/lib-dist/{terra → components/terra}/flow/Nodes.d.ts +2 -3
  132. package/lib-dist/components/terra/flow/Nodes.d.ts.map +1 -0
  133. package/lib-dist/{terra → components/terra}/flow/Nodes.js +213 -106
  134. package/lib-dist/components/terra/flow/Nodes.js.map +1 -0
  135. package/lib-dist/{terra → components/terra}/flow/_chrome.d.ts +7 -9
  136. package/lib-dist/components/terra/flow/_chrome.d.ts.map +1 -0
  137. package/lib-dist/{terra → components/terra}/flow/_chrome.js +329 -118
  138. package/lib-dist/components/terra/flow/_chrome.js.map +1 -0
  139. package/lib-dist/components/terra/flow/menuContext.d.ts.map +1 -0
  140. package/lib-dist/components/terra/flow/menuContext.js.map +1 -0
  141. package/lib-dist/{terra → components/terra}/pages/docs/_attachments.d.ts +1 -1
  142. package/lib-dist/components/terra/pages/docs/_attachments.d.ts.map +1 -0
  143. package/lib-dist/{terra → components/terra}/pages/docs/_attachments.js +375 -131
  144. package/lib-dist/components/terra/pages/docs/_attachments.js.map +1 -0
  145. package/lib-dist/components/terra/pages/docs/_blocks.d.ts.map +1 -0
  146. package/lib-dist/{terra → components/terra}/pages/docs/_blocks.js +42 -31
  147. package/lib-dist/components/terra/pages/docs/_blocks.js.map +1 -0
  148. package/lib-dist/{terra → components/terra}/pages/docs/_editable.d.ts +2 -3
  149. package/lib-dist/components/terra/pages/docs/_editable.d.ts.map +1 -0
  150. package/lib-dist/{terra → components/terra}/pages/docs/_editable.js +82 -44
  151. package/lib-dist/components/terra/pages/docs/_editable.js.map +1 -0
  152. package/lib-dist/{terra → components/terra}/pages/docs/_export-dialog.d.ts +1 -1
  153. package/lib-dist/components/terra/pages/docs/_export-dialog.d.ts.map +1 -0
  154. package/lib-dist/{terra → components/terra}/pages/docs/_export-dialog.js +17 -17
  155. package/lib-dist/components/terra/pages/docs/_export-dialog.js.map +1 -0
  156. package/lib-dist/components/terra/pages/docs/_icons.d.ts.map +1 -0
  157. package/lib-dist/components/terra/pages/docs/_icons.js.map +1 -0
  158. package/lib-dist/{terra → components/terra}/pages/docs/_main.d.ts +10 -7
  159. package/lib-dist/components/terra/pages/docs/_main.d.ts.map +1 -0
  160. package/lib-dist/components/terra/pages/docs/_main.js +710 -0
  161. package/lib-dist/components/terra/pages/docs/_main.js.map +1 -0
  162. package/lib-dist/components/terra/pages/docs/_manage-attachments-dialog.d.ts +10 -0
  163. package/lib-dist/components/terra/pages/docs/_manage-attachments-dialog.d.ts.map +1 -0
  164. package/lib-dist/components/terra/pages/docs/_manage-attachments-dialog.js +597 -0
  165. package/lib-dist/components/terra/pages/docs/_manage-attachments-dialog.js.map +1 -0
  166. package/lib-dist/{terra → components/terra}/pages/docs/_sidebar.d.ts +3 -12
  167. package/lib-dist/components/terra/pages/docs/_sidebar.d.ts.map +1 -0
  168. package/lib-dist/components/terra/pages/docs/_sidebar.js +1437 -0
  169. package/lib-dist/components/terra/pages/docs/_sidebar.js.map +1 -0
  170. package/lib-dist/components/terra/pages/docs/_toc.d.ts +4 -0
  171. package/lib-dist/components/terra/pages/docs/_toc.d.ts.map +1 -0
  172. package/lib-dist/components/terra/pages/docs/_toc.js +212 -0
  173. package/lib-dist/components/terra/pages/docs/_toc.js.map +1 -0
  174. package/lib-dist/components/terra/pages/docs/_toolbar-find-replace.d.ts +15 -0
  175. package/lib-dist/components/terra/pages/docs/_toolbar-find-replace.d.ts.map +1 -0
  176. package/lib-dist/components/terra/pages/docs/_toolbar-find-replace.js +207 -0
  177. package/lib-dist/components/terra/pages/docs/_toolbar-find-replace.js.map +1 -0
  178. package/lib-dist/{terra → components/terra}/pages/docs/_toolbar.d.ts +3 -5
  179. package/lib-dist/components/terra/pages/docs/_toolbar.d.ts.map +1 -0
  180. package/lib-dist/{terra → components/terra}/pages/docs/_toolbar.js +318 -350
  181. package/lib-dist/components/terra/pages/docs/_toolbar.js.map +1 -0
  182. package/lib-dist/{terra → components/terra}/pages/docs/_tree.d.ts +1 -4
  183. package/lib-dist/components/terra/pages/docs/_tree.d.ts.map +1 -0
  184. package/lib-dist/{terra → components/terra}/pages/docs/_tree.js +219 -264
  185. package/lib-dist/components/terra/pages/docs/_tree.js.map +1 -0
  186. package/lib-dist/components/terra/pages/docs/use-block-nav.d.ts +5 -0
  187. package/lib-dist/components/terra/pages/docs/use-block-nav.d.ts.map +1 -0
  188. package/lib-dist/components/terra/pages/docs/use-block-nav.js +1306 -0
  189. package/lib-dist/components/terra/pages/docs/use-block-nav.js.map +1 -0
  190. package/lib-dist/components/terra/pages/docs/use-media-paste.d.ts +5 -0
  191. package/lib-dist/components/terra/pages/docs/use-media-paste.d.ts.map +1 -0
  192. package/lib-dist/components/terra/pages/docs/use-media-paste.js +391 -0
  193. package/lib-dist/components/terra/pages/docs/use-media-paste.js.map +1 -0
  194. package/lib-dist/components/terra/pages/docs/use-render-tripwire.d.ts +2 -0
  195. package/lib-dist/components/terra/pages/docs/use-render-tripwire.d.ts.map +1 -0
  196. package/lib-dist/components/terra/pages/docs/use-render-tripwire.js +25 -0
  197. package/lib-dist/components/terra/pages/docs/use-render-tripwire.js.map +1 -0
  198. package/lib-dist/{terra/runtime → components/terra}/ui.d.ts +2 -5
  199. package/lib-dist/components/terra/ui.d.ts.map +1 -0
  200. package/lib-dist/components/terra/ui.js +20 -0
  201. package/lib-dist/components/terra/ui.js.map +1 -0
  202. package/lib-dist/components/workspace-demo-fixture.d.ts +35 -0
  203. package/lib-dist/components/workspace-demo-fixture.d.ts.map +1 -0
  204. package/lib-dist/components/workspace-demo-fixture.js +820 -0
  205. package/lib-dist/components/workspace-demo-fixture.js.map +1 -0
  206. package/lib-dist/fonts/KaTeX_AMS-Regular.ttf +0 -0
  207. package/lib-dist/fonts/KaTeX_AMS-Regular.woff +0 -0
  208. package/lib-dist/fonts/KaTeX_AMS-Regular.woff2 +0 -0
  209. package/lib-dist/fonts/KaTeX_Caligraphic-Bold.ttf +0 -0
  210. package/lib-dist/fonts/KaTeX_Caligraphic-Bold.woff +0 -0
  211. package/lib-dist/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
  212. package/lib-dist/fonts/KaTeX_Caligraphic-Regular.ttf +0 -0
  213. package/lib-dist/fonts/KaTeX_Caligraphic-Regular.woff +0 -0
  214. package/lib-dist/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
  215. package/lib-dist/fonts/KaTeX_Fraktur-Bold.ttf +0 -0
  216. package/lib-dist/fonts/KaTeX_Fraktur-Bold.woff +0 -0
  217. package/lib-dist/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
  218. package/lib-dist/fonts/KaTeX_Fraktur-Regular.ttf +0 -0
  219. package/lib-dist/fonts/KaTeX_Fraktur-Regular.woff +0 -0
  220. package/lib-dist/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
  221. package/lib-dist/fonts/KaTeX_Main-Bold.ttf +0 -0
  222. package/lib-dist/fonts/KaTeX_Main-Bold.woff +0 -0
  223. package/lib-dist/fonts/KaTeX_Main-Bold.woff2 +0 -0
  224. package/lib-dist/fonts/KaTeX_Main-BoldItalic.ttf +0 -0
  225. package/lib-dist/fonts/KaTeX_Main-BoldItalic.woff +0 -0
  226. package/lib-dist/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
  227. package/lib-dist/fonts/KaTeX_Main-Italic.ttf +0 -0
  228. package/lib-dist/fonts/KaTeX_Main-Italic.woff +0 -0
  229. package/lib-dist/fonts/KaTeX_Main-Italic.woff2 +0 -0
  230. package/lib-dist/fonts/KaTeX_Main-Regular.ttf +0 -0
  231. package/lib-dist/fonts/KaTeX_Main-Regular.woff +0 -0
  232. package/lib-dist/fonts/KaTeX_Main-Regular.woff2 +0 -0
  233. package/lib-dist/fonts/KaTeX_Math-BoldItalic.ttf +0 -0
  234. package/lib-dist/fonts/KaTeX_Math-BoldItalic.woff +0 -0
  235. package/lib-dist/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
  236. package/lib-dist/fonts/KaTeX_Math-Italic.ttf +0 -0
  237. package/lib-dist/fonts/KaTeX_Math-Italic.woff +0 -0
  238. package/lib-dist/fonts/KaTeX_Math-Italic.woff2 +0 -0
  239. package/lib-dist/fonts/KaTeX_SansSerif-Bold.ttf +0 -0
  240. package/lib-dist/fonts/KaTeX_SansSerif-Bold.woff +0 -0
  241. package/lib-dist/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
  242. package/lib-dist/fonts/KaTeX_SansSerif-Italic.ttf +0 -0
  243. package/lib-dist/fonts/KaTeX_SansSerif-Italic.woff +0 -0
  244. package/lib-dist/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
  245. package/lib-dist/fonts/KaTeX_SansSerif-Regular.ttf +0 -0
  246. package/lib-dist/fonts/KaTeX_SansSerif-Regular.woff +0 -0
  247. package/lib-dist/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
  248. package/lib-dist/fonts/KaTeX_Script-Regular.ttf +0 -0
  249. package/lib-dist/fonts/KaTeX_Script-Regular.woff +0 -0
  250. package/lib-dist/fonts/KaTeX_Script-Regular.woff2 +0 -0
  251. package/lib-dist/fonts/KaTeX_Size1-Regular.ttf +0 -0
  252. package/lib-dist/fonts/KaTeX_Size1-Regular.woff +0 -0
  253. package/lib-dist/fonts/KaTeX_Size1-Regular.woff2 +0 -0
  254. package/lib-dist/fonts/KaTeX_Size2-Regular.ttf +0 -0
  255. package/lib-dist/fonts/KaTeX_Size2-Regular.woff +0 -0
  256. package/lib-dist/fonts/KaTeX_Size2-Regular.woff2 +0 -0
  257. package/lib-dist/fonts/KaTeX_Size3-Regular.ttf +0 -0
  258. package/lib-dist/fonts/KaTeX_Size3-Regular.woff +0 -0
  259. package/lib-dist/fonts/KaTeX_Size3-Regular.woff2 +0 -0
  260. package/lib-dist/fonts/KaTeX_Size4-Regular.ttf +0 -0
  261. package/lib-dist/fonts/KaTeX_Size4-Regular.woff +0 -0
  262. package/lib-dist/fonts/KaTeX_Size4-Regular.woff2 +0 -0
  263. package/lib-dist/fonts/KaTeX_Typewriter-Regular.ttf +0 -0
  264. package/lib-dist/fonts/KaTeX_Typewriter-Regular.woff +0 -0
  265. package/lib-dist/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
  266. package/lib-dist/lib/astro.d.ts +8 -0
  267. package/lib-dist/lib/astro.d.ts.map +1 -0
  268. package/lib-dist/lib/astro.js +27 -0
  269. package/lib-dist/lib/astro.js.map +1 -0
  270. package/lib-dist/lib/docs-theme.d.ts +7 -0
  271. package/lib-dist/lib/docs-theme.d.ts.map +1 -0
  272. package/lib-dist/lib/docs-theme.js +51 -0
  273. package/lib-dist/lib/docs-theme.js.map +1 -0
  274. package/lib-dist/lib/host-runtime.d.ts.map +1 -0
  275. package/lib-dist/{host-runtime.js → lib/host-runtime.js} +4 -2
  276. package/lib-dist/lib/host-runtime.js.map +1 -0
  277. package/lib-dist/{host.d.ts → lib/host.d.ts} +20 -0
  278. package/lib-dist/lib/host.d.ts.map +1 -0
  279. package/lib-dist/lib/host.js.map +1 -0
  280. package/lib-dist/lib/index.d.ts +34 -0
  281. package/lib-dist/lib/index.d.ts.map +1 -0
  282. package/lib-dist/lib/index.js +27 -0
  283. package/lib-dist/lib/index.js.map +1 -0
  284. package/lib-dist/{markdown-model.d.ts → lib/markdown-model.d.ts} +3 -3
  285. package/lib-dist/lib/markdown-model.d.ts.map +1 -0
  286. package/lib-dist/lib/markdown-model.js +2030 -0
  287. package/lib-dist/lib/markdown-model.js.map +1 -0
  288. package/lib-dist/lib/markdown.d.ts +3 -0
  289. package/lib-dist/lib/markdown.d.ts.map +1 -0
  290. package/lib-dist/lib/markdown.js +222 -0
  291. package/lib-dist/lib/markdown.js.map +1 -0
  292. package/lib-dist/{schema.d.ts → lib/schema.d.ts} +55 -23
  293. package/lib-dist/lib/schema.d.ts.map +1 -0
  294. package/lib-dist/{schema.js → lib/schema.js} +26 -18
  295. package/lib-dist/lib/schema.js.map +1 -0
  296. package/lib-dist/{terra/pages/docs/_custom.d.ts → lib/terra/custom-components.d.ts} +2 -2
  297. package/lib-dist/lib/terra/custom-components.d.ts.map +1 -0
  298. package/lib-dist/{terra/pages/docs/_custom.js → lib/terra/custom-components.js} +1 -1
  299. package/lib-dist/lib/terra/custom-components.js.map +1 -0
  300. package/lib-dist/lib/terra/docs/archive.d.ts +3 -0
  301. package/lib-dist/lib/terra/docs/archive.d.ts.map +1 -0
  302. package/lib-dist/lib/terra/docs/archive.js +654 -0
  303. package/lib-dist/lib/terra/docs/archive.js.map +1 -0
  304. package/lib-dist/lib/terra/docs/assets.d.ts +26 -0
  305. package/lib-dist/lib/terra/docs/assets.d.ts.map +1 -0
  306. package/lib-dist/lib/terra/docs/assets.js +74 -0
  307. package/lib-dist/lib/terra/docs/assets.js.map +1 -0
  308. package/lib-dist/lib/terra/docs/attachments.d.ts +4 -0
  309. package/lib-dist/lib/terra/docs/attachments.d.ts.map +1 -0
  310. package/lib-dist/lib/terra/docs/attachments.js +5 -0
  311. package/lib-dist/lib/terra/docs/attachments.js.map +1 -0
  312. package/lib-dist/lib/terra/docs/editor-dom.d.ts +50 -0
  313. package/lib-dist/lib/terra/docs/editor-dom.d.ts.map +1 -0
  314. package/lib-dist/lib/terra/docs/editor-dom.js +236 -0
  315. package/lib-dist/lib/terra/docs/editor-dom.js.map +1 -0
  316. package/lib-dist/lib/terra/docs/mutations.d.ts +10 -0
  317. package/lib-dist/lib/terra/docs/mutations.d.ts.map +1 -0
  318. package/lib-dist/lib/terra/docs/mutations.js +105 -0
  319. package/lib-dist/lib/terra/docs/mutations.js.map +1 -0
  320. package/lib-dist/lib/terra/docs/navigation.d.ts +6 -0
  321. package/lib-dist/lib/terra/docs/navigation.d.ts.map +1 -0
  322. package/lib-dist/lib/terra/docs/navigation.js +21 -0
  323. package/lib-dist/lib/terra/docs/navigation.js.map +1 -0
  324. package/lib-dist/lib/terra/docs/state.d.ts +185 -0
  325. package/lib-dist/lib/terra/docs/state.d.ts.map +1 -0
  326. package/lib-dist/lib/terra/docs/state.js +254 -0
  327. package/lib-dist/lib/terra/docs/state.js.map +1 -0
  328. package/lib-dist/lib/terra/docs/toolbar.d.ts +11 -0
  329. package/lib-dist/lib/terra/docs/toolbar.d.ts.map +1 -0
  330. package/lib-dist/lib/terra/docs/toolbar.js +41 -0
  331. package/lib-dist/lib/terra/docs/toolbar.js.map +1 -0
  332. package/lib-dist/lib/terra/docs/tree.d.ts +15 -0
  333. package/lib-dist/lib/terra/docs/tree.d.ts.map +1 -0
  334. package/lib-dist/lib/terra/docs/tree.js +61 -0
  335. package/lib-dist/lib/terra/docs/tree.js.map +1 -0
  336. package/lib-dist/{terra/pages/docs/_helpers.d.ts → lib/terra/docs/workspace.d.ts} +6 -8
  337. package/lib-dist/lib/terra/docs/workspace.d.ts.map +1 -0
  338. package/lib-dist/{terra/pages/docs/_helpers.js → lib/terra/docs/workspace.js} +39 -28
  339. package/lib-dist/lib/terra/docs/workspace.js.map +1 -0
  340. package/lib-dist/lib/terra/flow/_layout.d.ts.map +1 -0
  341. package/lib-dist/{terra → lib/terra}/flow/_layout.js +16 -6
  342. package/lib-dist/lib/terra/flow/_layout.js.map +1 -0
  343. package/lib-dist/{terra → lib/terra}/flow/powerSource.d.ts +1 -2
  344. package/lib-dist/lib/terra/flow/powerSource.d.ts.map +1 -0
  345. package/lib-dist/{terra → lib/terra}/flow/powerSource.js +10 -4
  346. package/lib-dist/lib/terra/flow/powerSource.js.map +1 -0
  347. package/lib-dist/{terra → lib/terra}/regex.mjs +11 -6
  348. package/lib-dist/lib/terra/runtime/action-proxy.d.ts +45 -0
  349. package/lib-dist/lib/terra/runtime/action-proxy.d.ts.map +1 -0
  350. package/lib-dist/{terra → lib/terra}/runtime/action-proxy.js +1 -1
  351. package/lib-dist/lib/terra/runtime/action-proxy.js.map +1 -0
  352. package/lib-dist/lib/terra/runtime/content/block-jsx.d.ts +23 -0
  353. package/lib-dist/lib/terra/runtime/content/block-jsx.d.ts.map +1 -0
  354. package/lib-dist/lib/terra/runtime/content/block-jsx.js +225 -0
  355. package/lib-dist/lib/terra/runtime/content/block-jsx.js.map +1 -0
  356. package/lib-dist/lib/terra/runtime/content/document-markdown.d.ts +41 -0
  357. package/lib-dist/lib/terra/runtime/content/document-markdown.d.ts.map +1 -0
  358. package/lib-dist/lib/terra/runtime/content/document-markdown.js +536 -0
  359. package/lib-dist/lib/terra/runtime/content/document-markdown.js.map +1 -0
  360. package/lib-dist/lib/terra/runtime/content/markdown.d.ts +109 -0
  361. package/lib-dist/lib/terra/runtime/content/markdown.d.ts.map +1 -0
  362. package/lib-dist/lib/terra/runtime/content/markdown.js +428 -0
  363. package/lib-dist/lib/terra/runtime/content/markdown.js.map +1 -0
  364. package/lib-dist/lib/terra/runtime/content.d.ts.map +1 -0
  365. package/lib-dist/{terra → lib/terra}/runtime/content.js +147 -62
  366. package/lib-dist/lib/terra/runtime/content.js.map +1 -0
  367. package/lib-dist/lib/terra/runtime/leaf.d.ts.map +1 -0
  368. package/lib-dist/{terra → lib/terra}/runtime/leaf.js +1 -1
  369. package/lib-dist/lib/terra/runtime/leaf.js.map +1 -0
  370. package/lib-dist/lib/terra/runtime/nodes.d.ts.map +1 -0
  371. package/lib-dist/{terra → lib/terra}/runtime/nodes.js +103 -31
  372. package/lib-dist/lib/terra/runtime/nodes.js.map +1 -0
  373. package/lib-dist/{terra → lib/terra}/runtime/runtime.d.ts +8 -2
  374. package/lib-dist/lib/terra/runtime/runtime.d.ts.map +1 -0
  375. package/lib-dist/lib/terra/runtime/runtime.js +86 -0
  376. package/lib-dist/lib/terra/runtime/runtime.js.map +1 -0
  377. package/lib-dist/lib/terra/runtime/shared.d.ts.map +1 -0
  378. package/lib-dist/{terra → lib/terra}/runtime/shared.js +56 -11
  379. package/lib-dist/lib/terra/runtime/shared.js.map +1 -0
  380. package/lib-dist/lib/terra/runtime/types.d.ts +529 -0
  381. package/lib-dist/lib/terra/runtime/types.d.ts.map +1 -0
  382. package/lib-dist/{terra → lib/terra}/runtime/types.js +28 -2
  383. package/lib-dist/lib/terra/runtime/types.js.map +1 -0
  384. package/lib-dist/lib/workspace-types.d.ts +32 -0
  385. package/lib-dist/lib/workspace-types.d.ts.map +1 -0
  386. package/lib-dist/lib/workspace-types.js +2 -0
  387. package/lib-dist/lib/workspace-types.js.map +1 -0
  388. package/lib-dist/style.css +237 -1
  389. package/package.json +63 -38
  390. package/site/astro.config.mjs +67 -0
  391. package/site/docs-content-plugin.mjs +62 -0
  392. package/site/src/components/DocsSiteSearch.tsx +108 -0
  393. package/site/src/lib/catalog.ts +151 -0
  394. package/site/src/pages/404.astro +38 -0
  395. package/site/src/pages/[...slug].astro +49 -0
  396. package/site/src/styles/search.css +56 -0
  397. package/src/components/NotFound.astro +6 -0
  398. package/src/components/NotFound.tsx +48 -0
  399. package/src/{SiteLayout.astro → components/SiteLayout.astro} +17 -5
  400. package/src/{navigation.tsx → components/navigation.tsx} +3 -1
  401. package/lib-dist/Docs.d.ts.map +0 -1
  402. package/lib-dist/Docs.js +0 -60
  403. package/lib-dist/Docs.js.map +0 -1
  404. package/lib-dist/LocalDocsWorkspace.d.ts.map +0 -1
  405. package/lib-dist/LocalDocsWorkspace.js.map +0 -1
  406. package/lib-dist/SiteLayout.d.ts +0 -30
  407. package/lib-dist/SiteLayout.d.ts.map +0 -1
  408. package/lib-dist/SiteLayout.js +0 -34
  409. package/lib-dist/SiteLayout.js.map +0 -1
  410. package/lib-dist/StaticWorkspace.d.ts.map +0 -1
  411. package/lib-dist/StaticWorkspace.js.map +0 -1
  412. package/lib-dist/_Toolbar.d.ts +0 -7
  413. package/lib-dist/_Toolbar.d.ts.map +0 -1
  414. package/lib-dist/_Toolbar.js +0 -85
  415. package/lib-dist/_Toolbar.js.map +0 -1
  416. package/lib-dist/blocks.d.ts.map +0 -1
  417. package/lib-dist/blocks.js.map +0 -1
  418. package/lib-dist/docs-catalog.d.ts +0 -5
  419. package/lib-dist/docs-catalog.d.ts.map +0 -1
  420. package/lib-dist/docs-catalog.js +0 -38
  421. package/lib-dist/docs-catalog.js.map +0 -1
  422. package/lib-dist/docs-style.css +0 -31
  423. package/lib-dist/fonts/README.md +0 -5
  424. package/lib-dist/host-runtime.d.ts.map +0 -1
  425. package/lib-dist/host-runtime.js.map +0 -1
  426. package/lib-dist/host.d.ts.map +0 -1
  427. package/lib-dist/host.js.map +0 -1
  428. package/lib-dist/index.d.ts +0 -35
  429. package/lib-dist/index.d.ts.map +0 -1
  430. package/lib-dist/index.js +0 -28
  431. package/lib-dist/index.js.map +0 -1
  432. package/lib-dist/markdown-model.d.ts.map +0 -1
  433. package/lib-dist/markdown-model.js +0 -181
  434. package/lib-dist/markdown-model.js.map +0 -1
  435. package/lib-dist/markdown.d.ts +0 -3
  436. package/lib-dist/markdown.d.ts.map +0 -1
  437. package/lib-dist/markdown.js +0 -83
  438. package/lib-dist/markdown.js.map +0 -1
  439. package/lib-dist/navigation.d.ts.map +0 -1
  440. package/lib-dist/navigation.js.map +0 -1
  441. package/lib-dist/schema.d.ts.map +0 -1
  442. package/lib-dist/schema.js.map +0 -1
  443. package/lib-dist/terra/Workspace.d.ts.map +0 -1
  444. package/lib-dist/terra/Workspace.js +0 -9
  445. package/lib-dist/terra/Workspace.js.map +0 -1
  446. package/lib-dist/terra/editor/TerraContentEditor.d.ts +0 -10
  447. package/lib-dist/terra/editor/TerraContentEditor.d.ts.map +0 -1
  448. package/lib-dist/terra/editor/TerraContentEditor.js +0 -47
  449. package/lib-dist/terra/editor/TerraContentEditor.js.map +0 -1
  450. package/lib-dist/terra/editor/_blocks.d.ts.map +0 -1
  451. package/lib-dist/terra/editor/_blocks.js +0 -110
  452. package/lib-dist/terra/editor/_blocks.js.map +0 -1
  453. package/lib-dist/terra/editor/docs/_Callout.d.ts.map +0 -1
  454. package/lib-dist/terra/editor/docs/_Callout.js.map +0 -1
  455. package/lib-dist/terra/editor/docs/_CodeBlock.d.ts.map +0 -1
  456. package/lib-dist/terra/editor/docs/_CodeBlock.js.map +0 -1
  457. package/lib-dist/terra/editor/docs/_DocsCode.d.ts.map +0 -1
  458. package/lib-dist/terra/editor/docs/_DocsCode.js.map +0 -1
  459. package/lib-dist/terra/editor/docs/_DocsImage.d.ts.map +0 -1
  460. package/lib-dist/terra/editor/docs/_DocsImage.js +0 -62
  461. package/lib-dist/terra/editor/docs/_DocsImage.js.map +0 -1
  462. package/lib-dist/terra/editor/docs/_Embed.d.ts.map +0 -1
  463. package/lib-dist/terra/editor/docs/_Embed.js +0 -27
  464. package/lib-dist/terra/editor/docs/_Embed.js.map +0 -1
  465. package/lib-dist/terra/editor/docs/_Math.d.ts.map +0 -1
  466. package/lib-dist/terra/editor/docs/_Math.js.map +0 -1
  467. package/lib-dist/terra/editor/docs/_Nodes.d.ts.map +0 -1
  468. package/lib-dist/terra/editor/docs/_Nodes.js +0 -52
  469. package/lib-dist/terra/editor/docs/_Nodes.js.map +0 -1
  470. package/lib-dist/terra/editor/docs/_Raw.d.ts.map +0 -1
  471. package/lib-dist/terra/editor/docs/_Raw.js.map +0 -1
  472. package/lib-dist/terra/editor/docs/_Table.d.ts.map +0 -1
  473. package/lib-dist/terra/editor/docs/_Table.js +0 -71
  474. package/lib-dist/terra/editor/docs/_Table.js.map +0 -1
  475. package/lib-dist/terra/editor/docs/_Tabs.d.ts.map +0 -1
  476. package/lib-dist/terra/editor/docs/_Tabs.js.map +0 -1
  477. package/lib-dist/terra/editor/docs/_TsDocs.d.ts.map +0 -1
  478. package/lib-dist/terra/editor/docs/_TsDocs.js.map +0 -1
  479. package/lib-dist/terra/editor/docs/_math_inline.d.ts.map +0 -1
  480. package/lib-dist/terra/editor/docs/_math_inline.js.map +0 -1
  481. package/lib-dist/terra/editor/docs/heading.d.ts.map +0 -1
  482. package/lib-dist/terra/editor/docs/heading.js.map +0 -1
  483. package/lib-dist/terra/editor/docs/index.d.ts.map +0 -1
  484. package/lib-dist/terra/editor/docs/index.js.map +0 -1
  485. package/lib-dist/terra/editor/types.d.ts.map +0 -1
  486. package/lib-dist/terra/editor/types.js.map +0 -1
  487. package/lib-dist/terra/flow/Nodes.d.ts.map +0 -1
  488. package/lib-dist/terra/flow/Nodes.js.map +0 -1
  489. package/lib-dist/terra/flow/_chrome.d.ts.map +0 -1
  490. package/lib-dist/terra/flow/_chrome.js.map +0 -1
  491. package/lib-dist/terra/flow/_layout.d.ts.map +0 -1
  492. package/lib-dist/terra/flow/_layout.js.map +0 -1
  493. package/lib-dist/terra/flow/menuContext.d.ts.map +0 -1
  494. package/lib-dist/terra/flow/menuContext.js.map +0 -1
  495. package/lib-dist/terra/flow/powerSource.d.ts.map +0 -1
  496. package/lib-dist/terra/flow/powerSource.js.map +0 -1
  497. package/lib-dist/terra/pages/docs/_attachments.d.ts.map +0 -1
  498. package/lib-dist/terra/pages/docs/_attachments.js.map +0 -1
  499. package/lib-dist/terra/pages/docs/_blocks.d.ts.map +0 -1
  500. package/lib-dist/terra/pages/docs/_blocks.js.map +0 -1
  501. package/lib-dist/terra/pages/docs/_custom.d.ts.map +0 -1
  502. package/lib-dist/terra/pages/docs/_custom.js.map +0 -1
  503. package/lib-dist/terra/pages/docs/_editable.d.ts.map +0 -1
  504. package/lib-dist/terra/pages/docs/_editable.js.map +0 -1
  505. package/lib-dist/terra/pages/docs/_export-dialog.d.ts.map +0 -1
  506. package/lib-dist/terra/pages/docs/_export-dialog.js.map +0 -1
  507. package/lib-dist/terra/pages/docs/_helpers.d.ts.map +0 -1
  508. package/lib-dist/terra/pages/docs/_helpers.js.map +0 -1
  509. package/lib-dist/terra/pages/docs/_icons.d.ts.map +0 -1
  510. package/lib-dist/terra/pages/docs/_icons.js.map +0 -1
  511. package/lib-dist/terra/pages/docs/_main.d.ts.map +0 -1
  512. package/lib-dist/terra/pages/docs/_main.js +0 -1959
  513. package/lib-dist/terra/pages/docs/_main.js.map +0 -1
  514. package/lib-dist/terra/pages/docs/_sidebar.d.ts.map +0 -1
  515. package/lib-dist/terra/pages/docs/_sidebar.js +0 -2450
  516. package/lib-dist/terra/pages/docs/_sidebar.js.map +0 -1
  517. package/lib-dist/terra/pages/docs/_toolbar.d.ts.map +0 -1
  518. package/lib-dist/terra/pages/docs/_toolbar.js.map +0 -1
  519. package/lib-dist/terra/pages/docs/_tree.d.ts.map +0 -1
  520. package/lib-dist/terra/pages/docs/_tree.js.map +0 -1
  521. package/lib-dist/terra/runtime/action-proxy.d.ts +0 -5
  522. package/lib-dist/terra/runtime/action-proxy.d.ts.map +0 -1
  523. package/lib-dist/terra/runtime/action-proxy.js.map +0 -1
  524. package/lib-dist/terra/runtime/content.d.ts.map +0 -1
  525. package/lib-dist/terra/runtime/content.js.map +0 -1
  526. package/lib-dist/terra/runtime/leaf.d.ts.map +0 -1
  527. package/lib-dist/terra/runtime/leaf.js.map +0 -1
  528. package/lib-dist/terra/runtime/nodes.d.ts.map +0 -1
  529. package/lib-dist/terra/runtime/nodes.js.map +0 -1
  530. package/lib-dist/terra/runtime/runtime.d.ts.map +0 -1
  531. package/lib-dist/terra/runtime/runtime.js +0 -50
  532. package/lib-dist/terra/runtime/runtime.js.map +0 -1
  533. package/lib-dist/terra/runtime/shared.d.ts.map +0 -1
  534. package/lib-dist/terra/runtime/shared.js.map +0 -1
  535. package/lib-dist/terra/runtime/types.d.ts +0 -266
  536. package/lib-dist/terra/runtime/types.d.ts.map +0 -1
  537. package/lib-dist/terra/runtime/types.js.map +0 -1
  538. package/lib-dist/terra/runtime/ui.d.ts.map +0 -1
  539. package/lib-dist/terra/runtime/ui.js +0 -16
  540. package/lib-dist/terra/runtime/ui.js.map +0 -1
  541. package/lib-dist/workspace.d.ts +0 -78
  542. package/lib-dist/workspace.d.ts.map +0 -1
  543. package/lib-dist/workspace.js +0 -151
  544. package/lib-dist/workspace.js.map +0 -1
  545. package/src/style.css +0 -733
  546. /package/lib-dist/{fonts → assets/fonts}/Avara-Bold.woff2 +0 -0
  547. /package/lib-dist/{fonts → assets/fonts}/Avara-BoldItalic.woff2 +0 -0
  548. /package/lib-dist/{fonts → assets/fonts}/OFL-1.1.txt +0 -0
  549. /package/lib-dist/{blocks.d.ts → components/blocks.d.ts} +0 -0
  550. /package/lib-dist/{navigation.js → components/navigation.js} +0 -0
  551. /package/lib-dist/{terra → components/terra}/editor/docs/_CodeBlock.d.ts +0 -0
  552. /package/lib-dist/{terra → components/terra}/editor/docs/index.d.ts +0 -0
  553. /package/lib-dist/{terra → components/terra}/editor/docs/index.js +0 -0
  554. /package/lib-dist/{terra → components/terra}/flow/menuContext.d.ts +0 -0
  555. /package/lib-dist/{terra → components/terra}/flow/menuContext.js +0 -0
  556. /package/lib-dist/{terra → components/terra}/pages/docs/_blocks.d.ts +0 -0
  557. /package/lib-dist/{terra → components/terra}/pages/docs/_icons.d.ts +0 -0
  558. /package/lib-dist/{terra → components/terra}/pages/docs/_icons.js +0 -0
  559. /package/lib-dist/{host-runtime.d.ts → lib/host-runtime.d.ts} +0 -0
  560. /package/lib-dist/{host.js → lib/host.js} +0 -0
  561. /package/lib-dist/{terra → lib/terra}/flow/_layout.d.ts +0 -0
  562. /package/lib-dist/{terra → lib/terra}/runtime/content.d.ts +0 -0
  563. /package/lib-dist/{terra → lib/terra}/runtime/leaf.d.ts +0 -0
  564. /package/lib-dist/{terra → lib/terra}/runtime/nodes.d.ts +0 -0
  565. /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 { $attachmentFilter, clearTransition, codeViewOf, isDocBody, setTransition, toolbarFocusValue, useAtom } from './_helpers.js';
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 '../../runtime/action-proxy.js';
16
- import { docsRootPath } from '../../runtime/shared.js';
17
- import { cn, notify } from '../../runtime/runtime.js';
18
- import { components as repoComponents } from './_custom.js';
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 '../../runtime/content.js';
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 '../../../host-runtime.js';
28
+ import { getDocsHostAdapter } from '../../../../lib/host-runtime.js';
25
29
  // COMPONENTS
26
- import * as TerraQualityRegex from '../../regex.mjs';
30
+ import * as TerraQualityRegex from '../../../../lib/terra/regex.mjs';
27
31
  import React from 'react';
28
- import { TextTooltip, TooltipProvider } from '@terra-symposium/styling/ui/terra-original';
29
- import { ArrowLeft as LeftArrowIcon, ArrowRight as RightArrowIcon, ArrowUpRight as PopOutIcon, ButtonCentered as FullWordIcon, CaretDown as CaretDownIcon, CharacterPatterns as ReplaceIcon, CharacterSentenceCase as CaseIcon, DataShare as ShareIcon, Image as ImageIcon, Link as LinkIcon, ListBulleted as BulletListIcon, ListNumbered as NumberListIcon, Paste as PasteIcon, Redo as RedoIcon, RepoSourceCode as ModuleIcon, Search as SearchIcon, Task as CheckListIcon, TextBold as BoldIcon, TextFont as TextFontIcon, TextItalic as ItalicIcon, TextStrikethrough as StrikethroughIcon, TextUnderline as UnderlineIcon, Undo as UndoIcon, } from '@carbon/icons-react';
30
- import { Button as UiButton } from '@terra-symposium/styling/ui/terra-original';
31
- import { ButtonGroup } from '@terra-symposium/styling/ui/terra-original';
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/terra-original';
34
- import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger } from '@terra-symposium/styling/ui/terra-original';
35
- import { EditStateCtx } from './_helpers.js';
36
- import { ErrorBoundary } from '../../runtime/ui.js';
37
- import { Input } from '@terra-symposium/styling/ui/terra-original';
38
- import { Label } from '@terra-symposium/styling/ui/terra-original';
39
- import { Popover, PopoverContent, PopoverTrigger } from '@terra-symposium/styling/ui/terra-original';
40
- import { SearchEmpty } from '@terra-symposium/styling/ui/terra-original';
41
- import { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectSeparator, SelectTrigger, SelectValue } from '@terra-symposium/styling/ui/terra-original';
42
- import { Textarea } from '@terra-symposium/styling/ui/terra-original';
43
- import { Toggle } from '@terra-symposium/styling/ui/terra-original';
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 './_helpers.js';
48
+ import { ATTCH_TYPES } from '../../../../lib/terra/docs/attachments.js';
47
49
  import { DOCS_BLOCK_ICONS } from './_icons.js';
48
- import { EMPTY_NODES } from '../../runtime/nodes.js';
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 = [/<[^>]+>/gu, /^[\t ]*(?:#{1,6}|>+|[-+*]|\d+\.)[\t ]*/gmu, /:::[^\n]*|===|\|\|\|/gu, /[`*_~[\]()]/gu, /\s+/gu];
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: '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 }) }));
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, { className: 'w-[150px]', "aria-label": 'Mode', 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)) })] }));
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: aMode, editable, size = 'xs', toolbar }) {
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 ready = !!toolbar;
193
- const selectedVersion = versions.find(v => v.savedAt === selectedVersionId);
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 (err) {
220
- console.error('[Toolbar:versions] load-failed', { path, error: err });
221
- toast.error(err instanceof Error ? err.message : 'Failed to load doc versions.');
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 (e) => {
233
- e.preventDefault();
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 (err) {
240
- console.error('[Docs:save] failed', err);
241
- toast.error(err instanceof Error ? err.message : 'Unable to save document.');
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 (aMode === 'view')
256
+ if (activeMode === 'view')
246
257
  return;
247
- const onKeyDown = (e) => {
248
- if ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === 's')
249
- void save(e);
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
- document.removeEventListener('keydown', onKeyDown);
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: 'flex items-center gap-1', "data-docs-toolbar-actions": true, children: [_jsx(Mode, { editable: editable, mode: aMode, size: size, disabled: !ready, onModeChange: m => {
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(m).catch(e => {
262
- console.error('[Toolbar:mode] change-failed', { error: e, mode: m });
263
- toast.error(e instanceof Error ? e.message : 'Failed to change mode.');
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
- } }), aMode !== 'view' && aMode !== 'attachments' && (_jsx(_Fragment, { children: _jsxs(ButtonGroup, { children: [_jsx(TextTooltip, { content: 'Save (\u2318S)', side: 'top', align: 'center', delayDuration: 400, children: _jsx(UiButton, { size: size, disabled: !ready || !(toolbar?.dirty ?? false), loading: (toolbar?.busy ?? null) === 'saving', onMouseDown: preserveSel, onClick: e => void save(e), children: "Save" }) }), _jsx(TextTooltip, { content: 'Version History', side: 'top', align: 'center', delayDuration: 400, children: _jsx(UiButton, { size: size, className: 'px-0.5', disabled: !ready, "aria-label": 'Version History', onMouseDown: preserveSel, onClick: () => {
267
- if (versions.length > 0 && !selectedVersionId)
268
- setSelectedVersionId(versions[0].savedAt);
269
- setHistoryOpen(true);
270
- }, 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(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: preview.markdown.trim() || ' ' }) }), _jsxs(DialogFooter, { children: [_jsx(UiButton, { variant: 'ghost', onClick: () => setHistoryOpen(false), children: "Cancel" }), _jsx(UiButton, { disabled: !selectedVersion, onClick: () => {
271
- if (!edit || !selectedVersionId)
272
- return;
273
- edit.update?.({ content: preview.body, description: selectedVersion?.description || '', source: preview.markdown, title: selectedVersion?.title || '' });
274
- (edit.setCode ?? edit.setSrc)?.(preview.markdown);
275
- setHistoryOpen(false);
276
- notify({ error: null, fallback: 'Restored version to local draft. Save to apply.' });
277
- }, children: "Restore" })] })] }) })] }) }))] }) }));
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({ redo: false, undo: false });
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 ? { redo: redoDepth(view.state) > 0, undo: undoDepth(view.state) > 0 } : { redo: false, undo: false };
301
- setState(c => (c.undo === n.undo && c.redo === n.redo ? c : n));
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
- { lbl: 'Undo', canFire: adapter?.undoable ?? state.undo, action: adapter?.undo ?? undo, icon: UndoIcon, shortcut: '⌘Z' },
324
- { lbl: 'Redo', canFire: adapter?.redoable ?? state.redo, action: adapter?.redo ?? redo, icon: RedoIcon, shortcut: '⌘Y' },
325
- ].map(b => (_jsx(Button, { lbl: b.lbl, shortcut: b.shortcut, disabled: disabled || !b.canFire, onMouseDown: onMouseDown, onClick: () => {
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()) || 'attachment';
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: '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 => {
604
- setCfg(v => ({ ...v, attachment: p }));
605
- }, 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" })] })] }));
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: 'capitalize', children: name.replace(TerraQualityRegex.REGEX_G_REGEX_7(), ' ') }), _jsxs(DropdownMenuSubContent, { children: [tree.components.map(c => (_jsx(DropdownMenuItem, { onMouseDown: preserveSel, onSelect: e => {
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.replace(TerraQualityRegex.REGEX_G_REGEX_7(), ' ').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)))] })] }));
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({ open: false, query: '', tree: [], busy: false });
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() || '') ? dirname(ctx) : ctx);
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(s => ({ ...s, tree: Array.isArray(d) ? d.filter((n) => Boolean(n && typeof n === 'object' && 'type' in n)) : [], busy: false }));
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 = [{ nodes: search.tree, index: 0, path: '' }];
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({ nodes: n.children, index: 0, path: frame.path ? `${frame.path} / ${currTitle}` : currTitle });
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() ? search.query.replace(TerraQualityRegex.REGEX_A_Z0_9_GI_REGEX_2(), '-').toLowerCase() : 'untitled';
805
- const nId = basePath ? `${basePath}/${sName}-${Date.now()}.mdx` : `${sName}-${Date.now()}.mdx`;
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.editor({ path: nId, title: search.query, source: 'This page is empty.' }).catch(_err => ({ data: null, error: _err }));
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.docRef({ path: ctx, refId: finalPath, title: search.query || 'Embedded Page' }).catch(_err => {
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' && 'refId' in attRes.data && typeof attRes.data.refId === 'string' ? attRes.data.refId : leafId,
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({ error: _err instanceof Error ? _err : new Error('Embed failed'), fallback: 'Failed to embed leaf.' });
884
- setSearch(s => ({ ...s, query: '', busy: false }));
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: '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 => {
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.replace(TerraQualityRegex.REGEX_G_REGEX_7(), ' ').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 => {
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: '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)))] })] })] }) })] }));
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?.closest('td, th')?.closest('[data-docs-editor-block="DocsTable"], [data-terra-block="table"]'))
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', { detail: { type: 'style', style: v === 'p' ? 'normal' : v } }));
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 = 'Text';
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({ changes: { from: line.from, to: line.to, insert: replacementStr }, selection: { anchor: line.from + replacementStr.length } });
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: '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
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 = { edit: useContext(EditStateCtx), attachmentFilter: useAtom($attachmentFilter) };
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 = { code: { from: Math.min(from, to), to: Math.max(from, to) }, dom: null, visible: true };
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({ content: previewPack.body, title: selVer?.title || '', description: selVer?.description || '', source: previewPack.markdown });
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) => ({ _key: crypto.randomUUID(), _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({ type: 'insert', block: jsonBlock('code', { language: 'text', value: 'Code...' }) }))
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' ? `\n\n<Code language="json" source=${JSON.stringify(endpoint)} />\n\n` : '\n\n<Code language="text">\n{`\nCode...\n`}\n</Code>\n\n';
1400
- if (jsonCmd({ type: 'insert', block: jsonBlock('code', src === 'received' ? { language: 'json', source: endpoint, value: '' } : { language: 'text', value: 'Code...' }) }))
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 ? { from: curr.length, to: curr.length } : { from: Math.min(sel.from, curr.length), to: Math.min(sel.to, curr.length) };
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 ? { from: view.state.doc.length, to: view.state.doc.length } : (codeSel.current?.code ?? view.state.selection.main);
1423
- view.dispatch({ changes: { from: range.from, insert: code, to: range.to }, scrollIntoView: true, selection: { anchor: range.from + code.length } });
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: '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, 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 => {
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: 'multiple', value: [...toolbarCtx.attachmentFilter], onValueChange: v => {
1423
+ } })), _jsx(ToggleGroup, { type: "multiple", value: [...toolbarCtx.attachmentFilter], onValueChange: (v) => {
1484
1424
  if (v)
1485
1425
  $attachmentFilter.set(v);
1486
- }, 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
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({ type: 'decorator', decorator: k === 'strikethrough' ? 'strike-through' : k }) ||
1493
- (adapter?.format ? adapter.format(k === 'strikethrough' ? 'strike' : k) : insert?.(f(sSel('text', true)))),
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: 'Insert list', disabled: !ready, onMouseDown: preserveSel, children: _jsx(BulletListIcon, {}) }) }), _jsx(DropdownMenuContent, { align: 'start', children: [
1496
- { key: 'bullet', lbl: 'Bulleted list', icon: BulletListIcon, prefix: '\n- ', fallback: 'Item' },
1497
- { key: 'number', lbl: 'Numbered list', icon: NumberListIcon, prefix: '\n1. ', fallback: 'Item' },
1498
- { key: 'check', lbl: 'Checklist', icon: CheckListIcon, prefix: '\n- [ ] ', fallback: 'Task' },
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 ? adapter.toggleList(k) : toolbar?.toggleList ? toolbar.toggleList(k) : insert?.(`${p}${sSel(f)}\n`)),
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: 'flex items-center gap-1', children: [docs && (_jsx(Mode, { editable: editable, mode: mode, disabled: !ready, onModeChange: v => {
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: 'Find (\u2318F)', side: 'top', align: 'center', delayDuration: 400, children: docs && _jsx(TOOLBAR_COMPONENTS.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 => {
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: 'Save (\u2318S)', side: 'top', align: 'center', delayDuration: 400, children: _jsx(UiButton, { size: 'xs', disabled: !ready || !dirty, loading: saving === 'saving', onMouseDown: e => {
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: '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 => {
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: '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 => {
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: '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 => {
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: '/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" })] })] }) })] })) }) }) })] }) }));
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