@intlayer/design-system 9.0.0-canary.0 → 9.0.0-canary.2

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 (249) hide show
  1. package/dist/esm/api/hooks/ai.mjs +20 -1
  2. package/dist/esm/api/hooks/ai.mjs.map +1 -1
  3. package/dist/esm/api/hooks/asset.mjs +78 -0
  4. package/dist/esm/api/hooks/asset.mjs.map +1 -0
  5. package/dist/esm/api/index.mjs +6 -5
  6. package/dist/esm/api/useIntlayerAPI.mjs +6 -1
  7. package/dist/esm/api/useIntlayerAPI.mjs.map +1 -1
  8. package/dist/esm/components/Command/index.mjs +8 -8
  9. package/dist/esm/components/Command/index.mjs.map +1 -1
  10. package/dist/esm/components/ContentEditor/ContentEditorTextArea.mjs +1 -1
  11. package/dist/esm/components/DictionaryFieldEditor/ContentEditor.mjs +132 -35
  12. package/dist/esm/components/DictionaryFieldEditor/ContentEditor.mjs.map +1 -1
  13. package/dist/esm/components/DictionaryFieldEditor/ContentEditorView/TextEditor.mjs +33 -11
  14. package/dist/esm/components/DictionaryFieldEditor/ContentEditorView/TextEditor.mjs.map +1 -1
  15. package/dist/esm/components/DictionaryFieldEditor/DictionaryCreationForm/DictionaryCreationForm.mjs +146 -35
  16. package/dist/esm/components/DictionaryFieldEditor/DictionaryCreationForm/DictionaryCreationForm.mjs.map +1 -1
  17. package/dist/esm/components/DictionaryFieldEditor/DictionaryCreationForm/dictionaryCreationForm.content.mjs +308 -0
  18. package/dist/esm/components/DictionaryFieldEditor/DictionaryCreationForm/dictionaryCreationForm.content.mjs.map +1 -1
  19. package/dist/esm/components/DictionaryFieldEditor/DictionaryCreationForm/useDictionaryFormSchema.mjs +12 -2
  20. package/dist/esm/components/DictionaryFieldEditor/DictionaryCreationForm/useDictionaryFormSchema.mjs.map +1 -1
  21. package/dist/esm/components/DictionaryFieldEditor/DictionaryDetails/DictionaryDetailsForm.mjs +460 -20
  22. package/dist/esm/components/DictionaryFieldEditor/DictionaryDetails/DictionaryDetailsForm.mjs.map +1 -1
  23. package/dist/esm/components/DictionaryFieldEditor/DictionaryDetails/dictionaryDetails.content.mjs +506 -0
  24. package/dist/esm/components/DictionaryFieldEditor/DictionaryDetails/dictionaryDetails.content.mjs.map +1 -1
  25. package/dist/esm/components/DictionaryFieldEditor/DictionaryFieldEditor.mjs +10 -6
  26. package/dist/esm/components/DictionaryFieldEditor/DictionaryFieldEditor.mjs.map +1 -1
  27. package/dist/esm/components/DictionaryFieldEditor/NavigationView/NavigationViewNode.mjs +1 -1
  28. package/dist/esm/components/DictionaryFieldEditor/SaveForm/SaveForm.mjs +9 -9
  29. package/dist/esm/components/DictionaryFieldEditor/SaveForm/SaveForm.mjs.map +1 -1
  30. package/dist/esm/components/DictionaryFieldEditor/StructureView/StructureView.mjs +2 -2
  31. package/dist/esm/components/DictionaryFieldEditor/StructureView/StructureView.mjs.map +1 -1
  32. package/dist/esm/components/DictionaryFieldEditor/contentEditor.content.mjs +79 -0
  33. package/dist/esm/components/DictionaryFieldEditor/contentEditor.content.mjs.map +1 -0
  34. package/dist/esm/components/Form/Form.mjs +3 -43
  35. package/dist/esm/components/Form/Form.mjs.map +1 -1
  36. package/dist/esm/components/Form/elements/FormElement.mjs +2 -3
  37. package/dist/esm/components/Form/elements/FormElement.mjs.map +1 -1
  38. package/dist/esm/components/Form/elements/MultiselectElement.mjs +2 -3
  39. package/dist/esm/components/Form/elements/MultiselectElement.mjs.map +1 -1
  40. package/dist/esm/components/Form/elements/OTPElement.mjs +3 -4
  41. package/dist/esm/components/Form/elements/OTPElement.mjs.map +1 -1
  42. package/dist/esm/components/Form/elements/SelectElement.mjs +2 -3
  43. package/dist/esm/components/Form/elements/SelectElement.mjs.map +1 -1
  44. package/dist/esm/components/Form/elements/SwitchSelectorElement.mjs +2 -3
  45. package/dist/esm/components/Form/elements/SwitchSelectorElement.mjs.map +1 -1
  46. package/dist/esm/components/Form/index.mjs +21 -2
  47. package/dist/esm/components/Form/layout/FormItemLayout.mjs +8 -5
  48. package/dist/esm/components/Form/layout/FormItemLayout.mjs.map +1 -1
  49. package/dist/esm/components/LanguageBackground/LanguageBackground.mjs +3 -8
  50. package/dist/esm/components/LanguageBackground/LanguageBackground.mjs.map +1 -1
  51. package/dist/esm/components/LocaleSwitcherContentDropDown/LocaleSwitcherContent.mjs +1 -1
  52. package/dist/esm/components/MarkDownRender/MarkDownRender.mjs +1 -1
  53. package/dist/esm/components/MarkDownRender/MarkDownRender.mjs.map +1 -1
  54. package/dist/esm/components/MarkdownEditor/MarkdownEditor.mjs +113 -0
  55. package/dist/esm/components/MarkdownEditor/MarkdownEditor.mjs.map +1 -0
  56. package/dist/esm/components/MarkdownEditor/extensions.mjs +103 -0
  57. package/dist/esm/components/MarkdownEditor/extensions.mjs.map +1 -0
  58. package/dist/esm/components/MarkdownEditor/generative/AICompletionCommands.mjs +51 -0
  59. package/dist/esm/components/MarkdownEditor/generative/AICompletionCommands.mjs.map +1 -0
  60. package/dist/esm/components/MarkdownEditor/generative/AISelector.mjs +100 -0
  61. package/dist/esm/components/MarkdownEditor/generative/AISelector.mjs.map +1 -0
  62. package/dist/esm/components/MarkdownEditor/generative/AISelectorCommands.mjs +81 -0
  63. package/dist/esm/components/MarkdownEditor/generative/AISelectorCommands.mjs.map +1 -0
  64. package/dist/esm/components/MarkdownEditor/generative/GenerativeMenuSwitch.mjs +47 -0
  65. package/dist/esm/components/MarkdownEditor/generative/GenerativeMenuSwitch.mjs.map +1 -0
  66. package/dist/esm/components/MarkdownEditor/generative/useAICompletion.mjs +83 -0
  67. package/dist/esm/components/MarkdownEditor/generative/useAICompletion.mjs.map +1 -0
  68. package/dist/esm/components/MarkdownEditor/imageUpload.mjs +47 -0
  69. package/dist/esm/components/MarkdownEditor/imageUpload.mjs.map +1 -0
  70. package/dist/esm/components/MarkdownEditor/index.mjs +4 -0
  71. package/dist/esm/components/MarkdownEditor/markdownEditor.content.mjs +1140 -0
  72. package/dist/esm/components/MarkdownEditor/markdownEditor.content.mjs.map +1 -0
  73. package/dist/esm/components/MarkdownEditor/novel/components/editor-bubble-item.mjs +20 -0
  74. package/dist/esm/components/MarkdownEditor/novel/components/editor-bubble-item.mjs.map +1 -0
  75. package/dist/esm/components/MarkdownEditor/novel/components/editor-bubble.mjs +39 -0
  76. package/dist/esm/components/MarkdownEditor/novel/components/editor-bubble.mjs.map +1 -0
  77. package/dist/esm/components/MarkdownEditor/novel/components/editor-command-item.mjs +25 -0
  78. package/dist/esm/components/MarkdownEditor/novel/components/editor-command-item.mjs.map +1 -0
  79. package/dist/esm/components/MarkdownEditor/novel/components/editor-command.mjs +61 -0
  80. package/dist/esm/components/MarkdownEditor/novel/components/editor-command.mjs.map +1 -0
  81. package/dist/esm/components/MarkdownEditor/novel/components/editor.mjs +27 -0
  82. package/dist/esm/components/MarkdownEditor/novel/components/editor.mjs.map +1 -0
  83. package/dist/esm/components/MarkdownEditor/novel/components/index.mjs +8 -0
  84. package/dist/esm/components/MarkdownEditor/novel/extensions/ai-highlight.mjs +74 -0
  85. package/dist/esm/components/MarkdownEditor/novel/extensions/ai-highlight.mjs.map +1 -0
  86. package/dist/esm/components/MarkdownEditor/novel/extensions/custom-keymap.mjs +37 -0
  87. package/dist/esm/components/MarkdownEditor/novel/extensions/custom-keymap.mjs.map +1 -0
  88. package/dist/esm/components/MarkdownEditor/novel/extensions/image-resizer.mjs +49 -0
  89. package/dist/esm/components/MarkdownEditor/novel/extensions/image-resizer.mjs.map +1 -0
  90. package/dist/esm/components/MarkdownEditor/novel/extensions/index.mjs +51 -0
  91. package/dist/esm/components/MarkdownEditor/novel/extensions/index.mjs.map +1 -0
  92. package/dist/esm/components/MarkdownEditor/novel/extensions/slash-command.mjs +79 -0
  93. package/dist/esm/components/MarkdownEditor/novel/extensions/slash-command.mjs.map +1 -0
  94. package/dist/esm/components/MarkdownEditor/novel/extensions/updated-image.mjs +17 -0
  95. package/dist/esm/components/MarkdownEditor/novel/extensions/updated-image.mjs.map +1 -0
  96. package/dist/esm/components/MarkdownEditor/novel/index.mjs +17 -0
  97. package/dist/esm/components/MarkdownEditor/novel/plugins/index.mjs +3 -0
  98. package/dist/esm/components/MarkdownEditor/novel/plugins/upload-images.mjs +92 -0
  99. package/dist/esm/components/MarkdownEditor/novel/plugins/upload-images.mjs.map +1 -0
  100. package/dist/esm/components/MarkdownEditor/novel/utils/atoms.mjs +39 -0
  101. package/dist/esm/components/MarkdownEditor/novel/utils/atoms.mjs.map +1 -0
  102. package/dist/esm/components/MarkdownEditor/novel/utils/index.mjs +38 -0
  103. package/dist/esm/components/MarkdownEditor/novel/utils/index.mjs.map +1 -0
  104. package/dist/esm/components/MarkdownEditor/selectors/ColorSelector.mjs +176 -0
  105. package/dist/esm/components/MarkdownEditor/selectors/ColorSelector.mjs.map +1 -0
  106. package/dist/esm/components/MarkdownEditor/selectors/LinkSelector.mjs +95 -0
  107. package/dist/esm/components/MarkdownEditor/selectors/LinkSelector.mjs.map +1 -0
  108. package/dist/esm/components/MarkdownEditor/selectors/NodeSelector.mjs +139 -0
  109. package/dist/esm/components/MarkdownEditor/selectors/NodeSelector.mjs.map +1 -0
  110. package/dist/esm/components/MarkdownEditor/selectors/TextButtons.mjs +81 -0
  111. package/dist/esm/components/MarkdownEditor/selectors/TextButtons.mjs.map +1 -0
  112. package/dist/esm/components/MarkdownEditor/slashCommand.mjs +161 -0
  113. package/dist/esm/components/MarkdownEditor/slashCommand.mjs.map +1 -0
  114. package/dist/esm/components/Modal/Modal.mjs +2 -2
  115. package/dist/esm/components/Navbar/MobileNavbar.mjs +1 -1
  116. package/dist/esm/components/Pagination/Pagination.mjs +1 -1
  117. package/dist/esm/components/Pattern/GridDistortionPattern.mjs +275 -0
  118. package/dist/esm/components/Pattern/GridDistortionPattern.mjs.map +1 -0
  119. package/dist/esm/components/Pattern/index.mjs +2 -1
  120. package/dist/esm/components/RightDrawer/RightDrawer.mjs +3 -3
  121. package/dist/esm/components/Tab/Tab.mjs +1 -1
  122. package/dist/esm/components/Table/Table.mjs +1 -1
  123. package/dist/esm/components/Table/Table.mjs.map +1 -1
  124. package/dist/esm/components/Tag/index.mjs +0 -9
  125. package/dist/esm/components/Tag/index.mjs.map +1 -1
  126. package/dist/esm/components/Toaster/Toast.mjs +1 -1
  127. package/dist/esm/components/Toaster/Toast.mjs.map +1 -1
  128. package/dist/esm/components/index.mjs +27 -6
  129. package/dist/esm/hooks/index.mjs +8 -8
  130. package/dist/esm/hooks/useIsMounted.mjs +4 -2
  131. package/dist/esm/hooks/useIsMounted.mjs.map +1 -1
  132. package/dist/esm/routes.mjs +2 -1
  133. package/dist/esm/routes.mjs.map +1 -1
  134. package/dist/types/api/hooks/ai.d.ts +5 -1
  135. package/dist/types/api/hooks/ai.d.ts.map +1 -1
  136. package/dist/types/api/hooks/asset.d.ts +27 -0
  137. package/dist/types/api/hooks/asset.d.ts.map +1 -0
  138. package/dist/types/api/hooks/audit.d.ts +1 -1
  139. package/dist/types/api/index.d.ts +4 -3
  140. package/dist/types/api/useIntlayerAPI.d.ts +15 -3
  141. package/dist/types/api/useIntlayerAPI.d.ts.map +1 -1
  142. package/dist/types/components/Badge/index.d.ts +1 -1
  143. package/dist/types/components/Breadcrumb/index.d.ts +1 -1
  144. package/dist/types/components/Button/Button.d.ts +3 -3
  145. package/dist/types/components/CollapsibleTable/CollapsibleTable.d.ts +2 -2
  146. package/dist/types/components/Command/index.d.ts.map +1 -1
  147. package/dist/types/components/Container/index.d.ts +1 -1
  148. package/dist/types/components/DictionaryFieldEditor/ContentEditor.d.ts.map +1 -1
  149. package/dist/types/components/DictionaryFieldEditor/ContentEditorView/TextEditor.d.ts.map +1 -1
  150. package/dist/types/components/DictionaryFieldEditor/DictionaryCreationForm/DictionaryCreationForm.d.ts.map +1 -1
  151. package/dist/types/components/DictionaryFieldEditor/DictionaryCreationForm/dictionaryCreationForm.content.d.ts +308 -0
  152. package/dist/types/components/DictionaryFieldEditor/DictionaryCreationForm/dictionaryCreationForm.content.d.ts.map +1 -1
  153. package/dist/types/components/DictionaryFieldEditor/DictionaryCreationForm/useDictionaryFormSchema.d.ts +12 -1
  154. package/dist/types/components/DictionaryFieldEditor/DictionaryCreationForm/useDictionaryFormSchema.d.ts.map +1 -1
  155. package/dist/types/components/DictionaryFieldEditor/DictionaryDetails/DictionaryDetailsForm.d.ts +2 -0
  156. package/dist/types/components/DictionaryFieldEditor/DictionaryDetails/DictionaryDetailsForm.d.ts.map +1 -1
  157. package/dist/types/components/DictionaryFieldEditor/DictionaryDetails/dictionaryDetails.content.d.ts +506 -0
  158. package/dist/types/components/DictionaryFieldEditor/DictionaryDetails/dictionaryDetails.content.d.ts.map +1 -1
  159. package/dist/types/components/DictionaryFieldEditor/DictionaryFieldEditor.d.ts +2 -1
  160. package/dist/types/components/DictionaryFieldEditor/DictionaryFieldEditor.d.ts.map +1 -1
  161. package/dist/types/components/DictionaryFieldEditor/contentEditor.content.d.ts +80 -0
  162. package/dist/types/components/DictionaryFieldEditor/contentEditor.content.d.ts.map +1 -0
  163. package/dist/types/components/Form/Form.d.ts +27 -47
  164. package/dist/types/components/Form/Form.d.ts.map +1 -1
  165. package/dist/types/components/Form/elements/FormElement.d.ts.map +1 -1
  166. package/dist/types/components/Form/elements/MultiselectElement.d.ts.map +1 -1
  167. package/dist/types/components/Form/elements/OTPElement.d.ts.map +1 -1
  168. package/dist/types/components/Form/elements/SelectElement.d.ts.map +1 -1
  169. package/dist/types/components/Form/elements/SwitchSelectorElement.d.ts.map +1 -1
  170. package/dist/types/components/Form/index.d.ts +22 -3
  171. package/dist/types/components/Form/layout/FormItemLayout.d.ts.map +1 -1
  172. package/dist/types/components/Input/Checkbox.d.ts +3 -3
  173. package/dist/types/components/Input/Input.d.ts +1 -1
  174. package/dist/types/components/Input/Radio.d.ts +3 -3
  175. package/dist/types/components/LanguageBackground/LanguageBackground.d.ts.map +1 -1
  176. package/dist/types/components/Link/Link.d.ts +1 -1
  177. package/dist/types/components/MarkdownEditor/MarkdownEditor.d.ts +31 -0
  178. package/dist/types/components/MarkdownEditor/MarkdownEditor.d.ts.map +1 -0
  179. package/dist/types/components/MarkdownEditor/extensions.d.ts +11 -0
  180. package/dist/types/components/MarkdownEditor/extensions.d.ts.map +1 -0
  181. package/dist/types/components/MarkdownEditor/generative/AICompletionCommands.d.ts +18 -0
  182. package/dist/types/components/MarkdownEditor/generative/AICompletionCommands.d.ts.map +1 -0
  183. package/dist/types/components/MarkdownEditor/generative/AISelector.d.ts +22 -0
  184. package/dist/types/components/MarkdownEditor/generative/AISelector.d.ts.map +1 -0
  185. package/dist/types/components/MarkdownEditor/generative/AISelectorCommands.d.ts +17 -0
  186. package/dist/types/components/MarkdownEditor/generative/AISelectorCommands.d.ts.map +1 -0
  187. package/dist/types/components/MarkdownEditor/generative/GenerativeMenuSwitch.d.ts +26 -0
  188. package/dist/types/components/MarkdownEditor/generative/GenerativeMenuSwitch.d.ts.map +1 -0
  189. package/dist/types/components/MarkdownEditor/generative/useAICompletion.d.ts +30 -0
  190. package/dist/types/components/MarkdownEditor/generative/useAICompletion.d.ts.map +1 -0
  191. package/dist/types/components/MarkdownEditor/imageUpload.d.ts +29 -0
  192. package/dist/types/components/MarkdownEditor/imageUpload.d.ts.map +1 -0
  193. package/dist/types/components/MarkdownEditor/index.d.ts +3 -0
  194. package/dist/types/components/MarkdownEditor/markdownEditor.content.d.ts +1135 -0
  195. package/dist/types/components/MarkdownEditor/markdownEditor.content.d.ts.map +1 -0
  196. package/dist/types/components/MarkdownEditor/novel/components/editor-bubble-item.d.ts +14 -0
  197. package/dist/types/components/MarkdownEditor/novel/components/editor-bubble-item.d.ts.map +1 -0
  198. package/dist/types/components/MarkdownEditor/novel/components/editor-bubble.d.ts +18 -0
  199. package/dist/types/components/MarkdownEditor/novel/components/editor-bubble.d.ts.map +1 -0
  200. package/dist/types/components/MarkdownEditor/novel/components/editor-command-item.d.ts +28 -0
  201. package/dist/types/components/MarkdownEditor/novel/components/editor-command-item.d.ts.map +1 -0
  202. package/dist/types/components/MarkdownEditor/novel/components/editor-command.d.ts +34 -0
  203. package/dist/types/components/MarkdownEditor/novel/components/editor-command.d.ts.map +1 -0
  204. package/dist/types/components/MarkdownEditor/novel/components/editor.d.ts +23 -0
  205. package/dist/types/components/MarkdownEditor/novel/components/editor.d.ts.map +1 -0
  206. package/dist/types/components/MarkdownEditor/novel/components/index.d.ts +8 -0
  207. package/dist/types/components/MarkdownEditor/novel/extensions/ai-highlight.d.ts +36 -0
  208. package/dist/types/components/MarkdownEditor/novel/extensions/ai-highlight.d.ts.map +1 -0
  209. package/dist/types/components/MarkdownEditor/novel/extensions/custom-keymap.d.ts +17 -0
  210. package/dist/types/components/MarkdownEditor/novel/extensions/custom-keymap.d.ts.map +1 -0
  211. package/dist/types/components/MarkdownEditor/novel/extensions/image-resizer.d.ts +7 -0
  212. package/dist/types/components/MarkdownEditor/novel/extensions/image-resizer.d.ts.map +1 -0
  213. package/dist/types/components/MarkdownEditor/novel/extensions/index.d.ts +30 -0
  214. package/dist/types/components/MarkdownEditor/novel/extensions/index.d.ts.map +1 -0
  215. package/dist/types/components/MarkdownEditor/novel/extensions/slash-command.d.ts +38 -0
  216. package/dist/types/components/MarkdownEditor/novel/extensions/slash-command.d.ts.map +1 -0
  217. package/dist/types/components/MarkdownEditor/novel/extensions/updated-image.d.ts +8 -0
  218. package/dist/types/components/MarkdownEditor/novel/extensions/updated-image.d.ts.map +1 -0
  219. package/dist/types/components/MarkdownEditor/novel/index.d.ts +16 -0
  220. package/dist/types/components/MarkdownEditor/novel/plugins/index.d.ts +2 -0
  221. package/dist/types/components/MarkdownEditor/novel/plugins/upload-images.d.ts +22 -0
  222. package/dist/types/components/MarkdownEditor/novel/plugins/upload-images.d.ts.map +1 -0
  223. package/dist/types/components/MarkdownEditor/novel/utils/atoms.d.ts +21 -0
  224. package/dist/types/components/MarkdownEditor/novel/utils/atoms.d.ts.map +1 -0
  225. package/dist/types/components/MarkdownEditor/novel/utils/index.d.ts +10 -0
  226. package/dist/types/components/MarkdownEditor/novel/utils/index.d.ts.map +1 -0
  227. package/dist/types/components/MarkdownEditor/selectors/ColorSelector.d.ts +17 -0
  228. package/dist/types/components/MarkdownEditor/selectors/ColorSelector.d.ts.map +1 -0
  229. package/dist/types/components/MarkdownEditor/selectors/LinkSelector.d.ts +15 -0
  230. package/dist/types/components/MarkdownEditor/selectors/LinkSelector.d.ts.map +1 -0
  231. package/dist/types/components/MarkdownEditor/selectors/NodeSelector.d.ts +22 -0
  232. package/dist/types/components/MarkdownEditor/selectors/NodeSelector.d.ts.map +1 -0
  233. package/dist/types/components/MarkdownEditor/selectors/TextButtons.d.ts +11 -0
  234. package/dist/types/components/MarkdownEditor/selectors/TextButtons.d.ts.map +1 -0
  235. package/dist/types/components/MarkdownEditor/slashCommand.d.ts +29 -0
  236. package/dist/types/components/MarkdownEditor/slashCommand.d.ts.map +1 -0
  237. package/dist/types/components/Pattern/GridDistortionPattern.d.ts +15 -0
  238. package/dist/types/components/Pattern/GridDistortionPattern.d.ts.map +1 -0
  239. package/dist/types/components/Pattern/index.d.ts +2 -1
  240. package/dist/types/components/SwitchSelector/SwitchSelector.d.ts +1 -1
  241. package/dist/types/components/SwitchSelector/VerticalSwitchSelector.d.ts +1 -1
  242. package/dist/types/components/Tag/index.d.ts +2 -2
  243. package/dist/types/components/Tag/index.d.ts.map +1 -1
  244. package/dist/types/components/Toaster/Toast.d.ts +1 -1
  245. package/dist/types/components/index.d.ts +24 -3
  246. package/dist/types/routes.d.ts +2 -1
  247. package/dist/types/routes.d.ts.map +1 -1
  248. package/package.json +63 -32
  249. package/src/components/MarkdownEditor/markdown-editor.css +297 -0
