@jvs-milkdown/components 1.0.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 (192) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +11 -0
  3. package/lib/__internal__/components/icon.d.ts +24 -0
  4. package/lib/__internal__/components/icon.d.ts.map +1 -0
  5. package/lib/__internal__/components/image-input.d.ts +17 -0
  6. package/lib/__internal__/components/image-input.d.ts.map +1 -0
  7. package/lib/__internal__/keep-alive.d.ts +2 -0
  8. package/lib/__internal__/keep-alive.d.ts.map +1 -0
  9. package/lib/__internal__/meta.d.ts +3 -0
  10. package/lib/__internal__/meta.d.ts.map +1 -0
  11. package/lib/__tests__/setup.d.ts +2 -0
  12. package/lib/__tests__/setup.d.ts.map +1 -0
  13. package/lib/code-block/config.d.ts +23 -0
  14. package/lib/code-block/config.d.ts.map +1 -0
  15. package/lib/code-block/index.d.ts +5 -0
  16. package/lib/code-block/index.d.ts.map +1 -0
  17. package/lib/code-block/index.js +4160 -0
  18. package/lib/code-block/index.js.map +1 -0
  19. package/lib/code-block/view/components/code-block.d.ts +16 -0
  20. package/lib/code-block/view/components/code-block.d.ts.map +1 -0
  21. package/lib/code-block/view/components/copy-button.d.ts +9 -0
  22. package/lib/code-block/view/components/copy-button.d.ts.map +1 -0
  23. package/lib/code-block/view/components/language-picker.d.ts +5 -0
  24. package/lib/code-block/view/components/language-picker.d.ts.map +1 -0
  25. package/lib/code-block/view/components/preview-panel.d.ts +9 -0
  26. package/lib/code-block/view/components/preview-panel.d.ts.map +1 -0
  27. package/lib/code-block/view/index.d.ts +3 -0
  28. package/lib/code-block/view/index.d.ts.map +1 -0
  29. package/lib/code-block/view/loader.d.ts +13 -0
  30. package/lib/code-block/view/loader.d.ts.map +1 -0
  31. package/lib/code-block/view/node-view.d.ts +40 -0
  32. package/lib/code-block/view/node-view.d.ts.map +1 -0
  33. package/lib/image-block/config.d.ts +16 -0
  34. package/lib/image-block/config.d.ts.map +1 -0
  35. package/lib/image-block/index.d.ts +7 -0
  36. package/lib/image-block/index.d.ts.map +1 -0
  37. package/lib/image-block/index.js +660 -0
  38. package/lib/image-block/index.js.map +1 -0
  39. package/lib/image-block/remark-plugin.d.ts +2 -0
  40. package/lib/image-block/remark-plugin.d.ts.map +1 -0
  41. package/lib/image-block/schema.d.ts +3 -0
  42. package/lib/image-block/schema.d.ts.map +1 -0
  43. package/lib/image-block/view/components/__tests__/image-viewer.onImageLoadError.spec.d.ts +2 -0
  44. package/lib/image-block/view/components/__tests__/image-viewer.onImageLoadError.spec.d.ts.map +1 -0
  45. package/lib/image-block/view/components/image-block.d.ts +18 -0
  46. package/lib/image-block/view/components/image-block.d.ts.map +1 -0
  47. package/lib/image-block/view/components/image-viewer.d.ts +3 -0
  48. package/lib/image-block/view/components/image-viewer.d.ts.map +1 -0
  49. package/lib/image-block/view/index.d.ts +3 -0
  50. package/lib/image-block/view/index.d.ts.map +1 -0
  51. package/lib/image-inline/components/image-inline.d.ts +18 -0
  52. package/lib/image-inline/components/image-inline.d.ts.map +1 -0
  53. package/lib/image-inline/config.d.ts +11 -0
  54. package/lib/image-inline/config.d.ts.map +1 -0
  55. package/lib/image-inline/index.d.ts +5 -0
  56. package/lib/image-inline/index.d.ts.map +1 -0
  57. package/lib/image-inline/index.js +377 -0
  58. package/lib/image-inline/index.js.map +1 -0
  59. package/lib/image-inline/view.d.ts +3 -0
  60. package/lib/image-inline/view.d.ts.map +1 -0
  61. package/lib/index.d.ts +2 -0
  62. package/lib/index.d.ts.map +1 -0
  63. package/lib/index.js +35 -0
  64. package/lib/index.js.map +1 -0
  65. package/lib/link-tooltip/command.d.ts +2 -0
  66. package/lib/link-tooltip/command.d.ts.map +1 -0
  67. package/lib/link-tooltip/configure.d.ts +3 -0
  68. package/lib/link-tooltip/configure.d.ts.map +1 -0
  69. package/lib/link-tooltip/edit/component.d.ts +11 -0
  70. package/lib/link-tooltip/edit/component.d.ts.map +1 -0
  71. package/lib/link-tooltip/edit/edit-configure.d.ts +3 -0
  72. package/lib/link-tooltip/edit/edit-configure.d.ts.map +1 -0
  73. package/lib/link-tooltip/edit/edit-view.d.ts +15 -0
  74. package/lib/link-tooltip/edit/edit-view.d.ts.map +1 -0
  75. package/lib/link-tooltip/index.d.ts +7 -0
  76. package/lib/link-tooltip/index.d.ts.map +1 -0
  77. package/lib/link-tooltip/index.js +2526 -0
  78. package/lib/link-tooltip/index.js.map +1 -0
  79. package/lib/link-tooltip/preview/component.d.ts +11 -0
  80. package/lib/link-tooltip/preview/component.d.ts.map +1 -0
  81. package/lib/link-tooltip/preview/preview-configure.d.ts +3 -0
  82. package/lib/link-tooltip/preview/preview-configure.d.ts.map +1 -0
  83. package/lib/link-tooltip/preview/preview-view.d.ts +14 -0
  84. package/lib/link-tooltip/preview/preview-view.d.ts.map +1 -0
  85. package/lib/link-tooltip/slices.d.ts +34 -0
  86. package/lib/link-tooltip/slices.d.ts.map +1 -0
  87. package/lib/link-tooltip/tooltips.d.ts +3 -0
  88. package/lib/link-tooltip/tooltips.d.ts.map +1 -0
  89. package/lib/link-tooltip/utils.d.ts +14 -0
  90. package/lib/link-tooltip/utils.d.ts.map +1 -0
  91. package/lib/list-item-block/component.d.ts +19 -0
  92. package/lib/list-item-block/component.d.ts.map +1 -0
  93. package/lib/list-item-block/config.d.ts +13 -0
  94. package/lib/list-item-block/config.d.ts.map +1 -0
  95. package/lib/list-item-block/index.d.ts +6 -0
  96. package/lib/list-item-block/index.d.ts.map +1 -0
  97. package/lib/list-item-block/index.js +2149 -0
  98. package/lib/list-item-block/index.js.map +1 -0
  99. package/lib/list-item-block/view.d.ts +3 -0
  100. package/lib/list-item-block/view.d.ts.map +1 -0
  101. package/lib/table-block/config.d.ts +8 -0
  102. package/lib/table-block/config.d.ts.map +1 -0
  103. package/lib/table-block/dnd/calc-drag-over.d.ts +3 -0
  104. package/lib/table-block/dnd/calc-drag-over.d.ts.map +1 -0
  105. package/lib/table-block/dnd/create-drag-handler.d.ts +5 -0
  106. package/lib/table-block/dnd/create-drag-handler.d.ts.map +1 -0
  107. package/lib/table-block/dnd/drag-over-handler.d.ts +3 -0
  108. package/lib/table-block/dnd/drag-over-handler.d.ts.map +1 -0
  109. package/lib/table-block/dnd/prepare-dnd-context.d.ts +3 -0
  110. package/lib/table-block/dnd/prepare-dnd-context.d.ts.map +1 -0
  111. package/lib/table-block/dnd/preview.d.ts +3 -0
  112. package/lib/table-block/dnd/preview.d.ts.map +1 -0
  113. package/lib/table-block/index.d.ts +5 -0
  114. package/lib/table-block/index.d.ts.map +1 -0
  115. package/lib/table-block/index.js +3961 -0
  116. package/lib/table-block/index.js.map +1 -0
  117. package/lib/table-block/view/component.d.ts +16 -0
  118. package/lib/table-block/view/component.d.ts.map +1 -0
  119. package/lib/table-block/view/drag.d.ts +7 -0
  120. package/lib/table-block/view/drag.d.ts.map +1 -0
  121. package/lib/table-block/view/index.d.ts +2 -0
  122. package/lib/table-block/view/index.d.ts.map +1 -0
  123. package/lib/table-block/view/operation.d.ts +11 -0
  124. package/lib/table-block/view/operation.d.ts.map +1 -0
  125. package/lib/table-block/view/pointer.d.ts +7 -0
  126. package/lib/table-block/view/pointer.d.ts.map +1 -0
  127. package/lib/table-block/view/types.d.ts +32 -0
  128. package/lib/table-block/view/types.d.ts.map +1 -0
  129. package/lib/table-block/view/utils.d.ts +21 -0
  130. package/lib/table-block/view/utils.d.ts.map +1 -0
  131. package/lib/table-block/view/view.d.ts +22 -0
  132. package/lib/table-block/view/view.d.ts.map +1 -0
  133. package/lib/tsconfig.tsbuildinfo +1 -0
  134. package/package.json +110 -0
  135. package/src/__internal__/components/icon.tsx +38 -0
  136. package/src/__internal__/components/image-input.tsx +182 -0
  137. package/src/__internal__/keep-alive.ts +3 -0
  138. package/src/__internal__/meta.ts +15 -0
  139. package/src/__tests__/setup.ts +6 -0
  140. package/src/code-block/config.ts +54 -0
  141. package/src/code-block/index.ts +12 -0
  142. package/src/code-block/view/components/code-block.tsx +170 -0
  143. package/src/code-block/view/components/copy-button.tsx +96 -0
  144. package/src/code-block/view/components/language-picker.tsx +239 -0
  145. package/src/code-block/view/components/preview-panel.tsx +79 -0
  146. package/src/code-block/view/index.ts +24 -0
  147. package/src/code-block/view/loader.ts +40 -0
  148. package/src/code-block/view/node-view.ts +310 -0
  149. package/src/image-block/config.ts +37 -0
  150. package/src/image-block/index.ts +18 -0
  151. package/src/image-block/remark-plugin.ts +51 -0
  152. package/src/image-block/schema.ts +71 -0
  153. package/src/image-block/view/components/__tests__/image-viewer.onImageLoadError.spec.tsx +42 -0
  154. package/src/image-block/view/components/image-block.tsx +80 -0
  155. package/src/image-block/view/components/image-viewer.tsx +186 -0
  156. package/src/image-block/view/index.ts +111 -0
  157. package/src/image-inline/components/image-inline.tsx +85 -0
  158. package/src/image-inline/config.ts +30 -0
  159. package/src/image-inline/index.ts +12 -0
  160. package/src/image-inline/view.ts +109 -0
  161. package/src/index.ts +1 -0
  162. package/src/link-tooltip/command.ts +19 -0
  163. package/src/link-tooltip/configure.ts +9 -0
  164. package/src/link-tooltip/edit/component.tsx +82 -0
  165. package/src/link-tooltip/edit/edit-configure.ts +29 -0
  166. package/src/link-tooltip/edit/edit-view.ts +165 -0
  167. package/src/link-tooltip/index.ts +19 -0
  168. package/src/link-tooltip/preview/component.tsx +87 -0
  169. package/src/link-tooltip/preview/preview-configure.ts +65 -0
  170. package/src/link-tooltip/preview/preview-view.ts +101 -0
  171. package/src/link-tooltip/slices.ts +69 -0
  172. package/src/link-tooltip/tooltips.ts +22 -0
  173. package/src/link-tooltip/utils.ts +56 -0
  174. package/src/list-item-block/component.tsx +133 -0
  175. package/src/list-item-block/config.ts +39 -0
  176. package/src/list-item-block/index.ts +13 -0
  177. package/src/list-item-block/view.ts +130 -0
  178. package/src/table-block/config.ts +53 -0
  179. package/src/table-block/dnd/calc-drag-over.ts +46 -0
  180. package/src/table-block/dnd/create-drag-handler.ts +99 -0
  181. package/src/table-block/dnd/drag-over-handler.ts +113 -0
  182. package/src/table-block/dnd/prepare-dnd-context.ts +46 -0
  183. package/src/table-block/dnd/preview.ts +58 -0
  184. package/src/table-block/index.ts +9 -0
  185. package/src/table-block/view/component.tsx +219 -0
  186. package/src/table-block/view/drag.ts +121 -0
  187. package/src/table-block/view/index.ts +1 -0
  188. package/src/table-block/view/operation.ts +148 -0
  189. package/src/table-block/view/pointer.ts +165 -0
  190. package/src/table-block/view/types.ts +35 -0
  191. package/src/table-block/view/utils.ts +192 -0
  192. package/src/table-block/view/view.ts +165 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../src/__internal__/meta.ts","../../src/image-block/config.ts","../../src/image-block/remark-plugin.ts","../../src/image-block/schema.ts","../../src/__internal__/keep-alive.ts","../../src/__internal__/components/icon.tsx","../../src/__internal__/components/image-input.tsx","../../src/image-block/view/components/image-viewer.tsx","../../src/image-block/view/components/image-block.tsx","../../src/image-block/view/index.ts","../../src/image-block/index.ts"],"sourcesContent":["import type { Meta, MilkdownPlugin } from '@jvs-milkdown/ctx'\n\nexport function withMeta<T extends MilkdownPlugin>(\n plugin: T,\n meta: Partial<Meta> & Pick<Meta, 'displayName'>\n): T {\n Object.assign(plugin, {\n meta: {\n package: '@jvs-milkdown/components',\n ...meta,\n },\n })\n\n return plugin\n}\n","import { $ctx } from '@jvs-milkdown/utils'\n\nimport { withMeta } from '../__internal__/meta'\n\nexport interface ImageBlockConfig {\n imageIcon: string | undefined\n captionIcon: string | undefined\n uploadButton: string | undefined\n confirmButton: string | undefined\n uploadPlaceholderText: string\n captionPlaceholderText: string\n onUpload: (file: File) => Promise<string>\n proxyDomURL?: (url: string) => Promise<string> | string\n onImageLoadError?: (event: Event) => void | Promise<void>\n maxWidth?: number\n maxHeight?: number\n}\n\nexport const defaultImageBlockConfig: ImageBlockConfig = {\n imageIcon: '🌌',\n captionIcon: '💬',\n uploadButton: 'Upload file',\n confirmButton: 'Confirm ⏎',\n uploadPlaceholderText: 'or paste the image link ...',\n captionPlaceholderText: 'Image caption',\n onUpload: (file) => Promise.resolve(URL.createObjectURL(file)),\n}\n\nexport const imageBlockConfig = $ctx(\n defaultImageBlockConfig,\n 'imageBlockConfigCtx'\n)\n\nwithMeta(imageBlockConfig, {\n displayName: 'Config<image-block>',\n group: 'ImageBlock',\n})\n","import type { Node } from '@jvs-milkdown/transformer'\n\nimport { $remark } from '@jvs-milkdown/utils'\nimport { visit } from 'unist-util-visit'\n\nimport { withMeta } from '../__internal__/meta'\n\nfunction visitImage(ast: Node) {\n return visit(\n ast,\n 'paragraph',\n (\n node: Node & { children?: Node[] },\n index: number,\n parent: Node & { children: Node[] }\n ) => {\n if (node.children?.length !== 1) return\n const firstChild = node.children?.[0]\n if (!firstChild || firstChild.type !== 'image') return\n\n const { url, alt, title } = firstChild as Node & {\n url: string\n alt: string\n title: string\n }\n const newNode = {\n type: 'image-block',\n url,\n alt,\n title,\n }\n\n parent.children.splice(index, 1, newNode)\n }\n )\n}\n\nexport const remarkImageBlockPlugin = $remark(\n 'remark-image-block',\n () => () => visitImage\n)\n\nwithMeta(remarkImageBlockPlugin.plugin, {\n displayName: 'Remark<remarkImageBlock>',\n group: 'ImageBlock',\n})\n\nwithMeta(remarkImageBlockPlugin.options, {\n displayName: 'RemarkConfig<remarkImageBlock>',\n group: 'ImageBlock',\n})\n","import { expectDomTypeError } from '@jvs-milkdown/exception'\nimport { $nodeSchema } from '@jvs-milkdown/utils'\n\nimport { withMeta } from '../__internal__/meta'\n\nexport const IMAGE_DATA_TYPE = 'image-block'\n\nexport const imageBlockSchema = $nodeSchema('image-block', () => {\n return {\n inline: false,\n group: 'block',\n selectable: true,\n draggable: true,\n isolating: true,\n marks: '',\n atom: true,\n priority: 100,\n attrs: {\n src: { default: '', validate: 'string' },\n caption: { default: '', validate: 'string' },\n ratio: { default: 1, validate: 'number' },\n },\n parseDOM: [\n {\n tag: `img[data-type=\"${IMAGE_DATA_TYPE}\"]`,\n getAttrs: (dom) => {\n if (!(dom instanceof HTMLElement)) throw expectDomTypeError(dom)\n\n return {\n src: dom.getAttribute('src') || '',\n caption: dom.getAttribute('caption') || '',\n ratio: Number(dom.getAttribute('ratio') ?? 1),\n }\n },\n },\n ],\n toDOM: (node) => ['img', { 'data-type': IMAGE_DATA_TYPE, ...node.attrs }],\n parseMarkdown: {\n match: ({ type }) => type === 'image-block',\n runner: (state, node, type) => {\n const src = node.url as string\n const caption = node.title as string\n let ratio = Number((node.alt as string) || 1)\n if (Number.isNaN(ratio) || ratio === 0) ratio = 1\n\n state.addNode(type, {\n src,\n caption,\n ratio,\n })\n },\n },\n toMarkdown: {\n match: (node) => node.type.name === 'image-block',\n runner: (state, node) => {\n state.openNode('paragraph')\n state.addNode('image', undefined, undefined, {\n title: node.attrs.caption,\n url: node.attrs.src,\n alt: `${Number.parseFloat(node.attrs.ratio).toFixed(2)}`,\n })\n state.closeNode()\n },\n },\n }\n})\n\nwithMeta(imageBlockSchema.node, {\n displayName: 'NodeSchema<image-block>',\n group: 'ImageBlock',\n})\n","// Prevent tree-shaking from removing Vue's `h` and `Fragment`,\n// which are required at runtime for TSX to work.\nexport function keepAlive(..._args: unknown[]) {}\n","import clsx from 'clsx'\nimport DOMPurify from 'dompurify'\nimport { h } from 'vue'\n\nimport { keepAlive } from '../keep-alive'\n\nkeepAlive(h)\n\ntype IconProps = {\n icon?: string | null\n class?: string\n onClick?: (event: PointerEvent) => void\n}\n\nexport function Icon({ icon, class: className, onClick }: IconProps) {\n return (\n <span\n class={clsx('milkdown-icon', className)}\n onPointerdown={onClick}\n innerHTML={icon ? DOMPurify.sanitize(icon.trim()) : undefined}\n />\n )\n}\n\nIcon.props = {\n icon: {\n type: String,\n required: false,\n },\n class: {\n type: String,\n required: false,\n },\n onClick: {\n type: Function,\n required: false,\n },\n}\n","import clsx from 'clsx'\nimport { customAlphabet } from 'nanoid'\nimport { defineComponent, ref, h, type Ref } from 'vue'\n\nimport { keepAlive } from '../keep-alive'\nimport { Icon } from './icon'\n\nkeepAlive(h)\n\nconst nanoid = customAlphabet('abcdefg', 8)\n\ntype ImageInputProps = {\n src: Ref<string | undefined>\n selected: Ref<boolean>\n readonly: Ref<boolean>\n setLink: (link: string) => void\n\n imageIcon?: string\n uploadButton?: string\n confirmButton?: string\n uploadPlaceholderText?: string\n\n className?: string\n\n onUpload: (file: File) => Promise<string>\n onImageLoadError?: (event: Event) => void | Promise<void>\n}\n\nexport const ImageInput = defineComponent<ImageInputProps>({\n props: {\n src: {\n type: Object,\n required: true,\n },\n selected: {\n type: Object,\n required: true,\n },\n readonly: {\n type: Object,\n required: true,\n },\n setLink: {\n type: Function,\n required: true,\n },\n imageIcon: {\n type: String,\n required: false,\n },\n uploadButton: {\n type: String,\n required: false,\n },\n confirmButton: {\n type: String,\n required: false,\n },\n uploadPlaceholderText: {\n type: String,\n required: false,\n },\n onUpload: {\n type: Function,\n required: true,\n },\n onImageLoadError: {\n type: Function,\n required: false,\n },\n },\n setup({\n readonly,\n src,\n setLink,\n onUpload,\n imageIcon,\n uploadButton,\n confirmButton,\n uploadPlaceholderText,\n className,\n onImageLoadError,\n }) {\n const focusLinkInput = ref(false)\n const linkInputRef = ref<HTMLInputElement>()\n const currentLink = ref(src.value ?? '')\n const uuid = ref(nanoid())\n const hidePlaceholder = ref(src.value?.length !== 0)\n const onEditLink = (e: Event) => {\n const target = e.target as HTMLInputElement\n const value = target.value\n hidePlaceholder.value = value.length !== 0\n currentLink.value = value\n }\n\n const onKeydown = (e: KeyboardEvent) => {\n if (e.key === 'Enter') {\n setLink(linkInputRef.value?.value ?? '')\n }\n }\n\n const onConfirmLinkInput = () => {\n setLink(linkInputRef.value?.value ?? '')\n }\n\n const onUploadFile = (e: Event) => {\n const file = (e.target as HTMLInputElement).files?.[0]\n if (!file) return\n\n onUpload(file)\n .then((url) => {\n if (!url) return\n\n setLink(url)\n hidePlaceholder.value = true\n })\n .catch((err) => {\n console.error('An error occurred while uploading image')\n console.error(err)\n })\n }\n\n return () => {\n return (\n <div class={clsx('image-edit', className)}>\n <Icon icon={imageIcon} class=\"image-icon\" />\n <div class={clsx('link-importer', focusLinkInput.value && 'focus')}>\n <input\n ref={linkInputRef}\n draggable=\"true\"\n onDragstart={(e) => {\n e.preventDefault()\n e.stopPropagation()\n }}\n disabled={readonly.value}\n class=\"link-input-area\"\n value={currentLink.value}\n onInput={onEditLink}\n onKeydown={onKeydown}\n onFocus={() => (focusLinkInput.value = true)}\n onBlur={() => (focusLinkInput.value = false)}\n />\n {!hidePlaceholder.value && (\n <div class=\"placeholder\">\n <input\n disabled={readonly.value}\n class=\"hidden\"\n id={uuid.value}\n type=\"file\"\n accept=\"image/*\"\n onChange={onUploadFile}\n />\n <label class=\"uploader\" for={uuid.value}>\n <Icon icon={uploadButton} />\n </label>\n <span class=\"text\" onClick={() => linkInputRef.value?.focus()}>\n {uploadPlaceholderText}\n </span>\n </div>\n )}\n </div>\n {currentLink.value && (\n <>\n <div class=\"image-preview\">\n <img\n src={currentLink.value}\n alt=\"\"\n onError={(e) =>\n Promise.resolve(onImageLoadError?.(e)).catch(() => {})\n }\n />\n </div>\n <div class=\"confirm\" onClick={() => onConfirmLinkInput()}>\n <Icon icon={confirmButton} />\n </div>\n </>\n )}\n </div>\n )\n }\n },\n})\n","import { defineComponent, ref, h, Fragment } from 'vue'\n\nimport type { MilkdownImageBlockProps } from './image-block'\n\nimport { Icon } from '../../../__internal__/components/icon'\nimport { keepAlive } from '../../../__internal__/keep-alive'\nimport { IMAGE_DATA_TYPE } from '../../schema'\n\nkeepAlive(h, Fragment)\n\nexport const ImageViewer = defineComponent<MilkdownImageBlockProps>({\n props: {\n src: {\n type: Object,\n required: true,\n },\n caption: {\n type: Object,\n required: true,\n },\n ratio: {\n type: Object,\n required: true,\n },\n selected: {\n type: Object,\n required: true,\n },\n readonly: {\n type: Object,\n required: true,\n },\n setAttr: {\n type: Function,\n required: true,\n },\n config: {\n type: Object,\n required: true,\n },\n },\n setup({ src, caption, ratio, readonly, setAttr, config }) {\n const imageRef = ref<HTMLImageElement>()\n const resizeHandle = ref<HTMLDivElement>()\n const showCaption = ref(Boolean(caption.value?.length))\n const timer = ref(0)\n\n const onImageLoad = () => {\n const image = imageRef.value\n if (!image) return\n const host = image.closest('.milkdown-image-block')\n if (!host) return\n\n let maxWidth = host.getBoundingClientRect().width\n if (!maxWidth) return\n\n if (config.maxWidth && config.maxWidth < maxWidth)\n maxWidth = config.maxWidth\n\n const height = image.naturalHeight\n const width = image.naturalWidth\n let transformedHeight =\n width < maxWidth ? height : maxWidth * (height / width)\n\n if (config.maxHeight && transformedHeight > config.maxHeight)\n transformedHeight = config.maxHeight\n\n const h = (transformedHeight * (ratio.value ?? 1)).toFixed(2)\n image.dataset.origin = transformedHeight.toFixed(2)\n image.dataset.height = h\n image.style.height = `${h}px`\n\n if (config.maxWidth) image.style.maxWidth = `${config.maxWidth}px`\n }\n\n const onToggleCaption = (e: PointerEvent) => {\n e.preventDefault()\n e.stopPropagation()\n if (readonly.value) return\n showCaption.value = !showCaption.value\n }\n\n const onInputCaption = (e: Event) => {\n const target = e.target as HTMLInputElement\n const value = target.value\n if (timer.value) window.clearTimeout(timer.value)\n\n timer.value = window.setTimeout(() => {\n setAttr('caption', value)\n }, 1000)\n }\n\n const onBlurCaption = (e: Event) => {\n const target = e.target as HTMLInputElement\n const value = target.value\n if (timer.value) {\n window.clearTimeout(timer.value)\n timer.value = 0\n }\n\n setAttr('caption', value)\n }\n\n const onResizeHandlePointerMove = (e: PointerEvent) => {\n e.preventDefault()\n const image = imageRef.value\n if (!image) return\n const top = image.getBoundingClientRect().top\n let height = e.clientY - top\n if (height < 100) height = 100\n if (config.maxHeight && height > config.maxHeight)\n height = config.maxHeight\n const h = Number(height).toFixed(2)\n image.dataset.height = h\n image.style.height = `${h}px`\n }\n\n const onResizeHandlePointerUp = () => {\n window.removeEventListener('pointermove', onResizeHandlePointerMove)\n window.removeEventListener('pointerup', onResizeHandlePointerUp)\n\n const image = imageRef.value\n if (!image) return\n\n const originHeight = Number(image.dataset.origin)\n const currentHeight = Number(image.dataset.height)\n const ratio = Number.parseFloat(\n Number(currentHeight / originHeight).toFixed(2)\n )\n if (Number.isNaN(ratio)) return\n\n setAttr('ratio', ratio)\n }\n\n const onResizeHandlePointerDown = (e: PointerEvent) => {\n if (readonly.value) return\n e.preventDefault()\n e.stopPropagation()\n window.addEventListener('pointermove', onResizeHandlePointerMove)\n window.addEventListener('pointerup', onResizeHandlePointerUp)\n }\n\n return () => {\n return (\n <>\n <div class=\"image-wrapper\">\n <div class=\"operation\">\n <div class=\"operation-item\" onPointerdown={onToggleCaption}>\n <Icon icon={config.captionIcon} />\n </div>\n </div>\n <img\n ref={imageRef}\n data-type={IMAGE_DATA_TYPE}\n onLoad={onImageLoad}\n src={src.value}\n alt={caption.value}\n onError={(e) =>\n Promise.resolve(config.onImageLoadError?.(e)).catch(() => {})\n }\n />\n <div\n ref={resizeHandle}\n class=\"image-resize-handle\"\n onPointerdown={onResizeHandlePointerDown}\n />\n </div>\n {showCaption.value && (\n <input\n draggable=\"true\"\n onDragstart={(e) => {\n e.preventDefault()\n e.stopPropagation()\n }}\n class=\"caption-input\"\n placeholder={config?.captionPlaceholderText}\n onInput={onInputCaption}\n onBlur={onBlurCaption}\n value={caption.value}\n />\n )}\n </>\n )\n }\n },\n})\n","import { h, Fragment, type Ref, defineComponent } from 'vue'\n\nimport type { ImageBlockConfig } from '../../config'\n\nimport { ImageInput } from '../../../__internal__/components/image-input'\nimport { keepAlive } from '../../../__internal__/keep-alive'\nimport { ImageViewer } from './image-viewer'\n\nkeepAlive(h, Fragment)\n\ntype Attrs = {\n src: string\n caption: string\n ratio: number\n}\n\nexport type MilkdownImageBlockProps = {\n selected: Ref<boolean>\n readonly: Ref<boolean>\n setAttr: <T extends keyof Attrs>(attr: T, value: Attrs[T]) => void\n config: ImageBlockConfig\n} & {\n [P in keyof Attrs]: Ref<Attrs[P] | undefined>\n}\n\nexport const MilkdownImageBlock = defineComponent<MilkdownImageBlockProps>({\n props: {\n src: {\n type: Object,\n required: true,\n },\n caption: {\n type: Object,\n required: true,\n },\n ratio: {\n type: Object,\n required: true,\n },\n selected: {\n type: Object,\n required: true,\n },\n readonly: {\n type: Object,\n required: true,\n },\n setAttr: {\n type: Function,\n required: true,\n },\n config: {\n type: Object,\n required: true,\n },\n },\n setup(props) {\n const { src } = props\n\n return () => {\n if (!src.value?.length) {\n return (\n <ImageInput\n src={props.src}\n selected={props.selected}\n readonly={props.readonly}\n setLink={(link) => props.setAttr('src', link)}\n imageIcon={props.config.imageIcon}\n uploadButton={props.config.uploadButton}\n confirmButton={props.config.confirmButton}\n uploadPlaceholderText={props.config.uploadPlaceholderText}\n onUpload={props.config.onUpload}\n onImageLoadError={props.config.onImageLoadError}\n />\n )\n }\n return <ImageViewer {...props} />\n }\n },\n})\n","import type { Node } from '@jvs-milkdown/prose/model'\nimport type { NodeViewConstructor } from '@jvs-milkdown/prose/view'\n\nimport { $view } from '@jvs-milkdown/utils'\nimport DOMPurify from 'dompurify'\nimport { createApp, ref, watchEffect } from 'vue'\n\nimport { withMeta } from '../../__internal__/meta'\nimport { imageBlockConfig } from '../config'\nimport { imageBlockSchema } from '../schema'\nimport { MilkdownImageBlock } from './components/image-block'\n\nexport const imageBlockView = $view(\n imageBlockSchema.node,\n (ctx): NodeViewConstructor => {\n return (initialNode, view, getPos) => {\n const src = ref(initialNode.attrs.src)\n const caption = ref(initialNode.attrs.caption)\n const ratio = ref(initialNode.attrs.ratio)\n const selected = ref(false)\n const readonly = ref(!view.editable)\n const setAttr = (attr: string, value: unknown) => {\n if (!view.editable) return\n const pos = getPos()\n if (pos == null) return\n view.dispatch(\n view.state.tr.setNodeAttribute(\n pos,\n attr,\n attr === 'src' ? DOMPurify.sanitize(value as string) : value\n )\n )\n }\n const config = ctx.get(imageBlockConfig.key)\n const app = createApp(MilkdownImageBlock, {\n src,\n caption,\n ratio,\n selected,\n readonly,\n setAttr,\n config,\n })\n const dom = document.createElement('div')\n dom.className = 'milkdown-image-block'\n const disposeSelectedWatcher = watchEffect(() => {\n const isSelected = selected.value\n if (isSelected) {\n dom.classList.add('selected')\n } else {\n dom.classList.remove('selected')\n }\n })\n const proxyDomURL = config.proxyDomURL\n const bindAttrs = (node: Node) => {\n if (!proxyDomURL) {\n src.value = node.attrs.src\n } else {\n const proxiedURL = proxyDomURL(node.attrs.src)\n if (typeof proxiedURL === 'string') {\n src.value = proxiedURL\n } else {\n proxiedURL\n .then((url) => {\n src.value = url\n })\n .catch(console.error)\n }\n }\n ratio.value = node.attrs.ratio\n caption.value = node.attrs.caption\n\n readonly.value = !view.editable\n }\n\n bindAttrs(initialNode)\n app.mount(dom)\n\n return {\n dom,\n update: (updatedNode) => {\n if (updatedNode.type !== initialNode.type) return false\n\n bindAttrs(updatedNode)\n return true\n },\n stopEvent: (e) => {\n if (e.target instanceof HTMLInputElement) return true\n\n return false\n },\n selectNode: () => {\n selected.value = true\n },\n deselectNode: () => {\n selected.value = false\n },\n destroy: () => {\n disposeSelectedWatcher()\n app.unmount()\n dom.remove()\n },\n }\n }\n }\n)\n\nwithMeta(imageBlockView, {\n displayName: 'NodeView<image-block>',\n group: 'ImageBlock',\n})\n","import type { MilkdownPlugin } from '@jvs-milkdown/ctx'\n\nimport { imageBlockConfig } from './config'\nimport { remarkImageBlockPlugin } from './remark-plugin'\nimport { imageBlockSchema } from './schema'\nimport { imageBlockView } from './view'\n\nexport * from './schema'\nexport * from './remark-plugin'\nexport * from './config'\nexport * from './view'\n\nexport const imageBlockComponent: MilkdownPlugin[] = [\n remarkImageBlockPlugin,\n imageBlockSchema,\n imageBlockView,\n imageBlockConfig,\n].flat()\n"],"names":["__spreadValues","_a","_b","Fragment","h","ratio"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const remarkImageBlockPlugin: import("@jvs-milkdown/utils").$Remark<"remark-image-block", unknown>;
