@terra-symposium/docs 0.1.17 → 0.1.71

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (560) hide show
  1. package/README.md +3 -3
  2. package/lib-dist/assets/fonts/AUTHENTICSans-130.woff +0 -0
  3. package/lib-dist/assets/fonts/AUTHENTICSans-130.woff2 +0 -0
  4. package/lib-dist/assets/fonts/AUTHENTICSans-150.woff +0 -0
  5. package/lib-dist/assets/fonts/AUTHENTICSans-150.woff2 +0 -0
  6. package/lib-dist/assets/fonts/AUTHENTICSans-90.woff +0 -0
  7. package/lib-dist/assets/fonts/AUTHENTICSans-90.woff2 +0 -0
  8. package/lib-dist/assets/fonts/Avara-Bold.woff +0 -0
  9. package/lib-dist/assets/fonts/Avara-BoldItalic.woff +0 -0
  10. package/lib-dist/assets/fonts/InterVariable-Italic-latin-20260728.woff2 +0 -0
  11. package/lib-dist/assets/fonts/InterVariable-latin-20260728.woff2 +0 -0
  12. package/lib-dist/assets/fonts/README.md +7 -0
  13. package/lib-dist/assets/fonts/licenses/Inter-OFL-1.1.txt +92 -0
  14. package/lib-dist/assets/fonts/licenses/OFL-1.1.txt +93 -0
  15. package/lib-dist/{Docs.d.ts → components/Docs.d.ts} +1 -1
  16. package/lib-dist/components/Docs.d.ts.map +1 -0
  17. package/lib-dist/components/Docs.js +9 -0
  18. package/lib-dist/components/Docs.js.map +1 -0
  19. package/lib-dist/{LocalDocsWorkspace.d.ts → components/LocalDocsWorkspace.d.ts} +9 -2
  20. package/lib-dist/components/LocalDocsWorkspace.d.ts.map +1 -0
  21. package/lib-dist/{LocalDocsWorkspace.js → components/LocalDocsWorkspace.js} +83 -24
  22. package/lib-dist/components/LocalDocsWorkspace.js.map +1 -0
  23. package/lib-dist/components/NotFound.d.ts +8 -0
  24. package/lib-dist/components/NotFound.d.ts.map +1 -0
  25. package/lib-dist/components/NotFound.js +6 -0
  26. package/lib-dist/components/NotFound.js.map +1 -0
  27. package/lib-dist/components/SiteLayout.d.ts +25 -0
  28. package/lib-dist/components/SiteLayout.d.ts.map +1 -0
  29. package/lib-dist/components/SiteLayout.js +12 -0
  30. package/lib-dist/components/SiteLayout.js.map +1 -0
  31. package/lib-dist/{StaticWorkspace.d.ts → components/StaticWorkspace.d.ts} +7 -3
  32. package/lib-dist/components/StaticWorkspace.d.ts.map +1 -0
  33. package/lib-dist/{StaticWorkspace.js → components/StaticWorkspace.js} +100 -34
  34. package/lib-dist/components/StaticWorkspace.js.map +1 -0
  35. package/lib-dist/components/StrictLocalWorkspaceHarness.d.ts +10 -0
  36. package/lib-dist/components/StrictLocalWorkspaceHarness.d.ts.map +1 -0
  37. package/lib-dist/components/StrictLocalWorkspaceHarness.js +12 -0
  38. package/lib-dist/components/StrictLocalWorkspaceHarness.js.map +1 -0
  39. package/lib-dist/components/blocks.d.ts.map +1 -0
  40. package/lib-dist/{blocks.js → components/blocks.js} +88 -13
  41. package/lib-dist/components/blocks.js.map +1 -0
  42. package/lib-dist/{navigation.d.ts → components/navigation.d.ts} +2 -1
  43. package/lib-dist/components/navigation.d.ts.map +1 -0
  44. package/lib-dist/components/navigation.js.map +1 -0
  45. package/lib-dist/{terra → components/terra}/Workspace.d.ts +1 -1
  46. package/lib-dist/components/terra/Workspace.d.ts.map +1 -0
  47. package/lib-dist/components/terra/Workspace.js +190 -0
  48. package/lib-dist/components/terra/Workspace.js.map +1 -0
  49. package/lib-dist/components/terra/editor/TerraContentEditor.d.ts +15 -0
  50. package/lib-dist/components/terra/editor/TerraContentEditor.d.ts.map +1 -0
  51. package/lib-dist/components/terra/editor/TerraContentEditor.js +358 -0
  52. package/lib-dist/components/terra/editor/TerraContentEditor.js.map +1 -0
  53. package/lib-dist/{terra → components/terra}/editor/_blocks.d.ts +3 -4
  54. package/lib-dist/components/terra/editor/_blocks.d.ts.map +1 -0
  55. package/lib-dist/components/terra/editor/_blocks.js +120 -0
  56. package/lib-dist/components/terra/editor/_blocks.js.map +1 -0
  57. package/lib-dist/components/terra/editor/docs/BlockContext.d.ts +7 -0
  58. package/lib-dist/components/terra/editor/docs/BlockContext.d.ts.map +1 -0
  59. package/lib-dist/components/terra/editor/docs/BlockContext.js +60 -0
  60. package/lib-dist/components/terra/editor/docs/BlockContext.js.map +1 -0
  61. package/lib-dist/components/terra/editor/docs/DocsAttachmentPicker.d.ts +12 -0
  62. package/lib-dist/components/terra/editor/docs/DocsAttachmentPicker.d.ts.map +1 -0
  63. package/lib-dist/components/terra/editor/docs/DocsAttachmentPicker.js +66 -0
  64. package/lib-dist/components/terra/editor/docs/DocsAttachmentPicker.js.map +1 -0
  65. package/lib-dist/components/terra/editor/docs/TerraToolbar.d.ts +12 -0
  66. package/lib-dist/components/terra/editor/docs/TerraToolbar.d.ts.map +1 -0
  67. package/lib-dist/components/terra/editor/docs/TerraToolbar.js +169 -0
  68. package/lib-dist/components/terra/editor/docs/TerraToolbar.js.map +1 -0
  69. package/lib-dist/{terra → components/terra}/editor/docs/_Callout.d.ts +1 -1
  70. package/lib-dist/components/terra/editor/docs/_Callout.d.ts.map +1 -0
  71. package/lib-dist/{terra → components/terra}/editor/docs/_Callout.js +10 -6
  72. package/lib-dist/components/terra/editor/docs/_Callout.js.map +1 -0
  73. package/lib-dist/components/terra/editor/docs/_CodeBlock.d.ts.map +1 -0
  74. package/lib-dist/{terra → components/terra}/editor/docs/_CodeBlock.js +110 -44
  75. package/lib-dist/components/terra/editor/docs/_CodeBlock.js.map +1 -0
  76. package/lib-dist/{terra → components/terra}/editor/docs/_DocsCode.d.ts +1 -1
  77. package/lib-dist/components/terra/editor/docs/_DocsCode.d.ts.map +1 -0
  78. package/lib-dist/{terra → components/terra}/editor/docs/_DocsCode.js +44 -11
  79. package/lib-dist/components/terra/editor/docs/_DocsCode.js.map +1 -0
  80. package/lib-dist/{terra → components/terra}/editor/docs/_DocsImage.d.ts +1 -1
  81. package/lib-dist/components/terra/editor/docs/_DocsImage.d.ts.map +1 -0
  82. package/lib-dist/components/terra/editor/docs/_DocsImage.js +62 -0
  83. package/lib-dist/components/terra/editor/docs/_DocsImage.js.map +1 -0
  84. package/lib-dist/{terra → components/terra}/editor/docs/_Embed.d.ts +3 -1
  85. package/lib-dist/components/terra/editor/docs/_Embed.d.ts.map +1 -0
  86. package/lib-dist/components/terra/editor/docs/_Embed.js +73 -0
  87. package/lib-dist/components/terra/editor/docs/_Embed.js.map +1 -0
  88. package/lib-dist/{terra → components/terra}/editor/docs/_Math.d.ts +2 -2
  89. package/lib-dist/components/terra/editor/docs/_Math.d.ts.map +1 -0
  90. package/lib-dist/{terra → components/terra}/editor/docs/_Math.js +26 -14
  91. package/lib-dist/components/terra/editor/docs/_Math.js.map +1 -0
  92. package/lib-dist/{terra → components/terra}/editor/docs/_Nodes.d.ts +1 -1
  93. package/lib-dist/components/terra/editor/docs/_Nodes.d.ts.map +1 -0
  94. package/lib-dist/components/terra/editor/docs/_Nodes.js +62 -0
  95. package/lib-dist/components/terra/editor/docs/_Nodes.js.map +1 -0
  96. package/lib-dist/{terra → components/terra}/editor/docs/_Raw.d.ts +1 -1
  97. package/lib-dist/components/terra/editor/docs/_Raw.d.ts.map +1 -0
  98. package/lib-dist/{terra → components/terra}/editor/docs/_Raw.js +8 -3
  99. package/lib-dist/components/terra/editor/docs/_Raw.js.map +1 -0
  100. package/lib-dist/{terra → components/terra}/editor/docs/_Table.d.ts +1 -1
  101. package/lib-dist/components/terra/editor/docs/_Table.d.ts.map +1 -0
  102. package/lib-dist/components/terra/editor/docs/_Table.js +99 -0
  103. package/lib-dist/components/terra/editor/docs/_Table.js.map +1 -0
  104. package/lib-dist/{terra → components/terra}/editor/docs/_Tabs.d.ts +1 -1
  105. package/lib-dist/components/terra/editor/docs/_Tabs.d.ts.map +1 -0
  106. package/lib-dist/{terra → components/terra}/editor/docs/_Tabs.js +35 -14
  107. package/lib-dist/components/terra/editor/docs/_Tabs.js.map +1 -0
  108. package/lib-dist/{terra → components/terra}/editor/docs/_TsDocs.d.ts +1 -1
  109. package/lib-dist/components/terra/editor/docs/_TsDocs.d.ts.map +1 -0
  110. package/lib-dist/{terra → components/terra}/editor/docs/_TsDocs.js +15 -13
  111. package/lib-dist/components/terra/editor/docs/_TsDocs.js.map +1 -0
  112. package/lib-dist/{terra → components/terra}/editor/docs/_math_inline.d.ts +1 -1
  113. package/lib-dist/components/terra/editor/docs/_math_inline.d.ts.map +1 -0
  114. package/lib-dist/{terra → components/terra}/editor/docs/_math_inline.js +2 -2
  115. package/lib-dist/components/terra/editor/docs/_math_inline.js.map +1 -0
  116. package/lib-dist/{terra → components/terra}/editor/docs/heading.d.ts +1 -1
  117. package/lib-dist/components/terra/editor/docs/heading.d.ts.map +1 -0
  118. package/lib-dist/{terra → components/terra}/editor/docs/heading.js +8 -5
  119. package/lib-dist/components/terra/editor/docs/heading.js.map +1 -0
  120. package/lib-dist/components/terra/editor/docs/index.d.ts.map +1 -0
  121. package/lib-dist/components/terra/editor/docs/index.js.map +1 -0
  122. package/lib-dist/components/terra/editor/terra-content.styles.d.ts +3 -0
  123. package/lib-dist/components/terra/editor/terra-content.styles.d.ts.map +1 -0
  124. package/lib-dist/components/terra/editor/terra-content.styles.js +3 -0
  125. package/lib-dist/components/terra/editor/terra-content.styles.js.map +1 -0
  126. package/lib-dist/{terra → components/terra}/editor/types.d.ts +2 -2
  127. package/lib-dist/components/terra/editor/types.d.ts.map +1 -0
  128. package/lib-dist/{terra → components/terra}/editor/types.js +1 -1
  129. package/lib-dist/components/terra/editor/types.js.map +1 -0
  130. package/lib-dist/{terra → components/terra}/flow/Nodes.d.ts +3 -3
  131. package/lib-dist/components/terra/flow/Nodes.d.ts.map +1 -0
  132. package/lib-dist/{terra → components/terra}/flow/Nodes.js +211 -104
  133. package/lib-dist/components/terra/flow/Nodes.js.map +1 -0
  134. package/lib-dist/{terra → components/terra}/flow/_chrome.d.ts +9 -9
  135. package/lib-dist/components/terra/flow/_chrome.d.ts.map +1 -0
  136. package/lib-dist/{terra → components/terra}/flow/_chrome.js +325 -114
  137. package/lib-dist/components/terra/flow/_chrome.js.map +1 -0
  138. package/lib-dist/components/terra/flow/menuContext.d.ts.map +1 -0
  139. package/lib-dist/components/terra/flow/menuContext.js.map +1 -0
  140. package/lib-dist/{terra → components/terra}/pages/docs/_attachments.d.ts +1 -1
  141. package/lib-dist/components/terra/pages/docs/_attachments.d.ts.map +1 -0
  142. package/lib-dist/{terra → components/terra}/pages/docs/_attachments.js +371 -127
  143. package/lib-dist/components/terra/pages/docs/_attachments.js.map +1 -0
  144. package/lib-dist/components/terra/pages/docs/_blocks.d.ts.map +1 -0
  145. package/lib-dist/{terra → components/terra}/pages/docs/_blocks.js +39 -28
  146. package/lib-dist/components/terra/pages/docs/_blocks.js.map +1 -0
  147. package/lib-dist/{terra → components/terra}/pages/docs/_editable.d.ts +3 -3
  148. package/lib-dist/components/terra/pages/docs/_editable.d.ts.map +1 -0
  149. package/lib-dist/{terra → components/terra}/pages/docs/_editable.js +81 -43
  150. package/lib-dist/components/terra/pages/docs/_editable.js.map +1 -0
  151. package/lib-dist/{terra → components/terra}/pages/docs/_export-dialog.d.ts +1 -1
  152. package/lib-dist/components/terra/pages/docs/_export-dialog.d.ts.map +1 -0
  153. package/lib-dist/{terra → components/terra}/pages/docs/_export-dialog.js +13 -13
  154. package/lib-dist/components/terra/pages/docs/_export-dialog.js.map +1 -0
  155. package/lib-dist/components/terra/pages/docs/_icons.d.ts.map +1 -0
  156. package/lib-dist/components/terra/pages/docs/_icons.js.map +1 -0
  157. package/lib-dist/{terra → components/terra}/pages/docs/_main.d.ts +10 -7
  158. package/lib-dist/components/terra/pages/docs/_main.d.ts.map +1 -0
  159. package/lib-dist/components/terra/pages/docs/_main.js +710 -0
  160. package/lib-dist/components/terra/pages/docs/_main.js.map +1 -0
  161. package/lib-dist/components/terra/pages/docs/_manage-attachments-dialog.d.ts +10 -0
  162. package/lib-dist/components/terra/pages/docs/_manage-attachments-dialog.d.ts.map +1 -0
  163. package/lib-dist/components/terra/pages/docs/_manage-attachments-dialog.js +597 -0
  164. package/lib-dist/components/terra/pages/docs/_manage-attachments-dialog.js.map +1 -0
  165. package/lib-dist/{terra → components/terra}/pages/docs/_sidebar.d.ts +3 -12
  166. package/lib-dist/components/terra/pages/docs/_sidebar.d.ts.map +1 -0
  167. package/lib-dist/components/terra/pages/docs/_sidebar.js +1437 -0
  168. package/lib-dist/components/terra/pages/docs/_sidebar.js.map +1 -0
  169. package/lib-dist/components/terra/pages/docs/_toc.d.ts +4 -0
  170. package/lib-dist/components/terra/pages/docs/_toc.d.ts.map +1 -0
  171. package/lib-dist/components/terra/pages/docs/_toc.js +212 -0
  172. package/lib-dist/components/terra/pages/docs/_toc.js.map +1 -0
  173. package/lib-dist/components/terra/pages/docs/_toolbar-find-replace.d.ts +15 -0
  174. package/lib-dist/components/terra/pages/docs/_toolbar-find-replace.d.ts.map +1 -0
  175. package/lib-dist/components/terra/pages/docs/_toolbar-find-replace.js +207 -0
  176. package/lib-dist/components/terra/pages/docs/_toolbar-find-replace.js.map +1 -0
  177. package/lib-dist/{terra → components/terra}/pages/docs/_toolbar.d.ts +4 -5
  178. package/lib-dist/components/terra/pages/docs/_toolbar.d.ts.map +1 -0
  179. package/lib-dist/{terra → components/terra}/pages/docs/_toolbar.js +312 -343
  180. package/lib-dist/components/terra/pages/docs/_toolbar.js.map +1 -0
  181. package/lib-dist/{terra → components/terra}/pages/docs/_tree.d.ts +4 -4
  182. package/lib-dist/components/terra/pages/docs/_tree.d.ts.map +1 -0
  183. package/lib-dist/{terra → components/terra}/pages/docs/_tree.js +219 -264
  184. package/lib-dist/components/terra/pages/docs/_tree.js.map +1 -0
  185. package/lib-dist/components/terra/pages/docs/use-block-nav.d.ts +5 -0
  186. package/lib-dist/components/terra/pages/docs/use-block-nav.d.ts.map +1 -0
  187. package/lib-dist/components/terra/pages/docs/use-block-nav.js +1306 -0
  188. package/lib-dist/components/terra/pages/docs/use-block-nav.js.map +1 -0
  189. package/lib-dist/components/terra/pages/docs/use-media-paste.d.ts +5 -0
  190. package/lib-dist/components/terra/pages/docs/use-media-paste.d.ts.map +1 -0
  191. package/lib-dist/components/terra/pages/docs/use-media-paste.js +391 -0
  192. package/lib-dist/components/terra/pages/docs/use-media-paste.js.map +1 -0
  193. package/lib-dist/components/terra/pages/docs/use-render-tripwire.d.ts +2 -0
  194. package/lib-dist/components/terra/pages/docs/use-render-tripwire.d.ts.map +1 -0
  195. package/lib-dist/components/terra/pages/docs/use-render-tripwire.js +25 -0
  196. package/lib-dist/components/terra/pages/docs/use-render-tripwire.js.map +1 -0
  197. package/lib-dist/{terra/runtime → components/terra}/ui.d.ts +2 -5
  198. package/lib-dist/components/terra/ui.d.ts.map +1 -0
  199. package/lib-dist/components/terra/ui.js +20 -0
  200. package/lib-dist/components/terra/ui.js.map +1 -0
  201. package/lib-dist/components/workspace-demo-fixture.d.ts +35 -0
  202. package/lib-dist/components/workspace-demo-fixture.d.ts.map +1 -0
  203. package/lib-dist/components/workspace-demo-fixture.js +820 -0
  204. package/lib-dist/components/workspace-demo-fixture.js.map +1 -0
  205. package/lib-dist/fonts/KaTeX_AMS-Regular.ttf +0 -0
  206. package/lib-dist/fonts/KaTeX_AMS-Regular.woff +0 -0
  207. package/lib-dist/fonts/KaTeX_AMS-Regular.woff2 +0 -0
  208. package/lib-dist/fonts/KaTeX_Caligraphic-Bold.ttf +0 -0
  209. package/lib-dist/fonts/KaTeX_Caligraphic-Bold.woff +0 -0
  210. package/lib-dist/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
  211. package/lib-dist/fonts/KaTeX_Caligraphic-Regular.ttf +0 -0
  212. package/lib-dist/fonts/KaTeX_Caligraphic-Regular.woff +0 -0
  213. package/lib-dist/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
  214. package/lib-dist/fonts/KaTeX_Fraktur-Bold.ttf +0 -0
  215. package/lib-dist/fonts/KaTeX_Fraktur-Bold.woff +0 -0
  216. package/lib-dist/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
  217. package/lib-dist/fonts/KaTeX_Fraktur-Regular.ttf +0 -0
  218. package/lib-dist/fonts/KaTeX_Fraktur-Regular.woff +0 -0
  219. package/lib-dist/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
  220. package/lib-dist/fonts/KaTeX_Main-Bold.ttf +0 -0
  221. package/lib-dist/fonts/KaTeX_Main-Bold.woff +0 -0
  222. package/lib-dist/fonts/KaTeX_Main-Bold.woff2 +0 -0
  223. package/lib-dist/fonts/KaTeX_Main-BoldItalic.ttf +0 -0
  224. package/lib-dist/fonts/KaTeX_Main-BoldItalic.woff +0 -0
  225. package/lib-dist/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
  226. package/lib-dist/fonts/KaTeX_Main-Italic.ttf +0 -0
  227. package/lib-dist/fonts/KaTeX_Main-Italic.woff +0 -0
  228. package/lib-dist/fonts/KaTeX_Main-Italic.woff2 +0 -0
  229. package/lib-dist/fonts/KaTeX_Main-Regular.ttf +0 -0
  230. package/lib-dist/fonts/KaTeX_Main-Regular.woff +0 -0
  231. package/lib-dist/fonts/KaTeX_Main-Regular.woff2 +0 -0
  232. package/lib-dist/fonts/KaTeX_Math-BoldItalic.ttf +0 -0
  233. package/lib-dist/fonts/KaTeX_Math-BoldItalic.woff +0 -0
  234. package/lib-dist/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
  235. package/lib-dist/fonts/KaTeX_Math-Italic.ttf +0 -0
  236. package/lib-dist/fonts/KaTeX_Math-Italic.woff +0 -0
  237. package/lib-dist/fonts/KaTeX_Math-Italic.woff2 +0 -0
  238. package/lib-dist/fonts/KaTeX_SansSerif-Bold.ttf +0 -0
  239. package/lib-dist/fonts/KaTeX_SansSerif-Bold.woff +0 -0
  240. package/lib-dist/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
  241. package/lib-dist/fonts/KaTeX_SansSerif-Italic.ttf +0 -0
  242. package/lib-dist/fonts/KaTeX_SansSerif-Italic.woff +0 -0
  243. package/lib-dist/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
  244. package/lib-dist/fonts/KaTeX_SansSerif-Regular.ttf +0 -0
  245. package/lib-dist/fonts/KaTeX_SansSerif-Regular.woff +0 -0
  246. package/lib-dist/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
  247. package/lib-dist/fonts/KaTeX_Script-Regular.ttf +0 -0
  248. package/lib-dist/fonts/KaTeX_Script-Regular.woff +0 -0
  249. package/lib-dist/fonts/KaTeX_Script-Regular.woff2 +0 -0
  250. package/lib-dist/fonts/KaTeX_Size1-Regular.ttf +0 -0
  251. package/lib-dist/fonts/KaTeX_Size1-Regular.woff +0 -0
  252. package/lib-dist/fonts/KaTeX_Size1-Regular.woff2 +0 -0
  253. package/lib-dist/fonts/KaTeX_Size2-Regular.ttf +0 -0
  254. package/lib-dist/fonts/KaTeX_Size2-Regular.woff +0 -0
  255. package/lib-dist/fonts/KaTeX_Size2-Regular.woff2 +0 -0
  256. package/lib-dist/fonts/KaTeX_Size3-Regular.ttf +0 -0
  257. package/lib-dist/fonts/KaTeX_Size3-Regular.woff +0 -0
  258. package/lib-dist/fonts/KaTeX_Size3-Regular.woff2 +0 -0
  259. package/lib-dist/fonts/KaTeX_Size4-Regular.ttf +0 -0
  260. package/lib-dist/fonts/KaTeX_Size4-Regular.woff +0 -0
  261. package/lib-dist/fonts/KaTeX_Size4-Regular.woff2 +0 -0
  262. package/lib-dist/fonts/KaTeX_Typewriter-Regular.ttf +0 -0
  263. package/lib-dist/fonts/KaTeX_Typewriter-Regular.woff +0 -0
  264. package/lib-dist/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
  265. package/lib-dist/lib/astro.d.ts +8 -0
  266. package/lib-dist/lib/astro.d.ts.map +1 -0
  267. package/lib-dist/lib/astro.js +27 -0
  268. package/lib-dist/lib/astro.js.map +1 -0
  269. package/lib-dist/{docs-catalog.d.ts → lib/docs-catalog.d.ts} +1 -1
  270. package/lib-dist/lib/docs-catalog.d.ts.map +1 -0
  271. package/lib-dist/lib/docs-catalog.js +75 -0
  272. package/lib-dist/lib/docs-catalog.js.map +1 -0
  273. package/lib-dist/lib/docs-theme.d.ts +7 -0
  274. package/lib-dist/lib/docs-theme.d.ts.map +1 -0
  275. package/lib-dist/lib/docs-theme.js +51 -0
  276. package/lib-dist/lib/docs-theme.js.map +1 -0
  277. package/lib-dist/lib/host-runtime.d.ts.map +1 -0
  278. package/lib-dist/{host-runtime.js → lib/host-runtime.js} +4 -2
  279. package/lib-dist/lib/host-runtime.js.map +1 -0
  280. package/lib-dist/{host.d.ts → lib/host.d.ts} +20 -0
  281. package/lib-dist/lib/host.d.ts.map +1 -0
  282. package/lib-dist/lib/host.js.map +1 -0
  283. package/lib-dist/lib/index.d.ts +34 -0
  284. package/lib-dist/lib/index.d.ts.map +1 -0
  285. package/lib-dist/lib/index.js +27 -0
  286. package/lib-dist/lib/index.js.map +1 -0
  287. package/lib-dist/{markdown-model.d.ts → lib/markdown-model.d.ts} +3 -3
  288. package/lib-dist/lib/markdown-model.d.ts.map +1 -0
  289. package/lib-dist/lib/markdown-model.js +2031 -0
  290. package/lib-dist/lib/markdown-model.js.map +1 -0
  291. package/lib-dist/lib/markdown.d.ts +3 -0
  292. package/lib-dist/lib/markdown.d.ts.map +1 -0
  293. package/lib-dist/lib/markdown.js +222 -0
  294. package/lib-dist/lib/markdown.js.map +1 -0
  295. package/lib-dist/{schema.d.ts → lib/schema.d.ts} +55 -23
  296. package/lib-dist/lib/schema.d.ts.map +1 -0
  297. package/lib-dist/{schema.js → lib/schema.js} +26 -18
  298. package/lib-dist/lib/schema.js.map +1 -0
  299. package/lib-dist/{terra/pages/docs/_custom.d.ts → lib/terra/custom-components.d.ts} +2 -2
  300. package/lib-dist/lib/terra/custom-components.d.ts.map +1 -0
  301. package/lib-dist/{terra/pages/docs/_custom.js → lib/terra/custom-components.js} +1 -1
  302. package/lib-dist/lib/terra/custom-components.js.map +1 -0
  303. package/lib-dist/lib/terra/docs/archive.d.ts +3 -0
  304. package/lib-dist/lib/terra/docs/archive.d.ts.map +1 -0
  305. package/lib-dist/lib/terra/docs/archive.js +654 -0
  306. package/lib-dist/lib/terra/docs/archive.js.map +1 -0
  307. package/lib-dist/lib/terra/docs/assets.d.ts +26 -0
  308. package/lib-dist/lib/terra/docs/assets.d.ts.map +1 -0
  309. package/lib-dist/lib/terra/docs/assets.js +74 -0
  310. package/lib-dist/lib/terra/docs/assets.js.map +1 -0
  311. package/lib-dist/lib/terra/docs/attachments.d.ts +4 -0
  312. package/lib-dist/lib/terra/docs/attachments.d.ts.map +1 -0
  313. package/lib-dist/lib/terra/docs/attachments.js +5 -0
  314. package/lib-dist/lib/terra/docs/attachments.js.map +1 -0
  315. package/lib-dist/lib/terra/docs/editor-dom.d.ts +50 -0
  316. package/lib-dist/lib/terra/docs/editor-dom.d.ts.map +1 -0
  317. package/lib-dist/lib/terra/docs/editor-dom.js +236 -0
  318. package/lib-dist/lib/terra/docs/editor-dom.js.map +1 -0
  319. package/lib-dist/lib/terra/docs/mutations.d.ts +10 -0
  320. package/lib-dist/lib/terra/docs/mutations.d.ts.map +1 -0
  321. package/lib-dist/lib/terra/docs/mutations.js +105 -0
  322. package/lib-dist/lib/terra/docs/mutations.js.map +1 -0
  323. package/lib-dist/lib/terra/docs/navigation.d.ts +6 -0
  324. package/lib-dist/lib/terra/docs/navigation.d.ts.map +1 -0
  325. package/lib-dist/lib/terra/docs/navigation.js +21 -0
  326. package/lib-dist/lib/terra/docs/navigation.js.map +1 -0
  327. package/lib-dist/lib/terra/docs/state.d.ts +186 -0
  328. package/lib-dist/lib/terra/docs/state.d.ts.map +1 -0
  329. package/lib-dist/lib/terra/docs/state.js +255 -0
  330. package/lib-dist/lib/terra/docs/state.js.map +1 -0
  331. package/lib-dist/lib/terra/docs/toolbar.d.ts +11 -0
  332. package/lib-dist/lib/terra/docs/toolbar.d.ts.map +1 -0
  333. package/lib-dist/lib/terra/docs/toolbar.js +41 -0
  334. package/lib-dist/lib/terra/docs/toolbar.js.map +1 -0
  335. package/lib-dist/lib/terra/docs/tree.d.ts +15 -0
  336. package/lib-dist/lib/terra/docs/tree.d.ts.map +1 -0
  337. package/lib-dist/lib/terra/docs/tree.js +61 -0
  338. package/lib-dist/lib/terra/docs/tree.js.map +1 -0
  339. package/lib-dist/{terra/pages/docs/_helpers.d.ts → lib/terra/docs/workspace.d.ts} +7 -6
  340. package/lib-dist/lib/terra/docs/workspace.d.ts.map +1 -0
  341. package/lib-dist/{terra/pages/docs/_helpers.js → lib/terra/docs/workspace.js} +39 -27
  342. package/lib-dist/lib/terra/docs/workspace.js.map +1 -0
  343. package/lib-dist/lib/terra/flow/_layout.d.ts.map +1 -0
  344. package/lib-dist/{terra → lib/terra}/flow/_layout.js +16 -6
  345. package/lib-dist/lib/terra/flow/_layout.js.map +1 -0
  346. package/lib-dist/lib/terra/flow/powerSource.d.ts.map +1 -0
  347. package/lib-dist/{terra → lib/terra}/flow/powerSource.js +10 -4
  348. package/lib-dist/lib/terra/flow/powerSource.js.map +1 -0
  349. package/lib-dist/{terra → lib/terra}/regex.mjs +11 -6
  350. package/lib-dist/lib/terra/runtime/action-proxy.d.ts +45 -0
  351. package/lib-dist/lib/terra/runtime/action-proxy.d.ts.map +1 -0
  352. package/lib-dist/{terra → lib/terra}/runtime/action-proxy.js +1 -1
  353. package/lib-dist/lib/terra/runtime/action-proxy.js.map +1 -0
  354. package/lib-dist/lib/terra/runtime/content/block-jsx.d.ts +23 -0
  355. package/lib-dist/lib/terra/runtime/content/block-jsx.d.ts.map +1 -0
  356. package/lib-dist/lib/terra/runtime/content/block-jsx.js +225 -0
  357. package/lib-dist/lib/terra/runtime/content/block-jsx.js.map +1 -0
  358. package/lib-dist/lib/terra/runtime/content/document-markdown.d.ts +41 -0
  359. package/lib-dist/lib/terra/runtime/content/document-markdown.d.ts.map +1 -0
  360. package/lib-dist/lib/terra/runtime/content/document-markdown.js +536 -0
  361. package/lib-dist/lib/terra/runtime/content/document-markdown.js.map +1 -0
  362. package/lib-dist/lib/terra/runtime/content/markdown.d.ts +109 -0
  363. package/lib-dist/lib/terra/runtime/content/markdown.d.ts.map +1 -0
  364. package/lib-dist/lib/terra/runtime/content/markdown.js +428 -0
  365. package/lib-dist/lib/terra/runtime/content/markdown.js.map +1 -0
  366. package/lib-dist/lib/terra/runtime/content.d.ts.map +1 -0
  367. package/lib-dist/{terra → lib/terra}/runtime/content.js +147 -62
  368. package/lib-dist/lib/terra/runtime/content.js.map +1 -0
  369. package/lib-dist/lib/terra/runtime/leaf.d.ts.map +1 -0
  370. package/lib-dist/{terra → lib/terra}/runtime/leaf.js +1 -1
  371. package/lib-dist/lib/terra/runtime/leaf.js.map +1 -0
  372. package/lib-dist/lib/terra/runtime/nodes.d.ts.map +1 -0
  373. package/lib-dist/{terra → lib/terra}/runtime/nodes.js +103 -31
  374. package/lib-dist/lib/terra/runtime/nodes.js.map +1 -0
  375. package/lib-dist/{terra → lib/terra}/runtime/runtime.d.ts +8 -2
  376. package/lib-dist/lib/terra/runtime/runtime.d.ts.map +1 -0
  377. package/lib-dist/lib/terra/runtime/runtime.js +86 -0
  378. package/lib-dist/lib/terra/runtime/runtime.js.map +1 -0
  379. package/lib-dist/lib/terra/runtime/shared.d.ts.map +1 -0
  380. package/lib-dist/{terra → lib/terra}/runtime/shared.js +56 -11
  381. package/lib-dist/lib/terra/runtime/shared.js.map +1 -0
  382. package/lib-dist/lib/terra/runtime/types.d.ts +529 -0
  383. package/lib-dist/lib/terra/runtime/types.d.ts.map +1 -0
  384. package/lib-dist/{terra → lib/terra}/runtime/types.js +28 -2
  385. package/lib-dist/lib/terra/runtime/types.js.map +1 -0
  386. package/lib-dist/lib/workspace-types.d.ts +29 -0
  387. package/lib-dist/lib/workspace-types.d.ts.map +1 -0
  388. package/lib-dist/lib/workspace-types.js +2 -0
  389. package/lib-dist/lib/workspace-types.js.map +1 -0
  390. package/lib-dist/style.css +237 -1
  391. package/package.json +34 -16
  392. package/src/components/NotFound.astro +6 -0
  393. package/src/components/NotFound.tsx +48 -0
  394. package/src/{SiteLayout.astro → components/SiteLayout.astro} +8 -4
  395. package/src/{navigation.tsx → components/navigation.tsx} +2 -1
  396. package/lib-dist/Docs.d.ts.map +0 -1
  397. package/lib-dist/Docs.js +0 -60
  398. package/lib-dist/Docs.js.map +0 -1
  399. package/lib-dist/LocalDocsWorkspace.d.ts.map +0 -1
  400. package/lib-dist/LocalDocsWorkspace.js.map +0 -1
  401. package/lib-dist/SiteLayout.d.ts +0 -30
  402. package/lib-dist/SiteLayout.d.ts.map +0 -1
  403. package/lib-dist/SiteLayout.js +0 -34
  404. package/lib-dist/SiteLayout.js.map +0 -1
  405. package/lib-dist/StaticWorkspace.d.ts.map +0 -1
  406. package/lib-dist/StaticWorkspace.js.map +0 -1
  407. package/lib-dist/_Toolbar.d.ts +0 -7
  408. package/lib-dist/_Toolbar.d.ts.map +0 -1
  409. package/lib-dist/_Toolbar.js +0 -85
  410. package/lib-dist/_Toolbar.js.map +0 -1
  411. package/lib-dist/blocks.d.ts.map +0 -1
  412. package/lib-dist/blocks.js.map +0 -1
  413. package/lib-dist/docs-catalog.d.ts.map +0 -1
  414. package/lib-dist/docs-catalog.js +0 -38
  415. package/lib-dist/docs-catalog.js.map +0 -1
  416. package/lib-dist/docs-style.css +0 -31
  417. package/lib-dist/fonts/README.md +0 -5
  418. package/lib-dist/host-runtime.d.ts.map +0 -1
  419. package/lib-dist/host-runtime.js.map +0 -1
  420. package/lib-dist/host.d.ts.map +0 -1
  421. package/lib-dist/host.js.map +0 -1
  422. package/lib-dist/index.d.ts +0 -35
  423. package/lib-dist/index.d.ts.map +0 -1
  424. package/lib-dist/index.js +0 -28
  425. package/lib-dist/index.js.map +0 -1
  426. package/lib-dist/markdown-model.d.ts.map +0 -1
  427. package/lib-dist/markdown-model.js +0 -181
  428. package/lib-dist/markdown-model.js.map +0 -1
  429. package/lib-dist/markdown.d.ts +0 -3
  430. package/lib-dist/markdown.d.ts.map +0 -1
  431. package/lib-dist/markdown.js +0 -83
  432. package/lib-dist/markdown.js.map +0 -1
  433. package/lib-dist/navigation.d.ts.map +0 -1
  434. package/lib-dist/navigation.js.map +0 -1
  435. package/lib-dist/schema.d.ts.map +0 -1
  436. package/lib-dist/schema.js.map +0 -1
  437. package/lib-dist/terra/Workspace.d.ts.map +0 -1
  438. package/lib-dist/terra/Workspace.js +0 -9
  439. package/lib-dist/terra/Workspace.js.map +0 -1
  440. package/lib-dist/terra/editor/TerraContentEditor.d.ts +0 -10
  441. package/lib-dist/terra/editor/TerraContentEditor.d.ts.map +0 -1
  442. package/lib-dist/terra/editor/TerraContentEditor.js +0 -47
  443. package/lib-dist/terra/editor/TerraContentEditor.js.map +0 -1
  444. package/lib-dist/terra/editor/_blocks.d.ts.map +0 -1
  445. package/lib-dist/terra/editor/_blocks.js +0 -110
  446. package/lib-dist/terra/editor/_blocks.js.map +0 -1
  447. package/lib-dist/terra/editor/docs/_Callout.d.ts.map +0 -1
  448. package/lib-dist/terra/editor/docs/_Callout.js.map +0 -1
  449. package/lib-dist/terra/editor/docs/_CodeBlock.d.ts.map +0 -1
  450. package/lib-dist/terra/editor/docs/_CodeBlock.js.map +0 -1
  451. package/lib-dist/terra/editor/docs/_DocsCode.d.ts.map +0 -1
  452. package/lib-dist/terra/editor/docs/_DocsCode.js.map +0 -1
  453. package/lib-dist/terra/editor/docs/_DocsImage.d.ts.map +0 -1
  454. package/lib-dist/terra/editor/docs/_DocsImage.js +0 -62
  455. package/lib-dist/terra/editor/docs/_DocsImage.js.map +0 -1
  456. package/lib-dist/terra/editor/docs/_Embed.d.ts.map +0 -1
  457. package/lib-dist/terra/editor/docs/_Embed.js +0 -27
  458. package/lib-dist/terra/editor/docs/_Embed.js.map +0 -1
  459. package/lib-dist/terra/editor/docs/_Math.d.ts.map +0 -1
  460. package/lib-dist/terra/editor/docs/_Math.js.map +0 -1
  461. package/lib-dist/terra/editor/docs/_Nodes.d.ts.map +0 -1
  462. package/lib-dist/terra/editor/docs/_Nodes.js +0 -52
  463. package/lib-dist/terra/editor/docs/_Nodes.js.map +0 -1
  464. package/lib-dist/terra/editor/docs/_Raw.d.ts.map +0 -1
  465. package/lib-dist/terra/editor/docs/_Raw.js.map +0 -1
  466. package/lib-dist/terra/editor/docs/_Table.d.ts.map +0 -1
  467. package/lib-dist/terra/editor/docs/_Table.js +0 -71
  468. package/lib-dist/terra/editor/docs/_Table.js.map +0 -1
  469. package/lib-dist/terra/editor/docs/_Tabs.d.ts.map +0 -1
  470. package/lib-dist/terra/editor/docs/_Tabs.js.map +0 -1
  471. package/lib-dist/terra/editor/docs/_TsDocs.d.ts.map +0 -1
  472. package/lib-dist/terra/editor/docs/_TsDocs.js.map +0 -1
  473. package/lib-dist/terra/editor/docs/_math_inline.d.ts.map +0 -1
  474. package/lib-dist/terra/editor/docs/_math_inline.js.map +0 -1
  475. package/lib-dist/terra/editor/docs/heading.d.ts.map +0 -1
  476. package/lib-dist/terra/editor/docs/heading.js.map +0 -1
  477. package/lib-dist/terra/editor/docs/index.d.ts.map +0 -1
  478. package/lib-dist/terra/editor/docs/index.js.map +0 -1
  479. package/lib-dist/terra/editor/types.d.ts.map +0 -1
  480. package/lib-dist/terra/editor/types.js.map +0 -1
  481. package/lib-dist/terra/flow/Nodes.d.ts.map +0 -1
  482. package/lib-dist/terra/flow/Nodes.js.map +0 -1
  483. package/lib-dist/terra/flow/_chrome.d.ts.map +0 -1
  484. package/lib-dist/terra/flow/_chrome.js.map +0 -1
  485. package/lib-dist/terra/flow/_layout.d.ts.map +0 -1
  486. package/lib-dist/terra/flow/_layout.js.map +0 -1
  487. package/lib-dist/terra/flow/menuContext.d.ts.map +0 -1
  488. package/lib-dist/terra/flow/menuContext.js.map +0 -1
  489. package/lib-dist/terra/flow/powerSource.d.ts.map +0 -1
  490. package/lib-dist/terra/flow/powerSource.js.map +0 -1
  491. package/lib-dist/terra/pages/docs/_attachments.d.ts.map +0 -1
  492. package/lib-dist/terra/pages/docs/_attachments.js.map +0 -1
  493. package/lib-dist/terra/pages/docs/_blocks.d.ts.map +0 -1
  494. package/lib-dist/terra/pages/docs/_blocks.js.map +0 -1
  495. package/lib-dist/terra/pages/docs/_custom.d.ts.map +0 -1
  496. package/lib-dist/terra/pages/docs/_custom.js.map +0 -1
  497. package/lib-dist/terra/pages/docs/_editable.d.ts.map +0 -1
  498. package/lib-dist/terra/pages/docs/_editable.js.map +0 -1
  499. package/lib-dist/terra/pages/docs/_export-dialog.d.ts.map +0 -1
  500. package/lib-dist/terra/pages/docs/_export-dialog.js.map +0 -1
  501. package/lib-dist/terra/pages/docs/_helpers.d.ts.map +0 -1
  502. package/lib-dist/terra/pages/docs/_helpers.js.map +0 -1
  503. package/lib-dist/terra/pages/docs/_icons.d.ts.map +0 -1
  504. package/lib-dist/terra/pages/docs/_icons.js.map +0 -1
  505. package/lib-dist/terra/pages/docs/_main.d.ts.map +0 -1
  506. package/lib-dist/terra/pages/docs/_main.js +0 -1959
  507. package/lib-dist/terra/pages/docs/_main.js.map +0 -1
  508. package/lib-dist/terra/pages/docs/_sidebar.d.ts.map +0 -1
  509. package/lib-dist/terra/pages/docs/_sidebar.js +0 -2450
  510. package/lib-dist/terra/pages/docs/_sidebar.js.map +0 -1
  511. package/lib-dist/terra/pages/docs/_toolbar.d.ts.map +0 -1
  512. package/lib-dist/terra/pages/docs/_toolbar.js.map +0 -1
  513. package/lib-dist/terra/pages/docs/_tree.d.ts.map +0 -1
  514. package/lib-dist/terra/pages/docs/_tree.js.map +0 -1
  515. package/lib-dist/terra/runtime/action-proxy.d.ts +0 -5
  516. package/lib-dist/terra/runtime/action-proxy.d.ts.map +0 -1
  517. package/lib-dist/terra/runtime/action-proxy.js.map +0 -1
  518. package/lib-dist/terra/runtime/content.d.ts.map +0 -1
  519. package/lib-dist/terra/runtime/content.js.map +0 -1
  520. package/lib-dist/terra/runtime/leaf.d.ts.map +0 -1
  521. package/lib-dist/terra/runtime/leaf.js.map +0 -1
  522. package/lib-dist/terra/runtime/nodes.d.ts.map +0 -1
  523. package/lib-dist/terra/runtime/nodes.js.map +0 -1
  524. package/lib-dist/terra/runtime/runtime.d.ts.map +0 -1
  525. package/lib-dist/terra/runtime/runtime.js +0 -50
  526. package/lib-dist/terra/runtime/runtime.js.map +0 -1
  527. package/lib-dist/terra/runtime/shared.d.ts.map +0 -1
  528. package/lib-dist/terra/runtime/shared.js.map +0 -1
  529. package/lib-dist/terra/runtime/types.d.ts +0 -266
  530. package/lib-dist/terra/runtime/types.d.ts.map +0 -1
  531. package/lib-dist/terra/runtime/types.js.map +0 -1
  532. package/lib-dist/terra/runtime/ui.d.ts.map +0 -1
  533. package/lib-dist/terra/runtime/ui.js +0 -16
  534. package/lib-dist/terra/runtime/ui.js.map +0 -1
  535. package/lib-dist/workspace.d.ts +0 -78
  536. package/lib-dist/workspace.d.ts.map +0 -1
  537. package/lib-dist/workspace.js +0 -151
  538. package/lib-dist/workspace.js.map +0 -1
  539. package/src/style.css +0 -733
  540. /package/lib-dist/{fonts → assets/fonts}/Avara-Bold.woff2 +0 -0
  541. /package/lib-dist/{fonts → assets/fonts}/Avara-BoldItalic.woff2 +0 -0
  542. /package/lib-dist/{fonts → assets/fonts}/OFL-1.1.txt +0 -0
  543. /package/lib-dist/{blocks.d.ts → components/blocks.d.ts} +0 -0
  544. /package/lib-dist/{navigation.js → components/navigation.js} +0 -0
  545. /package/lib-dist/{terra → components/terra}/editor/docs/_CodeBlock.d.ts +0 -0
  546. /package/lib-dist/{terra → components/terra}/editor/docs/index.d.ts +0 -0
  547. /package/lib-dist/{terra → components/terra}/editor/docs/index.js +0 -0
  548. /package/lib-dist/{terra → components/terra}/flow/menuContext.d.ts +0 -0
  549. /package/lib-dist/{terra → components/terra}/flow/menuContext.js +0 -0
  550. /package/lib-dist/{terra → components/terra}/pages/docs/_blocks.d.ts +0 -0
  551. /package/lib-dist/{terra → components/terra}/pages/docs/_icons.d.ts +0 -0
  552. /package/lib-dist/{terra → components/terra}/pages/docs/_icons.js +0 -0
  553. /package/lib-dist/{host-runtime.d.ts → lib/host-runtime.d.ts} +0 -0
  554. /package/lib-dist/{host.js → lib/host.js} +0 -0
  555. /package/lib-dist/{terra → lib/terra}/flow/_layout.d.ts +0 -0
  556. /package/lib-dist/{terra → lib/terra}/flow/powerSource.d.ts +0 -0
  557. /package/lib-dist/{terra → lib/terra}/runtime/content.d.ts +0 -0
  558. /package/lib-dist/{terra → lib/terra}/runtime/leaf.d.ts +0 -0
  559. /package/lib-dist/{terra → lib/terra}/runtime/nodes.d.ts +0 -0
  560. /package/lib-dist/{terra → lib/terra}/runtime/shared.d.ts +0 -0
