@cloudvoyant/helical-svelte 0.19.0

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 (545) hide show
  1. package/dist/Badge.svelte +24 -0
  2. package/dist/Badge.svelte.d.ts +12 -0
  3. package/dist/Button.svelte +35 -0
  4. package/dist/Button.svelte.d.ts +14 -0
  5. package/dist/Center.svelte +21 -0
  6. package/dist/Center.svelte.d.ts +9 -0
  7. package/dist/Chart.svelte +52 -0
  8. package/dist/Chart.svelte.d.ts +22 -0
  9. package/dist/Col.svelte +21 -0
  10. package/dist/Col.svelte.d.ts +9 -0
  11. package/dist/Container.svelte +21 -0
  12. package/dist/Container.svelte.d.ts +9 -0
  13. package/dist/CopyButton.svelte +58 -0
  14. package/dist/CopyButton.svelte.d.ts +12 -0
  15. package/dist/Figure.svelte +32 -0
  16. package/dist/Figure.svelte.d.ts +14 -0
  17. package/dist/HStack.svelte +21 -0
  18. package/dist/HStack.svelte.d.ts +9 -0
  19. package/dist/InlineLaTeX.svelte +34 -0
  20. package/dist/InlineLaTeX.svelte.d.ts +9 -0
  21. package/dist/Input.svelte +17 -0
  22. package/dist/Input.svelte.d.ts +8 -0
  23. package/dist/Item.svelte +22 -0
  24. package/dist/Item.svelte.d.ts +10 -0
  25. package/dist/LaTeX.svelte +34 -0
  26. package/dist/LaTeX.svelte.d.ts +9 -0
  27. package/dist/Manim.svelte +119 -0
  28. package/dist/Manim.svelte.d.ts +12 -0
  29. package/dist/Mermaid.svelte +92 -0
  30. package/dist/Mermaid.svelte.d.ts +14 -0
  31. package/dist/Notice.svelte +87 -0
  32. package/dist/Notice.svelte.d.ts +12 -0
  33. package/dist/Page.svelte +27 -0
  34. package/dist/Page.svelte.d.ts +10 -0
  35. package/dist/PageContent.svelte +21 -0
  36. package/dist/PageContent.svelte.d.ts +9 -0
  37. package/dist/PageFooter.svelte +21 -0
  38. package/dist/PageFooter.svelte.d.ts +9 -0
  39. package/dist/PageGutter.svelte +37 -0
  40. package/dist/PageGutter.svelte.d.ts +12 -0
  41. package/dist/PageSection.svelte +21 -0
  42. package/dist/PageSection.svelte.d.ts +9 -0
  43. package/dist/Portal.svelte +11 -0
  44. package/dist/Portal.svelte.d.ts +4 -0
  45. package/dist/PrevNext.svelte +47 -0
  46. package/dist/PrevNext.svelte.d.ts +15 -0
  47. package/dist/Reveal.svelte +40 -0
  48. package/dist/Reveal.svelte.d.ts +9 -0
  49. package/dist/Row.svelte +21 -0
  50. package/dist/Row.svelte.d.ts +9 -0
  51. package/dist/Scroll.svelte +72 -0
  52. package/dist/Scroll.svelte.d.ts +14 -0
  53. package/dist/Splitter.svelte +12 -0
  54. package/dist/Splitter.svelte.d.ts +4 -0
  55. package/dist/SplitterPanel.svelte +12 -0
  56. package/dist/SplitterPanel.svelte.d.ts +4 -0
  57. package/dist/SplitterResizeTrigger.svelte +15 -0
  58. package/dist/SplitterResizeTrigger.svelte.d.ts +4 -0
  59. package/dist/SplitterResizeTriggerIndicator.svelte +15 -0
  60. package/dist/SplitterResizeTriggerIndicator.svelte.d.ts +4 -0
  61. package/dist/Stack.svelte +21 -0
  62. package/dist/Stack.svelte.d.ts +9 -0
  63. package/dist/Textarea.svelte +14 -0
  64. package/dist/Textarea.svelte.d.ts +4 -0
  65. package/dist/ToggleButton.svelte +18 -0
  66. package/dist/ToggleButton.svelte.d.ts +9 -0
  67. package/dist/ToggleButtonIndicator.svelte +9 -0
  68. package/dist/ToggleButtonIndicator.svelte.d.ts +4 -0
  69. package/dist/VStack.svelte +21 -0
  70. package/dist/VStack.svelte.d.ts +9 -0
  71. package/dist/YouTube.svelte +81 -0
  72. package/dist/YouTube.svelte.d.ts +13 -0
  73. package/dist/YoutubeTimestampAt.svelte +20 -0
  74. package/dist/YoutubeTimestampAt.svelte.d.ts +10 -0
  75. package/dist/YoutubeTimestamps.svelte +100 -0
  76. package/dist/YoutubeTimestamps.svelte.d.ts +11 -0
  77. package/dist/card/Card.svelte +34 -0
  78. package/dist/card/Card.svelte.d.ts +12 -0
  79. package/dist/card/CardBody.svelte +21 -0
  80. package/dist/card/CardBody.svelte.d.ts +9 -0
  81. package/dist/card/CardCover.svelte +26 -0
  82. package/dist/card/CardCover.svelte.d.ts +11 -0
  83. package/dist/card/CardDescription.svelte +21 -0
  84. package/dist/card/CardDescription.svelte.d.ts +9 -0
  85. package/dist/card/CardFooter.svelte +21 -0
  86. package/dist/card/CardFooter.svelte.d.ts +9 -0
  87. package/dist/card/CardHeader.svelte +21 -0
  88. package/dist/card/CardHeader.svelte.d.ts +9 -0
  89. package/dist/card/CardTitle.svelte +22 -0
  90. package/dist/card/CardTitle.svelte.d.ts +10 -0
  91. package/dist/card/index.d.ts +7 -0
  92. package/dist/card/index.js +8 -0
  93. package/dist/checkbox/Checkbox.svelte +23 -0
  94. package/dist/checkbox/Checkbox.svelte.d.ts +8 -0
  95. package/dist/checkbox/CheckboxContext.svelte.d.ts +1 -0
  96. package/dist/checkbox/CheckboxContext.svelte.js +3 -0
  97. package/dist/checkbox/CheckboxControl.svelte +17 -0
  98. package/dist/checkbox/CheckboxControl.svelte.d.ts +4 -0
  99. package/dist/checkbox/CheckboxGroup.svelte +14 -0
  100. package/dist/checkbox/CheckboxGroup.svelte.d.ts +4 -0
  101. package/dist/checkbox/CheckboxIndicator.svelte +14 -0
  102. package/dist/checkbox/CheckboxIndicator.svelte.d.ts +4 -0
  103. package/dist/checkbox/CheckboxLabel.svelte +14 -0
  104. package/dist/checkbox/CheckboxLabel.svelte.d.ts +4 -0
  105. package/dist/checkbox/index.d.ts +6 -0
  106. package/dist/checkbox/index.js +7 -0
  107. package/dist/code-block/CodeBlock.svelte +67 -0
  108. package/dist/code-block/CodeBlock.svelte.d.ts +17 -0
  109. package/dist/code-block/CodeBlockContent.svelte +19 -0
  110. package/dist/code-block/CodeBlockContent.svelte.d.ts +8 -0
  111. package/dist/code-block/CodeBlockContext.svelte.d.ts +11 -0
  112. package/dist/code-block/CodeBlockContext.svelte.js +7 -0
  113. package/dist/code-block/CodeBlockCopyButton.svelte +19 -0
  114. package/dist/code-block/CodeBlockCopyButton.svelte.d.ts +8 -0
  115. package/dist/code-block/CodeBlockHeader.svelte +15 -0
  116. package/dist/code-block/CodeBlockHeader.svelte.d.ts +9 -0
  117. package/dist/code-block/CodeBlockTitle.svelte +15 -0
  118. package/dist/code-block/CodeBlockTitle.svelte.d.ts +9 -0
  119. package/dist/code-block/CodeRenderer.svelte +78 -0
  120. package/dist/code-block/CodeRenderer.svelte.d.ts +12 -0
  121. package/dist/code-block/LanguageTabsCodeBlock.svelte +119 -0
  122. package/dist/code-block/LanguageTabsCodeBlock.svelte.d.ts +12 -0
  123. package/dist/code-block/MultiFileCodeBlock.svelte +75 -0
  124. package/dist/code-block/MultiFileCodeBlock.svelte.d.ts +12 -0
  125. package/dist/code-block/index.d.ts +7 -0
  126. package/dist/code-block/index.js +8 -0
  127. package/dist/combobox/Combobox.svelte +25 -0
  128. package/dist/combobox/Combobox.svelte.d.ts +9 -0
  129. package/dist/combobox/ComboboxClear.svelte +14 -0
  130. package/dist/combobox/ComboboxClear.svelte.d.ts +4 -0
  131. package/dist/combobox/ComboboxContent.svelte +19 -0
  132. package/dist/combobox/ComboboxContent.svelte.d.ts +4 -0
  133. package/dist/combobox/ComboboxContext.svelte.d.ts +1 -0
  134. package/dist/combobox/ComboboxContext.svelte.js +3 -0
  135. package/dist/combobox/ComboboxControl.svelte +14 -0
  136. package/dist/combobox/ComboboxControl.svelte.d.ts +4 -0
  137. package/dist/combobox/ComboboxEmpty.svelte +18 -0
  138. package/dist/combobox/ComboboxEmpty.svelte.d.ts +4 -0
  139. package/dist/combobox/ComboboxInput.svelte +17 -0
  140. package/dist/combobox/ComboboxInput.svelte.d.ts +8 -0
  141. package/dist/combobox/ComboboxItem.svelte +22 -0
  142. package/dist/combobox/ComboboxItem.svelte.d.ts +10 -0
  143. package/dist/combobox/ComboboxItemGroup.svelte +11 -0
  144. package/dist/combobox/ComboboxItemGroup.svelte.d.ts +4 -0
  145. package/dist/combobox/ComboboxItemGroupLabel.svelte +14 -0
  146. package/dist/combobox/ComboboxItemGroupLabel.svelte.d.ts +4 -0
  147. package/dist/combobox/ComboboxItemIndicator.svelte +14 -0
  148. package/dist/combobox/ComboboxItemIndicator.svelte.d.ts +4 -0
  149. package/dist/combobox/ComboboxItemText.svelte +11 -0
  150. package/dist/combobox/ComboboxItemText.svelte.d.ts +4 -0
  151. package/dist/combobox/ComboboxList.svelte +14 -0
  152. package/dist/combobox/ComboboxList.svelte.d.ts +4 -0
  153. package/dist/combobox/ComboboxTrigger.svelte +14 -0
  154. package/dist/combobox/ComboboxTrigger.svelte.d.ts +4 -0
  155. package/dist/combobox/index.d.ts +14 -0
  156. package/dist/combobox/index.js +15 -0
  157. package/dist/dialog/Dialog.svelte +11 -0
  158. package/dist/dialog/Dialog.svelte.d.ts +4 -0
  159. package/dist/dialog/DialogBackdrop.svelte +17 -0
  160. package/dist/dialog/DialogBackdrop.svelte.d.ts +7 -0
  161. package/dist/dialog/DialogContent.svelte +22 -0
  162. package/dist/dialog/DialogContent.svelte.d.ts +9 -0
  163. package/dist/dialog/DialogContext.svelte.d.ts +1 -0
  164. package/dist/dialog/DialogContext.svelte.js +3 -0
  165. package/dist/dialog/DialogDescription.svelte +16 -0
  166. package/dist/dialog/DialogDescription.svelte.d.ts +7 -0
  167. package/dist/dialog/DialogDismiss.svelte +16 -0
  168. package/dist/dialog/DialogDismiss.svelte.d.ts +7 -0
  169. package/dist/dialog/DialogFooter.svelte +20 -0
  170. package/dist/dialog/DialogFooter.svelte.d.ts +9 -0
  171. package/dist/dialog/DialogHeader.svelte +20 -0
  172. package/dist/dialog/DialogHeader.svelte.d.ts +9 -0
  173. package/dist/dialog/DialogProvider.svelte +11 -0
  174. package/dist/dialog/DialogProvider.svelte.d.ts +4 -0
  175. package/dist/dialog/DialogRender.svelte +9 -0
  176. package/dist/dialog/DialogRender.svelte.d.ts +4 -0
  177. package/dist/dialog/DialogTitle.svelte +16 -0
  178. package/dist/dialog/DialogTitle.svelte.d.ts +7 -0
  179. package/dist/dialog/DialogTrigger.svelte +13 -0
  180. package/dist/dialog/DialogTrigger.svelte.d.ts +7 -0
  181. package/dist/dialog/index.d.ts +12 -0
  182. package/dist/dialog/index.js +13 -0
  183. package/dist/editor/BookmarkInput.svelte +107 -0
  184. package/dist/editor/BookmarkInput.svelte.d.ts +13 -0
  185. package/dist/editor/BubbleMenu.svelte +412 -0
  186. package/dist/editor/BubbleMenu.svelte.d.ts +7 -0
  187. package/dist/editor/CodeBlockComponent.svelte +307 -0
  188. package/dist/editor/CodeBlockComponent.svelte.d.ts +4 -0
  189. package/dist/editor/CursorOverlay.svelte +99 -0
  190. package/dist/editor/CursorOverlay.svelte.d.ts +15 -0
  191. package/dist/editor/Editor.svelte +646 -0
  192. package/dist/editor/Editor.svelte.d.ts +27 -0
  193. package/dist/editor/FontColorPicker.svelte +102 -0
  194. package/dist/editor/FontColorPicker.svelte.d.ts +9 -0
  195. package/dist/editor/ImageFileUpload.svelte +70 -0
  196. package/dist/editor/ImageFileUpload.svelte.d.ts +8 -0
  197. package/dist/editor/ImageInput.svelte +189 -0
  198. package/dist/editor/ImageInput.svelte.d.ts +11 -0
  199. package/dist/editor/ImageNodeView.svelte +116 -0
  200. package/dist/editor/ImageNodeView.svelte.d.ts +4 -0
  201. package/dist/editor/LinkEditPopover.svelte +95 -0
  202. package/dist/editor/LinkEditPopover.svelte.d.ts +9 -0
  203. package/dist/editor/LinkPreviewCard.svelte +83 -0
  204. package/dist/editor/LinkPreviewCard.svelte.d.ts +4 -0
  205. package/dist/editor/MentionList.svelte +184 -0
  206. package/dist/editor/MentionList.svelte.d.ts +13 -0
  207. package/dist/editor/NoticeNodeView.svelte +57 -0
  208. package/dist/editor/NoticeNodeView.svelte.d.ts +4 -0
  209. package/dist/editor/Reader.svelte +284 -0
  210. package/dist/editor/Reader.svelte.d.ts +7 -0
  211. package/dist/editor/SlashMenu.svelte +124 -0
  212. package/dist/editor/SlashMenu.svelte.d.ts +9 -0
  213. package/dist/editor/UrlMentionPill.svelte +29 -0
  214. package/dist/editor/UrlMentionPill.svelte.d.ts +4 -0
  215. package/dist/editor/YouTubeInput.svelte +81 -0
  216. package/dist/editor/YouTubeInput.svelte.d.ts +9 -0
  217. package/dist/editor/index.d.ts +4 -0
  218. package/dist/editor/index.js +4 -0
  219. package/dist/field/Field.svelte +14 -0
  220. package/dist/field/Field.svelte.d.ts +4 -0
  221. package/dist/field/FieldContext.svelte.d.ts +1 -0
  222. package/dist/field/FieldContext.svelte.js +3 -0
  223. package/dist/field/FieldError.svelte +14 -0
  224. package/dist/field/FieldError.svelte.d.ts +4 -0
  225. package/dist/field/FieldHelper.svelte +14 -0
  226. package/dist/field/FieldHelper.svelte.d.ts +4 -0
  227. package/dist/field/FieldLabel.svelte +14 -0
  228. package/dist/field/FieldLabel.svelte.d.ts +4 -0
  229. package/dist/field/FieldRequiredIndicator.svelte +14 -0
  230. package/dist/field/FieldRequiredIndicator.svelte.d.ts +4 -0
  231. package/dist/field/FieldSet.svelte +14 -0
  232. package/dist/field/FieldSet.svelte.d.ts +4 -0
  233. package/dist/field/FieldSetError.svelte +14 -0
  234. package/dist/field/FieldSetError.svelte.d.ts +4 -0
  235. package/dist/field/FieldSetHelper.svelte +14 -0
  236. package/dist/field/FieldSetHelper.svelte.d.ts +4 -0
  237. package/dist/field/FieldSetLegend.svelte +14 -0
  238. package/dist/field/FieldSetLegend.svelte.d.ts +4 -0
  239. package/dist/field/index.d.ts +10 -0
  240. package/dist/field/index.js +11 -0
  241. package/dist/index.d.ts +61 -0
  242. package/dist/index.js +62 -0
  243. package/dist/listbox/Listbox.svelte +33 -0
  244. package/dist/listbox/Listbox.svelte.d.ts +12 -0
  245. package/dist/listbox/ListboxContent.svelte +18 -0
  246. package/dist/listbox/ListboxContent.svelte.d.ts +9 -0
  247. package/dist/listbox/ListboxContext.svelte.d.ts +1 -0
  248. package/dist/listbox/ListboxContext.svelte.js +3 -0
  249. package/dist/listbox/ListboxEmpty.svelte +14 -0
  250. package/dist/listbox/ListboxEmpty.svelte.d.ts +9 -0
  251. package/dist/listbox/ListboxInput.svelte +14 -0
  252. package/dist/listbox/ListboxInput.svelte.d.ts +7 -0
  253. package/dist/listbox/ListboxItem.svelte +20 -0
  254. package/dist/listbox/ListboxItem.svelte.d.ts +10 -0
  255. package/dist/listbox/ListboxItemIndicator.svelte +14 -0
  256. package/dist/listbox/ListboxItemIndicator.svelte.d.ts +9 -0
  257. package/dist/listbox/ListboxItemText.svelte +14 -0
  258. package/dist/listbox/ListboxItemText.svelte.d.ts +9 -0
  259. package/dist/listbox/ListboxLabel.svelte +14 -0
  260. package/dist/listbox/ListboxLabel.svelte.d.ts +9 -0
  261. package/dist/listbox/index.d.ts +9 -0
  262. package/dist/listbox/index.js +10 -0
  263. package/dist/navbar/NavbarActions.svelte +25 -0
  264. package/dist/navbar/NavbarActions.svelte.d.ts +9 -0
  265. package/dist/navbar/NavbarActivationArea.svelte +30 -0
  266. package/dist/navbar/NavbarActivationArea.svelte.d.ts +9 -0
  267. package/dist/navbar/NavbarBrand.svelte +25 -0
  268. package/dist/navbar/NavbarBrand.svelte.d.ts +9 -0
  269. package/dist/navbar/NavbarContext.svelte.d.ts +25 -0
  270. package/dist/navbar/NavbarContext.svelte.js +14 -0
  271. package/dist/navbar/NavbarMenu.svelte +61 -0
  272. package/dist/navbar/NavbarMenu.svelte.d.ts +10 -0
  273. package/dist/navbar/NavbarMenuContent.svelte +16 -0
  274. package/dist/navbar/NavbarMenuContent.svelte.d.ts +4 -0
  275. package/dist/navbar/NavbarMenuContext.svelte.d.ts +8 -0
  276. package/dist/navbar/NavbarMenuContext.svelte.js +14 -0
  277. package/dist/navbar/NavbarMenuIndicator.svelte +12 -0
  278. package/dist/navbar/NavbarMenuIndicator.svelte.d.ts +4 -0
  279. package/dist/navbar/NavbarMenuItem.svelte +34 -0
  280. package/dist/navbar/NavbarMenuItem.svelte.d.ts +8 -0
  281. package/dist/navbar/NavbarMenuLink.svelte +18 -0
  282. package/dist/navbar/NavbarMenuLink.svelte.d.ts +4 -0
  283. package/dist/navbar/NavbarMenuList.svelte +14 -0
  284. package/dist/navbar/NavbarMenuList.svelte.d.ts +4 -0
  285. package/dist/navbar/NavbarMenuTrigger.svelte +30 -0
  286. package/dist/navbar/NavbarMenuTrigger.svelte.d.ts +4 -0
  287. package/dist/navbar/NavbarMenuViewport.svelte +12 -0
  288. package/dist/navbar/NavbarMenuViewport.svelte.d.ts +4 -0
  289. package/dist/navbar/NavbarMenuViewportPositioner.svelte +17 -0
  290. package/dist/navbar/NavbarMenuViewportPositioner.svelte.d.ts +4 -0
  291. package/dist/navbar/NavbarMobileMenu.svelte +14 -0
  292. package/dist/navbar/NavbarMobileMenu.svelte.d.ts +4 -0
  293. package/dist/navbar/NavbarMobileMenuContent.svelte +23 -0
  294. package/dist/navbar/NavbarMobileMenuContent.svelte.d.ts +9 -0
  295. package/dist/navbar/NavbarMobileMenuTrigger.svelte +26 -0
  296. package/dist/navbar/NavbarMobileMenuTrigger.svelte.d.ts +4 -0
  297. package/dist/navbar/NavbarMobileOverlay.svelte +85 -0
  298. package/dist/navbar/NavbarMobileOverlay.svelte.d.ts +9 -0
  299. package/dist/navbar/NavbarProvider.svelte +83 -0
  300. package/dist/navbar/NavbarProvider.svelte.d.ts +8 -0
  301. package/dist/navbar/NavbarRoot.svelte +142 -0
  302. package/dist/navbar/NavbarRoot.svelte.d.ts +13 -0
  303. package/dist/navbar/NavbarTrigger.svelte +60 -0
  304. package/dist/navbar/NavbarTrigger.svelte.d.ts +10 -0
  305. package/dist/navbar/index.d.ts +22 -0
  306. package/dist/navbar/index.js +28 -0
  307. package/dist/number-input/NumberInput.svelte +14 -0
  308. package/dist/number-input/NumberInput.svelte.d.ts +4 -0
  309. package/dist/number-input/NumberInputContext.svelte.d.ts +1 -0
  310. package/dist/number-input/NumberInputContext.svelte.js +3 -0
  311. package/dist/number-input/NumberInputControl.svelte +14 -0
  312. package/dist/number-input/NumberInputControl.svelte.d.ts +4 -0
  313. package/dist/number-input/NumberInputDecrement.svelte +14 -0
  314. package/dist/number-input/NumberInputDecrement.svelte.d.ts +4 -0
  315. package/dist/number-input/NumberInputIncrement.svelte +14 -0
  316. package/dist/number-input/NumberInputIncrement.svelte.d.ts +4 -0
  317. package/dist/number-input/NumberInputInput.svelte +12 -0
  318. package/dist/number-input/NumberInputInput.svelte.d.ts +4 -0
  319. package/dist/number-input/index.d.ts +6 -0
  320. package/dist/number-input/index.js +7 -0
  321. package/dist/pagination/Pagination.svelte +35 -0
  322. package/dist/pagination/Pagination.svelte.d.ts +4 -0
  323. package/dist/pagination/PaginationEllipsis.svelte +26 -0
  324. package/dist/pagination/PaginationEllipsis.svelte.d.ts +4 -0
  325. package/dist/pagination/PaginationItem.svelte +14 -0
  326. package/dist/pagination/PaginationItem.svelte.d.ts +4 -0
  327. package/dist/pagination/PaginationItems.svelte +21 -0
  328. package/dist/pagination/PaginationItems.svelte.d.ts +18 -0
  329. package/dist/pagination/PaginationNext.svelte +29 -0
  330. package/dist/pagination/PaginationNext.svelte.d.ts +4 -0
  331. package/dist/pagination/PaginationPrevious.svelte +29 -0
  332. package/dist/pagination/PaginationPrevious.svelte.d.ts +4 -0
  333. package/dist/pagination/index.d.ts +6 -0
  334. package/dist/pagination/index.js +7 -0
  335. package/dist/popover/Popover.svelte +11 -0
  336. package/dist/popover/Popover.svelte.d.ts +4 -0
  337. package/dist/popover/PopoverAnchor.svelte +13 -0
  338. package/dist/popover/PopoverAnchor.svelte.d.ts +7 -0
  339. package/dist/popover/PopoverContent.svelte +35 -0
  340. package/dist/popover/PopoverContent.svelte.d.ts +8 -0
  341. package/dist/popover/PopoverContext.svelte.d.ts +1 -0
  342. package/dist/popover/PopoverContext.svelte.js +3 -0
  343. package/dist/popover/PopoverDescription.svelte +16 -0
  344. package/dist/popover/PopoverDescription.svelte.d.ts +7 -0
  345. package/dist/popover/PopoverDismiss.svelte +16 -0
  346. package/dist/popover/PopoverDismiss.svelte.d.ts +7 -0
  347. package/dist/popover/PopoverIndicator.svelte +16 -0
  348. package/dist/popover/PopoverIndicator.svelte.d.ts +7 -0
  349. package/dist/popover/PopoverProvider.svelte +11 -0
  350. package/dist/popover/PopoverProvider.svelte.d.ts +4 -0
  351. package/dist/popover/PopoverTitle.svelte +16 -0
  352. package/dist/popover/PopoverTitle.svelte.d.ts +7 -0
  353. package/dist/popover/PopoverTrigger.svelte +13 -0
  354. package/dist/popover/PopoverTrigger.svelte.d.ts +7 -0
  355. package/dist/popover/index.d.ts +10 -0
  356. package/dist/popover/index.js +11 -0
  357. package/dist/prose/Prose.svelte +23 -0
  358. package/dist/prose/Prose.svelte.d.ts +11 -0
  359. package/dist/prose/index.d.ts +1 -0
  360. package/dist/prose/index.js +2 -0
  361. package/dist/questions/MultipleChoiceQuestion.svelte +167 -0
  362. package/dist/questions/MultipleChoiceQuestion.svelte.d.ts +19 -0
  363. package/dist/questions/NumericQuestion.svelte +139 -0
  364. package/dist/questions/NumericQuestion.svelte.d.ts +20 -0
  365. package/dist/questions/Quiz.svelte +119 -0
  366. package/dist/questions/Quiz.svelte.d.ts +11 -0
  367. package/dist/questions/SingleChoiceQuestion.svelte +141 -0
  368. package/dist/questions/SingleChoiceQuestion.svelte.d.ts +19 -0
  369. package/dist/questions/index.d.ts +4 -0
  370. package/dist/questions/index.js +5 -0
  371. package/dist/radio-group/RadioGroup.svelte +16 -0
  372. package/dist/radio-group/RadioGroup.svelte.d.ts +7 -0
  373. package/dist/radio-group/RadioGroupItem.svelte +26 -0
  374. package/dist/radio-group/RadioGroupItem.svelte.d.ts +7 -0
  375. package/dist/radio-group/index.d.ts +2 -0
  376. package/dist/radio-group/index.js +3 -0
  377. package/dist/select/Select.svelte +70 -0
  378. package/dist/select/Select.svelte.d.ts +11 -0
  379. package/dist/select/SelectClearTrigger.svelte +14 -0
  380. package/dist/select/SelectClearTrigger.svelte.d.ts +4 -0
  381. package/dist/select/SelectContent.svelte +19 -0
  382. package/dist/select/SelectContent.svelte.d.ts +4 -0
  383. package/dist/select/SelectContext.svelte.d.ts +1 -0
  384. package/dist/select/SelectContext.svelte.js +3 -0
  385. package/dist/select/SelectIndicator.svelte +14 -0
  386. package/dist/select/SelectIndicator.svelte.d.ts +4 -0
  387. package/dist/select/SelectItem.svelte +21 -0
  388. package/dist/select/SelectItem.svelte.d.ts +9 -0
  389. package/dist/select/SelectItemGroup.svelte +11 -0
  390. package/dist/select/SelectItemGroup.svelte.d.ts +4 -0
  391. package/dist/select/SelectItemGroupLabel.svelte +14 -0
  392. package/dist/select/SelectItemGroupLabel.svelte.d.ts +4 -0
  393. package/dist/select/SelectItemIndicator.svelte +14 -0
  394. package/dist/select/SelectItemIndicator.svelte.d.ts +4 -0
  395. package/dist/select/SelectItemText.svelte +14 -0
  396. package/dist/select/SelectItemText.svelte.d.ts +4 -0
  397. package/dist/select/SelectNative.svelte +73 -0
  398. package/dist/select/SelectNative.svelte.d.ts +16 -0
  399. package/dist/select/SelectTrigger.svelte +19 -0
  400. package/dist/select/SelectTrigger.svelte.d.ts +8 -0
  401. package/dist/select/SelectValue.svelte +18 -0
  402. package/dist/select/SelectValue.svelte.d.ts +4 -0
  403. package/dist/select/index.d.ts +13 -0
  404. package/dist/select/index.js +14 -0
  405. package/dist/sidebar/Content.svelte +19 -0
  406. package/dist/sidebar/Content.svelte.d.ts +9 -0
  407. package/dist/sidebar/Footer.svelte +19 -0
  408. package/dist/sidebar/Footer.svelte.d.ts +9 -0
  409. package/dist/sidebar/Group.svelte +27 -0
  410. package/dist/sidebar/Group.svelte.d.ts +10 -0
  411. package/dist/sidebar/GroupAction.svelte +28 -0
  412. package/dist/sidebar/GroupAction.svelte.d.ts +10 -0
  413. package/dist/sidebar/Header.svelte +19 -0
  414. package/dist/sidebar/Header.svelte.d.ts +9 -0
  415. package/dist/sidebar/Input.svelte +21 -0
  416. package/dist/sidebar/Input.svelte.d.ts +7 -0
  417. package/dist/sidebar/Inset.svelte +19 -0
  418. package/dist/sidebar/Inset.svelte.d.ts +9 -0
  419. package/dist/sidebar/Menu.svelte +19 -0
  420. package/dist/sidebar/Menu.svelte.d.ts +9 -0
  421. package/dist/sidebar/MenuAction.svelte +34 -0
  422. package/dist/sidebar/MenuAction.svelte.d.ts +11 -0
  423. package/dist/sidebar/MenuBadge.svelte +25 -0
  424. package/dist/sidebar/MenuBadge.svelte.d.ts +9 -0
  425. package/dist/sidebar/MenuButton.svelte +80 -0
  426. package/dist/sidebar/MenuButton.svelte.d.ts +18 -0
  427. package/dist/sidebar/MenuItem.svelte +25 -0
  428. package/dist/sidebar/MenuItem.svelte.d.ts +9 -0
  429. package/dist/sidebar/MenuLink.svelte +66 -0
  430. package/dist/sidebar/MenuLink.svelte.d.ts +21 -0
  431. package/dist/sidebar/MenuSkeleton.svelte +38 -0
  432. package/dist/sidebar/MenuSkeleton.svelte.d.ts +8 -0
  433. package/dist/sidebar/MenuSub.svelte +25 -0
  434. package/dist/sidebar/MenuSub.svelte.d.ts +9 -0
  435. package/dist/sidebar/MenuSubButton.svelte +31 -0
  436. package/dist/sidebar/MenuSubButton.svelte.d.ts +12 -0
  437. package/dist/sidebar/MenuSubItem.svelte +25 -0
  438. package/dist/sidebar/MenuSubItem.svelte.d.ts +9 -0
  439. package/dist/sidebar/Provider.svelte +103 -0
  440. package/dist/sidebar/Provider.svelte.d.ts +12 -0
  441. package/dist/sidebar/Rail.svelte +32 -0
  442. package/dist/sidebar/Rail.svelte.d.ts +7 -0
  443. package/dist/sidebar/Root.svelte +109 -0
  444. package/dist/sidebar/Root.svelte.d.ts +15 -0
  445. package/dist/sidebar/Separator.svelte +22 -0
  446. package/dist/sidebar/Separator.svelte.d.ts +7 -0
  447. package/dist/sidebar/Trigger.svelte +34 -0
  448. package/dist/sidebar/Trigger.svelte.d.ts +9 -0
  449. package/dist/sidebar/context.svelte.d.ts +4 -0
  450. package/dist/sidebar/context.svelte.js +14 -0
  451. package/dist/sidebar/index.d.ts +24 -0
  452. package/dist/sidebar/index.js +28 -0
  453. package/dist/switch/Switch.svelte +23 -0
  454. package/dist/switch/Switch.svelte.d.ts +8 -0
  455. package/dist/switch/SwitchContext.svelte.d.ts +1 -0
  456. package/dist/switch/SwitchContext.svelte.js +3 -0
  457. package/dist/switch/SwitchControl.svelte +17 -0
  458. package/dist/switch/SwitchControl.svelte.d.ts +4 -0
  459. package/dist/switch/SwitchLabel.svelte +14 -0
  460. package/dist/switch/SwitchLabel.svelte.d.ts +4 -0
  461. package/dist/switch/SwitchThumb.svelte +12 -0
  462. package/dist/switch/SwitchThumb.svelte.d.ts +4 -0
  463. package/dist/switch/index.d.ts +5 -0
  464. package/dist/switch/index.js +6 -0
  465. package/dist/tabs/Tabs.svelte +24 -0
  466. package/dist/tabs/Tabs.svelte.d.ts +4 -0
  467. package/dist/tabs/TabsContent.svelte +14 -0
  468. package/dist/tabs/TabsContent.svelte.d.ts +4 -0
  469. package/dist/tabs/TabsContext.svelte.d.ts +1 -0
  470. package/dist/tabs/TabsContext.svelte.js +3 -0
  471. package/dist/tabs/TabsList.svelte +20 -0
  472. package/dist/tabs/TabsList.svelte.d.ts +7 -0
  473. package/dist/tabs/TabsTrigger.svelte +14 -0
  474. package/dist/tabs/TabsTrigger.svelte.d.ts +4 -0
  475. package/dist/tabs/index.d.ts +5 -0
  476. package/dist/tabs/index.js +6 -0
  477. package/dist/tags-input/TagInput.svelte +19 -0
  478. package/dist/tags-input/TagInput.svelte.d.ts +4 -0
  479. package/dist/tags-input/TagInputClearTrigger.svelte +14 -0
  480. package/dist/tags-input/TagInputClearTrigger.svelte.d.ts +4 -0
  481. package/dist/tags-input/TagInputContext.svelte.d.ts +1 -0
  482. package/dist/tags-input/TagInputContext.svelte.js +3 -0
  483. package/dist/tags-input/TagInputControl.svelte +14 -0
  484. package/dist/tags-input/TagInputControl.svelte.d.ts +4 -0
  485. package/dist/tags-input/TagInputInput.svelte +12 -0
  486. package/dist/tags-input/TagInputInput.svelte.d.ts +4 -0
  487. package/dist/tags-input/TagInputItem.svelte +14 -0
  488. package/dist/tags-input/TagInputItem.svelte.d.ts +4 -0
  489. package/dist/tags-input/TagInputItemDeleteTrigger.svelte +14 -0
  490. package/dist/tags-input/TagInputItemDeleteTrigger.svelte.d.ts +4 -0
  491. package/dist/tags-input/TagInputItemInput.svelte +12 -0
  492. package/dist/tags-input/TagInputItemInput.svelte.d.ts +4 -0
  493. package/dist/tags-input/TagInputItemPreview.svelte +11 -0
  494. package/dist/tags-input/TagInputItemPreview.svelte.d.ts +4 -0
  495. package/dist/tags-input/TagInputItemText.svelte +14 -0
  496. package/dist/tags-input/TagInputItemText.svelte.d.ts +4 -0
  497. package/dist/tags-input/index.d.ts +11 -0
  498. package/dist/tags-input/index.js +12 -0
  499. package/dist/toggle-group/ToggleGroup.svelte +28 -0
  500. package/dist/toggle-group/ToggleGroup.svelte.d.ts +11 -0
  501. package/dist/toggle-group/ToggleGroupItem.svelte +28 -0
  502. package/dist/toggle-group/ToggleGroupItem.svelte.d.ts +11 -0
  503. package/dist/toggle-group/index.d.ts +2 -0
  504. package/dist/toggle-group/index.js +3 -0
  505. package/dist/tooltip/Tooltip.svelte +11 -0
  506. package/dist/tooltip/Tooltip.svelte.d.ts +4 -0
  507. package/dist/tooltip/TooltipContent.svelte +35 -0
  508. package/dist/tooltip/TooltipContent.svelte.d.ts +8 -0
  509. package/dist/tooltip/TooltipContext.svelte.d.ts +1 -0
  510. package/dist/tooltip/TooltipContext.svelte.js +3 -0
  511. package/dist/tooltip/TooltipProvider.svelte +11 -0
  512. package/dist/tooltip/TooltipProvider.svelte.d.ts +4 -0
  513. package/dist/tooltip/TooltipRender.svelte +9 -0
  514. package/dist/tooltip/TooltipRender.svelte.d.ts +3 -0
  515. package/dist/tooltip/TooltipTrigger.svelte +13 -0
  516. package/dist/tooltip/TooltipTrigger.svelte.d.ts +7 -0
  517. package/dist/tooltip/index.d.ts +6 -0
  518. package/dist/tooltip/index.js +7 -0
  519. package/dist/window/Window.svelte +34 -0
  520. package/dist/window/Window.svelte.d.ts +10 -0
  521. package/dist/window/WindowBody.svelte +16 -0
  522. package/dist/window/WindowBody.svelte.d.ts +7 -0
  523. package/dist/window/WindowContext.svelte.d.ts +1 -0
  524. package/dist/window/WindowContext.svelte.js +3 -0
  525. package/dist/window/WindowControl.svelte +16 -0
  526. package/dist/window/WindowControl.svelte.d.ts +7 -0
  527. package/dist/window/WindowDismiss.svelte +16 -0
  528. package/dist/window/WindowDismiss.svelte.d.ts +7 -0
  529. package/dist/window/WindowDragTrigger.svelte +16 -0
  530. package/dist/window/WindowDragTrigger.svelte.d.ts +7 -0
  531. package/dist/window/WindowHeader.svelte +16 -0
  532. package/dist/window/WindowHeader.svelte.d.ts +7 -0
  533. package/dist/window/WindowProvider.svelte +11 -0
  534. package/dist/window/WindowProvider.svelte.d.ts +4 -0
  535. package/dist/window/WindowRender.svelte +9 -0
  536. package/dist/window/WindowRender.svelte.d.ts +4 -0
  537. package/dist/window/WindowResizeTrigger.svelte +16 -0
  538. package/dist/window/WindowResizeTrigger.svelte.d.ts +7 -0
  539. package/dist/window/WindowStageTrigger.svelte +16 -0
  540. package/dist/window/WindowStageTrigger.svelte.d.ts +7 -0
  541. package/dist/window/WindowTitle.svelte +16 -0
  542. package/dist/window/WindowTitle.svelte.d.ts +7 -0
  543. package/dist/window/index.d.ts +12 -0
  544. package/dist/window/index.js +13 -0
  545. package/package.json +68 -0