2
+ //# sourceMappingURL=remark-plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remark-plugin.d.ts","sourceRoot":"","sources":["../../src/image-block/remark-plugin.ts"],"names":[],"mappings":"AAqCA,eAAO,MAAM,sBAAsB,sEAGlC,CAAA"}
@@ -0,0 +1,3 @@
1
+ export declare const IMAGE_DATA_TYPE = "image-block";
2
+ export declare const imageBlockSchema: import("@jvs-milkdown/utils").$NodeSchema<"image-block">;
3
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/image-block/schema.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,eAAe,gBAAgB,CAAA;AAE5C,eAAO,MAAM,gBAAgB,0DA0D3B,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=image-viewer.onImageLoadError.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-viewer.onImageLoadError.spec.d.ts","sourceRoot":"","sources":["../../../../../src/image-block/view/components/__tests__/image-viewer.onImageLoadError.spec.tsx"],"names":[],"mappings":""}
@@ -0,0 +1,18 @@
1
+ import { type Ref } from 'vue';
2
+ import type { ImageBlockConfig } from '../../config';
3
+ type Attrs = {
4
+ src: string;
5
+ caption: string;
6
+ ratio: number;
7
+ };
8
+ export type MilkdownImageBlockProps = {
9
+ selected: Ref<boolean>;
10
+ readonly: Ref<boolean>;
11
+ setAttr: <T extends keyof Attrs>(attr: T, value: Attrs[T]) => void;
12
+ config: ImageBlockConfig;
13
+ } & {
14
+ [P in keyof Attrs]: Ref<Attrs[P] | undefined>;
15
+ };
16
+ export declare const MilkdownImageBlock: import("vue").DefineComponent<MilkdownImageBlockProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<MilkdownImageBlockProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
17
+ export {};
18
+ //# sourceMappingURL=image-block.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-block.d.ts","sourceRoot":"","sources":["../../../../src/image-block/view/components/image-block.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,GAAG,EAAmB,MAAM,KAAK,CAAA;AAE5D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAQpD,KAAK,KAAK,GAAG;IACX,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED,MAAM,MAAM,uBAAuB,GAAG;IACpC,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,CAAA;IACtB,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,CAAA;IACtB,OAAO,EAAE,CAAC,CAAC,SAAS,MAAM,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAA;IAClE,MAAM,EAAE,gBAAgB,CAAA;CACzB,GAAG;KACD,CAAC,IAAI,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;CAC9C,CAAA;AAED,eAAO,MAAM,kBAAkB,0TAsD7B,CAAA"}
@@ -0,0 +1,3 @@
1
+ import type { MilkdownImageBlockProps } from './image-block';
2
+ export declare const ImageViewer: import("vue").DefineComponent<MilkdownImageBlockProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<MilkdownImageBlockProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
3
+ //# sourceMappingURL=image-viewer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-viewer.d.ts","sourceRoot":"","sources":["../../../../src/image-block/view/components/image-viewer.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAA;AAQ5D,eAAO,MAAM,WAAW,0TA+KtB,CAAA"}
@@ -0,0 +1,3 @@
1
+ import type { NodeViewConstructor } from '@jvs-milkdown/prose/view';
2
+ export declare const imageBlockView: import("@jvs-milkdown/utils").$View<import("@jvs-milkdown/utils").$Node, NodeViewConstructor>;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/image-block/view/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAWnE,eAAO,MAAM,cAAc,+FA6F1B,CAAA"}
@@ -0,0 +1,18 @@
1
+ import { type Ref } from 'vue';
2
+ import type { InlineImageConfig } from '../config';
3
+ type Attrs = {
4
+ src: string;
5
+ alt: string;
6
+ title: string;
7
+ };
8
+ type MilkdownImageInlineProps = {
9
+ selected: Ref<boolean>;
10
+ readonly: Ref<boolean>;
11
+ setAttr: <T extends keyof Attrs>(attr: T, value: Attrs[T]) => void;
12
+ config: InlineImageConfig;
13
+ } & {
14
+ [P in keyof Attrs]: Ref<Attrs[P] | undefined>;
15
+ };
16
+ export declare const MilkdownImageInline: import("vue").DefineComponent<MilkdownImageInlineProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<MilkdownImageInlineProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
17
+ export {};
18
+ //# sourceMappingURL=image-inline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-inline.d.ts","sourceRoot":"","sources":["../../../src/image-inline/components/image-inline.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,GAAG,EAAmB,MAAM,KAAK,CAAA;AAE5D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAOlD,KAAK,KAAK,GAAG;IACX,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED,KAAK,wBAAwB,GAAG;IAC9B,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,CAAA;IACtB,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,CAAA;IACtB,OAAO,EAAE,CAAC,CAAC,SAAS,MAAM,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAA;IAClE,MAAM,EAAE,iBAAiB,CAAA;CAC1B,GAAG;KACD,CAAC,IAAI,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;CAC9C,CAAA;AAED,eAAO,MAAM,mBAAmB,4TA4D9B,CAAA"}
@@ -0,0 +1,11 @@
1
+ export interface InlineImageConfig {
2
+ imageIcon: string | undefined;
3
+ uploadButton: string | undefined;
4
+ confirmButton: string | undefined;
5
+ uploadPlaceholderText: string;
6
+ onUpload: (file: File) => Promise<string>;
7
+ proxyDomURL?: (url: string) => Promise<string> | string;
8
+ }
9
+ export declare const defaultInlineImageConfig: InlineImageConfig;
10
+ export declare const inlineImageConfig: import("@jvs-milkdown/utils").$Ctx<InlineImageConfig, "inlineImageConfigCtx">;
11
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/image-inline/config.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAA;IAC7B,YAAY,EAAE,MAAM,GAAG,SAAS,CAAA;IAChC,aAAa,EAAE,MAAM,GAAG,SAAS,CAAA;IACjC,qBAAqB,EAAE,MAAM,CAAA;IAC7B,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;IACzC,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAA;CACxD;AAED,eAAO,MAAM,wBAAwB,EAAE,iBAMtC,CAAA;AAED,eAAO,MAAM,iBAAiB,+EAG7B,CAAA"}
@@ -0,0 +1,5 @@
1
+ import type { MilkdownPlugin } from '@jvs-milkdown/ctx';
2
+ export * from './config';
3
+ export * from './view';
4
+ export declare const imageInlineComponent: MilkdownPlugin[];
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/image-inline/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAKvD,cAAc,UAAU,CAAA;AACxB,cAAc,QAAQ,CAAA;AAEtB,eAAO,MAAM,oBAAoB,EAAE,cAAc,EAGhD,CAAA"}
@@ -0,0 +1,377 @@
1
+ import { $ctx, $view } from '@jvs-milkdown/utils';
2
+ import { imageSchema } from '@jvs-milkdown/preset-commonmark';
3
+ import DOMPurify from 'dompurify';
4
+ import { h, defineComponent, ref, Fragment as Fragment$1, createApp, watchEffect } from 'vue';
5
+ import clsx from 'clsx';
6
+ import { customAlphabet } from 'nanoid';
7
+
8
+ var __defProp = Object.defineProperty;
9
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
10
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
11
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
12
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
13
+ var __spreadValues = (a, b) => {
14
+ for (var prop in b || (b = {}))
15
+ if (__hasOwnProp.call(b, prop))
16
+ __defNormalProp(a, prop, b[prop]);
17
+ if (__getOwnPropSymbols)
18
+ for (var prop of __getOwnPropSymbols(b)) {
19
+ if (__propIsEnum.call(b, prop))
20
+ __defNormalProp(a, prop, b[prop]);
21
+ }
22
+ return a;
23
+ };
24
+ function withMeta(plugin, meta) {
25
+ Object.assign(plugin, {
26
+ meta: __spreadValues({
27
+ package: "@jvs-milkdown/components"
28
+ }, meta)
29
+ });
30
+ return plugin;
31
+ }
32
+
33
+ const defaultInlineImageConfig = {
34
+ imageIcon: "\u{1F30C}",
35
+ uploadButton: "Upload",
36
+ confirmButton: "\u23CE",
37
+ uploadPlaceholderText: "/Paste",
38
+ onUpload: (file) => Promise.resolve(URL.createObjectURL(file))
39
+ };
40
+ const inlineImageConfig = $ctx(
41
+ defaultInlineImageConfig,
42
+ "inlineImageConfigCtx"
43
+ );
44
+ withMeta(inlineImageConfig, {
45
+ displayName: "Config<image-inline>",
46
+ group: "ImageInline"
47
+ });
48
+
49
+ function keepAlive(..._args) {
50
+ }
51
+
52
+ keepAlive(h);
53
+ function Icon({ icon, class: className, onClick }) {
54
+ return /* @__PURE__ */ h(
55
+ "span",
56
+ {
57
+ class: clsx("milkdown-icon", className),
58
+ onPointerdown: onClick,
59
+ innerHTML: icon ? DOMPurify.sanitize(icon.trim()) : void 0
60
+ }
61
+ );
62
+ }
63
+ Icon.props = {
64
+ icon: {
65
+ type: String,
66
+ required: false
67
+ },
68
+ class: {
69
+ type: String,
70
+ required: false
71
+ },
72
+ onClick: {
73
+ type: Function,
74
+ required: false
75
+ }
76
+ };
77
+
78
+ keepAlive(h);
79
+ const nanoid = customAlphabet("abcdefg", 8);
80
+ const ImageInput = defineComponent({
81
+ props: {
82
+ src: {
83
+ type: Object,
84
+ required: true
85
+ },
86
+ selected: {
87
+ type: Object,
88
+ required: true
89
+ },
90
+ readonly: {
91
+ type: Object,
92
+ required: true
93
+ },
94
+ setLink: {
95
+ type: Function,
96
+ required: true
97
+ },
98
+ imageIcon: {
99
+ type: String,
100
+ required: false
101
+ },
102
+ uploadButton: {
103
+ type: String,
104
+ required: false
105
+ },
106
+ confirmButton: {
107
+ type: String,
108
+ required: false
109
+ },
110
+ uploadPlaceholderText: {
111
+ type: String,
112
+ required: false
113
+ },
114
+ onUpload: {
115
+ type: Function,
116
+ required: true
117
+ },
118
+ onImageLoadError: {
119
+ type: Function,
120
+ required: false
121
+ }
122
+ },
123
+ setup({
124
+ readonly,
125
+ src,
126
+ setLink,
127
+ onUpload,
128
+ imageIcon,
129
+ uploadButton,
130
+ confirmButton,
131
+ uploadPlaceholderText,
132
+ className,
133
+ onImageLoadError
134
+ }) {
135
+ var _a, _b;
136
+ const focusLinkInput = ref(false);
137
+ const linkInputRef = ref();
138
+ const currentLink = ref((_a = src.value) != null ? _a : "");
139
+ const uuid = ref(nanoid());
140
+ const hidePlaceholder = ref(((_b = src.value) == null ? void 0 : _b.length) !== 0);
141
+ const onEditLink = (e) => {
142
+ const target = e.target;
143
+ const value = target.value;
144
+ hidePlaceholder.value = value.length !== 0;
145
+ currentLink.value = value;
146
+ };
147
+ const onKeydown = (e) => {
148
+ var _a2, _b2;
149
+ if (e.key === "Enter") {
150
+ setLink((_b2 = (_a2 = linkInputRef.value) == null ? void 0 : _a2.value) != null ? _b2 : "");
151
+ }
152
+ };
153
+ const onConfirmLinkInput = () => {
154
+ var _a2, _b2;
155
+ setLink((_b2 = (_a2 = linkInputRef.value) == null ? void 0 : _a2.value) != null ? _b2 : "");
156
+ };
157
+ const onUploadFile = (e) => {
158
+ var _a2;
159
+ const file = (_a2 = e.target.files) == null ? void 0 : _a2[0];
160
+ if (!file) return;
161
+ onUpload(file).then((url) => {
162
+ if (!url) return;
163
+ setLink(url);
164
+ hidePlaceholder.value = true;
165
+ }).catch((err) => {
166
+ console.error("An error occurred while uploading image");
167
+ console.error(err);
168
+ });
169
+ };
170
+ return () => {
171
+ return /* @__PURE__ */ h("div", { class: clsx("image-edit", className) }, /* @__PURE__ */ h(Icon, { icon: imageIcon, class: "image-icon" }), /* @__PURE__ */ h("div", { class: clsx("link-importer", focusLinkInput.value && "focus") }, /* @__PURE__ */ h(
172
+ "input",
173
+ {
174
+ ref: linkInputRef,
175
+ draggable: "true",
176
+ onDragstart: (e) => {
177
+ e.preventDefault();
178
+ e.stopPropagation();
179
+ },
180
+ disabled: readonly.value,
181
+ class: "link-input-area",
182
+ value: currentLink.value,
183
+ onInput: onEditLink,
184
+ onKeydown,
185
+ onFocus: () => focusLinkInput.value = true,
186
+ onBlur: () => focusLinkInput.value = false
187
+ }
188
+ ), !hidePlaceholder.value && /* @__PURE__ */ h("div", { class: "placeholder" }, /* @__PURE__ */ h(
189
+ "input",
190
+ {
191
+ disabled: readonly.value,
192
+ class: "hidden",
193
+ id: uuid.value,
194
+ type: "file",
195
+ accept: "image/*",
196
+ onChange: onUploadFile
197
+ }
198
+ ), /* @__PURE__ */ h("label", { class: "uploader", for: uuid.value }, /* @__PURE__ */ h(Icon, { icon: uploadButton })), /* @__PURE__ */ h("span", { class: "text", onClick: () => {
199
+ var _a2;
200
+ return (_a2 = linkInputRef.value) == null ? void 0 : _a2.focus();
201
+ } }, uploadPlaceholderText))), currentLink.value && /* @__PURE__ */ h(Fragment, null, /* @__PURE__ */ h("div", { class: "image-preview" }, /* @__PURE__ */ h(
202
+ "img",
203
+ {
204
+ src: currentLink.value,
205
+ alt: "",
206
+ onError: (e) => Promise.resolve(onImageLoadError == null ? void 0 : onImageLoadError(e)).catch(() => {
207
+ })
208
+ }
209
+ )), /* @__PURE__ */ h("div", { class: "confirm", onClick: () => onConfirmLinkInput() }, /* @__PURE__ */ h(Icon, { icon: confirmButton }))));
210
+ };
211
+ }
212
+ });
213
+
214
+ keepAlive(h, Fragment$1);
215
+ const MilkdownImageInline = defineComponent({
216
+ props: {
217
+ src: {
218
+ type: Object,
219
+ required: true
220
+ },
221
+ alt: {
222
+ type: Object,
223
+ required: true
224
+ },
225
+ title: {
226
+ type: Object,
227
+ required: true
228
+ },
229
+ selected: {
230
+ type: Object,
231
+ required: true
232
+ },
233
+ readonly: {
234
+ type: Object,
235
+ required: true
236
+ },
237
+ setAttr: {
238
+ type: Function,
239
+ required: true
240
+ },
241
+ config: {
242
+ type: Object,
243
+ required: true
244
+ }
245
+ },
246
+ setup(props) {
247
+ const { src, alt, title } = props;
248
+ return () => {
249
+ var _a;
250
+ if (!((_a = src.value) == null ? void 0 : _a.length)) {
251
+ return /* @__PURE__ */ h(
252
+ ImageInput,
253
+ {
254
+ src: props.src,
255
+ selected: props.selected,
256
+ readonly: props.readonly,
257
+ setLink: (link) => props.setAttr("src", link),
258
+ imageIcon: props.config.imageIcon,
259
+ uploadButton: props.config.uploadButton,
260
+ confirmButton: props.config.confirmButton,
261
+ uploadPlaceholderText: props.config.uploadPlaceholderText,
262
+ onUpload: props.config.onUpload,
263
+ className: "empty-image-inline"
264
+ }
265
+ );
266
+ }
267
+ return /* @__PURE__ */ h(
268
+ "img",
269
+ {
270
+ class: "image-inline",
271
+ src: src.value,
272
+ alt: alt.value,
273
+ title: title.value
274
+ }
275
+ );
276
+ };
277
+ }
278
+ });
279
+
280
+ const inlineImageView = $view(
281
+ imageSchema.node,
282
+ (ctx) => {
283
+ return (initialNode, view, getPos) => {
284
+ const src = ref(initialNode.attrs.src);
285
+ const alt = ref(initialNode.attrs.alt);
286
+ const title = ref(initialNode.attrs.title);
287
+ const selected = ref(false);
288
+ const readonly = ref(!view.editable);
289
+ const setAttr = (attr, value) => {
290
+ if (!view.editable) return;
291
+ const pos = getPos();
292
+ if (pos == null) return;
293
+ view.dispatch(
294
+ view.state.tr.setNodeAttribute(
295
+ pos,
296
+ attr,
297
+ attr === "src" ? DOMPurify.sanitize(value) : value
298
+ )
299
+ );
300
+ };
301
+ const config = ctx.get(inlineImageConfig.key);
302
+ const app = createApp(MilkdownImageInline, {
303
+ src,
304
+ alt,
305
+ title,
306
+ selected,
307
+ readonly,
308
+ setAttr,
309
+ config
310
+ });
311
+ const dom = document.createElement("span");
312
+ dom.className = "milkdown-image-inline";
313
+ const disposeSelectedWatcher = watchEffect(() => {
314
+ const isSelected = selected.value;
315
+ if (isSelected) {
316
+ dom.classList.add("selected");
317
+ } else {
318
+ dom.classList.remove("selected");
319
+ }
320
+ });
321
+ const proxyDomURL = config.proxyDomURL;
322
+ const bindAttrs = (node) => {
323
+ if (!proxyDomURL) {
324
+ src.value = node.attrs.src;
325
+ } else {
326
+ const proxiedURL = proxyDomURL(node.attrs.src);
327
+ if (typeof proxiedURL === "string") {
328
+ src.value = proxiedURL;
329
+ } else {
330
+ proxiedURL.then((url) => {
331
+ src.value = url;
332
+ }).catch(console.error);
333
+ }
334
+ }
335
+ alt.value = node.attrs.alt;
336
+ title.value = node.attrs.title;
337
+ };
338
+ bindAttrs(initialNode);
339
+ app.mount(dom);
340
+ return {
341
+ dom,
342
+ update: (updatedNode) => {
343
+ if (updatedNode.type !== initialNode.type) return false;
344
+ bindAttrs(updatedNode);
345
+ return true;
346
+ },
347
+ stopEvent: (e) => {
348
+ if (e.target instanceof HTMLInputElement) return true;
349
+ return false;
350
+ },
351
+ selectNode: () => {
352
+ selected.value = true;
353
+ },
354
+ deselectNode: () => {
355
+ selected.value = false;
356
+ },
357
+ destroy: () => {
358
+ disposeSelectedWatcher();
359
+ app.unmount();
360
+ dom.remove();
361
+ }
362
+ };
363
+ };
364
+ }
365
+ );
366
+ withMeta(inlineImageView, {
367
+ displayName: "NodeView<image-inline>",
368
+ group: "ImageInline"
369
+ });
370
+
371
+ const imageInlineComponent = [
372
+ inlineImageConfig,
373
+ inlineImageView
374
+ ];
375
+
376
+ export { defaultInlineImageConfig, imageInlineComponent, inlineImageConfig, inlineImageView };
377
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../src/__internal__/meta.ts","../../src/image-inline/config.ts","../../src/__internal__/keep-alive.ts","../../src/__internal__/components/icon.tsx","../../src/__internal__/components/image-input.tsx","../../src/image-inline/components/image-inline.tsx","../../src/image-inline/view.ts","../../src/image-inline/index.ts"],"sourcesContent":["import type { Meta, MilkdownPlugin } from '@jvs-milkdown/ctx'\n\nexport function withMeta<T extends MilkdownPlugin>(\n plugin: T,\n meta: Partial<Meta> & Pick<Meta, 'displayName'>\n): T {\n Object.assign(plugin, {\n meta: {\n package: '@jvs-milkdown/components',\n ...meta,\n },\n })\n\n return plugin\n}\n","import { $ctx } from '@jvs-milkdown/utils'\n\nimport { withMeta } from '../__internal__/meta'\n\nexport interface InlineImageConfig {\n imageIcon: string | undefined\n uploadButton: string | undefined\n confirmButton: string | undefined\n uploadPlaceholderText: string\n onUpload: (file: File) => Promise<string>\n proxyDomURL?: (url: string) => Promise<string> | string\n}\n\nexport const defaultInlineImageConfig: InlineImageConfig = {\n imageIcon: '🌌',\n uploadButton: 'Upload',\n confirmButton: '⏎',\n uploadPlaceholderText: '/Paste',\n onUpload: (file) => Promise.resolve(URL.createObjectURL(file)),\n}\n\nexport const inlineImageConfig = $ctx(\n defaultInlineImageConfig,\n 'inlineImageConfigCtx'\n)\n\nwithMeta(inlineImageConfig, {\n displayName: 'Config<image-inline>',\n group: 'ImageInline',\n})\n","// Prevent tree-shaking from removing Vue's `h` and `Fragment`,\n// which are required at runtime for TSX to work.\nexport function keepAlive(..._args: unknown[]) {}\n","import clsx from 'clsx'\nimport DOMPurify from 'dompurify'\nimport { h } from 'vue'\n\nimport { keepAlive } from '../keep-alive'\n\nkeepAlive(h)\n\ntype IconProps = {\n icon?: string | null\n class?: string\n onClick?: (event: PointerEvent) => void\n}\n\nexport function Icon({ icon, class: className, onClick }: IconProps) {\n return (\n <span\n class={clsx('milkdown-icon', className)}\n onPointerdown={onClick}\n innerHTML={icon ? DOMPurify.sanitize(icon.trim()) : undefined}\n />\n )\n}\n\nIcon.props = {\n icon: {\n type: String,\n required: false,\n },\n class: {\n type: String,\n required: false,\n },\n onClick: {\n type: Function,\n required: false,\n },\n}\n","import clsx from 'clsx'\nimport { customAlphabet } from 'nanoid'\nimport { defineComponent, ref, h, type Ref } from 'vue'\n\nimport { keepAlive } from '../keep-alive'\nimport { Icon } from './icon'\n\nkeepAlive(h)\n\nconst nanoid = customAlphabet('abcdefg', 8)\n\ntype ImageInputProps = {\n src: Ref<string | undefined>\n selected: Ref<boolean>\n readonly: Ref<boolean>\n setLink: (link: string) => void\n\n imageIcon?: string\n uploadButton?: string\n confirmButton?: string\n uploadPlaceholderText?: string\n\n className?: string\n\n onUpload: (file: File) => Promise<string>\n onImageLoadError?: (event: Event) => void | Promise<void>\n}\n\nexport const ImageInput = defineComponent<ImageInputProps>({\n props: {\n src: {\n type: Object,\n required: true,\n },\n selected: {\n type: Object,\n required: true,\n },\n readonly: {\n type: Object,\n required: true,\n },\n setLink: {\n type: Function,\n required: true,\n },\n imageIcon: {\n type: String,\n required: false,\n },\n uploadButton: {\n type: String,\n required: false,\n },\n confirmButton: {\n type: String,\n required: false,\n },\n uploadPlaceholderText: {\n type: String,\n required: false,\n },\n onUpload: {\n type: Function,\n required: true,\n },\n onImageLoadError: {\n type: Function,\n required: false,\n },\n },\n setup({\n readonly,\n src,\n setLink,\n onUpload,\n imageIcon,\n uploadButton,\n confirmButton,\n uploadPlaceholderText,\n className,\n onImageLoadError,\n }) {\n const focusLinkInput = ref(false)\n const linkInputRef = ref<HTMLInputElement>()\n const currentLink = ref(src.value ?? '')\n const uuid = ref(nanoid())\n const hidePlaceholder = ref(src.value?.length !== 0)\n const onEditLink = (e: Event) => {\n const target = e.target as HTMLInputElement\n const value = target.value\n hidePlaceholder.value = value.length !== 0\n currentLink.value = value\n }\n\n const onKeydown = (e: KeyboardEvent) => {\n if (e.key === 'Enter') {\n setLink(linkInputRef.value?.value ?? '')\n }\n }\n\n const onConfirmLinkInput = () => {\n setLink(linkInputRef.value?.value ?? '')\n }\n\n const onUploadFile = (e: Event) => {\n const file = (e.target as HTMLInputElement).files?.[0]\n if (!file) return\n\n onUpload(file)\n .then((url) => {\n if (!url) return\n\n setLink(url)\n hidePlaceholder.value = true\n })\n .catch((err) => {\n console.error('An error occurred while uploading image')\n console.error(err)\n })\n }\n\n return () => {\n return (\n <div class={clsx('image-edit', className)}>\n <Icon icon={imageIcon} class=\"image-icon\" />\n <div class={clsx('link-importer', focusLinkInput.value && 'focus')}>\n <input\n ref={linkInputRef}\n draggable=\"true\"\n onDragstart={(e) => {\n e.preventDefault()\n e.stopPropagation()\n }}\n disabled={readonly.value}\n class=\"link-input-area\"\n value={currentLink.value}\n onInput={onEditLink}\n onKeydown={onKeydown}\n onFocus={() => (focusLinkInput.value = true)}\n onBlur={() => (focusLinkInput.value = false)}\n />\n {!hidePlaceholder.value && (\n <div class=\"placeholder\">\n <input\n disabled={readonly.value}\n class=\"hidden\"\n id={uuid.value}\n type=\"file\"\n accept=\"image/*\"\n onChange={onUploadFile}\n />\n <label class=\"uploader\" for={uuid.value}>\n <Icon icon={uploadButton} />\n </label>\n <span class=\"text\" onClick={() => linkInputRef.value?.focus()}>\n {uploadPlaceholderText}\n </span>\n </div>\n )}\n </div>\n {currentLink.value && (\n <>\n <div class=\"image-preview\">\n <img\n src={currentLink.value}\n alt=\"\"\n onError={(e) =>\n Promise.resolve(onImageLoadError?.(e)).catch(() => {})\n }\n />\n </div>\n <div class=\"confirm\" onClick={() => onConfirmLinkInput()}>\n <Icon icon={confirmButton} />\n </div>\n </>\n )}\n </div>\n )\n }\n },\n})\n","import { h, Fragment, type Ref, defineComponent } from 'vue'\n\nimport type { InlineImageConfig } from '../config'\n\nimport { ImageInput } from '../../__internal__/components/image-input'\nimport { keepAlive } from '../../__internal__/keep-alive'\n\nkeepAlive(h, Fragment)\n\ntype Attrs = {\n src: string\n alt: string\n title: string\n}\n\ntype MilkdownImageInlineProps = {\n selected: Ref<boolean>\n readonly: Ref<boolean>\n setAttr: <T extends keyof Attrs>(attr: T, value: Attrs[T]) => void\n config: InlineImageConfig\n} & {\n [P in keyof Attrs]: Ref<Attrs[P] | undefined>\n}\n\nexport const MilkdownImageInline = defineComponent<MilkdownImageInlineProps>({\n props: {\n src: {\n type: Object,\n required: true,\n },\n alt: {\n type: Object,\n required: true,\n },\n title: {\n type: Object,\n required: true,\n },\n selected: {\n type: Object,\n required: true,\n },\n readonly: {\n type: Object,\n required: true,\n },\n setAttr: {\n type: Function,\n required: true,\n },\n config: {\n type: Object,\n required: true,\n },\n },\n setup(props) {\n const { src, alt, title } = props\n return () => {\n if (!src.value?.length) {\n return (\n <ImageInput\n src={props.src}\n selected={props.selected}\n readonly={props.readonly}\n setLink={(link) => props.setAttr('src', link)}\n imageIcon={props.config.imageIcon}\n uploadButton={props.config.uploadButton}\n confirmButton={props.config.confirmButton}\n uploadPlaceholderText={props.config.uploadPlaceholderText}\n onUpload={props.config.onUpload}\n className=\"empty-image-inline\"\n />\n )\n }\n return (\n <img\n class=\"image-inline\"\n src={src.value}\n alt={alt.value}\n title={title.value}\n />\n )\n }\n },\n})\n","import type { Node } from '@jvs-milkdown/prose/model'\nimport type { NodeViewConstructor } from '@jvs-milkdown/prose/view'\n\nimport { imageSchema } from '@jvs-milkdown/preset-commonmark'\nimport { $view } from '@jvs-milkdown/utils'\nimport DOMPurify from 'dompurify'\nimport { createApp, ref, watchEffect } from 'vue'\n\nimport { withMeta } from '../__internal__/meta'\nimport { MilkdownImageInline } from './components/image-inline'\nimport { inlineImageConfig } from './config'\n\nexport const inlineImageView = $view(\n imageSchema.node,\n (ctx): NodeViewConstructor => {\n return (initialNode, view, getPos) => {\n const src = ref(initialNode.attrs.src)\n const alt = ref(initialNode.attrs.alt)\n const title = ref(initialNode.attrs.title)\n const selected = ref(false)\n const readonly = ref(!view.editable)\n const setAttr = (attr: string, value: unknown) => {\n if (!view.editable) return\n const pos = getPos()\n if (pos == null) return\n view.dispatch(\n view.state.tr.setNodeAttribute(\n pos,\n attr,\n attr === 'src' ? DOMPurify.sanitize(value as string) : value\n )\n )\n }\n\n const config = ctx.get(inlineImageConfig.key)\n const app = createApp(MilkdownImageInline, {\n src,\n alt,\n title,\n selected,\n readonly,\n setAttr,\n config,\n })\n const dom = document.createElement('span')\n dom.className = 'milkdown-image-inline'\n const disposeSelectedWatcher = watchEffect(() => {\n const isSelected = selected.value\n if (isSelected) {\n dom.classList.add('selected')\n } else {\n dom.classList.remove('selected')\n }\n })\n const proxyDomURL = config.proxyDomURL\n const bindAttrs = (node: Node) => {\n if (!proxyDomURL) {\n src.value = node.attrs.src\n } else {\n const proxiedURL = proxyDomURL(node.attrs.src)\n if (typeof proxiedURL === 'string') {\n src.value = proxiedURL\n } else {\n proxiedURL\n .then((url) => {\n src.value = url\n })\n .catch(console.error)\n }\n }\n alt.value = node.attrs.alt\n title.value = node.attrs.title\n }\n bindAttrs(initialNode)\n app.mount(dom)\n\n return {\n dom,\n update: (updatedNode) => {\n if (updatedNode.type !== initialNode.type) return false\n\n bindAttrs(updatedNode)\n return true\n },\n stopEvent: (e) => {\n if (e.target instanceof HTMLInputElement) return true\n\n return false\n },\n selectNode: () => {\n selected.value = true\n },\n deselectNode: () => {\n selected.value = false\n },\n destroy: () => {\n disposeSelectedWatcher()\n app.unmount()\n dom.remove()\n },\n }\n }\n }\n)\n\nwithMeta(inlineImageView, {\n displayName: 'NodeView<image-inline>',\n group: 'ImageInline',\n})\n","import type { MilkdownPlugin } from '@jvs-milkdown/ctx'\n\nimport { inlineImageConfig } from './config'\nimport { inlineImageView } from './view'\n\nexport * from './config'\nexport * from './view'\n\nexport const imageInlineComponent: MilkdownPlugin[] = [\n inlineImageConfig,\n inlineImageView,\n]\n"],"names":["_a","_b","Fragment"],"mappings":"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"}