@@ -0,0 +1,139 @@
1
+ 'use client';
2
+
3
+ import { cn } from "../../../utils/cn.mjs";
4
+ import { useEditor } from "../novel/components/index.mjs";
5
+ import { useEffect, useRef, useState } from "react";
6
+ import { Check, CheckSquare, ChevronDown, Code, Heading1, Heading2, Heading3, ListOrdered, TextIcon, TextQuote } from "lucide-react";
7
+ import { jsx, jsxs } from "react/jsx-runtime";
8
+ import { useIntlayer } from "react-intlayer";
9
+
10
+ //#region src/components/MarkdownEditor/selectors/NodeSelector.tsx
11
+ const items = [
12
+ {
13
+ name: "Text",
14
+ icon: TextIcon,
15
+ command: (editor) => editor.chain().focus().clearNodes().run(),
16
+ isActive: (editor) => editor.isActive("paragraph") && !editor.isActive("bulletList") && !editor.isActive("orderedList")
17
+ },
18
+ {
19
+ name: "Heading 1",
20
+ icon: Heading1,
21
+ command: (editor) => editor.chain().focus().clearNodes().toggleHeading({ level: 1 }).run(),
22
+ isActive: (editor) => editor.isActive("heading", { level: 1 })
23
+ },
24
+ {
25
+ name: "Heading 2",
26
+ icon: Heading2,
27
+ command: (editor) => editor.chain().focus().clearNodes().toggleHeading({ level: 2 }).run(),
28
+ isActive: (editor) => editor.isActive("heading", { level: 2 })
29
+ },
30
+ {
31
+ name: "Heading 3",
32
+ icon: Heading3,
33
+ command: (editor) => editor.chain().focus().clearNodes().toggleHeading({ level: 3 }).run(),
34
+ isActive: (editor) => editor.isActive("heading", { level: 3 })
35
+ },
36
+ {
37
+ name: "To-do List",
38
+ icon: CheckSquare,
39
+ command: (editor) => editor.chain().focus().clearNodes().toggleTaskList().run(),
40
+ isActive: (editor) => editor.isActive("taskItem")
41
+ },
42
+ {
43
+ name: "Bullet List",
44
+ icon: ListOrdered,
45
+ command: (editor) => editor.chain().focus().clearNodes().toggleBulletList().run(),
46
+ isActive: (editor) => editor.isActive("bulletList")
47
+ },
48
+ {
49
+ name: "Numbered List",
50
+ icon: ListOrdered,
51
+ command: (editor) => editor.chain().focus().clearNodes().toggleOrderedList().run(),
52
+ isActive: (editor) => editor.isActive("orderedList")
53
+ },
54
+ {
55
+ name: "Quote",
56
+ icon: TextQuote,
57
+ command: (editor) => editor.chain().focus().clearNodes().toggleBlockquote().run(),
58
+ isActive: (editor) => editor.isActive("blockquote")
59
+ },
60
+ {
61
+ name: "Code",
62
+ icon: Code,
63
+ command: (editor) => editor.chain().focus().clearNodes().toggleCodeBlock().run(),
64
+ isActive: (editor) => editor.isActive("codeBlock")
65
+ }
66
+ ];
67
+ /**
68
+ * Bubble-menu selector that converts the current block between paragraph,
69
+ * headings, lists, quote and code.
70
+ *
71
+ * Uses `onMouseDown` + `preventDefault` on every interactive element so the
72
+ * editor's selection is never cleared while the panel is open.
73
+ */
74
+ const NodeSelector = () => {
75
+ const { editor } = useEditor();
76
+ const [isOpen, setIsOpen] = useState(false);
77
+ const containerRef = useRef(null);
78
+ const content = useIntlayer("markdown-editor");
79
+ useEffect(() => {
80
+ if (!isOpen) return;
81
+ const handleOutsideMouseDown = (event) => {
82
+ if (!containerRef.current?.contains(event.target)) setIsOpen(false);
83
+ };
84
+ document.addEventListener("mousedown", handleOutsideMouseDown);
85
+ return () => document.removeEventListener("mousedown", handleOutsideMouseDown);
86
+ }, [isOpen]);
87
+ if (!editor) return null;
88
+ const activeItem = items.filter((item) => item.isActive(editor)).pop() ?? { name: "Multiple" };
89
+ const getItemName = (name) => {
90
+ switch (name) {
91
+ case "Text": return content.text.value;
92
+ case "Heading 1": return content.heading1.value;
93
+ case "Heading 2": return content.heading2.value;
94
+ case "Heading 3": return content.heading3.value;
95
+ case "To-do List": return content.todoList.value;
96
+ case "Bullet List": return content.bulletList.value;
97
+ case "Numbered List": return content.numberedList.value;
98
+ case "Quote": return content.quote.value;
99
+ case "Code": return content.code.value;
100
+ case "Multiple": return content.multiple.value;
101
+ default: return name;
102
+ }
103
+ };
104
+ return /* @__PURE__ */ jsxs("div", {
105
+ ref: containerRef,
106
+ className: "relative",
107
+ children: [/* @__PURE__ */ jsxs("button", {
108
+ type: "button",
109
+ onMouseDown: (e) => {
110
+ e.preventDefault();
111
+ setIsOpen((prev) => !prev);
112
+ },
113
+ className: "flex items-center gap-1 whitespace-nowrap rounded-none px-3 py-1.5 text-sm hover:bg-accent",
114
+ children: [/* @__PURE__ */ jsx("span", { children: getItemName(activeItem.name) }), /* @__PURE__ */ jsx(ChevronDown, { className: cn("size-3 transition-transform", isOpen && "rotate-180") })]
115
+ }), isOpen && /* @__PURE__ */ jsx("div", {
116
+ className: "absolute top-[calc(100%+0.5rem)] left-0 z-50 w-48 rounded-md border bg-popover p-1 shadow-md",
117
+ children: items.map((item) => /* @__PURE__ */ jsxs("button", {
118
+ type: "button",
119
+ onMouseDown: (e) => {
120
+ e.preventDefault();
121
+ item.command(editor);
122
+ setIsOpen(false);
123
+ },
124
+ className: "flex w-full cursor-pointer items-center justify-between rounded-sm px-2 py-1 text-sm hover:bg-accent",
125
+ children: [/* @__PURE__ */ jsxs("div", {
126
+ className: "flex items-center space-x-2",
127
+ children: [/* @__PURE__ */ jsx("div", {
128
+ className: "rounded-sm border p-1",
129
+ children: /* @__PURE__ */ jsx(item.icon, { className: "size-3" })
130
+ }), /* @__PURE__ */ jsx("span", { children: getItemName(item.name) })]
131
+ }), activeItem.name === item.name && /* @__PURE__ */ jsx(Check, { className: "size-4" })]
132
+ }, item.name))
133
+ })]
134
+ });
135
+ };
136
+
137
+ //#endregion
138
+ export { NodeSelector };
139
+ //# sourceMappingURL=NodeSelector.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NodeSelector.mjs","names":[],"sources":["../../../../../src/components/MarkdownEditor/selectors/NodeSelector.tsx"],"sourcesContent":["'use client';\n\nimport { cn } from '@utils/cn';\nimport {\n Check,\n CheckSquare,\n ChevronDown,\n Code,\n Heading1,\n Heading2,\n Heading3,\n ListOrdered,\n type LucideIcon,\n TextIcon,\n TextQuote,\n} from 'lucide-react';\nimport { type FC, useEffect, useRef, useState } from 'react';\nimport { useIntlayer } from 'react-intlayer';\nimport { type EditorInstance, useEditor } from '../novel';\n\nexport type SelectorItem = {\n name: string;\n icon: LucideIcon;\n command: (editor: NonNullable<EditorInstance>) => void;\n isActive: (editor: NonNullable<EditorInstance>) => boolean;\n};\n\nconst items: SelectorItem[] = [\n {\n name: 'Text',\n icon: TextIcon,\n command: (editor) => editor.chain().focus().clearNodes().run(),\n isActive: (editor) =>\n editor.isActive('paragraph') &&\n !editor.isActive('bulletList') &&\n !editor.isActive('orderedList'),\n },\n {\n name: 'Heading 1',\n icon: Heading1,\n command: (editor) =>\n editor.chain().focus().clearNodes().toggleHeading({ level: 1 }).run(),\n isActive: (editor) => editor.isActive('heading', { level: 1 }),\n },\n {\n name: 'Heading 2',\n icon: Heading2,\n command: (editor) =>\n editor.chain().focus().clearNodes().toggleHeading({ level: 2 }).run(),\n isActive: (editor) => editor.isActive('heading', { level: 2 }),\n },\n {\n name: 'Heading 3',\n icon: Heading3,\n command: (editor) =>\n editor.chain().focus().clearNodes().toggleHeading({ level: 3 }).run(),\n isActive: (editor) => editor.isActive('heading', { level: 3 }),\n },\n {\n name: 'To-do List',\n icon: CheckSquare,\n command: (editor) =>\n editor.chain().focus().clearNodes().toggleTaskList().run(),\n isActive: (editor) => editor.isActive('taskItem'),\n },\n {\n name: 'Bullet List',\n icon: ListOrdered,\n command: (editor) =>\n editor.chain().focus().clearNodes().toggleBulletList().run(),\n isActive: (editor) => editor.isActive('bulletList'),\n },\n {\n name: 'Numbered List',\n icon: ListOrdered,\n command: (editor) =>\n editor.chain().focus().clearNodes().toggleOrderedList().run(),\n isActive: (editor) => editor.isActive('orderedList'),\n },\n {\n name: 'Quote',\n icon: TextQuote,\n command: (editor) =>\n editor.chain().focus().clearNodes().toggleBlockquote().run(),\n isActive: (editor) => editor.isActive('blockquote'),\n },\n {\n name: 'Code',\n icon: Code,\n command: (editor) =>\n editor.chain().focus().clearNodes().toggleCodeBlock().run(),\n isActive: (editor) => editor.isActive('codeBlock'),\n },\n];\n\n/**\n * Bubble-menu selector that converts the current block between paragraph,\n * headings, lists, quote and code.\n *\n * Uses `onMouseDown` + `preventDefault` on every interactive element so the\n * editor's selection is never cleared while the panel is open.\n */\nexport const NodeSelector: FC = () => {\n const { editor } = useEditor();\n const [isOpen, setIsOpen] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n const content = useIntlayer('markdown-editor');\n\n useEffect(() => {\n if (!isOpen) return;\n const handleOutsideMouseDown = (event: MouseEvent) => {\n if (!containerRef.current?.contains(event.target as Node)) {\n setIsOpen(false);\n }\n };\n document.addEventListener('mousedown', handleOutsideMouseDown);\n return () =>\n document.removeEventListener('mousedown', handleOutsideMouseDown);\n }, [isOpen]);\n\n if (!editor) return null;\n\n const activeItem = items.filter((item) => item.isActive(editor)).pop() ?? {\n name: 'Multiple',\n };\n\n const getItemName = (name: string) => {\n switch (name) {\n case 'Text':\n return content.text.value;\n case 'Heading 1':\n return content.heading1.value;\n case 'Heading 2':\n return content.heading2.value;\n case 'Heading 3':\n return content.heading3.value;\n case 'To-do List':\n return content.todoList.value;\n case 'Bullet List':\n return content.bulletList.value;\n case 'Numbered List':\n return content.numberedList.value;\n case 'Quote':\n return content.quote.value;\n case 'Code':\n return content.code.value;\n case 'Multiple':\n return content.multiple.value;\n default:\n return name;\n }\n };\n\n return (\n <div ref={containerRef} className=\"relative\">\n <button\n type=\"button\"\n onMouseDown={(e) => {\n e.preventDefault();\n setIsOpen((prev) => !prev);\n }}\n className=\"flex items-center gap-1 whitespace-nowrap rounded-none px-3 py-1.5 text-sm hover:bg-accent\"\n >\n <span>{getItemName(activeItem.name)}</span>\n <ChevronDown\n className={cn('size-3 transition-transform', isOpen && 'rotate-180')}\n />\n </button>\n\n {isOpen && (\n <div className=\"absolute top-[calc(100%+0.5rem)] left-0 z-50 w-48 rounded-md border bg-popover p-1 shadow-md\">\n {items.map((item) => (\n <button\n type=\"button\"\n key={item.name}\n onMouseDown={(e) => {\n e.preventDefault();\n item.command(editor);\n setIsOpen(false);\n }}\n className=\"flex w-full cursor-pointer items-center justify-between rounded-sm px-2 py-1 text-sm hover:bg-accent\"\n >\n <div className=\"flex items-center space-x-2\">\n <div className=\"rounded-sm border p-1\">\n <item.icon className=\"size-3\" />\n </div>\n <span>{getItemName(item.name)}</span>\n </div>\n {activeItem.name === item.name && <Check className=\"size-4\" />}\n </button>\n ))}\n </div>\n )}\n </div>\n );\n};\n"],"mappings":"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"}
@@ -0,0 +1,81 @@
1
+ 'use client';
2
+
3
+ import { cn } from "../../../utils/cn.mjs";
4
+ import { Button } from "../../Button/Button.mjs";
5
+ import { EditorBubbleItem } from "../novel/components/editor-bubble-item.mjs";
6
+ import { useEditor } from "../novel/components/index.mjs";
7
+ import { BoldIcon, CodeIcon, ItalicIcon, StrikethroughIcon, UnderlineIcon } from "lucide-react";
8
+ import { jsx } from "react/jsx-runtime";
9
+ import { useIntlayer } from "react-intlayer";
10
+
11
+ //#region src/components/MarkdownEditor/selectors/TextButtons.tsx
12
+ /**
13
+ * Inline mark toggles (bold / italic / underline / strike / code) shown in the
14
+ * bubble menu.
15
+ */
16
+ const TextButtons = () => {
17
+ const { editor } = useEditor();
18
+ const content = useIntlayer("markdown-editor");
19
+ if (!editor) return null;
20
+ const items = [
21
+ {
22
+ name: "bold",
23
+ isActive: (currentEditor) => currentEditor.isActive("bold"),
24
+ command: (currentEditor) => currentEditor.chain().focus().toggleBold().run(),
25
+ icon: BoldIcon
26
+ },
27
+ {
28
+ name: "italic",
29
+ isActive: (currentEditor) => currentEditor.isActive("italic"),
30
+ command: (currentEditor) => currentEditor.chain().focus().toggleItalic().run(),
31
+ icon: ItalicIcon
32
+ },
33
+ {
34
+ name: "underline",
35
+ isActive: (currentEditor) => currentEditor.isActive("underline"),
36
+ command: (currentEditor) => currentEditor.chain().focus().toggleUnderline().run(),
37
+ icon: UnderlineIcon
38
+ },
39
+ {
40
+ name: "strike",
41
+ isActive: (currentEditor) => currentEditor.isActive("strike"),
42
+ command: (currentEditor) => currentEditor.chain().focus().toggleStrike().run(),
43
+ icon: StrikethroughIcon
44
+ },
45
+ {
46
+ name: "code",
47
+ isActive: (currentEditor) => currentEditor.isActive("code"),
48
+ command: (currentEditor) => currentEditor.chain().focus().toggleCode().run(),
49
+ icon: CodeIcon
50
+ }
51
+ ];
52
+ const getButtonLabel = (name) => {
53
+ switch (name) {
54
+ case "bold": return content.bold.value;
55
+ case "italic": return content.italic.value;
56
+ case "underline": return content.underline.value;
57
+ case "strike": return content.strike.value;
58
+ case "code": return content.code.value;
59
+ default: return name;
60
+ }
61
+ };
62
+ return /* @__PURE__ */ jsx("div", {
63
+ className: "flex",
64
+ children: items.map((item) => /* @__PURE__ */ jsx(EditorBubbleItem, {
65
+ onSelect: (selectedEditor) => item.command(selectedEditor),
66
+ children: /* @__PURE__ */ jsx(Button, {
67
+ label: getButtonLabel(item.name),
68
+ size: "icon-sm",
69
+ variant: "hoverable",
70
+ color: "text",
71
+ roundedSize: "none",
72
+ Icon: item.icon,
73
+ iconClassName: cn(item.isActive(editor) && "text-blue-500")
74
+ })
75
+ }, item.name))
76
+ });
77
+ };
78
+
79
+ //#endregion
80
+ export { TextButtons };
81
+ //# sourceMappingURL=TextButtons.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TextButtons.mjs","names":[],"sources":["../../../../../src/components/MarkdownEditor/selectors/TextButtons.tsx"],"sourcesContent":["'use client';\n\nimport { Button } from '@components/Button';\nimport { cn } from '@utils/cn';\nimport {\n BoldIcon,\n CodeIcon,\n ItalicIcon,\n StrikethroughIcon,\n UnderlineIcon,\n} from 'lucide-react';\nimport { useIntlayer } from 'react-intlayer';\nimport { EditorBubbleItem, useEditor } from '../novel';\nimport type { SelectorItem } from './NodeSelector';\n\n/**\n * Inline mark toggles (bold / italic / underline / strike / code) shown in the\n * bubble menu.\n */\nexport const TextButtons = () => {\n const { editor } = useEditor();\n const content = useIntlayer('markdown-editor');\n\n if (!editor) return null;\n\n const items: SelectorItem[] = [\n {\n name: 'bold',\n isActive: (currentEditor) => currentEditor.isActive('bold'),\n command: (currentEditor) =>\n currentEditor.chain().focus().toggleBold().run(),\n icon: BoldIcon,\n },\n {\n name: 'italic',\n isActive: (currentEditor) => currentEditor.isActive('italic'),\n command: (currentEditor) =>\n currentEditor.chain().focus().toggleItalic().run(),\n icon: ItalicIcon,\n },\n {\n name: 'underline',\n isActive: (currentEditor) => currentEditor.isActive('underline'),\n command: (currentEditor) =>\n currentEditor.chain().focus().toggleUnderline().run(),\n icon: UnderlineIcon,\n },\n {\n name: 'strike',\n isActive: (currentEditor) => currentEditor.isActive('strike'),\n command: (currentEditor) =>\n currentEditor.chain().focus().toggleStrike().run(),\n icon: StrikethroughIcon,\n },\n {\n name: 'code',\n isActive: (currentEditor) => currentEditor.isActive('code'),\n command: (currentEditor) =>\n currentEditor.chain().focus().toggleCode().run(),\n icon: CodeIcon,\n },\n ];\n\n const getButtonLabel = (name: string) => {\n switch (name) {\n case 'bold':\n return content.bold.value;\n case 'italic':\n return content.italic.value;\n case 'underline':\n return content.underline.value;\n case 'strike':\n return content.strike.value;\n case 'code':\n return content.code.value;\n default:\n return name;\n }\n };\n\n return (\n <div className=\"flex\">\n {items.map((item) => (\n <EditorBubbleItem\n key={item.name}\n onSelect={(selectedEditor) => item.command(selectedEditor)}\n >\n <Button\n label={getButtonLabel(item.name)}\n size=\"icon-sm\"\n variant=\"hoverable\"\n color=\"text\"\n roundedSize=\"none\"\n Icon={item.icon}\n iconClassName={cn(item.isActive(editor) && 'text-blue-500')}\n />\n </EditorBubbleItem>\n ))}\n </div>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;AAmBA,MAAa,oBAAoB;CAC/B,MAAM,EAAE,WAAW,WAAW;CAC9B,MAAM,UAAU,YAAY,kBAAkB;AAE9C,KAAI,CAAC,OAAQ,QAAO;CAEpB,MAAM,QAAwB;EAC5B;GACE,MAAM;GACN,WAAW,kBAAkB,cAAc,SAAS,OAAO;GAC3D,UAAU,kBACR,cAAc,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK;GAClD,MAAM;GACP;EACD;GACE,MAAM;GACN,WAAW,kBAAkB,cAAc,SAAS,SAAS;GAC7D,UAAU,kBACR,cAAc,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK;GACpD,MAAM;GACP;EACD;GACE,MAAM;GACN,WAAW,kBAAkB,cAAc,SAAS,YAAY;GAChE,UAAU,kBACR,cAAc,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,KAAK;GACvD,MAAM;GACP;EACD;GACE,MAAM;GACN,WAAW,kBAAkB,cAAc,SAAS,SAAS;GAC7D,UAAU,kBACR,cAAc,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK;GACpD,MAAM;GACP;EACD;GACE,MAAM;GACN,WAAW,kBAAkB,cAAc,SAAS,OAAO;GAC3D,UAAU,kBACR,cAAc,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK;GAClD,MAAM;GACP;EACF;CAED,MAAM,kBAAkB,SAAiB;AACvC,UAAQ,MAAR;GACE,KAAK,OACH,QAAO,QAAQ,KAAK;GACtB,KAAK,SACH,QAAO,QAAQ,OAAO;GACxB,KAAK,YACH,QAAO,QAAQ,UAAU;GAC3B,KAAK,SACH,QAAO,QAAQ,OAAO;GACxB,KAAK,OACH,QAAO,QAAQ,KAAK;GACtB,QACE,QAAO;;;AAIb,QACE,oBAAC,OAAD;EAAK,WAAU;YACZ,MAAM,KAAK,SACV,oBAAC,kBAAD;GAEE,WAAW,mBAAmB,KAAK,QAAQ,eAAe;aAE1D,oBAAC,QAAD;IACE,OAAO,eAAe,KAAK,KAAK;IAChC,MAAK;IACL,SAAQ;IACR,OAAM;IACN,aAAY;IACZ,MAAM,KAAK;IACX,eAAe,GAAG,KAAK,SAAS,OAAO,IAAI,gBAAgB;IAC3D;GACe,EAZZ,KAAK,KAYO,CACnB;EACE"}
@@ -0,0 +1,161 @@
1
+ import { YoutubeLogo } from "../SocialNetworks/YoutubeLogo.mjs";
2
+ import { Command, createSuggestionItems, renderItems } from "./novel/extensions/slash-command.mjs";
3
+ import { CheckSquare, Code, Heading1, Heading2, Heading3, ImageIcon, List, ListOrdered, Text, TextQuote } from "lucide-react";
4
+ import { jsx } from "react/jsx-runtime";
5
+
6
+ //#region src/components/MarkdownEditor/slashCommand.tsx
7
+ /**
8
+ * Builds the list of slash-command suggestions. The image command needs the
9
+ * runtime `uploadFn`, hence the factory.
10
+ *
11
+ * @param uploadFn - Novel upload handler used by the "Image" command.
12
+ * @param content - The internationalized content object from useIntlayer.
13
+ */
14
+ const getSuggestionItems = (uploadFn, content) => createSuggestionItems([
15
+ {
16
+ title: content.text.value,
17
+ description: content.textDesc.value,
18
+ searchTerms: ["p", "paragraph"],
19
+ icon: /* @__PURE__ */ jsx(Text, { className: "size-10" }),
20
+ command: ({ editor, range }) => {
21
+ editor.chain().focus().deleteRange(range).toggleNode("paragraph", "paragraph").run();
22
+ }
23
+ },
24
+ {
25
+ title: content.todoList.value,
26
+ description: content.todoListDesc.value,
27
+ searchTerms: [
28
+ "todo",
29
+ "task",
30
+ "list",
31
+ "check",
32
+ "checkbox"
33
+ ],
34
+ icon: /* @__PURE__ */ jsx(CheckSquare, { className: "size-10" }),
35
+ command: ({ editor, range }) => {
36
+ editor.chain().focus().deleteRange(range).toggleTaskList().run();
37
+ }
38
+ },
39
+ {
40
+ title: content.heading1.value,
41
+ description: content.heading1Desc.value,
42
+ searchTerms: [
43
+ "title",
44
+ "big",
45
+ "large"
46
+ ],
47
+ icon: /* @__PURE__ */ jsx(Heading1, { className: "size-10" }),
48
+ command: ({ editor, range }) => {
49
+ editor.chain().focus().deleteRange(range).setNode("heading", { level: 1 }).run();
50
+ }
51
+ },
52
+ {
53
+ title: content.heading2.value,
54
+ description: content.heading2Desc.value,
55
+ searchTerms: ["subtitle", "medium"],
56
+ icon: /* @__PURE__ */ jsx(Heading2, { className: "size-10" }),
57
+ command: ({ editor, range }) => {
58
+ editor.chain().focus().deleteRange(range).setNode("heading", { level: 2 }).run();
59
+ }
60
+ },
61
+ {
62
+ title: content.heading3.value,
63
+ description: content.heading3Desc.value,
64
+ searchTerms: ["subtitle", "small"],
65
+ icon: /* @__PURE__ */ jsx(Heading3, { className: "size-10" }),
66
+ command: ({ editor, range }) => {
67
+ editor.chain().focus().deleteRange(range).setNode("heading", { level: 3 }).run();
68
+ }
69
+ },
70
+ {
71
+ title: content.bulletList.value,
72
+ description: content.bulletListDesc.value,
73
+ searchTerms: ["unordered", "point"],
74
+ icon: /* @__PURE__ */ jsx(List, { className: "size-10" }),
75
+ command: ({ editor, range }) => {
76
+ editor.chain().focus().deleteRange(range).toggleBulletList().run();
77
+ }
78
+ },
79
+ {
80
+ title: content.numberedList.value,
81
+ description: content.numberedListDesc.value,
82
+ searchTerms: ["ordered"],
83
+ icon: /* @__PURE__ */ jsx(ListOrdered, { className: "size-10" }),
84
+ command: ({ editor, range }) => {
85
+ editor.chain().focus().deleteRange(range).toggleOrderedList().run();
86
+ }
87
+ },
88
+ {
89
+ title: content.quote.value,
90
+ description: content.quoteDesc.value,
91
+ searchTerms: ["blockquote"],
92
+ icon: /* @__PURE__ */ jsx(TextQuote, { className: "size-10" }),
93
+ command: ({ editor, range }) => editor.chain().focus().deleteRange(range).toggleNode("paragraph", "paragraph").toggleBlockquote().run()
94
+ },
95
+ {
96
+ title: content.code.value,
97
+ description: content.codeDesc.value,
98
+ searchTerms: ["codeblock"],
99
+ icon: /* @__PURE__ */ jsx(Code, { className: "size-10" }),
100
+ command: ({ editor, range }) => editor.chain().focus().deleteRange(range).toggleCodeBlock().run()
101
+ },
102
+ {
103
+ title: content.image.value,
104
+ description: content.imageDesc.value,
105
+ searchTerms: [
106
+ "photo",
107
+ "picture",
108
+ "media"
109
+ ],
110
+ icon: /* @__PURE__ */ jsx(ImageIcon, { className: "size-10" }),
111
+ command: ({ editor, range }) => {
112
+ editor.chain().focus().deleteRange(range).run();
113
+ const input = document.createElement("input");
114
+ input.type = "file";
115
+ input.accept = "image/*";
116
+ input.onchange = () => {
117
+ if (input.files?.length) {
118
+ const file = input.files[0];
119
+ const pos = editor.view.state.selection.from;
120
+ uploadFn(file, editor.view, pos);
121
+ }
122
+ };
123
+ input.click();
124
+ }
125
+ },
126
+ {
127
+ title: content.youtube.value,
128
+ description: content.youtubeDesc.value,
129
+ searchTerms: [
130
+ "video",
131
+ "youtube",
132
+ "embed"
133
+ ],
134
+ icon: /* @__PURE__ */ jsx(YoutubeLogo, { className: "size-10" }),
135
+ command: ({ editor, range }) => {
136
+ const videoLink = prompt(content.youtubePrompt.value);
137
+ if (videoLink && /^((?:https?:)?\/\/)?((?:www|m)\.)?((?:youtube\.com|youtu.be))(\/(?:[\w-]+\?v=|embed\/|v\/)?)([\w-]+)(\S+)?$/.test(videoLink)) editor.chain().focus().deleteRange(range).setYoutubeVideo({ src: videoLink }).run();
138
+ else if (videoLink !== null) alert(content.youtubeError.value);
139
+ }
140
+ }
141
+ ]);
142
+ /**
143
+ * Builds the slash-command extension wired to the given upload handler.
144
+ *
145
+ * @param uploadFn - Novel upload handler used by the "Image" command.
146
+ * @param content - The internationalized content object from useIntlayer.
147
+ */
148
+ const createSlashCommand = (uploadFn, content) => {
149
+ const suggestionItems = getSuggestionItems(uploadFn, content);
150
+ return {
151
+ slashCommand: Command.configure({ suggestion: {
152
+ items: () => suggestionItems,
153
+ render: renderItems
154
+ } }),
155
+ suggestionItems
156
+ };
157
+ };
158
+
159
+ //#endregion
160
+ export { createSlashCommand, getSuggestionItems };
161
+ //# sourceMappingURL=slashCommand.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slashCommand.mjs","names":[],"sources":["../../../../src/components/MarkdownEditor/slashCommand.tsx"],"sourcesContent":["import { YoutubeLogo } from '@components/SocialNetworks';\nimport {\n CheckSquare,\n Code,\n Heading1,\n Heading2,\n Heading3,\n ImageIcon,\n List,\n ListOrdered,\n Text,\n TextQuote,\n} from 'lucide-react';\nimport {\n Command,\n createSuggestionItems,\n renderItems,\n type SuggestionItem,\n type UploadFn,\n} from './novel';\n\n/**\n * Builds the list of slash-command suggestions. The image command needs the\n * runtime `uploadFn`, hence the factory.\n *\n * @param uploadFn - Novel upload handler used by the \"Image\" command.\n * @param content - The internationalized content object from useIntlayer.\n */\nexport const getSuggestionItems = (\n uploadFn: UploadFn,\n content: any\n): SuggestionItem[] =>\n createSuggestionItems([\n {\n title: content.text.value,\n description: content.textDesc.value,\n searchTerms: ['p', 'paragraph'],\n icon: <Text className=\"size-10\" />,\n command: ({ editor, range }) => {\n editor\n .chain()\n .focus()\n .deleteRange(range)\n .toggleNode('paragraph', 'paragraph')\n .run();\n },\n },\n {\n title: content.todoList.value,\n description: content.todoListDesc.value,\n searchTerms: ['todo', 'task', 'list', 'check', 'checkbox'],\n icon: <CheckSquare className=\"size-10\" />,\n command: ({ editor, range }) => {\n editor.chain().focus().deleteRange(range).toggleTaskList().run();\n },\n },\n {\n title: content.heading1.value,\n description: content.heading1Desc.value,\n searchTerms: ['title', 'big', 'large'],\n icon: <Heading1 className=\"size-10\" />,\n command: ({ editor, range }) => {\n editor\n .chain()\n .focus()\n .deleteRange(range)\n .setNode('heading', { level: 1 })\n .run();\n },\n },\n {\n title: content.heading2.value,\n description: content.heading2Desc.value,\n searchTerms: ['subtitle', 'medium'],\n icon: <Heading2 className=\"size-10\" />,\n command: ({ editor, range }) => {\n editor\n .chain()\n .focus()\n .deleteRange(range)\n .setNode('heading', { level: 2 })\n .run();\n },\n },\n {\n title: content.heading3.value,\n description: content.heading3Desc.value,\n searchTerms: ['subtitle', 'small'],\n icon: <Heading3 className=\"size-10\" />,\n command: ({ editor, range }) => {\n editor\n .chain()\n .focus()\n .deleteRange(range)\n .setNode('heading', { level: 3 })\n .run();\n },\n },\n {\n title: content.bulletList.value,\n description: content.bulletListDesc.value,\n searchTerms: ['unordered', 'point'],\n icon: <List className=\"size-10\" />,\n command: ({ editor, range }) => {\n editor.chain().focus().deleteRange(range).toggleBulletList().run();\n },\n },\n {\n title: content.numberedList.value,\n description: content.numberedListDesc.value,\n searchTerms: ['ordered'],\n icon: <ListOrdered className=\"size-10\" />,\n command: ({ editor, range }) => {\n editor.chain().focus().deleteRange(range).toggleOrderedList().run();\n },\n },\n {\n title: content.quote.value,\n description: content.quoteDesc.value,\n searchTerms: ['blockquote'],\n icon: <TextQuote className=\"size-10\" />,\n command: ({ editor, range }) =>\n editor\n .chain()\n .focus()\n .deleteRange(range)\n .toggleNode('paragraph', 'paragraph')\n .toggleBlockquote()\n .run(),\n },\n {\n title: content.code.value,\n description: content.codeDesc.value,\n searchTerms: ['codeblock'],\n icon: <Code className=\"size-10\" />,\n command: ({ editor, range }) =>\n editor.chain().focus().deleteRange(range).toggleCodeBlock().run(),\n },\n {\n title: content.image.value,\n description: content.imageDesc.value,\n searchTerms: ['photo', 'picture', 'media'],\n icon: <ImageIcon className=\"size-10\" />,\n command: ({ editor, range }) => {\n editor.chain().focus().deleteRange(range).run();\n const input = document.createElement('input');\n input.type = 'file';\n input.accept = 'image/*';\n input.onchange = () => {\n if (input.files?.length) {\n const file = input.files[0];\n const pos = editor.view.state.selection.from;\n uploadFn(file, editor.view, pos);\n }\n };\n input.click();\n },\n },\n {\n title: content.youtube.value,\n description: content.youtubeDesc.value,\n searchTerms: ['video', 'youtube', 'embed'],\n icon: <YoutubeLogo className=\"size-10\" />,\n command: ({ editor, range }) => {\n const videoLink = prompt(content.youtubePrompt.value);\n // From https://regexr.com/3dj5t\n const ytRegex =\n /^((?:https?:)?\\/\\/)?((?:www|m)\\.)?((?:youtube\\.com|youtu.be))(\\/(?:[\\w-]+\\?v=|embed\\/|v\\/)?)([\\w-]+)(\\S+)?$/;\n\n if (videoLink && ytRegex.test(videoLink)) {\n editor\n .chain()\n .focus()\n .deleteRange(range)\n .setYoutubeVideo({ src: videoLink })\n .run();\n } else if (videoLink !== null) {\n alert(content.youtubeError.value);\n }\n },\n },\n ]);\n\n/**\n * Builds the slash-command extension wired to the given upload handler.\n *\n * @param uploadFn - Novel upload handler used by the \"Image\" command.\n * @param content - The internationalized content object from useIntlayer.\n */\nexport const createSlashCommand = (uploadFn: UploadFn, content: any) => {\n const suggestionItems = getSuggestionItems(uploadFn, content);\n\n const slashCommand = Command.configure({\n suggestion: {\n items: () => suggestionItems,\n render: renderItems,\n },\n });\n\n return { slashCommand, suggestionItems };\n};\n"],"mappings":";;;;;;;;;;;;;AA4BA,MAAa,sBACX,UACA,YAEA,sBAAsB;CACpB;EACE,OAAO,QAAQ,KAAK;EACpB,aAAa,QAAQ,SAAS;EAC9B,aAAa,CAAC,KAAK,YAAY;EAC/B,MAAM,oBAAC,MAAD,EAAM,WAAU,WAAY;EAClC,UAAU,EAAE,QAAQ,YAAY;AAC9B,UACG,OAAO,CACP,OAAO,CACP,YAAY,MAAM,CAClB,WAAW,aAAa,YAAY,CACpC,KAAK;;EAEX;CACD;EACE,OAAO,QAAQ,SAAS;EACxB,aAAa,QAAQ,aAAa;EAClC,aAAa;GAAC;GAAQ;GAAQ;GAAQ;GAAS;GAAW;EAC1D,MAAM,oBAAC,aAAD,EAAa,WAAU,WAAY;EACzC,UAAU,EAAE,QAAQ,YAAY;AAC9B,UAAO,OAAO,CAAC,OAAO,CAAC,YAAY,MAAM,CAAC,gBAAgB,CAAC,KAAK;;EAEnE;CACD;EACE,OAAO,QAAQ,SAAS;EACxB,aAAa,QAAQ,aAAa;EAClC,aAAa;GAAC;GAAS;GAAO;GAAQ;EACtC,MAAM,oBAAC,UAAD,EAAU,WAAU,WAAY;EACtC,UAAU,EAAE,QAAQ,YAAY;AAC9B,UACG,OAAO,CACP,OAAO,CACP,YAAY,MAAM,CAClB,QAAQ,WAAW,EAAE,OAAO,GAAG,CAAC,CAChC,KAAK;;EAEX;CACD;EACE,OAAO,QAAQ,SAAS;EACxB,aAAa,QAAQ,aAAa;EAClC,aAAa,CAAC,YAAY,SAAS;EACnC,MAAM,oBAAC,UAAD,EAAU,WAAU,WAAY;EACtC,UAAU,EAAE,QAAQ,YAAY;AAC9B,UACG,OAAO,CACP,OAAO,CACP,YAAY,MAAM,CAClB,QAAQ,WAAW,EAAE,OAAO,GAAG,CAAC,CAChC,KAAK;;EAEX;CACD;EACE,OAAO,QAAQ,SAAS;EACxB,aAAa,QAAQ,aAAa;EAClC,aAAa,CAAC,YAAY,QAAQ;EAClC,MAAM,oBAAC,UAAD,EAAU,WAAU,WAAY;EACtC,UAAU,EAAE,QAAQ,YAAY;AAC9B,UACG,OAAO,CACP,OAAO,CACP,YAAY,MAAM,CAClB,QAAQ,WAAW,EAAE,OAAO,GAAG,CAAC,CAChC,KAAK;;EAEX;CACD;EACE,OAAO,QAAQ,WAAW;EAC1B,aAAa,QAAQ,eAAe;EACpC,aAAa,CAAC,aAAa,QAAQ;EACnC,MAAM,oBAAC,MAAD,EAAM,WAAU,WAAY;EAClC,UAAU,EAAE,QAAQ,YAAY;AAC9B,UAAO,OAAO,CAAC,OAAO,CAAC,YAAY,MAAM,CAAC,kBAAkB,CAAC,KAAK;;EAErE;CACD;EACE,OAAO,QAAQ,aAAa;EAC5B,aAAa,QAAQ,iBAAiB;EACtC,aAAa,CAAC,UAAU;EACxB,MAAM,oBAAC,aAAD,EAAa,WAAU,WAAY;EACzC,UAAU,EAAE,QAAQ,YAAY;AAC9B,UAAO,OAAO,CAAC,OAAO,CAAC,YAAY,MAAM,CAAC,mBAAmB,CAAC,KAAK;;EAEtE;CACD;EACE,OAAO,QAAQ,MAAM;EACrB,aAAa,QAAQ,UAAU;EAC/B,aAAa,CAAC,aAAa;EAC3B,MAAM,oBAAC,WAAD,EAAW,WAAU,WAAY;EACvC,UAAU,EAAE,QAAQ,YAClB,OACG,OAAO,CACP,OAAO,CACP,YAAY,MAAM,CAClB,WAAW,aAAa,YAAY,CACpC,kBAAkB,CAClB,KAAK;EACX;CACD;EACE,OAAO,QAAQ,KAAK;EACpB,aAAa,QAAQ,SAAS;EAC9B,aAAa,CAAC,YAAY;EAC1B,MAAM,oBAAC,MAAD,EAAM,WAAU,WAAY;EAClC,UAAU,EAAE,QAAQ,YAClB,OAAO,OAAO,CAAC,OAAO,CAAC,YAAY,MAAM,CAAC,iBAAiB,CAAC,KAAK;EACpE;CACD;EACE,OAAO,QAAQ,MAAM;EACrB,aAAa,QAAQ,UAAU;EAC/B,aAAa;GAAC;GAAS;GAAW;GAAQ;EAC1C,MAAM,oBAAC,WAAD,EAAW,WAAU,WAAY;EACvC,UAAU,EAAE,QAAQ,YAAY;AAC9B,UAAO,OAAO,CAAC,OAAO,CAAC,YAAY,MAAM,CAAC,KAAK;GAC/C,MAAM,QAAQ,SAAS,cAAc,QAAQ;AAC7C,SAAM,OAAO;AACb,SAAM,SAAS;AACf,SAAM,iBAAiB;AACrB,QAAI,MAAM,OAAO,QAAQ;KACvB,MAAM,OAAO,MAAM,MAAM;KACzB,MAAM,MAAM,OAAO,KAAK,MAAM,UAAU;AACxC,cAAS,MAAM,OAAO,MAAM,IAAI;;;AAGpC,SAAM,OAAO;;EAEhB;CACD;EACE,OAAO,QAAQ,QAAQ;EACvB,aAAa,QAAQ,YAAY;EACjC,aAAa;GAAC;GAAS;GAAW;GAAQ;EAC1C,MAAM,oBAAC,aAAD,EAAa,WAAU,WAAY;EACzC,UAAU,EAAE,QAAQ,YAAY;GAC9B,MAAM,YAAY,OAAO,QAAQ,cAAc,MAAM;AAKrD,OAAI,aAAa,8GAAQ,KAAK,UAAU,CACtC,QACG,OAAO,CACP,OAAO,CACP,YAAY,MAAM,CAClB,gBAAgB,EAAE,KAAK,WAAW,CAAC,CACnC,KAAK;YACC,cAAc,KACvB,OAAM,QAAQ,aAAa,MAAM;;EAGtC;CACF,CAAC;;;;;;;AAQJ,MAAa,sBAAsB,UAAoB,YAAiB;CACtE,MAAM,kBAAkB,mBAAmB,UAAU,QAAQ;AAS7D,QAAO;EAAE,cAPY,QAAQ,UAAU,EACrC,YAAY;GACV,aAAa;GACb,QAAQ;GACT,EACF,CAEoB;EAAE;EAAiB"}
@@ -1,10 +1,10 @@
1
1
  'use client';