@@ -0,0 +1,646 @@
1
+ <script lang="ts">
2
+ import { onMount, onDestroy } from 'svelte';
3
+ import { Editor, type EditorOptions } from '@tiptap/core';
4
+ import { SvelteNodeViewRenderer } from 'svelte-tiptap';
5
+ import {
6
+ buildExtensions,
7
+ registerImageInsertCallback,
8
+ unregisterImageInsertCallback,
9
+ insertPastedUrlAsLink,
10
+ type SlashCommandItem,
11
+ type MentionItem,
12
+ type MentionListElement,
13
+ type EditorCounts,
14
+ type ImageUploadResult,
15
+ type LinkPreviewAttributes,
16
+ } from '@cloudvoyant/helical-ui';
17
+ import BubbleMenuContent from './BubbleMenu.svelte';
18
+ import SlashMenu from './SlashMenu.svelte';
19
+ import BookmarkInput from './BookmarkInput.svelte';
20
+ import ImageInput from './ImageInput.svelte';
21
+ import YouTubeInput from './YouTubeInput.svelte';
22
+ import ImageNodeView from './ImageNodeView.svelte';
23
+ import UrlMentionPill from './UrlMentionPill.svelte';
24
+ import LinkPreviewCard from './LinkPreviewCard.svelte';
25
+ import CodeBlockComponent from './CodeBlockComponent.svelte';
26
+ import NoticeNodeView from './NoticeNodeView.svelte';
27
+ import MentionList from './MentionList.svelte';
28
+ import CursorOverlay from './CursorOverlay.svelte';
29
+ import type { SuggestionProps } from '@tiptap/suggestion';
30
+ import type { JSONContent } from '@tiptap/core';
31
+
32
+ let {
33
+ content = '',
34
+ editable = true,
35
+ enforceTitle = true,
36
+ onchange,
37
+ mentionSource,
38
+ hrefBuilder,
39
+ onUpload,
40
+ fetchLinkPreview,
41
+ }: {
42
+ content?: string;
43
+ editable?: boolean;
44
+ /** Keep the required first H1 title. Disable for compact inputs such as mentions. */
45
+ enforceTitle?: boolean;
46
+ onchange?: (data: { content: string; title: string }) => void;
47
+ /** Seam: replaces the source editor's hardcoded internal-search endpoint. */
48
+ mentionSource?: (query: string) => Promise<MentionItem[]>;
49
+ /** Seam: replaces the source editor's hardcoded /read/... hrefs. */
50
+ hrefBuilder?: (item: MentionItem) => string;
51
+ /** Seam: replaces the source editor's app-specific image upload. */
52
+ onUpload?: (file: File) => Promise<ImageUploadResult>;
53
+ /** Resolve Open Graph or SEO metadata for bookmark cards. */
54
+ fetchLinkPreview?: (url: string) => Promise<Omit<LinkPreviewAttributes, 'url' | 'type'>>;
55
+ } = $props();
56
+
57
+ let editor = $state<Editor | null>(null);
58
+ let element: HTMLDivElement;
59
+ let slashMenuProps = $state<SuggestionProps<SlashCommandItem> | null>(null);
60
+ // The mention menu renders from the template (like the slash menu) rather than being mounted
61
+ // into document.body: that is the pattern already proven to work in this component, and it
62
+ // keeps keydown delegation on a bound element instead of a detached mount.
63
+ let mentionMenuProps = $state<SuggestionProps<MentionItem> | null>(null);
64
+ let mentionMenuCoords = $state({ left: 0, top: 0 });
65
+ let mentionMenuEl = $state<HTMLElement | null>(null);
66
+ let slashMenuCoords = $state({ left: 0, top: 0 });
67
+ let slashMenuSurface = $state<HTMLDivElement | null>(null);
68
+ let bookmarkInputActive = $state(false);
69
+ let bookmarkInputPosition = $state(0);
70
+ let imageInputActive = $state(false);
71
+ let imageInputPosition = $state(0);
72
+ let youTubeInputActive = $state(false);
73
+ let youTubeInputPosition = $state(0);
74
+
75
+ type SlashCommandInsertStorage = {
76
+ slashCommands: { onInsertYouTube?: (position: number) => void };
77
+ };
78
+
79
+ function registerYouTubeInsert(editorInstance: Editor, callback: (position: number) => void) {
80
+ // SAFETY: the shared slashCommands extension owns this per-editor storage object and
81
+ // initializes `onInsertYouTube`; Tiptap exposes extension storage as an open bag.
82
+ (editorInstance.storage as unknown as SlashCommandInsertStorage).slashCommands.onInsertYouTube = callback;
83
+ }
84
+
85
+ function unregisterYouTubeInsert(editorInstance: Editor) {
86
+ // SAFETY: same extension-owned storage invariant as registerYouTubeInsert.
87
+ (editorInstance.storage as unknown as SlashCommandInsertStorage).slashCommands.onInsertYouTube = undefined;
88
+ }
89
+
90
+ type OverlayPlacementOptions = { width: number; height: number; gap?: number; viewportGap?: number };
91
+
92
+ // Mirror helical-ui's placement helpers locally because this package's editor source is checked
93
+ // before newly-built helical-ui declarations are always available in workspace tooling.
94
+ function placeEditorOverlay(
95
+ rect: Pick<DOMRect, 'left' | 'top' | 'bottom'>,
96
+ { width, height, gap = 8, viewportGap = 16 }: OverlayPlacementOptions,
97
+ ) {
98
+ const spaceBelow = window.innerHeight - rect.bottom;
99
+ const spaceAbove = rect.top;
100
+ const preferredTop =
101
+ spaceBelow < height && spaceAbove > spaceBelow ? rect.top - height - gap : rect.bottom + gap;
102
+ return {
103
+ left: Math.min(
104
+ Math.max(rect.left, viewportGap),
105
+ Math.max(window.innerWidth - width - viewportGap, viewportGap),
106
+ ),
107
+ top: Math.min(
108
+ Math.max(preferredTop, viewportGap),
109
+ Math.max(window.innerHeight - height - viewportGap, viewportGap),
110
+ ),
111
+ };
112
+ }
113
+
114
+ function findEditorScrollContainer(editorElement: HTMLElement): HTMLElement | null {
115
+ let current = editorElement.parentElement;
116
+ while (current && current !== document.body) {
117
+ const overflowY = window.getComputedStyle(current).overflowY;
118
+ if (/(auto|scroll)/.test(overflowY) && current.scrollHeight > current.clientHeight) return current;
119
+ current = current.parentElement;
120
+ }
121
+ return null;
122
+ }
123
+
124
+ const SLASH_OVERLAY = { width: 288, height: 288 };
125
+ const IMAGE_OVERLAY = { width: 320, height: 480, gap: 4 };
126
+ const BOOKMARK_OVERLAY = { width: 320, height: 240, gap: 4 };
127
+ const YOUTUBE_OVERLAY = { width: 320, height: 220, gap: 4 };
128
+
129
+ function updateSlashMenuPosition() {
130
+ const props = slashMenuProps;
131
+ if (!props) return;
132
+ const rect = props.editor.view.coordsAtPos(props.range.to);
133
+ const itemCount = props.items?.length || 0;
134
+ slashMenuCoords = placeEditorOverlay(rect, {
135
+ width: slashMenuSurface?.offsetWidth || SLASH_OVERLAY.width,
136
+ height:
137
+ slashMenuSurface?.offsetHeight || Math.min(Math.max(itemCount, 1) * 32 + 8, SLASH_OVERLAY.height),
138
+ gap: 4,
139
+ });
140
+ }
141
+
142
+ // Reposition on every suggestion update and while any ancestor scrolls, so a fixed menu remains
143
+ // attached to the slash cursor rather than being left behind in the viewport.
144
+ $effect(() => {
145
+ if (slashMenuProps) updateSlashMenuPosition();
146
+ });
147
+
148
+ $effect(() => {
149
+ if (!slashMenuProps) return;
150
+ const surface = slashMenuSurface;
151
+ const observer = surface ? new ResizeObserver(updateSlashMenuPosition) : null;
152
+ if (surface) observer?.observe(surface);
153
+ updateSlashMenuPosition();
154
+ window.addEventListener('scroll', updateSlashMenuPosition, true);
155
+ window.addEventListener('resize', updateSlashMenuPosition);
156
+ return () => {
157
+ observer?.disconnect();
158
+ window.removeEventListener('scroll', updateSlashMenuPosition, true);
159
+ window.removeEventListener('resize', updateSlashMenuPosition);
160
+ };
161
+ });
162
+
163
+ // The slash suggestion is not a cursor-overlay component, so keep its equivalent lock here.
164
+ // Insertion forms use CursorOverlay below.
165
+ $effect(() => {
166
+ const activeMenu = slashMenuProps;
167
+ const editorInstance = editor;
168
+ if (!activeMenu || !editorInstance) return;
169
+ const container = findEditorScrollContainer(editorInstance.view.dom);
170
+ if (!container) return;
171
+ const preventWheel = (event: WheelEvent) => {
172
+ const target = event.target;
173
+ if (target instanceof Node && slashMenuSurface?.contains(target)) return;
174
+ event.preventDefault();
175
+ };
176
+ container.addEventListener('wheel', preventWheel, { passive: false });
177
+ return () => container.removeEventListener('wheel', preventWheel);
178
+ });
179
+
180
+ // Extract title from content (first H1)
181
+ function extractTitle(json: JSONContent): string {
182
+ if (json && json.content && json.content[0]?.type === 'heading' && json.content[0]?.attrs?.level === 1) {
183
+ return json.content[0]?.content?.[0]?.text || '';
184
+ }
185
+ return '';
186
+ }
187
+
188
+ onMount(() => {
189
+ // Cleanup any existing editor first (helps with hot reload)
190
+ if (editor) {
191
+ editor.destroy();
192
+ editor = null;
193
+ }
194
+
195
+ const nodeViews = {
196
+ image: () => SvelteNodeViewRenderer(ImageNodeView),
197
+ urlMention: () => SvelteNodeViewRenderer(UrlMentionPill),
198
+ linkPreview: () => SvelteNodeViewRenderer(LinkPreviewCard),
199
+ codeBlock: () => SvelteNodeViewRenderer(CodeBlockComponent),
200
+ notice: () => SvelteNodeViewRenderer(NoticeNodeView),
201
+ };
202
+
203
+ editor = new Editor({
204
+ element,
205
+ ...({ immediatelyRender: false } as unknown as Partial<EditorOptions>),
206
+ extensions: buildExtensions({
207
+ mentionSource,
208
+ hrefBuilder,
209
+ enforceTitle,
210
+ nodeViews,
211
+ mentionRender: () => ({
212
+ onStart: (props: SuggestionProps<MentionItem>) => {
213
+ mentionMenuProps = props;
214
+ const rect = props.clientRect?.();
215
+ if (rect) mentionMenuCoords = { left: rect.left, top: rect.bottom + 8 };
216
+ },
217
+ onUpdate: (props: SuggestionProps<MentionItem>) => {
218
+ mentionMenuProps = props;
219
+ const rect = props.clientRect?.();
220
+ if (rect) mentionMenuCoords = { left: rect.left, top: rect.bottom + 8 };
221
+ },
222
+ onKeyDown: (props: { event: KeyboardEvent }) => {
223
+ if (props.event.key === 'Escape') {
224
+ props.event.preventDefault();
225
+ props.event.stopPropagation();
226
+ return true;
227
+ }
228
+ // MentionList exposes its handler on the element (see its $effect).
229
+ const child = mentionMenuEl?.firstElementChild as MentionListElement | null;
230
+ return child?.__mentionListKeyDown?.(props.event) ?? false;
231
+ },
232
+ onExit: () => {
233
+ mentionMenuProps = null;
234
+ },
235
+ }),
236
+ // The slash menu is rendered from this component's template (see `slashMenuProps`).
237
+ slashRender: () => ({
238
+ onStart: (props: SuggestionProps<SlashCommandItem>) => {
239
+ slashMenuProps = props;
240
+ },
241
+ onUpdate: (props: SuggestionProps<SlashCommandItem>) => {
242
+ slashMenuProps = props;
243
+ },
244
+ onExit: () => {
245
+ slashMenuProps = null;
246
+ },
247
+ }),
248
+ }),
249
+ content: content
250
+ ? JSON.parse(content)
251
+ : {
252
+ type: 'doc',
253
+ content: enforceTitle
254
+ ? [
255
+ {
256
+ type: 'heading',
257
+ attrs: { level: 1 },
258
+ content: [],
259
+ },
260
+ {
261
+ type: 'paragraph',
262
+ content: [],
263
+ },
264
+ ]
265
+ : [
266
+ {
267
+ type: 'paragraph',
268
+ content: [],
269
+ },
270
+ ],
271
+ },
272
+ editable,
273
+ onUpdate: ({ editor }) => {
274
+ const json = editor.getJSON();
275
+ const title = extractTitle(json);
276
+ const contentStr = JSON.stringify(json);
277
+ onchange?.({ content: contentStr, title });
278
+ },
279
+ editorProps: {
280
+ attributes: {
281
+ class: 'prose prose-lg focus:outline-none max-w-none min-h-[500px]',
282
+ },
283
+ handlePaste: insertPastedUrlAsLink,
284
+ },
285
+ });
286
+
287
+ // Register callback so the image slash command can directly set Svelte state
288
+ // (editor.storage mutations are not tracked by Svelte 5 $effect)
289
+ registerImageInsertCallback(editor!, (position) => {
290
+ imageInputPosition = position;
291
+ imageInputActive = true;
292
+ });
293
+
294
+ registerYouTubeInsert(editor!, (position: number) => {
295
+ youTubeInputPosition = position;
296
+ youTubeInputActive = true;
297
+ });
298
+ editor!.on('transaction', syncBookmarkInput);
299
+ });
300
+
301
+ interface BookmarkInputState {
302
+ active: boolean;
303
+ position: number;
304
+ }
305
+
306
+ function isBookmarkInputState(v: unknown): v is BookmarkInputState {
307
+ return typeof v === 'object' && v !== null && 'active' in v;
308
+ }
309
+
310
+ // Tiptap storage is not reactive, so observe transactions just like the React editor.
311
+ function syncBookmarkInput() {
312
+ if (!editor?.view) return;
313
+
314
+ const storage = editor.storage as unknown as Record<string, unknown>;
315
+ const bookmarkInput = storage['bookmarkInput'];
316
+ if (isBookmarkInputState(bookmarkInput) && bookmarkInput.active) {
317
+ bookmarkInputPosition = bookmarkInput.position;
318
+ bookmarkInputActive = true;
319
+ storage['bookmarkInput'] = { active: false };
320
+ }
321
+ }
322
+
323
+ onDestroy(() => {
324
+ if (editor) {
325
+ unregisterImageInsertCallback(editor);
326
+ unregisterYouTubeInsert(editor);
327
+ editor.off('transaction', syncBookmarkInput);
328
+ editor.destroy();
329
+ }
330
+ });
331
+
332
+ // Update editable state
333
+ $effect(() => {
334
+ if (editor) {
335
+ editor.setEditable(editable);
336
+ }
337
+ });
338
+
339
+ // Expose method to update content externally
340
+ export function updateContent(newContent: string) {
341
+ if (editor && newContent !== JSON.stringify(editor.getJSON())) {
342
+ try {
343
+ const parsed = JSON.parse(newContent);
344
+ editor.commands.setContent(parsed);
345
+ } catch (e) {
346
+ console.error('Failed to parse content:', e);
347
+ }
348
+ }
349
+ }
350
+
351
+ // Expose focus method
352
+ export function focus() {
353
+ if (editor) {
354
+ editor.commands.focus('start');
355
+ }
356
+ }
357
+
358
+ // Expose method to get analytics counts
359
+ export function getCounts(): EditorCounts {
360
+ if (!editor) {
361
+ return { wordCount: 0, charCount: 0, pageCount: 0, readDuration: 0 };
362
+ }
363
+
364
+ const wordCount = editor.storage.characterCount?.words() || 0;
365
+ const charCount = editor.storage.characterCount?.characters() || 0;
366
+ const pageCount = Math.max(1, Math.ceil(wordCount / 300));
367
+ const readDuration = Math.max(1, Math.ceil(wordCount / 250));
368
+
369
+ return { wordCount, charCount, pageCount, readDuration };
370
+ }
371
+ </script>
372
+
373
+ <div class="relative">
374
+ <div bind:this={element}></div>
375
+ {#if editor}
376
+ <BubbleMenuContent {editor} />
377
+ {#if slashMenuProps}
378
+ <div
379
+ bind:this={slashMenuSurface}
380
+ data-slash-menu-surface
381
+ class="fixed z-50"
382
+ style="left: {slashMenuCoords.left}px; top: {slashMenuCoords.top}px;"
383
+ >
384
+ <SlashMenu items={slashMenuProps.items || []} command={(item) => slashMenuProps?.command?.(item)} />
385
+ </div>
386
+ {/if}
387
+ {#if mentionMenuProps}
388
+ <div
389
+ bind:this={mentionMenuEl}
390
+ class="fixed z-50"
391
+ style="left: {mentionMenuCoords.left}px; top: {mentionMenuCoords.top}px;"
392
+ >
393
+ <MentionList
394
+ items={mentionMenuProps.items || []}
395
+ command={(item) => mentionMenuProps?.command?.(item)}
396
+ clientRect={mentionMenuProps.clientRect ?? null}
397
+ />
398
+ </div>
399
+ {/if}
400
+ {#if bookmarkInputActive}
401
+ <CursorOverlay
402
+ {editor}
403
+ position={bookmarkInputPosition}
404
+ width={BOOKMARK_OVERLAY.width}
405
+ height={BOOKMARK_OVERLAY.height}
406
+ gap={BOOKMARK_OVERLAY.gap}
407
+ >
408
+ <BookmarkInput
409
+ {editor}
410
+ {fetchLinkPreview}
411
+ position={bookmarkInputPosition}
412
+ onClose={() => {
413
+ bookmarkInputActive = false;
414
+ }}
415
+ />
416
+ </CursorOverlay>
417
+ {/if}
418
+ {#if imageInputActive}
419
+ <CursorOverlay
420
+ {editor}
421
+ position={imageInputPosition}
422
+ width={IMAGE_OVERLAY.width}
423
+ height={IMAGE_OVERLAY.height}
424
+ gap={IMAGE_OVERLAY.gap}
425
+ >
426
+ <ImageInput
427
+ {editor}
428
+ {onUpload}
429
+ position={imageInputPosition}
430
+ onClose={() => {
431
+ imageInputActive = false;
432
+ }}
433
+ />
434
+ </CursorOverlay>
435
+ {/if}
436
+ {#if youTubeInputActive}
437
+ <CursorOverlay
438
+ {editor}
439
+ position={youTubeInputPosition}
440
+ width={YOUTUBE_OVERLAY.width}
441
+ height={YOUTUBE_OVERLAY.height}
442
+ gap={YOUTUBE_OVERLAY.gap}
443
+ >
444
+ <YouTubeInput
445
+ {editor}
446
+ position={youTubeInputPosition}
447
+ onClose={() => {
448
+ youTubeInputActive = false;
449
+ }}
450
+ />
451
+ </CursorOverlay>
452
+ {/if}
453
+ {/if}
454
+ </div>
455
+
456
+ <style>
457
+ /* Text alignment - applies to both editor and read view */
458
+ :global([data-text-align='left']),
459
+ :global(.ProseMirror [data-text-align='left']) {
460
+ text-align: left !important;
461
+ }
462
+
463
+ :global([data-text-align='center']),
464
+ :global(.ProseMirror [data-text-align='center']) {
465
+ text-align: center !important;
466
+ }
467
+
468
+ :global([data-text-align='right']),
469
+ :global(.ProseMirror [data-text-align='right']) {
470
+ text-align: right !important;
471
+ }
472
+
473
+ :global([data-text-align='justify']),
474
+ :global(.ProseMirror [data-text-align='justify']) {
475
+ text-align: justify !important;
476
+ }
477
+
478
+ /* Text colors - theme-aware */
479
+ :global(.ProseMirror span[data-color='red']) {
480
+ color: var(--text-red);
481
+ }
482
+ :global(.ProseMirror span[data-color='orange']) {
483
+ color: var(--text-orange);
484
+ }
485
+ :global(.ProseMirror span[data-color='yellow']) {
486
+ color: var(--text-yellow);
487
+ }
488
+ :global(.ProseMirror span[data-color='green']) {
489
+ color: var(--text-green);
490
+ }
491
+ :global(.ProseMirror span[data-color='cyan']) {
492
+ color: var(--text-cyan);
493
+ }
494
+ :global(.ProseMirror span[data-color='blue']) {
495
+ color: var(--text-blue);
496
+ }
497
+ :global(.ProseMirror span[data-color='violet']) {
498
+ color: var(--text-violet);
499
+ }
500
+ :global(.ProseMirror span[data-color='fuchsia']) {
501
+ color: var(--text-fuchsia);
502
+ }
503
+ :global(.ProseMirror span[data-color='slate']) {
504
+ color: var(--text-slate);
505
+ }
506
+
507
+ /* Tiptap writes selected highlight colors inline. Keep only a non-important default so the
508
+ chosen color remains authoritative. */
509
+ :global(.ProseMirror mark) {
510
+ background-color: var(--highlight-yellow);
511
+ color: inherit !important;
512
+ }
513
+
514
+ /* Code block syntax highlighting */
515
+ :global(.ProseMirror pre) {
516
+ background-color: var(--code-block-bg);
517
+ border-radius: 0.5rem;
518
+ padding: 1rem;
519
+ overflow-x: auto;
520
+ font-family: 'JetBrains Mono', 'Fira Code', 'Monaco', 'Courier New', monospace;
521
+ font-size: calc(var(--base-font-size, 16px) * 0.875);
522
+ line-height: var(--line-height, 1.5);
523
+ border: 1px solid var(--code-block-border, #e5e5e5);
524
+ }
525
+
526
+ :global(.ProseMirror pre code) {
527
+ background: none;
528
+ padding: 0;
529
+ border-radius: 0;
530
+ font-size: inherit;
531
+ font-family: inherit;
532
+ }
533
+
534
+ /* ProseMirror container */
535
+ :global(.ProseMirror) {
536
+ position: relative;
537
+ }
538
+
539
+ /* List styling fixes */
540
+ :global(.ProseMirror ul),
541
+ :global(.ProseMirror ol) {
542
+ padding-left: 1.25rem !important;
543
+ margin: 1rem 0 !important;
544
+ }
545
+
546
+ :global(.ProseMirror li) {
547
+ display: list-item !important;
548
+ list-style-position: outside !important;
549
+ margin: 0.25rem 0 !important;
550
+ padding-left: 0.25rem !important;
551
+ }
552
+
553
+ :global(.ProseMirror ul > li) {
554
+ list-style-type: disc !important;
555
+ }
556
+
557
+ :global(.ProseMirror ol > li) {
558
+ list-style-type: decimal !important;
559
+ }
560
+
561
+ :global(.ProseMirror li p) {
562
+ display: inline !important;
563
+ margin: 0 !important;
564
+ }
565
+
566
+ :global(.ProseMirror ul[data-type='taskList']) {
567
+ list-style-type: none !important;
568
+ padding-left: 0 !important;
569
+ }
570
+
571
+ :global(.ProseMirror ul[data-type='taskList'] li) {
572
+ display: flex !important;
573
+ align-items: flex-start !important;
574
+ gap: 0.5rem !important;
575
+ list-style-type: none !important;
576
+ }
577
+
578
+ :global(.ProseMirror ul[data-type='taskList'] li > label) {
579
+ flex-shrink: 0 !important;
580
+ margin-top: 0.2rem !important;
581
+ }
582
+
583
+ :global(.ProseMirror ul[data-type='taskList'] li > div) {
584
+ flex: 1 !important;
585
+ }
586
+
587
+ :global(.ProseMirror ul[data-type='taskList'] li p) {
588
+ display: inline !important;
589
+ margin: 0 !important;
590
+ }
591
+
592
+ /* Indent styles */
593
+ :global(.ProseMirror .tt-indent-1) {
594
+ margin-left: 2rem !important;
595
+ }
596
+
597
+ :global(.ProseMirror .tt-indent-2) {
598
+ margin-left: 4rem !important;
599
+ }
600
+
601
+ :global(.ProseMirror .tt-indent-3) {
602
+ margin-left: 6rem !important;
603
+ }
604
+
605
+ :global(.ProseMirror .tt-indent-4) {
606
+ margin-left: 8rem !important;
607
+ }
608
+
609
+ :global(.ProseMirror .tt-indent-5) {
610
+ margin-left: 10rem !important;
611
+ }
612
+
613
+ :global(.ProseMirror .tt-indent-6) {
614
+ margin-left: 12rem !important;
615
+ }
616
+
617
+ :global(.ProseMirror .tt-indent-7) {
618
+ margin-left: 14rem !important;
619
+ }
620
+
621
+ :global(.ProseMirror .tt-indent-8) {
622
+ margin-left: 16rem !important;
623
+ }
624
+
625
+ /* Internal Mention - styled like regular links */
626
+ :global(.ProseMirror a.internal-mention) {
627
+ color: inherit;
628
+ text-decoration: underline;
629
+ cursor: text;
630
+ user-select: text;
631
+ -webkit-user-select: text;
632
+ }
633
+
634
+ :global(.ProseMirror a.internal-mention:hover) {
635
+ opacity: 0.8;
636
+ }
637
+
638
+ /* URL Mention Pills in Editor */
639
+ :global(.ProseMirror .url-mention-pill-edit) {
640
+ background-color: var(--url-pill-bg);
641
+ }
642
+
643
+ :global(.ProseMirror .url-mention-pill-edit:hover) {
644
+ background-color: var(--bookmark-bg-hover);
645
+ }
646
+ </style>
@@ -0,0 +1,27 @@
1
+ import { Editor } from '@tiptap/core';
2
+ import { type MentionItem, type EditorCounts, type ImageUploadResult, type LinkPreviewAttributes } from '@cloudvoyant/helical-ui';
3
+ type $$ComponentProps = {
4
+ content?: string;
5
+ editable?: boolean;
6
+ /** Keep the required first H1 title. Disable for compact inputs such as mentions. */
7
+ enforceTitle?: boolean;
8
+ onchange?: (data: {
9
+ content: string;
10
+ title: string;
11
+ }) => void;
12
+ /** Seam: replaces the source editor's hardcoded internal-search endpoint. */
13
+ mentionSource?: (query: string) => Promise<MentionItem[]>;
14
+ /** Seam: replaces the source editor's hardcoded /read/... hrefs. */
15
+ hrefBuilder?: (item: MentionItem) => string;
16
+ /** Seam: replaces the source editor's app-specific image upload. */
17
+ onUpload?: (file: File) => Promise<ImageUploadResult>;
18
+ /** Resolve Open Graph or SEO metadata for bookmark cards. */
19
+ fetchLinkPreview?: (url: string) => Promise<Omit<LinkPreviewAttributes, 'url' | 'type'>>;
20
+ };
21
+ declare const Editor: import("svelte").Component<$$ComponentProps, {
22
+ updateContent: (newContent: string) => void;
23
+ focus: () => void;
24
+ getCounts: () => EditorCounts;
25
+ }, "">;
26
+ type Editor = ReturnType<typeof Editor>;
27
+ export default Editor;