@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,102 @@
1
+ <!-- libs/helical-svelte/src/editor/FontColorPicker.svelte -->
2
+ <script lang="ts">
3
+ import type { Editor } from '@tiptap/core';
4
+
5
+ let {
6
+ editor,
7
+ visible = $bindable(false),
8
+ mode = 'color',
9
+ }: {
10
+ editor: Editor;
11
+ visible?: boolean;
12
+ mode?: 'color' | 'highlight';
13
+ } = $props();
14
+
15
+ // Reading-friendly color palette with preview colors
16
+ const textColors = [
17
+ { id: 'red', preview: '#dc2626', name: 'Red' },
18
+ { id: 'orange', preview: '#ea580c', name: 'Orange' },
19
+ { id: 'yellow', preview: '#ca8a04', name: 'Yellow' },
20
+ { id: 'green', preview: '#16a34a', name: 'Green' },
21
+ { id: 'cyan', preview: '#0891b2', name: 'Cyan' },
22
+ { id: 'blue', preview: '#2563eb', name: 'Blue' },
23
+ { id: 'violet', preview: '#7c3aed', name: 'Violet' },
24
+ { id: 'fuchsia', preview: '#c026d3', name: 'Fuchsia' },
25
+ { id: 'slate', preview: '#64748b', name: 'Slate' },
26
+ ];
27
+
28
+ const highlightColors = [
29
+ { id: 'yellow', preview: '#fef9c3', name: 'Yellow' },
30
+ { id: 'blue', preview: '#dbeafe', name: 'Blue' },
31
+ { id: 'green', preview: '#d1fae5', name: 'Green' },
32
+ { id: 'red', preview: '#fee2e2', name: 'Red' },
33
+ { id: 'fuchsia', preview: '#fae8ff', name: 'Fuchsia' },
34
+ { id: 'orange', preview: '#ffedd5', name: 'Orange' },
35
+ { id: 'violet', preview: '#ede9fe', name: 'Violet' },
36
+ { id: 'cyan', preview: '#cffafe', name: 'Cyan' },
37
+ { id: 'slate', preview: '#f1f5f9', name: 'Slate' },
38
+ ];
39
+
40
+ function selectColor(colorId: string) {
41
+ if (mode === 'highlight') {
42
+ // Highlight serializes this as an inline `background-color`, so use the actual preview
43
+ // color rather than a bare CSS keyword such as `yellow`.
44
+ const entry = highlightColors.find((color) => color.id === colorId);
45
+ editor.chain().focus().toggleHighlight({ color: entry?.preview ?? colorId }).run();
46
+ } else {
47
+ // @tiptap/extension-color writes an inline `style`, so it needs a real CSS colour.
48
+ // Passing the palette id ('slate') produces invalid CSS and silently does nothing.
49
+ const entry = textColors.find((c) => c.id === colorId);
50
+ editor
51
+ .chain()
52
+ .focus()
53
+ .setColor(entry?.preview ?? colorId)
54
+ .run();
55
+ }
56
+ visible = false;
57
+ }
58
+
59
+ function clearColor() {
60
+ if (mode === 'highlight') {
61
+ editor.chain().focus().unsetHighlight().run();
62
+ } else {
63
+ editor.chain().focus().unsetColor().run();
64
+ }
65
+ visible = false;
66
+ }
67
+ </script>
68
+
69
+ {#if visible}
70
+ <div class="absolute z-50 mt-2 w-48 rounded-lg border bg-background text-foreground p-1 shadow-lg">
71
+ <div class="text-xs font-medium text-muted-foreground px-3 py-2">
72
+ {mode === 'highlight' ? 'Highlight' : 'Color'}
73
+ </div>
74
+ <div class="flex flex-col">
75
+ <!-- None/Clear option -->
76
+ <button
77
+ type="button"
78
+ class="flex items-center gap-2 rounded px-3 py-1.5 text-sm hover:bg-accent hover:text-accent-foreground transition-colors text-left"
79
+ onclick={clearColor}
80
+ >
81
+ <div class="h-5 w-5 rounded border border-border flex-shrink-0 flex items-center justify-center">
82
+ <span class="text-xs text-muted-foreground">×</span>
83
+ </div>
84
+ <span>None</span>
85
+ </button>
86
+ <!-- Color options -->
87
+ {#each mode === 'highlight' ? highlightColors : textColors as color}
88
+ <button
89
+ type="button"
90
+ class="flex items-center gap-2 rounded px-3 py-1.5 text-sm hover:bg-accent hover:text-accent-foreground transition-colors text-left"
91
+ onclick={() => selectColor(color.id)}
92
+ >
93
+ <div
94
+ class="h-5 w-5 rounded border border-border flex-shrink-0"
95
+ style="background-color: {color.preview}"
96
+ ></div>
97
+ <span>{color.name}</span>
98
+ </button>
99
+ {/each}
100
+ </div>
101
+ </div>
102
+ {/if}
@@ -0,0 +1,9 @@
1
+ import type { Editor } from '@tiptap/core';
2
+ type $$ComponentProps = {
3
+ editor: Editor;
4
+ visible?: boolean;
5
+ mode?: 'color' | 'highlight';
6
+ };
7
+ declare const FontColorPicker: import("svelte").Component<$$ComponentProps, {}, "visible">;
8
+ type FontColorPicker = ReturnType<typeof FontColorPicker>;
9
+ export default FontColorPicker;
@@ -0,0 +1,70 @@
1
+ <!-- libs/helical-svelte/src/editor/ImageFileUpload.svelte -->
2
+ <!-- Ark UI FileUpload dropzone used by ImageInput. Selection and upload remain separate so -->
3
+ <!-- Cancel/Upload can share one footer and the parent can display upload progress. -->
4
+ <script lang="ts">
5
+ import {
6
+ FileUploadRoot,
7
+ FileUploadDropzone,
8
+ FileUploadTrigger,
9
+ FileUploadHiddenInput,
10
+ FileUploadItemGroup,
11
+ FileUploadItem,
12
+ FileUploadItemPreview,
13
+ FileUploadItemPreviewImage,
14
+ FileUploadItemName,
15
+ FileUploadItemSizeText,
16
+ FileUploadItemDeleteTrigger,
17
+ type FileUploadFileChangeDetails,
18
+ } from '@ark-ui/svelte/file-upload';
19
+ import { ImagePlus, Trash2, Upload } from 'lucide-svelte';
20
+
21
+ interface Props {
22
+ file: File | null;
23
+ onFileChange: (file: File | null) => void;
24
+ disabled?: boolean;
25
+ }
26
+
27
+ let { file, onFileChange, disabled = false }: Props = $props();
28
+ </script>
29
+
30
+ <FileUploadRoot
31
+ accept="image/*"
32
+ maxFiles={1}
33
+ acceptedFiles={file ? [file] : []}
34
+ {disabled}
35
+ onFileChange={(details: FileUploadFileChangeDetails) => onFileChange(details.acceptedFiles[0] ?? null)}
36
+ >
37
+ <FileUploadDropzone
38
+ class="flex min-h-32 cursor-pointer flex-col items-center justify-center gap-2 rounded-md border border-dashed border-border bg-muted/30 px-4 py-5 text-center transition-colors data-[dragging]:border-primary data-[dragging]:bg-primary/5"
39
+ >
40
+ <ImagePlus size={24} class="text-muted-foreground" aria-hidden="true" />
41
+ <div class="text-sm font-medium">Drop an image here</div>
42
+ <div class="text-xs text-muted-foreground">or</div>
43
+ <FileUploadTrigger
44
+ class="inline-flex items-center gap-2 rounded-md border border-input bg-background px-3 py-1.5 text-sm hover:bg-accent"
45
+ >
46
+ <Upload size={16} aria-hidden="true" />
47
+ Choose image
48
+ </FileUploadTrigger>
49
+ </FileUploadDropzone>
50
+ <FileUploadItemGroup class="mt-2">
51
+ {#if file}
52
+ <FileUploadItem {file} class="flex items-center gap-3 rounded-md border border-border bg-background p-2">
53
+ <FileUploadItemPreview type="image/*" class="size-12 shrink-0 overflow-hidden rounded">
54
+ <FileUploadItemPreviewImage class="size-full object-cover" />
55
+ </FileUploadItemPreview>
56
+ <div class="min-w-0 flex-1">
57
+ <FileUploadItemName class="truncate text-sm font-medium" />
58
+ <FileUploadItemSizeText class="text-xs text-muted-foreground" />
59
+ </div>
60
+ <FileUploadItemDeleteTrigger
61
+ class="rounded p-1 text-muted-foreground hover:bg-muted hover:text-foreground"
62
+ aria-label="Remove image"
63
+ >
64
+ <Trash2 size={16} />
65
+ </FileUploadItemDeleteTrigger>
66
+ </FileUploadItem>
67
+ {/if}
68
+ </FileUploadItemGroup>
69
+ <FileUploadHiddenInput />
70
+ </FileUploadRoot>
@@ -0,0 +1,8 @@
1
+ interface Props {
2
+ file: File | null;
3
+ onFileChange: (file: File | null) => void;
4
+ disabled?: boolean;
5
+ }
6
+ declare const ImageFileUpload: import("svelte").Component<Props, {}, "">;
7
+ type ImageFileUpload = ReturnType<typeof ImageFileUpload>;
8
+ export default ImageFileUpload;
@@ -0,0 +1,189 @@
1
+ <script lang="ts">
2
+ import type { Editor } from '@tiptap/core';
3
+ import type { ImageUploadResult } from '@cloudvoyant/helical-ui';
4
+ import { X } from 'lucide-svelte';
5
+ import ImageFileUpload from './ImageFileUpload.svelte';
6
+
7
+ interface Props {
8
+ editor: Editor;
9
+ position: number;
10
+ onClose: () => void;
11
+ onUpload?: (file: File) => Promise<ImageUploadResult>;
12
+ }
13
+
14
+ let { editor, position, onClose, onUpload }: Props = $props();
15
+
16
+ let activeTab = $state<'upload' | 'url'>('upload');
17
+ let urlValue = $state('');
18
+ let urlError = $state('');
19
+ let urlInputEl: HTMLInputElement | undefined = $state();
20
+ let selectedFile = $state<File | null>(null);
21
+ let uploading = $state(false);
22
+ let uploadError = $state('');
23
+
24
+ $effect(() => {
25
+ if (activeTab === 'url') {
26
+ urlInputEl?.focus();
27
+ }
28
+ });
29
+
30
+ function insertImage(src: string, srcset?: string) {
31
+ editor.chain().focus().setTextSelection(position).insertImage({ src, srcset, alt: '', caption: '' }).run();
32
+ onClose();
33
+ }
34
+
35
+ function fileToDataUrl(file: File): Promise<string> {
36
+ return new Promise((resolve, reject) => {
37
+ const reader = new FileReader();
38
+ reader.onload = () =>
39
+ typeof reader.result === 'string' ? resolve(reader.result) : reject(new Error('No image data'));
40
+ reader.onerror = () => reject(reader.error ?? new Error('Could not read image'));
41
+ reader.readAsDataURL(file);
42
+ });
43
+ }
44
+
45
+ async function handleUpload() {
46
+ if (!selectedFile) {
47
+ uploadError = 'Choose an image first.';
48
+ return;
49
+ }
50
+
51
+ uploading = true;
52
+ uploadError = '';
53
+ try {
54
+ const result: ImageUploadResult = onUpload
55
+ ? await onUpload(selectedFile)
56
+ : { src: await fileToDataUrl(selectedFile) };
57
+ insertImage(result.src, result.srcset);
58
+ } catch {
59
+ uploadError = 'Upload failed. Please try again.';
60
+ } finally {
61
+ uploading = false;
62
+ }
63
+ }
64
+
65
+ function handleUrlSubmit() {
66
+ const trimmed = urlValue.trim();
67
+ if (!trimmed) {
68
+ urlError = 'Please enter a URL';
69
+ return;
70
+ }
71
+ try {
72
+ new URL(trimmed);
73
+ } catch {
74
+ urlError = 'Please enter a valid URL';
75
+ return;
76
+ }
77
+ insertImage(trimmed);
78
+ }
79
+
80
+ function handleKeydown(e: KeyboardEvent) {
81
+ if (e.key === 'Escape') onClose();
82
+ }
83
+
84
+ function handleUrlKeydown(e: KeyboardEvent) {
85
+ if (e.key === 'Enter') handleUrlSubmit();
86
+ }
87
+ </script>
88
+
89
+ <!-- svelte-ignore a11y_no_noninteractive_element_interactions -->
90
+ <div
91
+ class="max-h-[calc(100vh-2rem)] w-80 overflow-y-auto rounded-lg border border-border bg-popover p-3 text-popover-foreground shadow-xl"
92
+ role="dialog"
93
+ aria-label="Insert image"
94
+ tabindex="-1"
95
+ onkeydown={handleKeydown}
96
+ >
97
+ <div class="space-y-3">
98
+ <div class="flex items-center justify-between">
99
+ <p class="text-sm font-semibold">Insert Image</p>
100
+ <button
101
+ type="button"
102
+ onclick={onClose}
103
+ class="rounded p-1 text-muted-foreground hover:bg-muted hover:text-foreground"
104
+ aria-label="Close image dialog"
105
+ >
106
+ <X size={16} />
107
+ </button>
108
+ </div>
109
+
110
+ <!-- Tabs -->
111
+ <div class="flex gap-1 rounded-md bg-muted p-1">
112
+ <button
113
+ type="button"
114
+ onclick={() => {
115
+ activeTab = 'upload';
116
+ urlError = '';
117
+ }}
118
+ class="flex-1 rounded px-3 py-1 text-xs font-medium transition-colors {activeTab === 'upload'
119
+ ? 'bg-background shadow-sm'
120
+ : 'text-muted-foreground hover:text-foreground'}"
121
+ >
122
+ Upload
123
+ </button>
124
+ <button
125
+ type="button"
126
+ onclick={() => {
127
+ activeTab = 'url';
128
+ urlError = '';
129
+ }}
130
+ class="flex-1 rounded px-3 py-1 text-xs font-medium transition-colors {activeTab === 'url'
131
+ ? 'bg-background shadow-sm'
132
+ : 'text-muted-foreground hover:text-foreground'}"
133
+ >
134
+ URL
135
+ </button>
136
+ </div>
137
+
138
+ {#if activeTab === 'upload'}
139
+ <div class="space-y-1">
140
+ <ImageFileUpload
141
+ file={selectedFile}
142
+ disabled={uploading}
143
+ onFileChange={(file) => {
144
+ selectedFile = file;
145
+ uploadError = '';
146
+ }}
147
+ />
148
+ {#if uploading}
149
+ <p class="text-xs text-muted-foreground">Uploading…</p>
150
+ {/if}
151
+ {#if uploadError}
152
+ <div role="alert" class="text-xs leading-tight text-destructive">{uploadError}</div>
153
+ {/if}
154
+ </div>
155
+ {:else}
156
+ <div class="space-y-1">
157
+ <input
158
+ type="url"
159
+ bind:this={urlInputEl}
160
+ bind:value={urlValue}
161
+ onkeydown={handleUrlKeydown}
162
+ oninput={() => {
163
+ urlError = '';
164
+ }}
165
+ placeholder="https://example.com/image.jpg"
166
+ aria-invalid={Boolean(urlError)}
167
+ class="w-full rounded-md border border-input bg-background px-3 py-2 text-sm placeholder:text-muted-foreground focus:outline-none focus:ring-1 focus:ring-ring"
168
+ />
169
+ {#if urlError}
170
+ <div role="alert" class="text-xs leading-tight text-destructive">{urlError}</div>
171
+ {/if}
172
+ </div>
173
+ {/if}
174
+
175
+ <div class="flex justify-end gap-2">
176
+ <button type="button" onclick={onClose} class="rounded-md px-3 py-1.5 text-sm transition-colors hover:bg-muted">
177
+ Cancel
178
+ </button>
179
+ <button
180
+ type="button"
181
+ onclick={activeTab === 'upload' ? handleUpload : handleUrlSubmit}
182
+ disabled={uploading || (activeTab === 'upload' && !selectedFile)}
183
+ class="rounded-md bg-primary px-3 py-1.5 text-sm font-medium text-primary-foreground transition-colors hover:bg-primary/90 disabled:cursor-not-allowed disabled:opacity-50"
184
+ >
185
+ {activeTab === 'upload' ? (uploading ? 'Uploading…' : 'Upload') : 'Insert'}
186
+ </button>
187
+ </div>
188
+ </div>
189
+ </div>
@@ -0,0 +1,11 @@
1
+ import type { Editor } from '@tiptap/core';
2
+ import type { ImageUploadResult } from '@cloudvoyant/helical-ui';
3
+ interface Props {
4
+ editor: Editor;
5
+ position: number;
6
+ onClose: () => void;
7
+ onUpload?: (file: File) => Promise<ImageUploadResult>;
8
+ }
9
+ declare const ImageInput: import("svelte").Component<Props, {}, "">;
10
+ type ImageInput = ReturnType<typeof ImageInput>;
11
+ export default ImageInput;
@@ -0,0 +1,116 @@
1
+ <script lang="ts">
2
+ import type { NodeViewProps } from '@tiptap/core';
3
+ import { NodeViewWrapper } from 'svelte-tiptap';
4
+
5
+ let { node, deleteNode, updateAttributes, editor, getPos }: NodeViewProps = $props();
6
+
7
+ const { src, srcset, alt } = $derived(node.attrs);
8
+ let caption = $derived(node.attrs.caption || '');
9
+ let captionFocused = $state(false);
10
+
11
+ function handleCaptionBlur() {
12
+ captionFocused = false;
13
+ updateAttributes({ caption });
14
+ }
15
+
16
+ function handleCaptionKeydown(event: KeyboardEvent) {
17
+ if (event.key === 'ArrowUp') {
18
+ event.preventDefault();
19
+ updateAttributes({ caption });
20
+ const pos = (getPos as () => number)();
21
+ editor
22
+ .chain()
23
+ .focus()
24
+ .setTextSelection(Math.max(pos - 1, 0))
25
+ .run();
26
+ } else if (event.key === 'ArrowDown') {
27
+ event.preventDefault();
28
+ updateAttributes({ caption });
29
+ const posAfter = (getPos as () => number)() + node.nodeSize;
30
+ editor.chain().focus().setTextSelection(posAfter).run();
31
+ } else if (event.key === 'Enter') {
32
+ event.preventDefault();
33
+ const input = event.currentTarget as HTMLInputElement;
34
+ const cursorIdx = input.selectionStart ?? caption.length;
35
+ const leftText = caption.slice(0, cursorIdx);
36
+ const rightText = caption.slice(cursorIdx);
37
+
38
+ caption = leftText;
39
+ updateAttributes({ caption: leftText });
40
+
41
+ const posAfter = (getPos as () => number)() + node.nodeSize;
42
+ editor
43
+ .chain()
44
+ .focus()
45
+ .insertContentAt(posAfter, {
46
+ type: 'paragraph',
47
+ content: rightText ? [{ type: 'text', text: rightText }] : [],
48
+ })
49
+ .setTextSelection(posAfter + 1)
50
+ .run();
51
+ }
52
+ }
53
+ </script>
54
+
55
+ <NodeViewWrapper class="image-node-view relative my-6 group" contenteditable={false}>
56
+ <figure class="m-0">
57
+ <img
58
+ {src}
59
+ {srcset}
60
+ sizes="(max-width: 768px) 100vw, 720px"
61
+ alt={alt || ''}
62
+ class="w-full object-cover"
63
+ draggable="false"
64
+ />
65
+ <figcaption class="mt-2">
66
+ <input
67
+ type="text"
68
+ bind:value={caption}
69
+ onfocus={() => {
70
+ captionFocused = true;
71
+ }}
72
+ onblur={handleCaptionBlur}
73
+ onkeydown={handleCaptionKeydown}
74
+ placeholder={captionFocused ? '' : 'Add a caption…'}
75
+ style="background: transparent; box-shadow: none; outline: none;"
76
+ class="caption-input w-full border-0 p-0 text-sm italic text-muted-foreground text-center placeholder:italic appearance-none"
77
+ />
78
+ </figcaption>
79
+ </figure>
80
+
81
+ <button
82
+ type="button"
83
+ class="absolute top-2 right-2 w-7 h-7 rounded-full bg-background border border-border shadow-sm flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity cursor-pointer z-10"
84
+ onclick={deleteNode}
85
+ aria-label="Remove image"
86
+ >
87
+ <svg class="w-3.5 h-3.5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
88
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" />
89
+ </svg>
90
+ </button>
91
+ </NodeViewWrapper>
92
+
93
+ <style>
94
+ .caption-input:focus,
95
+ .caption-input:focus-visible {
96
+ outline: none !important;
97
+ box-shadow: none !important;
98
+ border-width: 0 !important;
99
+ border-color: transparent !important;
100
+ background-color: transparent !important;
101
+ }
102
+
103
+ /* Backspace-to-delete highlight — applied via ProseMirror decoration.
104
+ The class lands on renderer.dom (div.node-imageNode), not on NodeViewWrapper.
105
+ ::after overlay mimics browser text-selection highlight. */
106
+ :global(.node-imageNode.image-node-pending-delete [data-node-view-wrapper])::after {
107
+ content: '';
108
+ position: absolute;
109
+ inset: 0;
110
+ background: rgba(0, 120, 215, 0.25); /* fallback */
111
+ background: color-mix(in srgb, Highlight 30%, transparent);
112
+ border-radius: 0;
113
+ pointer-events: none;
114
+ z-index: 1;
115
+ }
116
+ </style>
@@ -0,0 +1,4 @@
1
+ import type { NodeViewProps } from '@tiptap/core';
2
+ declare const ImageNodeView: import("svelte").Component<NodeViewProps, {}, "">;
3
+ type ImageNodeView = ReturnType<typeof ImageNodeView>;
4
+ export default ImageNodeView;
@@ -0,0 +1,95 @@
1
+ <script lang="ts">
2
+ import { onMount } from 'svelte';
3
+ import type { Editor } from '@tiptap/core';
4
+ import { Trash2, Globe, ExternalLink } from 'lucide-svelte';
5
+
6
+ interface Props {
7
+ editor: Editor;
8
+ initialUrl?: string;
9
+ onClose: () => void;
10
+ }
11
+
12
+ let { editor, initialUrl = '', onClose }: Props = $props();
13
+
14
+ let linkUrl = $derived(initialUrl);
15
+ let inputElement: HTMLInputElement;
16
+ let isFocused = $state(false);
17
+
18
+ onMount(() => inputElement?.focus());
19
+
20
+ function saveAndClose() {
21
+ if (linkUrl.trim()) {
22
+ editor.chain().focus().setLink({ href: linkUrl.trim() }).run();
23
+ } else {
24
+ // If empty, remove the link
25
+ editor.chain().focus().unsetLink().run();
26
+ }
27
+ onClose();
28
+ }
29
+
30
+ function removeLink() {
31
+ editor.chain().focus().unsetLink().run();
32
+ onClose();
33
+ }
34
+
35
+ function handleKeydown(event: KeyboardEvent) {
36
+ if (event.key === 'Enter' || event.key === 'Escape') {
37
+ event.preventDefault();
38
+ saveAndClose();
39
+ }
40
+ }
41
+
42
+ function handleBlur() {
43
+ isFocused = false;
44
+ // Small delay to allow clicking trash button
45
+ setTimeout(saveAndClose, 100);
46
+ }
47
+ </script>
48
+
49
+ <div
50
+ data-link-editor
51
+ role="dialog"
52
+ aria-label="Edit link"
53
+ class="absolute start-0 top-full z-50 mt-2 rounded border shadow-lg bg-popover text-popover-foreground"
54
+ class:border-border={!isFocused}
55
+ class:border-ring={isFocused}
56
+ style="width: 280px"
57
+ >
58
+ <div class="flex items-center gap-2 px-2">
59
+ <span class="text-foreground/60 flex-shrink-0">
60
+ <Globe size={16} />
61
+ </span>
62
+ <input
63
+ bind:this={inputElement}
64
+ type="text"
65
+ bind:value={linkUrl}
66
+ placeholder="Enter URL"
67
+ class="flex-1 px-1.5 my-1 text-sm outline-none border-none rounded"
68
+ class:bg-muted={!isFocused}
69
+ class:bg-background={isFocused}
70
+ style="padding-top: 0.25rem !important; padding-bottom: 0.25rem !important;"
71
+ onkeydown={handleKeydown}
72
+ onfocus={() => (isFocused = true)}
73
+ onblur={handleBlur}
74
+ />
75
+ <button
76
+ type="button"
77
+ class="rounded p-1 hover:bg-accent hover:text-accent-foreground text-foreground/60 hover:text-foreground flex-shrink-0"
78
+ onclick={removeLink}
79
+ title="Remove link"
80
+ >
81
+ <Trash2 size={16} />
82
+ </button>
83
+ {#if linkUrl}
84
+ <a
85
+ href={linkUrl}
86
+ target="_blank"
87
+ rel="noopener noreferrer"
88
+ class="rounded p-1 hover:bg-accent hover:text-accent-foreground text-foreground/60 hover:text-foreground flex-shrink-0"
89
+ title="Open in new tab"
90
+ >
91
+ <ExternalLink size={16} />
92
+ </a>
93
+ {/if}
94
+ </div>
95
+ </div>
@@ -0,0 +1,9 @@
1
+ import type { Editor } from '@tiptap/core';
2
+ interface Props {
3
+ editor: Editor;
4
+ initialUrl?: string;
5
+ onClose: () => void;
6
+ }
7
+ declare const LinkEditPopover: import("svelte").Component<Props, {}, "">;
8
+ type LinkEditPopover = ReturnType<typeof LinkEditPopover>;
9
+ export default LinkEditPopover;