2
2
 
3
3
  import { cn } from "../../utils/cn.mjs";
4
- import { useGetElementOrWindow } from "../../hooks/useGetElementOrWindow.mjs";
5
- import { useScrollBlockage } from "../../hooks/useScrollBlockage/index.mjs";
6
4
  import { Button } from "../Button/Button.mjs";
7
5
  import { Container } from "../Container/index.mjs";
6
+ import { useGetElementOrWindow } from "../../hooks/useGetElementOrWindow.mjs";
7
+ import { useScrollBlockage } from "../../hooks/useScrollBlockage/index.mjs";
8
8
  import { H3 } from "../Headers/index.mjs";
9
9
  import { useEffect } from "react";
10
10
  import { cva } from "class-variance-authority";
@@ -1,9 +1,9 @@
1
1
  'use client';
2
2
 
3
3
  import { cn } from "../../utils/cn.mjs";
4
+ import { MaxHeightSmoother } from "../MaxHeightSmoother/index.mjs";
4
5
  import { useScrollBlockage } from "../../hooks/useScrollBlockage/index.mjs";
5
6
  import { useScrollDetection } from "../../hooks/useScrollDetection.mjs";
6
- import { MaxHeightSmoother } from "../MaxHeightSmoother/index.mjs";
7
7
  import { Burger } from "./Burger.mjs";
8
8
  import { useRef, useState } from "react";
9
9
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -1,8 +1,8 @@
1
1
  'use client';
2
2
 
3
3
  import { cn } from "../../utils/cn.mjs";
4
- import { useItemSelector } from "../../hooks/useItemSelector.mjs";
5
4
  import { Button } from "../Button/Button.mjs";
5
+ import { useItemSelector } from "../../hooks/useItemSelector.mjs";
6
6
  import { useEffect, useRef } from "react";
7
7
  import { cva } from "class-variance-authority";
8
8
  import { ChevronLeft, ChevronRight, MoreHorizontal } from "lucide-react";