@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,83 @@
1
+ 'use client';
2
+
3
+ import { useCustomQuery } from "../../../api/hooks/ai.mjs";
4
+ import { useCallback, useState } from "react";
5
+
6
+ //#region src/components/MarkdownEditor/generative/useAICompletion.ts
7
+ /**
8
+ * Builds the system prompt + user message for a given AI option. The prompts
9
+ * intentionally match the Novel reference implementation so behaviour is
10
+ * consistent.
11
+ */
12
+ const buildPromptParts = (option, prompt, command) => {
13
+ switch (option) {
14
+ case "continue": return {
15
+ system: "You are an AI writing assistant that continues existing text based on context from prior text. Give more weight/priority to the later characters than the beginning ones. Limit your response to no more than 200 characters, but make sure to construct complete sentences. Use Markdown formatting when appropriate.",
16
+ userContent: prompt
17
+ };
18
+ case "improve": return {
19
+ system: "You are an AI writing assistant that improves existing text. Limit your response to no more than 200 characters, but make sure to construct complete sentences. Use Markdown formatting when appropriate.",
20
+ userContent: `The existing text is: ${prompt}`
21
+ };
22
+ case "shorter": return {
23
+ system: "You are an AI writing assistant that shortens existing text. Use Markdown formatting when appropriate.",
24
+ userContent: `The existing text is: ${prompt}`
25
+ };
26
+ case "longer": return {
27
+ system: "You are an AI writing assistant that lengthens existing text. Use Markdown formatting when appropriate.",
28
+ userContent: `The existing text is: ${prompt}`
29
+ };
30
+ case "fix": return {
31
+ system: "You are an AI writing assistant that fixes grammar and spelling errors in existing text. Limit your response to no more than 200 characters, but make sure to construct complete sentences. Use Markdown formatting when appropriate.",
32
+ userContent: `The existing text is: ${prompt}`
33
+ };
34
+ case "zap": return {
35
+ system: "You are an AI writing assistant that generates text based on a prompt. You take an input from the user and a command for manipulating the text. Use Markdown formatting when appropriate.",
36
+ userContent: `For this text: ${prompt}. You have to respect the command: ${command ?? ""}`
37
+ };
38
+ default: return {
39
+ system: "",
40
+ userContent: prompt
41
+ };
42
+ }
43
+ };
44
+ /**
45
+ * Adapter around {@link useCustomQuery} that exposes a Novel-compatible
46
+ * `useCompletion`-style API (`completion` / `complete` / `isLoading`).
47
+ *
48
+ * It routes generative requests through the Intlayer AI backend
49
+ * (`@intlayer/api` → `@intlayer/ai`) instead of the Vercel AI SDK.
50
+ *
51
+ * @param onError - Optional error callback (e.g. to display a toast).
52
+ */
53
+ const useAICompletion = (onError) => {
54
+ const { mutateAsync, isPending } = useCustomQuery();
55
+ const [completion, setCompletion] = useState("");
56
+ return {
57
+ completion,
58
+ complete: useCallback(async (prompt, options) => {
59
+ const { option, command } = options.body;
60
+ const { system, userContent } = buildPromptParts(option, prompt, command);
61
+ try {
62
+ const text = (await mutateAsync({
63
+ system,
64
+ messages: [{
65
+ role: "user",
66
+ content: userContent
67
+ }]
68
+ }))?.data?.fileContent ?? "";
69
+ setCompletion(text);
70
+ return text;
71
+ } catch (error) {
72
+ onError?.(error instanceof Error ? error : /* @__PURE__ */ new Error("AI request failed"));
73
+ return "";
74
+ }
75
+ }, [mutateAsync, onError]),
76
+ isLoading: isPending,
77
+ reset: useCallback(() => setCompletion(""), [])
78
+ };
79
+ };
80
+
81
+ //#endregion
82
+ export { useAICompletion };
83
+ //# sourceMappingURL=useAICompletion.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAICompletion.mjs","names":[],"sources":["../../../../../src/components/MarkdownEditor/generative/useAICompletion.ts"],"sourcesContent":["'use client';\n\nimport { useCustomQuery } from '@api/index';\nimport { useCallback, useState } from 'react';\n\n/**\n * The kind of transformation the AI should apply to the provided text.\n * Mirrors the options exposed by the Novel generative menu.\n */\nexport type AICompletionOption =\n | 'continue'\n | 'improve'\n | 'shorter'\n | 'longer'\n | 'fix'\n | 'zap';\n\nexport type CompleteOptions = {\n body: {\n option: AICompletionOption;\n /** Free-form instruction, only used by the `zap` option. */\n command?: string;\n };\n};\n\ntype PromptParts = {\n system: string;\n userContent: string;\n};\n\n/**\n * Builds the system prompt + user message for a given AI option. The prompts\n * intentionally match the Novel reference implementation so behaviour is\n * consistent.\n */\nconst buildPromptParts = (\n option: AICompletionOption,\n prompt: string,\n command?: string\n): PromptParts => {\n switch (option) {\n case 'continue':\n return {\n system:\n 'You are an AI writing assistant that continues existing text based on context from prior text. ' +\n 'Give more weight/priority to the later characters than the beginning ones. ' +\n 'Limit your response to no more than 200 characters, but make sure to construct complete sentences. ' +\n 'Use Markdown formatting when appropriate.',\n userContent: prompt,\n };\n case 'improve':\n return {\n system:\n 'You are an AI writing assistant that improves existing text. ' +\n 'Limit your response to no more than 200 characters, but make sure to construct complete sentences. ' +\n 'Use Markdown formatting when appropriate.',\n userContent: `The existing text is: ${prompt}`,\n };\n case 'shorter':\n return {\n system:\n 'You are an AI writing assistant that shortens existing text. ' +\n 'Use Markdown formatting when appropriate.',\n userContent: `The existing text is: ${prompt}`,\n };\n case 'longer':\n return {\n system:\n 'You are an AI writing assistant that lengthens existing text. ' +\n 'Use Markdown formatting when appropriate.',\n userContent: `The existing text is: ${prompt}`,\n };\n case 'fix':\n return {\n system:\n 'You are an AI writing assistant that fixes grammar and spelling errors in existing text. ' +\n 'Limit your response to no more than 200 characters, but make sure to construct complete sentences. ' +\n 'Use Markdown formatting when appropriate.',\n userContent: `The existing text is: ${prompt}`,\n };\n case 'zap':\n return {\n system:\n 'You are an AI writing assistant that generates text based on a prompt. ' +\n 'You take an input from the user and a command for manipulating the text. ' +\n 'Use Markdown formatting when appropriate.',\n userContent: `For this text: ${prompt}. You have to respect the command: ${command ?? ''}`,\n };\n default:\n return { system: '', userContent: prompt };\n }\n};\n\n/**\n * Adapter around {@link useCustomQuery} that exposes a Novel-compatible\n * `useCompletion`-style API (`completion` / `complete` / `isLoading`).\n *\n * It routes generative requests through the Intlayer AI backend\n * (`@intlayer/api` → `@intlayer/ai`) instead of the Vercel AI SDK.\n *\n * @param onError - Optional error callback (e.g. to display a toast).\n */\nexport const useAICompletion = (onError?: (error: Error) => void) => {\n const { mutateAsync, isPending } = useCustomQuery();\n const [completion, setCompletion] = useState('');\n\n const complete = useCallback(\n async (prompt: string, options: CompleteOptions): Promise<string> => {\n const { option, command } = options.body;\n const { system, userContent } = buildPromptParts(option, prompt, command);\n\n try {\n const result = await mutateAsync({\n system,\n messages: [{ role: 'user', content: userContent }],\n });\n\n const text = result?.data?.fileContent ?? '';\n setCompletion(text);\n return text;\n } catch (error) {\n onError?.(\n error instanceof Error ? error : new Error('AI request failed')\n );\n return '';\n }\n },\n [mutateAsync, onError]\n );\n\n const reset = useCallback(() => setCompletion(''), []);\n\n return { completion, complete, isLoading: isPending, reset };\n};\n"],"mappings":";;;;;;;;;;;AAmCA,MAAM,oBACJ,QACA,QACA,YACgB;AAChB,SAAQ,QAAR;EACE,KAAK,WACH,QAAO;GACL,QACE;GAIF,aAAa;GACd;EACH,KAAK,UACH,QAAO;GACL,QACE;GAGF,aAAa,yBAAyB;GACvC;EACH,KAAK,UACH,QAAO;GACL,QACE;GAEF,aAAa,yBAAyB;GACvC;EACH,KAAK,SACH,QAAO;GACL,QACE;GAEF,aAAa,yBAAyB;GACvC;EACH,KAAK,MACH,QAAO;GACL,QACE;GAGF,aAAa,yBAAyB;GACvC;EACH,KAAK,MACH,QAAO;GACL,QACE;GAGF,aAAa,kBAAkB,OAAO,qCAAqC,WAAW;GACvF;EACH,QACE,QAAO;GAAE,QAAQ;GAAI,aAAa;GAAQ;;;;;;;;;;;;AAahD,MAAa,mBAAmB,YAAqC;CACnE,MAAM,EAAE,aAAa,cAAc,gBAAgB;CACnD,MAAM,CAAC,YAAY,iBAAiB,SAAS,GAAG;AA4BhD,QAAO;EAAE;EAAY,UA1BJ,YACf,OAAO,QAAgB,YAA8C;GACnE,MAAM,EAAE,QAAQ,YAAY,QAAQ;GACpC,MAAM,EAAE,QAAQ,gBAAgB,iBAAiB,QAAQ,QAAQ,QAAQ;AAEzE,OAAI;IAMF,MAAM,QAAO,MALQ,YAAY;KAC/B;KACA,UAAU,CAAC;MAAE,MAAM;MAAQ,SAAS;MAAa,CAAC;KACnD,CAAC,GAEmB,MAAM,eAAe;AAC1C,kBAAc,KAAK;AACnB,WAAO;YACA,OAAO;AACd,cACE,iBAAiB,QAAQ,wBAAQ,IAAI,MAAM,oBAAoB,CAChE;AACD,WAAO;;KAGX,CAAC,aAAa,QAAQ,CAKK;EAAE,WAAW;EAAW,OAFvC,kBAAkB,cAAc,GAAG,EAAE,EAAE,CAEK;EAAE"}
@@ -0,0 +1,47 @@
1
+ import { createImageUpload } from "./novel/plugins/upload-images.mjs";
2
+
3
+ //#region src/components/MarkdownEditor/imageUpload.ts
4
+ /**
5
+ * Reads a file as a base64 data URL. Used as the default, backend-less image
6
+ * handler so the editor works out of the box.
7
+ */
8
+ const fileToBase64 = (file) => new Promise((resolve, reject) => {
9
+ const reader = new FileReader();
10
+ reader.onload = () => resolve(reader.result);
11
+ reader.onerror = () => reject(reader.error ?? /* @__PURE__ */ new Error("Read failed"));
12
+ reader.readAsDataURL(file);
13
+ });
14
+ /**
15
+ * Preloads an image URL so the swap from placeholder to final image is seamless.
16
+ */
17
+ const preloadImage = (url) => new Promise((resolve) => {
18
+ const image = new Image();
19
+ image.src = url;
20
+ image.onload = () => resolve(url);
21
+ image.onerror = () => resolve(url);
22
+ });
23
+ /**
24
+ * Builds the Novel `UploadFn` used by the editor's paste / drop handlers and the
25
+ * "Image" slash command. Falls back to inline base64 embedding when no custom
26
+ * uploader is provided.
27
+ */
28
+ const createEditorUploadFn = ({ uploadImage, onError, maxSizeMb = 20 } = {}) => createImageUpload({
29
+ onUpload: async (file) => {
30
+ return preloadImage(uploadImage ? await uploadImage(file) : await fileToBase64(file));
31
+ },
32
+ validateFn: (file) => {
33
+ if (!file.type.includes("image/")) {
34
+ onError?.(/* @__PURE__ */ new Error("File type not supported."));
35
+ return false;
36
+ }
37
+ if (file.size / 1024 / 1024 > maxSizeMb) {
38
+ onError?.(/* @__PURE__ */ new Error(`File size too big (max ${maxSizeMb}MB).`));
39
+ return false;
40
+ }
41
+ return true;
42
+ }
43
+ });
44
+
45
+ //#endregion
46
+ export { createEditorUploadFn };
47
+ //# sourceMappingURL=imageUpload.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"imageUpload.mjs","names":[],"sources":["../../../../src/components/MarkdownEditor/imageUpload.ts"],"sourcesContent":["import { createImageUpload, type UploadFn } from './novel';\n\n/**\n * Uploads an image file and resolves to the URL that should be embedded in the\n * document. Provided by the consumer (e.g. wired to the asset backend).\n */\nexport type UploadImageFn = (file: File) => Promise<string>;\n\n/**\n * Reads a file as a base64 data URL. Used as the default, backend-less image\n * handler so the editor works out of the box.\n */\nconst fileToBase64 = (file: File): Promise<string> =>\n new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(reader.result as string);\n reader.onerror = () => reject(reader.error ?? new Error('Read failed'));\n reader.readAsDataURL(file);\n });\n\n/**\n * Preloads an image URL so the swap from placeholder to final image is seamless.\n */\nconst preloadImage = (url: string): Promise<string> =>\n new Promise((resolve) => {\n const image = new Image();\n image.src = url;\n image.onload = () => resolve(url);\n image.onerror = () => resolve(url);\n });\n\nexport type CreateEditorUploadFnOptions = {\n /**\n * Custom uploader. When omitted, images are embedded inline as base64 data\n * URLs (no backend required).\n */\n uploadImage?: UploadImageFn;\n /** Called when validation fails (wrong type / too large). */\n onError?: (error: Error) => void;\n /** Maximum allowed file size in megabytes. Defaults to `20`. */\n maxSizeMb?: number;\n};\n\n/**\n * Builds the Novel `UploadFn` used by the editor's paste / drop handlers and the\n * \"Image\" slash command. Falls back to inline base64 embedding when no custom\n * uploader is provided.\n */\nexport const createEditorUploadFn = ({\n uploadImage,\n onError,\n maxSizeMb = 20,\n}: CreateEditorUploadFnOptions = {}): UploadFn =>\n createImageUpload({\n onUpload: async (file) => {\n const url = uploadImage\n ? await uploadImage(file)\n : await fileToBase64(file);\n\n return preloadImage(url);\n },\n validateFn: (file) => {\n if (!file.type.includes('image/')) {\n onError?.(new Error('File type not supported.'));\n return false;\n }\n\n if (file.size / 1024 / 1024 > maxSizeMb) {\n onError?.(new Error(`File size too big (max ${maxSizeMb}MB).`));\n return false;\n }\n\n return true;\n },\n });\n"],"mappings":";;;;;;;AAYA,MAAM,gBAAgB,SACpB,IAAI,SAAS,SAAS,WAAW;CAC/B,MAAM,SAAS,IAAI,YAAY;AAC/B,QAAO,eAAe,QAAQ,OAAO,OAAiB;AACtD,QAAO,gBAAgB,OAAO,OAAO,yBAAS,IAAI,MAAM,cAAc,CAAC;AACvE,QAAO,cAAc,KAAK;EAC1B;;;;AAKJ,MAAM,gBAAgB,QACpB,IAAI,SAAS,YAAY;CACvB,MAAM,QAAQ,IAAI,OAAO;AACzB,OAAM,MAAM;AACZ,OAAM,eAAe,QAAQ,IAAI;AACjC,OAAM,gBAAgB,QAAQ,IAAI;EAClC;;;;;;AAmBJ,MAAa,wBAAwB,EACnC,aACA,SACA,YAAY,OACmB,EAAE,KACjC,kBAAkB;CAChB,UAAU,OAAO,SAAS;AAKxB,SAAO,aAJK,cACR,MAAM,YAAY,KAAK,GACvB,MAAM,aAAa,KAAK,CAEJ;;CAE1B,aAAa,SAAS;AACpB,MAAI,CAAC,KAAK,KAAK,SAAS,SAAS,EAAE;AACjC,6BAAU,IAAI,MAAM,2BAA2B,CAAC;AAChD,UAAO;;AAGT,MAAI,KAAK,OAAO,OAAO,OAAO,WAAW;AACvC,6BAAU,IAAI,MAAM,0BAA0B,UAAU,MAAM,CAAC;AAC/D,UAAO;;AAGT,SAAO;;CAEV,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { createEditorUploadFn } from "./imageUpload.mjs";
2
+ import { MarkdownEditor } from "./MarkdownEditor.mjs";
3
+
4
+ export { MarkdownEditor, createEditorUploadFn };