@@ -0,0 +1,1306 @@
1
+ // @ts-nocheck -- Docs editor navigation tracks browser selection across block hydration.
2
+ /** Maintains keyboard, pointer, and selection navigation across Docs editor blocks. */
3
+ import React, { useEffect, useRef } from 'react';
4
+ import { $cursor, $cursorGhost, $cursorPosition, $cursorTrack, } from '../../../../lib/terra/docs/state.js';
5
+ import { captureLinearOffset, captureNodePath, codeViewOf, document, getCollapsedRange, } from '../../../../lib/terra/docs/editor-dom.js';
6
+ import * as TerraQualityRegex from '../../../../lib/terra/regex.mjs';
7
+ export function useBlockNav(refs) {
8
+ // REFS
9
+ const bCursor = useRef(null);
10
+ const vCursor = useRef(0);
11
+ const vPending = useRef(null);
12
+ const restoreCursor = useRef(0);
13
+ // EFFECTS
14
+ useEffect(() => {
15
+ const EDITABLE = [
16
+ 'input',
17
+ 'textarea',
18
+ 'select',
19
+ '[contenteditable="true"]',
20
+ '[contenteditable="plaintext-only"]',
21
+ '.cm-editor',
22
+ 'td',
23
+ 'th',
24
+ ].join(', ');
25
+ const INTERACTIVE = [
26
+ 'button',
27
+ 'a[href]',
28
+ '[role="button"]',
29
+ '[role="tab"]',
30
+ '[tabindex]:not([tabindex="-1"])',
31
+ '[data-tool-cell]',
32
+ ].join(', ');
33
+ /**
34
+ * Returns the root.
35
+ *
36
+ * @returns root.
37
+ */
38
+ const root = () => refs.current?.body ?? null;
39
+ /**
40
+ * Checks whether the value is editable.
41
+ *
42
+ * @returns editable.
43
+ */
44
+ const editable = () => root()?.querySelector('[contenteditable="true"]') ?? null;
45
+ /**
46
+ * Gets active editable.
47
+ *
48
+ * @returns resolved value.
49
+ */
50
+ const getActiveEditable = () => {
51
+ if (bCursor.current)
52
+ return (bCursor.current.dec.parentElement?.closest('[contenteditable="true"], [contenteditable="plaintext-only"]') ?? editable());
53
+ const sel = window.getSelection();
54
+ if (sel?.anchorNode) {
55
+ const ce = (sel.anchorNode instanceof Element ? sel.anchorNode : sel.anchorNode.parentElement)?.closest('[contenteditable="true"], [contenteditable="plaintext-only"]');
56
+ if (ce)
57
+ return ce;
58
+ }
59
+ return editable();
60
+ };
61
+ /**
62
+ * Checks whether local text.
63
+ *
64
+ * @param node - Value passed to the helper.
65
+ *
66
+ * @returns True when the helper predicate succeeds.
67
+ */
68
+ const isLocalText = (node) => {
69
+ const ce = getActiveEditable();
70
+ if (!node || !ce)
71
+ return false;
72
+ const el = node instanceof Element ? node : node.parentElement;
73
+ if (!el)
74
+ return false;
75
+ const childDec = el.closest('[data-lexical-decorator="true"]');
76
+ return !childDec || !ce.contains(childDec);
77
+ };
78
+ /**
79
+ * Sets block cursor active.
80
+ *
81
+ * @param active - Value passed to the helper.
82
+ */
83
+ const setBlockCursorActive = (a) => {
84
+ if (!refs.current?.body)
85
+ return;
86
+ if (a)
87
+ refs.current.body.dataset.docsBlockCursorActive = 'true';
88
+ else
89
+ delete refs.current.body.dataset.docsBlockCursorActive;
90
+ };
91
+ /**
92
+ * Restores the restore Saved Selection.
93
+ *
94
+ * @param _reason - Value passed to the helper.
95
+ */
96
+ const restoreSavedSelection = (_reason) => {
97
+ const saved = refs.current.selection ?? $cursorPosition.get() ?? $cursor.get() ?? $cursorGhost.get();
98
+ if (!saved)
99
+ return;
100
+ const view = codeViewOf();
101
+ if (view && view.dom.offsetParent !== null && saved.code) {
102
+ $cursorTrack.set({
103
+ anchor: saved.code.from,
104
+ collapsed: saved.code.from === saved.code.to,
105
+ focus: saved.code.to,
106
+ range: [saved.code.from, saved.code.to],
107
+ visible: true,
108
+ });
109
+ $cursorPosition.set({
110
+ code: { from: saved.code.from, to: saved.code.to },
111
+ dom: null,
112
+ visible: true,
113
+ });
114
+ $cursor.set({
115
+ code: { from: saved.code.from, to: saved.code.to },
116
+ dom: null,
117
+ visible: true,
118
+ });
119
+ $cursorGhost.set({
120
+ code: { from: saved.code.from, to: saved.code.to },
121
+ dom: null,
122
+ visible: true,
123
+ });
124
+ refs.current.selection = {
125
+ ...saved,
126
+ code: { from: saved.code.from, to: saved.code.to },
127
+ dom: null,
128
+ visible: true,
129
+ };
130
+ view.dispatch({
131
+ selection: { anchor: saved.code.from, head: saved.code.to },
132
+ scrollIntoView: false,
133
+ });
134
+ return;
135
+ }
136
+ const body = refs.current.body;
137
+ if (!body)
138
+ return;
139
+ const sel = window.getSelection();
140
+ if (!sel)
141
+ return;
142
+ /**
143
+ * Returns the pick path.
144
+ *
145
+ * @param path - Path to process.
146
+ * @param offset - Value passed to the helper.
147
+ *
148
+ * @returns pick Path.
149
+ */
150
+ const pickPath = (path, offset) => {
151
+ if (!path?.length)
152
+ return null;
153
+ let node = body;
154
+ for (const idx of path) {
155
+ if (!node?.childNodes[idx]) {
156
+ node = null;
157
+ break;
158
+ }
159
+ node = node.childNodes[idx] ?? null;
160
+ }
161
+ if (!(node instanceof Text))
162
+ return null;
163
+ const range = document.createRange();
164
+ range.setStart(node, Math.min(offset ?? 0, node.textContent?.length ?? 0));
165
+ range.collapse(true);
166
+ return range;
167
+ };
168
+ /**
169
+ * Returns the pick text.
170
+ *
171
+ * @param text - Text content to process.
172
+ * @param offset - Value passed to the helper.
173
+ *
174
+ * @returns pick Text.
175
+ */
176
+ const pickText = (text, offset) => {
177
+ if (!text)
178
+ return null;
179
+ const walker = document.createTreeWalker(body, NodeFilter.SHOW_TEXT, {
180
+ acceptNode: (node) => node.textContent?.includes(text) ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP,
181
+ });
182
+ let node = walker.nextNode();
183
+ while (node) {
184
+ if (node instanceof Text) {
185
+ const i = node.textContent?.indexOf(text) ?? -1;
186
+ if (i !== -1) {
187
+ const range = document.createRange();
188
+ range.setStart(node, Math.min(i + (offset ?? 0), node.textContent?.length ?? 0));
189
+ range.collapse(true);
190
+ return range;
191
+ }
192
+ }
193
+ node = walker.nextNode();
194
+ }
195
+ return null;
196
+ };
197
+ const n = pickPath(saved.anchorPath ?? undefined, saved.anchorOffset) ??
198
+ pickText(saved.anchorText, saved.anchorOffset) ??
199
+ pickPath(saved.focusPath ?? undefined, saved.focusOffset) ??
200
+ pickText(saved.focusText, saved.focusOffset) ??
201
+ (saved.dom && body.contains(saved.dom.commonAncestorContainer)
202
+ ? saved.dom.cloneRange()
203
+ : null);
204
+ if (!n)
205
+ return;
206
+ sel.removeAllRanges();
207
+ sel.addRange(n.cloneRange());
208
+ const rect = n.getBoundingClientRect();
209
+ const box = rect.width || rect.height
210
+ ? {
211
+ height: Math.max(16, rect.height || 0),
212
+ left: rect.left,
213
+ top: rect.top,
214
+ width: Math.max(2, rect.width || 0),
215
+ }
216
+ : saved.box;
217
+ const anchorLinear = typeof saved.anchorLinear === 'number'
218
+ ? saved.anchorLinear
219
+ : captureLinearOffset(body, n.startContainer, n.startOffset);
220
+ const focusLinear = typeof saved.focusLinear === 'number' ? saved.focusLinear : anchorLinear;
221
+ $cursorTrack.set({
222
+ anchor: anchorLinear ?? 0,
223
+ box,
224
+ collapsed: n.collapsed,
225
+ focus: focusLinear ?? anchorLinear ?? 0,
226
+ range: [anchorLinear ?? 0, focusLinear ?? anchorLinear ?? 0],
227
+ visible: true,
228
+ });
229
+ $cursorPosition.set({
230
+ anchorOffset: saved.anchorOffset,
231
+ anchorPath: saved.anchorPath,
232
+ anchorText: saved.anchorText,
233
+ anchorLinear,
234
+ box,
235
+ collapsed: n.collapsed,
236
+ code: null,
237
+ dom: n.cloneRange(),
238
+ focusOffset: saved.focusOffset,
239
+ focusPath: saved.focusPath,
240
+ focusText: saved.focusText,
241
+ focusLinear,
242
+ text: saved.text,
243
+ visible: true,
244
+ });
245
+ $cursor.set({
246
+ anchorOffset: saved.anchorOffset,
247
+ anchorPath: saved.anchorPath,
248
+ anchorText: saved.anchorText,
249
+ anchorLinear,
250
+ box,
251
+ collapsed: n.collapsed,
252
+ code: null,
253
+ dom: n.cloneRange(),
254
+ focusOffset: saved.focusOffset,
255
+ focusPath: saved.focusPath,
256
+ focusText: saved.focusText,
257
+ focusLinear,
258
+ text: saved.text,
259
+ visible: true,
260
+ });
261
+ $cursorGhost.set({
262
+ anchorOffset: saved.anchorOffset,
263
+ anchorPath: saved.anchorPath,
264
+ anchorText: saved.anchorText,
265
+ anchorLinear,
266
+ box,
267
+ collapsed: n.collapsed,
268
+ code: null,
269
+ dom: n.cloneRange(),
270
+ focusOffset: saved.focusOffset,
271
+ focusPath: saved.focusPath,
272
+ focusText: saved.focusText,
273
+ focusLinear,
274
+ text: saved.text,
275
+ visible: true,
276
+ });
277
+ refs.current.selection = {
278
+ ...saved,
279
+ anchorLinear,
280
+ box,
281
+ collapsed: n.collapsed,
282
+ code: null,
283
+ dom: n.cloneRange(),
284
+ focusLinear,
285
+ visible: true,
286
+ };
287
+ setBlockCursorActive(Boolean(bCursor.current));
288
+ };
289
+ /**
290
+ * Checks whether toolbar target.
291
+ *
292
+ * @param target - Value passed to the helper.
293
+ *
294
+ * @returns True when the helper predicate succeeds.
295
+ */
296
+ const isToolbarTgt = (tgt) => !!tgt?.closest('[data-docs-main-toolbar], [data-docs-toolbar-frame], [data-toolbar="true"], [role="toolbar"], [role="dialog"], [role="menu"], [role="menuitem"], [data-radix-popper-content-wrapper]');
297
+ /**
298
+ * Snapshot selection.
299
+ *
300
+ */
301
+ const snapshotSelection = () => {
302
+ const sel = window.getSelection();
303
+ const view = codeViewOf();
304
+ if (view && view.dom.offsetParent !== null) {
305
+ refs.current.selection = {
306
+ code: { from: view.state.selection.main.from, to: view.state.selection.main.to },
307
+ collapsed: view.state.selection.main.empty,
308
+ dom: null,
309
+ visible: true,
310
+ };
311
+ $cursorTrack.set({
312
+ anchor: view.state.selection.main.from,
313
+ collapsed: view.state.selection.main.empty,
314
+ focus: view.state.selection.main.to,
315
+ range: [view.state.selection.main.from, view.state.selection.main.to],
316
+ visible: true,
317
+ });
318
+ $cursorPosition.set({
319
+ code: { from: view.state.selection.main.from, to: view.state.selection.main.to },
320
+ collapsed: view.state.selection.main.empty,
321
+ dom: null,
322
+ visible: true,
323
+ });
324
+ $cursor.set({
325
+ code: { from: view.state.selection.main.from, to: view.state.selection.main.to },
326
+ collapsed: view.state.selection.main.empty,
327
+ dom: null,
328
+ visible: true,
329
+ });
330
+ $cursorGhost.set({
331
+ code: { from: view.state.selection.main.from, to: view.state.selection.main.to },
332
+ collapsed: view.state.selection.main.empty,
333
+ dom: null,
334
+ visible: true,
335
+ });
336
+ return;
337
+ }
338
+ if (sel?.rangeCount && sel.anchorNode) {
339
+ const ce = (sel.anchorNode instanceof Element ? sel.anchorNode : sel.anchorNode.parentElement)?.closest('[contenteditable="true"], [contenteditable="plaintext-only"]');
340
+ if (ce && refs.current.body?.contains(ce)) {
341
+ const dom = sel.getRangeAt(0).cloneRange();
342
+ const rect = dom.getBoundingClientRect();
343
+ const anchorPath = captureNodePath(refs.current.body, sel.anchorNode);
344
+ const focusPath = captureNodePath(refs.current.body, sel.focusNode);
345
+ const anchorLinear = captureLinearOffset(refs.current.body, sel.anchorNode, sel.anchorOffset);
346
+ const focusLinear = captureLinearOffset(refs.current.body, sel.focusNode, sel.focusOffset);
347
+ $cursorTrack.set({
348
+ anchor: anchorLinear ?? 0,
349
+ box: rect.width || rect.height
350
+ ? {
351
+ height: Math.max(16, rect.height || 0),
352
+ left: rect.left,
353
+ top: rect.top,
354
+ width: Math.max(2, rect.width || 0),
355
+ }
356
+ : undefined,
357
+ collapsed: sel.isCollapsed,
358
+ focus: focusLinear ?? anchorLinear ?? 0,
359
+ range: [anchorLinear ?? 0, focusLinear ?? anchorLinear ?? 0],
360
+ visible: true,
361
+ });
362
+ refs.current.selection = {
363
+ anchorOffset: sel.anchorOffset,
364
+ anchorPath,
365
+ anchorText: sel.anchorNode?.textContent || undefined,
366
+ anchorLinear,
367
+ box: rect.width || rect.height
368
+ ? {
369
+ height: Math.max(16, rect.height || 0),
370
+ left: rect.left,
371
+ top: rect.top,
372
+ width: Math.max(2, rect.width || 0),
373
+ }
374
+ : undefined,
375
+ collapsed: sel.isCollapsed,
376
+ code: null,
377
+ dom,
378
+ focusOffset: sel.focusOffset,
379
+ focusPath,
380
+ focusText: sel.focusNode?.textContent || undefined,
381
+ focusLinear,
382
+ text: sel.toString(),
383
+ visible: true,
384
+ };
385
+ $cursorPosition.set({
386
+ anchorOffset: sel.anchorOffset,
387
+ anchorPath,
388
+ anchorText: sel.anchorNode?.textContent || undefined,
389
+ anchorLinear,
390
+ box: rect.width || rect.height
391
+ ? {
392
+ height: Math.max(16, rect.height || 0),
393
+ left: rect.left,
394
+ top: rect.top,
395
+ width: Math.max(2, rect.width || 0),
396
+ }
397
+ : undefined,
398
+ collapsed: sel.isCollapsed,
399
+ code: null,
400
+ dom,
401
+ focusOffset: sel.focusOffset,
402
+ focusPath,
403
+ focusText: sel.focusNode?.textContent || undefined,
404
+ focusLinear,
405
+ text: sel.toString(),
406
+ visible: true,
407
+ });
408
+ $cursor.set({
409
+ anchorOffset: sel.anchorOffset,
410
+ anchorPath,
411
+ anchorText: sel.anchorNode?.textContent || undefined,
412
+ anchorLinear,
413
+ box: rect.width || rect.height
414
+ ? {
415
+ height: Math.max(16, rect.height || 0),
416
+ left: rect.left,
417
+ top: rect.top,
418
+ width: Math.max(2, rect.width || 0),
419
+ }
420
+ : undefined,
421
+ collapsed: sel.isCollapsed,
422
+ code: null,
423
+ dom,
424
+ focusOffset: sel.focusOffset,
425
+ focusPath,
426
+ focusText: sel.focusNode?.textContent || undefined,
427
+ focusLinear,
428
+ text: sel.toString(),
429
+ visible: true,
430
+ });
431
+ $cursorGhost.set({
432
+ anchorOffset: sel.anchorOffset,
433
+ anchorPath,
434
+ anchorText: sel.anchorNode?.textContent || undefined,
435
+ anchorLinear,
436
+ box: rect.width || rect.height
437
+ ? {
438
+ height: Math.max(16, rect.height || 0),
439
+ left: rect.left,
440
+ top: rect.top,
441
+ width: Math.max(2, rect.width || 0),
442
+ }
443
+ : undefined,
444
+ collapsed: sel.isCollapsed,
445
+ code: null,
446
+ dom,
447
+ focusOffset: sel.focusOffset,
448
+ focusPath,
449
+ focusText: sel.focusNode?.textContent || undefined,
450
+ focusLinear,
451
+ text: sel.toString(),
452
+ visible: true,
453
+ });
454
+ }
455
+ }
456
+ };
457
+ /**
458
+ * Returns the clear.
459
+ *
460
+ */
461
+ const clear = () => {
462
+ window.cancelAnimationFrame(vCursor.current);
463
+ vPending.current = null;
464
+ if (bCursor.current) {
465
+ bCursor.current.wrapper.removeAttribute('data-docs-block-cursor');
466
+ setBlockCursorActive(false);
467
+ bCursor.current = null;
468
+ }
469
+ };
470
+ /**
471
+ * Returns the restore.
472
+ *
473
+ * @returns True when the helper predicate succeeds.
474
+ */
475
+ const restore = () => {
476
+ const { current: cur } = bCursor;
477
+ const body = root();
478
+ if (!cur || !body)
479
+ return false;
480
+ const matches = Array.from(body.querySelectorAll('[data-docs-editor-block]')).filter((w) => w.getAttribute('data-docs-editor-block') === cur.label);
481
+ const nWrapper = matches.find((w) => {
482
+ if (!cur.gId)
483
+ return false;
484
+ return ((w.matches('[data-docs-focus-group-id]')
485
+ ? w
486
+ : w.querySelector('[data-docs-focus-group-id]'))?.getAttribute('data-docs-focus-group-id') === cur.gId);
487
+ }) ?? matches[0];
488
+ if (!nWrapper)
489
+ return false;
490
+ const n = nWrapper.closest('[data-lexical-decorator="true"]') ?? nWrapper;
491
+ nWrapper.dataset.docsBlockCursor = 'true';
492
+ setBlockCursorActive(true);
493
+ bCursor.current = { ...cur, dec: n, wrapper: nWrapper };
494
+ // natively select the node so Lexical restores its internal state
495
+ const selection = { body: getActiveEditable(), range: window.getSelection() };
496
+ if (selection.body && selection.range) {
497
+ const range = document.createRange();
498
+ range.selectNode(n);
499
+ selection.range.removeAllRanges();
500
+ selection.range.addRange(range);
501
+ }
502
+ const ghost = document.createRange();
503
+ ghost.selectNode(n);
504
+ $cursor.set({ code: null, dom: ghost, visible: true });
505
+ return true;
506
+ };
507
+ /**
508
+ * G dec.
509
+ *
510
+ * @param dec - Value passed to the helper.
511
+ *
512
+ * @returns g Dec.
513
+ */
514
+ const gDec = (dec) => {
515
+ const body = root();
516
+ const marker = dec.matches('[data-docs-focus-group-id]')
517
+ ? dec
518
+ : dec.querySelector('[data-docs-focus-group-id]');
519
+ const gId = marker?.getAttribute('data-docs-focus-group-id');
520
+ if (!body || !gId || marker?.getAttribute('data-docs-focus-group') !== 'member')
521
+ return dec;
522
+ const gRoot = body.querySelector(`[data-docs-focus-group="root"][data-docs-focus-group-id="${gId}"]`);
523
+ return gRoot?.closest('[data-lexical-decorator="true"]') ?? gRoot ?? dec;
524
+ };
525
+ /**
526
+ * G decs.
527
+ *
528
+ * @param _vertical - Value passed to the helper.
529
+ *
530
+ * @returns g Decs.
531
+ */
532
+ const gDecs = (_vertical = false) => {
533
+ const ce = getActiveEditable();
534
+ if (!ce)
535
+ return [];
536
+ const seen = new Set();
537
+ return [
538
+ ...Array.from(ce.querySelectorAll('[data-lexical-decorator="true"]')),
539
+ ...Array.from(ce.querySelectorAll('[data-docs-editor-block]')).filter((b) => !b.closest('[data-lexical-decorator="true"]')),
540
+ ]
541
+ .filter((e) => {
542
+ if (e.parentElement?.closest('[contenteditable="true"], [contenteditable="plaintext-only"]') !== ce)
543
+ return false;
544
+ return true;
545
+ })
546
+ .map(gDec)
547
+ .filter((d) => {
548
+ if (seen.has(d))
549
+ return false;
550
+ seen.add(d);
551
+ return true;
552
+ })
553
+ .sort((a, b) => {
554
+ const pos = a.compareDocumentPosition(b);
555
+ if (pos & Node.DOCUMENT_POSITION_FOLLOWING)
556
+ return -1;
557
+ if (pos & Node.DOCUMENT_POSITION_PRECEDING)
558
+ return 1;
559
+ return 0;
560
+ });
561
+ };
562
+ /**
563
+ * Returns the focus target.
564
+ *
565
+ * @param tgt - Value passed to the helper.
566
+ * @param side - Value passed to the helper.
567
+ *
568
+ * @returns True when the helper predicate succeeds.
569
+ */
570
+ const focusTgt = (tgt, side) => {
571
+ tgt.focus({ preventScroll: true });
572
+ if (!tgt.matches('[contenteditable="true"], [contenteditable="plaintext-only"]'))
573
+ return document.activeElement === tgt;
574
+ const sel = window.getSelection();
575
+ if (!sel)
576
+ return false;
577
+ const walker = document.createTreeWalker(tgt, NodeFilter.SHOW_TEXT, {
578
+ acceptNode: (n) => n.textContent?.replace(TerraQualityRegex.REGEX_U200B_G_REGEX(), '').trim()
579
+ ? NodeFilter.FILTER_ACCEPT
580
+ : NodeFilter.FILTER_SKIP,
581
+ });
582
+ const texts = [];
583
+ let node = walker.nextNode();
584
+ while (node) {
585
+ if (node instanceof Text)
586
+ texts.push(node);
587
+ node = walker.nextNode();
588
+ }
589
+ const range = document.createRange();
590
+ const text = side === 'right' ? texts[0] : texts[texts.length - 1];
591
+ if (text)
592
+ range.setStart(text, side === 'right' ? 0 : (text.textContent?.length ?? 0));
593
+ else
594
+ range.selectNodeContents(tgt);
595
+ range.collapse(true);
596
+ sel.removeAllRanges();
597
+ sel.addRange(range);
598
+ return true;
599
+ };
600
+ /**
601
+ * Returns the focusables.
602
+ *
603
+ * @param wrapper - Value passed to the helper.
604
+ * @param pref - Value passed to the helper.
605
+ *
606
+ * @returns focusables.
607
+ */
608
+ const focusables = (wrapper, pref = false) => {
609
+ const seen = new Set();
610
+ const gId = wrapper.getAttribute('data-docs-focus-group-id');
611
+ return Array.from(wrapper.querySelectorAll(pref ? '[data-docs-focus-entry]' : [EDITABLE, INTERACTIVE].join(', '))).filter((n) => {
612
+ if (seen.has(n) || !n.isConnected)
613
+ return false;
614
+ seen.add(n);
615
+ if (pref) {
616
+ const owner = n.closest('[data-docs-editor-block]');
617
+ if (owner &&
618
+ owner !== wrapper &&
619
+ (!gId || owner.getAttribute('data-docs-focus-group-id') !== gId))
620
+ return false;
621
+ }
622
+ if ('disabled' in n && n.disabled)
623
+ return false;
624
+ if (n.getAttribute('aria-hidden') === 'true' || n.closest('[aria-hidden="true"]'))
625
+ return false;
626
+ return !!n.getClientRects().length;
627
+ });
628
+ };
629
+ /**
630
+ * Nearest adjacent.
631
+ *
632
+ * @param dir - Directory entry to read.
633
+ * @param vertical - Value passed to the helper.
634
+ *
635
+ * @returns nearest Adjacent.
636
+ */
637
+ const nearestAdjacent = (dir, vertical = false) => {
638
+ const range = getCollapsedRange();
639
+ if (!range)
640
+ return null;
641
+ const decs = gDecs(vertical);
642
+ if (dir === 'right') {
643
+ return (decs.find((d) => {
644
+ const edge = document.createRange();
645
+ edge.setStartBefore(d);
646
+ edge.collapse(true);
647
+ return range.compareBoundaryPoints(Range.START_TO_START, edge) <= 0;
648
+ }) ?? null);
649
+ }
650
+ for (let i = decs.length - 1; i >= 0; i--) {
651
+ const d = decs[i];
652
+ const edge = document.createRange();
653
+ edge.setStartAfter(d);
654
+ edge.collapse(true);
655
+ if (range.compareBoundaryPoints(Range.START_TO_START, edge) >= 0)
656
+ return d;
657
+ }
658
+ return null;
659
+ };
660
+ /**
661
+ * Caret rect.
662
+ *
663
+ * @param dir - Directory entry to read.
664
+ *
665
+ * @returns caret Rect.
666
+ */
667
+ const caretRect = (dir) => {
668
+ const range = getCollapsedRange();
669
+ if (!range)
670
+ return null;
671
+ const rects = Array.from(range.getClientRects());
672
+ const rect = (dir === 'right' ? rects[rects.length - 1] : rects[0]) || range.getBoundingClientRect();
673
+ return rect.width || rect.height ? { bottom: rect.bottom, top: rect.top } : null;
674
+ };
675
+ /**
676
+ * Passed dec.
677
+ *
678
+ * @param dec - Value passed to the helper.
679
+ * @param dir - Directory entry to read.
680
+ * @param beforeAnchor - Value passed to the helper.
681
+ * @param beforeBlock - Value passed to the helper.
682
+ * @param before - Value passed to the helper.
683
+ * @param aRect - Value passed to the helper.
684
+ *
685
+ * @returns True when the helper predicate succeeds.
686
+ */
687
+ const passedDec = (dec, dir, beforeAnchor, beforeBlock, before, aRect) => {
688
+ const select = window.getSelection();
689
+ if (!select?.rangeCount || !select.isCollapsed || !before || !aRect)
690
+ return false;
691
+ const block = (select.anchorNode instanceof Element
692
+ ? select.anchorNode
693
+ : select.anchorNode?.parentElement)?.closest('p, li, blockquote, h2, h3, h4, h5, h6, td, th') ?? null;
694
+ if (select.anchorNode === beforeAnchor && block === beforeBlock)
695
+ return false;
696
+ // Ignore if we've escaped local boundary limits during native modification
697
+ if (block && !isLocalText(block))
698
+ return false;
699
+ const range = select.getRangeAt(0);
700
+ const edge = document.createRange();
701
+ const box = dec.getBoundingClientRect();
702
+ const bRect = caretRect(dir);
703
+ if (!bRect)
704
+ return false;
705
+ if (dir === 'right')
706
+ edge.setStartAfter(dec);
707
+ else
708
+ edge.setStartBefore(dec);
709
+ edge.collapse(true);
710
+ const leeway = 10;
711
+ // prettier-ignore
712
+ return dir === 'right'
713
+ ? before.compareBoundaryPoints(Range.START_TO_START, edge) < 0 && range.compareBoundaryPoints(Range.START_TO_START, edge) >= 0 && aRect.bottom < box.top + leeway && bRect.bottom >= box.top - leeway
714
+ : before.compareBoundaryPoints(Range.START_TO_START, edge) > 0 && range.compareBoundaryPoints(Range.START_TO_START, edge) <= 0 && aRect.top > box.bottom - leeway && bRect.top <= box.bottom + leeway;
715
+ };
716
+ /**
717
+ * Selected dec.
718
+ *
719
+ * @param _vertical - Value passed to the helper.
720
+ *
721
+ * @returns selected Dec.
722
+ */
723
+ const selectedDec = (_vertical = false) => {
724
+ const ce = getActiveEditable();
725
+ if (!ce)
726
+ return null;
727
+ const range = getCollapsedRange();
728
+ if (!range || !ce.contains(range.startContainer))
729
+ return null;
730
+ const dec = (range.startContainer instanceof Element
731
+ ? range.startContainer
732
+ : range.startContainer.parentElement)?.closest('[data-lexical-decorator="true"]');
733
+ if (!dec || !ce.contains(dec) || dec === ce.closest('[data-lexical-decorator="true"]'))
734
+ return null;
735
+ return gDec(dec);
736
+ };
737
+ /**
738
+ * Returns the focus block.
739
+ *
740
+ * @param dec - Value passed to the helper.
741
+ * @param dir - Directory entry to read.
742
+ */
743
+ const focusBlock = (dec, dir) => {
744
+ const cells = Array.from(dec.querySelectorAll('th, td')).filter((c) => c.isContentEditable && c.getClientRects().length);
745
+ if (cells.length) {
746
+ clear();
747
+ focusTgt(dir === 'right' ? cells[0] : cells[cells.length - 1], dir === 'right' ? 'right' : 'left');
748
+ return;
749
+ }
750
+ focus(dec, dir === 'right' ? 'left' : 'right');
751
+ };
752
+ /**
753
+ * Returns the focus.
754
+ *
755
+ * @param dec - Value passed to the helper.
756
+ * @param side - Value passed to the helper.
757
+ */
758
+ const focus = (dec, side) => {
759
+ const tgt = gDec(dec);
760
+ const wrapper = tgt.querySelector('[data-docs-editor-block]') ?? tgt;
761
+ const cursorMetadata = {
762
+ marker: wrapper.matches('[data-docs-focus-group-id]')
763
+ ? wrapper
764
+ : wrapper.querySelector('[data-docs-focus-group-id]'),
765
+ label: wrapper.getAttribute('data-docs-editor-block') ?? 'Block',
766
+ };
767
+ clear();
768
+ const body = getActiveEditable();
769
+ const sel = window.getSelection();
770
+ if (body && sel) {
771
+ body.focus({ preventScroll: true });
772
+ const range = document.createRange();
773
+ if (side === 'left')
774
+ range.setStartBefore(tgt);
775
+ else
776
+ range.setStartAfter(tgt);
777
+ range.collapse(true);
778
+ sel.removeAllRanges();
779
+ sel.addRange(range);
780
+ }
781
+ wrapper.dataset.docsBlockCursor = 'true';
782
+ setBlockCursorActive(true);
783
+ bCursor.current = {
784
+ dec: tgt,
785
+ gId: cursorMetadata.marker?.getAttribute('data-docs-focus-group-id') ?? null,
786
+ label: cursorMetadata.label,
787
+ side,
788
+ wrapper,
789
+ };
790
+ document.dispatchEvent(new CustomEvent('docs:block-selected', { detail: { block: wrapper } }));
791
+ };
792
+ /**
793
+ * On key down.
794
+ *
795
+ * @param e - Value passed to the helper.
796
+ */
797
+ const eHandlers = {
798
+ onKeyDown(e) {
799
+ try {
800
+ if (e.defaultPrevented || e.altKey)
801
+ return;
802
+ const tgt = e.target instanceof HTMLElement ? e.target : null;
803
+ const closestEditable = tgt?.closest('[contenteditable="true"]') ?? null;
804
+ const key = e.key;
805
+ const entry = tgt?.closest('[data-docs-focus-entry]') ?? null;
806
+ if ((key === 'Enter' || key === ' ') &&
807
+ entry?.matches('button, [role="button"], [role="tab"]')) {
808
+ e.preventDefault();
809
+ e.stopPropagation();
810
+ if (entry.getAttribute('aria-expanded') !== 'true')
811
+ entry.click();
812
+ setTimeout(() => {
813
+ const container = entry.getAttribute('role') === 'tab'
814
+ ? entry.closest('[data-docs-focus-group="root"]')
815
+ : entry.closest('[data-docs-focus-group="member"]');
816
+ if (container) {
817
+ const editors = Array.from(container.querySelectorAll('[contenteditable="true"], [contenteditable="plaintext-only"]')).filter((e) => {
818
+ return window.getComputedStyle(e).display !== 'none' && e.offsetParent !== null;
819
+ });
820
+ if (editors.length > 0 && editors[0]) {
821
+ editors[0].focus({ preventScroll: true });
822
+ const sel = window.getSelection();
823
+ const range = document.createRange();
824
+ range.selectNodeContents(editors[0]);
825
+ range.collapse(true);
826
+ sel?.removeAllRanges();
827
+ sel?.addRange(range);
828
+ }
829
+ }
830
+ }, 100);
831
+ return;
832
+ }
833
+ if (bCursor.current && (key === 'Tab' || key === 'Enter')) {
834
+ e.preventDefault();
835
+ e.stopPropagation();
836
+ const cur = bCursor.current;
837
+ if (!cur)
838
+ return;
839
+ const tgt = (e.shiftKey
840
+ ? focusables(cur.wrapper, true).at(-1)
841
+ : focusables(cur.wrapper, true)[0]) ??
842
+ (e.shiftKey ? focusables(cur.wrapper).at(-1) : focusables(cur.wrapper)[0]);
843
+ if (!tgt) {
844
+ const ce = cur.wrapper.querySelector('[contenteditable="true"], [contenteditable="plaintext-only"]');
845
+ if (ce) {
846
+ clear();
847
+ ce.focus({ preventScroll: true });
848
+ }
849
+ return;
850
+ }
851
+ clear();
852
+ focusTgt(tgt, e.shiftKey ? 'left' : 'right');
853
+ return;
854
+ }
855
+ // If bCursor is active, we let standard copy/cut/paste combos fall completely
856
+ // through to Lexical to handle natively without intercepting!
857
+ if (bCursor.current &&
858
+ (e.metaKey || e.ctrlKey) &&
859
+ ['c', 'x', 'v'].includes(key.toLowerCase())) {
860
+ if (key.toLowerCase() === 'x')
861
+ requestAnimationFrame(() => {
862
+ clear();
863
+ });
864
+ return;
865
+ }
866
+ const dir = key === 'ArrowLeft' || key === 'ArrowUp' || key === 'Backspace'
867
+ ? 'left'
868
+ : key === 'ArrowRight' || key === 'ArrowDown' || key === 'Delete'
869
+ ? 'right'
870
+ : null;
871
+ if (!dir)
872
+ return;
873
+ const isVertical = key === 'ArrowUp' || key === 'ArrowDown';
874
+ if (!bCursor.current &&
875
+ (tgt?.closest([
876
+ 'input',
877
+ 'textarea',
878
+ 'select',
879
+ '[contenteditable="plaintext-only"]',
880
+ '.cm-editor',
881
+ 'td',
882
+ 'th',
883
+ INTERACTIVE,
884
+ ].join(', ')) ||
885
+ (closestEditable && closestEditable !== getActiveEditable())))
886
+ return;
887
+ if (bCursor.current) {
888
+ // Lexical will securely handle node deletion for Backspace/Delete, just visually clean up.
889
+ if (key === 'Backspace' || key === 'Delete') {
890
+ clear();
891
+ return;
892
+ }
893
+ e.preventDefault();
894
+ e.stopPropagation();
895
+ const cur = bCursor.current;
896
+ if (!cur)
897
+ return;
898
+ const dir = key === 'ArrowLeft' || key === 'ArrowUp' ? 'left' : 'right';
899
+ const isVertical = key === 'ArrowUp' || key === 'ArrowDown';
900
+ const decs = gDecs(isVertical);
901
+ const i = decs.indexOf(cur.dec);
902
+ const adjacent = i === -1 ? null : (decs[i + (dir === 'right' ? 1 : -1)] ?? null);
903
+ if (isVertical &&
904
+ adjacent &&
905
+ !(() => {
906
+ const body = getActiveEditable();
907
+ if (!body)
908
+ return false;
909
+ const walker = document.createTreeWalker(body, NodeFilter.SHOW_TEXT, {
910
+ acceptNode: (n) => n.textContent?.replace(TerraQualityRegex.REGEX_U200B_G_REGEX(), '').trim()
911
+ ? NodeFilter.FILTER_ACCEPT
912
+ : NodeFilter.FILTER_SKIP,
913
+ });
914
+ const first = cur.dec.compareDocumentPosition(adjacent) & Node.DOCUMENT_POSITION_FOLLOWING
915
+ ? cur.dec
916
+ : adjacent;
917
+ let text = walker.nextNode();
918
+ while (text) {
919
+ if (text instanceof Text && isLocalText(text))
920
+ if (first.compareDocumentPosition(text) & Node.DOCUMENT_POSITION_FOLLOWING &&
921
+ (first === cur.dec ? adjacent : cur.dec).compareDocumentPosition(text) &
922
+ Node.DOCUMENT_POSITION_PRECEDING)
923
+ return true;
924
+ text = walker.nextNode();
925
+ }
926
+ return false;
927
+ })()) {
928
+ focusBlock(adjacent, dir);
929
+ return;
930
+ }
931
+ const body = getActiveEditable();
932
+ const selection = window.getSelection();
933
+ if (body && selection) {
934
+ const walker = document.createTreeWalker(body, NodeFilter.SHOW_TEXT, {
935
+ acceptNode: (n) => n.textContent?.replace(TerraQualityRegex.REGEX_U200B_G_REGEX(), '').trim()
936
+ ? NodeFilter.FILTER_ACCEPT
937
+ : NodeFilter.FILTER_SKIP,
938
+ });
939
+ let candidate = null;
940
+ let node = walker.nextNode();
941
+ while (node) {
942
+ if (node instanceof Text && isLocalText(node)) {
943
+ const relation = cur.dec.compareDocumentPosition(node);
944
+ if (dir === 'right' && relation & Node.DOCUMENT_POSITION_FOLLOWING) {
945
+ candidate = node;
946
+ break;
947
+ }
948
+ if (dir === 'left' && relation & Node.DOCUMENT_POSITION_PRECEDING)
949
+ candidate = node;
950
+ }
951
+ node = walker.nextNode();
952
+ }
953
+ body.focus({ preventScroll: true });
954
+ const range = document.createRange();
955
+ if (candidate)
956
+ range.setStart(candidate, dir === 'right' ? 0 : (candidate.textContent?.length ?? 0));
957
+ else if (dir === 'left')
958
+ range.setStartBefore(cur.dec);
959
+ else
960
+ range.setStartAfter(cur.dec);
961
+ range.collapse(true);
962
+ selection.removeAllRanges();
963
+ selection.addRange(range);
964
+ }
965
+ clear();
966
+ return;
967
+ }
968
+ if (key !== 'ArrowLeft' &&
969
+ key !== 'ArrowRight' &&
970
+ key !== 'ArrowUp' &&
971
+ key !== 'ArrowDown')
972
+ return;
973
+ const dec = (() => {
974
+ const range = getCollapsedRange();
975
+ if (!range)
976
+ return null;
977
+ const decs = gDecs(isVertical);
978
+ let exact;
979
+ if (dir === 'right') {
980
+ exact = decs.find((d) => {
981
+ const edge = document.createRange();
982
+ edge.setStartBefore(d);
983
+ edge.collapse(true);
984
+ return (range.compareBoundaryPoints(Range.START_TO_START, edge) === 0 &&
985
+ range.compareBoundaryPoints(Range.END_TO_END, edge) === 0);
986
+ });
987
+ }
988
+ else {
989
+ for (let i = decs.length - 1; i >= 0; i--) {
990
+ const d = decs[i];
991
+ const edge = document.createRange();
992
+ edge.setStartAfter(d);
993
+ edge.collapse(true);
994
+ if (range.compareBoundaryPoints(Range.START_TO_START, edge) === 0 &&
995
+ range.compareBoundaryPoints(Range.END_TO_END, edge) === 0) {
996
+ exact = d;
997
+ break;
998
+ }
999
+ }
1000
+ }
1001
+ if (exact)
1002
+ return gDec(exact);
1003
+ const block = (range.startContainer instanceof Element
1004
+ ? range.startContainer
1005
+ : range.startContainer.parentElement)?.closest('p, li, blockquote, h2, h3, h4, h5, h6, td, th') ?? null;
1006
+ if (!block || !isLocalText(block))
1007
+ return null;
1008
+ const walker = document.createTreeWalker(block, NodeFilter.SHOW_TEXT, {
1009
+ acceptNode: (n) => n.textContent?.replace(TerraQualityRegex.REGEX_U200B_G_REGEX(), '').trim()
1010
+ ? NodeFilter.FILTER_ACCEPT
1011
+ : NodeFilter.FILTER_SKIP,
1012
+ });
1013
+ const textNodes = [];
1014
+ let text = walker.nextNode();
1015
+ while (text) {
1016
+ if (text instanceof Text)
1017
+ textNodes.push(text);
1018
+ text = walker.nextNode();
1019
+ }
1020
+ const tgt = dir === 'right' ? textNodes[textNodes.length - 1] : textNodes[0];
1021
+ if (!tgt)
1022
+ return null;
1023
+ const textRange = document.createRange();
1024
+ textRange.setStart(tgt, dir === 'right' ? (tgt.textContent?.length ?? 0) : 0);
1025
+ textRange.collapse(true);
1026
+ if (range.compareBoundaryPoints(Range.START_TO_START, textRange) === 0 &&
1027
+ range.compareBoundaryPoints(Range.END_TO_END, textRange) === 0) {
1028
+ if (dir === 'right') {
1029
+ return (decs.find((d) => !!(d.compareDocumentPosition(tgt) & Node.DOCUMENT_POSITION_PRECEDING)) ?? null);
1030
+ }
1031
+ for (let i = decs.length - 1; i >= 0; i--) {
1032
+ const d = decs[i];
1033
+ if (d.compareDocumentPosition(tgt) & Node.DOCUMENT_POSITION_FOLLOWING)
1034
+ return d;
1035
+ }
1036
+ }
1037
+ return null;
1038
+ })();
1039
+ if (isVertical) {
1040
+ if (dec) {
1041
+ e.preventDefault();
1042
+ e.stopPropagation();
1043
+ focusBlock(dec, dir);
1044
+ return;
1045
+ }
1046
+ if (!nearestAdjacent(dir, isVertical) ||
1047
+ !window.getSelection()?.modify)
1048
+ return;
1049
+ e.preventDefault();
1050
+ e.stopPropagation();
1051
+ const adjacent = nearestAdjacent(dir, true);
1052
+ if (!adjacent)
1053
+ return;
1054
+ const selection = window.getSelection();
1055
+ const anchor = selection?.anchorNode ?? null;
1056
+ vPending.current = {
1057
+ beforeAnchor: anchor,
1058
+ beforeBlock: (anchor instanceof Element ? anchor : anchor?.parentElement)?.closest('p, li, blockquote, h2, h3, h4, h5, h6, td, th') ?? null,
1059
+ before: selection?.rangeCount && selection.isCollapsed
1060
+ ? selection.getRangeAt(0).cloneRange()
1061
+ : null,
1062
+ beforeRect: caretRect(dir),
1063
+ dec: adjacent,
1064
+ dir,
1065
+ };
1066
+ window.cancelAnimationFrame(vCursor.current);
1067
+ vCursor.current = window.requestAnimationFrame(() => {
1068
+ (function settle(attempt = 0) {
1069
+ vCursor.current = 0;
1070
+ const pending = vPending.current;
1071
+ if (!pending?.dec || bCursor.current)
1072
+ return void (vPending.current = null);
1073
+ const selected = selectedDec(true);
1074
+ if (selected) {
1075
+ vPending.current = null;
1076
+ focusBlock(selected, pending.dir);
1077
+ return;
1078
+ }
1079
+ const currSelection = window.getSelection();
1080
+ if (currSelection?.anchorNode && pending.dec.contains(currSelection.anchorNode)) {
1081
+ vPending.current = null;
1082
+ focusBlock(pending.dec, pending.dir);
1083
+ return;
1084
+ }
1085
+ if (pending.dec &&
1086
+ passedDec(pending.dec, pending.dir, pending.beforeAnchor, pending.beforeBlock, pending.before, pending.beforeRect)) {
1087
+ vPending.current = null;
1088
+ focusBlock(pending.dec, pending.dir);
1089
+ return;
1090
+ }
1091
+ if (attempt >= 5)
1092
+ return void (vPending.current = null);
1093
+ vCursor.current = window.requestAnimationFrame(() => settle(attempt + 1));
1094
+ })(0);
1095
+ });
1096
+ const verticalSelection = window.getSelection();
1097
+ if (!verticalSelection?.rangeCount ||
1098
+ !verticalSelection.isCollapsed ||
1099
+ !verticalSelection.modify)
1100
+ return;
1101
+ verticalSelection.modify('move', dir === 'right' ? 'forward' : 'backward', 'line');
1102
+ const pending = vPending.current;
1103
+ if (!pending?.dec)
1104
+ return;
1105
+ const selected = selectedDec(true);
1106
+ if (selected) {
1107
+ vPending.current = null;
1108
+ focusBlock(selected, dir);
1109
+ return;
1110
+ }
1111
+ if (pending.dec &&
1112
+ passedDec(pending.dec, pending.dir, pending.beforeAnchor, pending.beforeBlock, pending.before, pending.beforeRect)) {
1113
+ vPending.current = null;
1114
+ focusBlock(pending.dec, dir);
1115
+ }
1116
+ return;
1117
+ }
1118
+ if (!dec)
1119
+ return;
1120
+ e.preventDefault();
1121
+ e.stopPropagation();
1122
+ focus(dec, dir === 'right' ? 'left' : 'right');
1123
+ }
1124
+ catch (err) {
1125
+ console.error('[docs:edit] Key down event failed', err);
1126
+ }
1127
+ },
1128
+ /**
1129
+ * On selection change.
1130
+ *
1131
+ */
1132
+ onSelectionChange() {
1133
+ try {
1134
+ snapshotSelection();
1135
+ const sel = window.getSelection();
1136
+ const p = vPending.current;
1137
+ if (!bCursor.current && p?.dec) {
1138
+ const dec = selectedDec(true);
1139
+ if (dec) {
1140
+ vPending.current = null;
1141
+ window.cancelAnimationFrame(vCursor.current);
1142
+ focusBlock(dec, p.dir);
1143
+ return;
1144
+ }
1145
+ if (sel?.anchorNode && p.dec.contains(sel.anchorNode)) {
1146
+ vPending.current = null;
1147
+ window.cancelAnimationFrame(vCursor.current);
1148
+ focusBlock(p.dec, p.dir);
1149
+ return;
1150
+ }
1151
+ if (passedDec(p.dec, p.dir, p.beforeAnchor, p.beforeBlock, p.before, p.beforeRect)) {
1152
+ vPending.current = null;
1153
+ window.cancelAnimationFrame(vCursor.current);
1154
+ focusBlock(p.dec, p.dir);
1155
+ return;
1156
+ }
1157
+ }
1158
+ const { current: cur } = bCursor;
1159
+ if (!cur)
1160
+ return;
1161
+ if (!cur.dec.isConnected || !cur.wrapper.isConnected) {
1162
+ if (restore())
1163
+ return;
1164
+ window.cancelAnimationFrame(restoreCursor.current);
1165
+ restoreCursor.current = window.requestAnimationFrame(() => {
1166
+ (function retryRestore(attempt = 0) {
1167
+ if (restore())
1168
+ return;
1169
+ if (attempt >= 12) {
1170
+ clear();
1171
+ return;
1172
+ }
1173
+ restoreCursor.current = window.requestAnimationFrame(() => retryRestore(attempt + 1));
1174
+ })(0);
1175
+ });
1176
+ return;
1177
+ }
1178
+ if (isToolbarTgt(document.activeElement)) {
1179
+ restoreSavedSelection('selectionchange-toolbar');
1180
+ return;
1181
+ }
1182
+ if (!sel?.rangeCount)
1183
+ return;
1184
+ if (!sel.isCollapsed) {
1185
+ const range = sel.getRangeAt(0);
1186
+ if (range.startContainer === range.endContainer &&
1187
+ range.endOffset - range.startOffset === 1) {
1188
+ const selNode = range.startContainer.childNodes[range.startOffset];
1189
+ if (selNode &&
1190
+ (selNode === cur.dec || cur.dec.contains(selNode) || cur.wrapper.contains(selNode)))
1191
+ return;
1192
+ }
1193
+ if (cur.dec.contains(range.startContainer) ||
1194
+ cur.wrapper.contains(range.startContainer))
1195
+ return;
1196
+ clear();
1197
+ return;
1198
+ }
1199
+ if (!sel.anchorNode ||
1200
+ (!root()?.contains(sel.anchorNode) && sel.anchorNode !== document.body))
1201
+ clear();
1202
+ }
1203
+ catch (err) {
1204
+ console.error('[docs:edit] Selection change event failed', err);
1205
+ }
1206
+ },
1207
+ /**
1208
+ * On pointer down.
1209
+ *
1210
+ * @param e - Value passed to the helper.
1211
+ */
1212
+ onPointerDown(e) {
1213
+ try {
1214
+ const tgt = e.target instanceof HTMLElement ? e.target : null;
1215
+ if (tgt?.closest('[role="combobox"], [data-docs-navigation]'))
1216
+ return;
1217
+ snapshotSelection();
1218
+ if (isToolbarTgt(tgt)) {
1219
+ restoreSavedSelection('pointerdown-toolbar');
1220
+ return;
1221
+ }
1222
+ const block = tgt
1223
+ ?.closest('[data-block-gutter="true"]')
1224
+ ?.parentElement?.querySelector('[data-docs-editor-block], [data-editor-block], .docs-editor-block') ?? tgt?.closest('[data-docs-editor-block], [data-editor-block]');
1225
+ const dec = block?.closest('[data-lexical-decorator="true"]') ??
1226
+ tgt?.closest('[data-lexical-decorator="true"]') ??
1227
+ block;
1228
+ if (!dec || !refs.current?.body?.contains(dec)) {
1229
+ clear();
1230
+ return;
1231
+ }
1232
+ const eTgt = tgt?.closest(EDITABLE);
1233
+ const iTgt = tgt?.closest(INTERACTIVE);
1234
+ const wrap = dec.matches('[data-docs-editor-block]')
1235
+ ? dec
1236
+ : (dec.querySelector('[data-docs-editor-block]') ?? dec);
1237
+ const wrapState = {
1238
+ box: wrap.getBoundingClientRect(),
1239
+ sameBlock: bCursor.current?.wrapper === wrap ||
1240
+ (bCursor.current?.label === wrap.getAttribute('data-docs-editor-block') &&
1241
+ bCursor.current?.gId ===
1242
+ (wrap.matches('[data-docs-focus-group-id]')
1243
+ ? wrap
1244
+ : wrap.querySelector('[data-docs-focus-group-id]'))?.getAttribute('data-docs-focus-group-id')),
1245
+ };
1246
+ if ((eTgt && dec.contains(eTgt)) || (iTgt && dec.contains(iTgt))) {
1247
+ if (bCursor.current)
1248
+ clear();
1249
+ return;
1250
+ }
1251
+ const gId = tgt
1252
+ ?.closest('[data-docs-focus-group-id]')
1253
+ ?.getAttribute('data-docs-focus-group-id') ?? null;
1254
+ if (gId && bCursor.current?.gId !== gId) {
1255
+ const gRoot = root()?.querySelector(`[data-docs-focus-group="root"][data-docs-focus-group-id="${gId}"]`);
1256
+ const gDec = gRoot?.closest('[data-lexical-decorator="true"]') ?? dec;
1257
+ const gBox = (gRoot ?? gDec).getBoundingClientRect();
1258
+ e.preventDefault();
1259
+ e.stopPropagation();
1260
+ focus(gDec, e.clientX - gBox.left > gBox.width / 2 ? 'right' : 'left');
1261
+ return;
1262
+ }
1263
+ e.preventDefault();
1264
+ e.stopPropagation();
1265
+ if (wrapState.sameBlock)
1266
+ return;
1267
+ focus(dec, e.clientX - wrapState.box.left > wrapState.box.width / 2 ? 'right' : 'left');
1268
+ }
1269
+ catch (err) {
1270
+ console.error('[docs:edit] Pointer down event failed', err);
1271
+ }
1272
+ },
1273
+ /**
1274
+ * Selects a decorator block from its surrounding interactive ring.
1275
+ *
1276
+ * @param e Ring selection event emitted by the visual block wrapper.
1277
+ *
1278
+ * @returns Completion after the decorator becomes the active block selection.
1279
+ */
1280
+ onBlockSelect(e) {
1281
+ const decorator = e.detail?.decorator;
1282
+ if (!(decorator instanceof HTMLElement) || !refs.current.body?.contains(decorator))
1283
+ return;
1284
+ focus(decorator, decorator.getBoundingClientRect().width > 0 ? 'left' : 'right');
1285
+ const block = decorator.querySelector('[data-docs-editor-block], .docs-math-wrapper, [data-math-code], [data-docs-view-root="true"]');
1286
+ if (block)
1287
+ document.dispatchEvent(new CustomEvent('docs:block-selected', { detail: { block } }));
1288
+ },
1289
+ };
1290
+ document.addEventListener('keydown', eHandlers.onKeyDown, true);
1291
+ document.addEventListener('selectionchange', eHandlers.onSelectionChange);
1292
+ document.addEventListener('pointerdown', eHandlers.onPointerDown, true);
1293
+ document.addEventListener('docs:block-select', eHandlers.onBlockSelect);
1294
+ return () => {
1295
+ window.cancelAnimationFrame(restoreCursor.current);
1296
+ window.cancelAnimationFrame(vCursor.current);
1297
+ vPending.current = null;
1298
+ clear();
1299
+ document.removeEventListener('keydown', eHandlers.onKeyDown, true);
1300
+ document.removeEventListener('selectionchange', eHandlers.onSelectionChange);
1301
+ document.removeEventListener('pointerdown', eHandlers.onPointerDown, true);
1302
+ document.removeEventListener('docs:block-select', eHandlers.onBlockSelect);
1303
+ };
1304
+ }, [refs]);
1305
+ }
1306
+ //# sourceMappingURL=use-block-nav.js.map