@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.
- package/LICENSE +21 -0
- package/README.md +11 -0
- package/lib/__internal__/components/icon.d.ts +24 -0
- package/lib/__internal__/components/icon.d.ts.map +1 -0
- package/lib/__internal__/components/image-input.d.ts +17 -0
- package/lib/__internal__/components/image-input.d.ts.map +1 -0
- package/lib/__internal__/keep-alive.d.ts +2 -0
- package/lib/__internal__/keep-alive.d.ts.map +1 -0
- package/lib/__internal__/meta.d.ts +3 -0
- package/lib/__internal__/meta.d.ts.map +1 -0
- package/lib/__tests__/setup.d.ts +2 -0
- package/lib/__tests__/setup.d.ts.map +1 -0
- package/lib/code-block/config.d.ts +23 -0
- package/lib/code-block/config.d.ts.map +1 -0
- package/lib/code-block/index.d.ts +5 -0
- package/lib/code-block/index.d.ts.map +1 -0
- package/lib/code-block/index.js +4160 -0
- package/lib/code-block/index.js.map +1 -0
- package/lib/code-block/view/components/code-block.d.ts +16 -0
- package/lib/code-block/view/components/code-block.d.ts.map +1 -0
- package/lib/code-block/view/components/copy-button.d.ts +9 -0
- package/lib/code-block/view/components/copy-button.d.ts.map +1 -0
- package/lib/code-block/view/components/language-picker.d.ts +5 -0
- package/lib/code-block/view/components/language-picker.d.ts.map +1 -0
- package/lib/code-block/view/components/preview-panel.d.ts +9 -0
- package/lib/code-block/view/components/preview-panel.d.ts.map +1 -0
- package/lib/code-block/view/index.d.ts +3 -0
- package/lib/code-block/view/index.d.ts.map +1 -0
- package/lib/code-block/view/loader.d.ts +13 -0
- package/lib/code-block/view/loader.d.ts.map +1 -0
- package/lib/code-block/view/node-view.d.ts +40 -0
- package/lib/code-block/view/node-view.d.ts.map +1 -0
- package/lib/image-block/config.d.ts +16 -0
- package/lib/image-block/config.d.ts.map +1 -0
- package/lib/image-block/index.d.ts +7 -0
- package/lib/image-block/index.d.ts.map +1 -0
- package/lib/image-block/index.js +660 -0
- package/lib/image-block/index.js.map +1 -0
- package/lib/image-block/remark-plugin.d.ts +2 -0
- package/lib/image-block/remark-plugin.d.ts.map +1 -0
- package/lib/image-block/schema.d.ts +3 -0
- package/lib/image-block/schema.d.ts.map +1 -0
- package/lib/image-block/view/components/__tests__/image-viewer.onImageLoadError.spec.d.ts +2 -0
- package/lib/image-block/view/components/__tests__/image-viewer.onImageLoadError.spec.d.ts.map +1 -0
- package/lib/image-block/view/components/image-block.d.ts +18 -0
- package/lib/image-block/view/components/image-block.d.ts.map +1 -0
- package/lib/image-block/view/components/image-viewer.d.ts +3 -0
- package/lib/image-block/view/components/image-viewer.d.ts.map +1 -0
- package/lib/image-block/view/index.d.ts +3 -0
- package/lib/image-block/view/index.d.ts.map +1 -0
- package/lib/image-inline/components/image-inline.d.ts +18 -0
- package/lib/image-inline/components/image-inline.d.ts.map +1 -0
- package/lib/image-inline/config.d.ts +11 -0
- package/lib/image-inline/config.d.ts.map +1 -0
- package/lib/image-inline/index.d.ts +5 -0
- package/lib/image-inline/index.d.ts.map +1 -0
- package/lib/image-inline/index.js +377 -0
- package/lib/image-inline/index.js.map +1 -0
- package/lib/image-inline/view.d.ts +3 -0
- package/lib/image-inline/view.d.ts.map +1 -0
- package/lib/index.d.ts +2 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +35 -0
- package/lib/index.js.map +1 -0
- package/lib/link-tooltip/command.d.ts +2 -0
- package/lib/link-tooltip/command.d.ts.map +1 -0
- package/lib/link-tooltip/configure.d.ts +3 -0
- package/lib/link-tooltip/configure.d.ts.map +1 -0
- package/lib/link-tooltip/edit/component.d.ts +11 -0
- package/lib/link-tooltip/edit/component.d.ts.map +1 -0
- package/lib/link-tooltip/edit/edit-configure.d.ts +3 -0
- package/lib/link-tooltip/edit/edit-configure.d.ts.map +1 -0
- package/lib/link-tooltip/edit/edit-view.d.ts +15 -0
- package/lib/link-tooltip/edit/edit-view.d.ts.map +1 -0
- package/lib/link-tooltip/index.d.ts +7 -0
- package/lib/link-tooltip/index.d.ts.map +1 -0
- package/lib/link-tooltip/index.js +2526 -0
- package/lib/link-tooltip/index.js.map +1 -0
- package/lib/link-tooltip/preview/component.d.ts +11 -0
- package/lib/link-tooltip/preview/component.d.ts.map +1 -0
- package/lib/link-tooltip/preview/preview-configure.d.ts +3 -0
- package/lib/link-tooltip/preview/preview-configure.d.ts.map +1 -0
- package/lib/link-tooltip/preview/preview-view.d.ts +14 -0
- package/lib/link-tooltip/preview/preview-view.d.ts.map +1 -0
- package/lib/link-tooltip/slices.d.ts +34 -0
- package/lib/link-tooltip/slices.d.ts.map +1 -0
- package/lib/link-tooltip/tooltips.d.ts +3 -0
- package/lib/link-tooltip/tooltips.d.ts.map +1 -0
- package/lib/link-tooltip/utils.d.ts +14 -0
- package/lib/link-tooltip/utils.d.ts.map +1 -0
- package/lib/list-item-block/component.d.ts +19 -0
- package/lib/list-item-block/component.d.ts.map +1 -0
- package/lib/list-item-block/config.d.ts +13 -0
- package/lib/list-item-block/config.d.ts.map +1 -0
- package/lib/list-item-block/index.d.ts +6 -0
- package/lib/list-item-block/index.d.ts.map +1 -0
- package/lib/list-item-block/index.js +2149 -0
- package/lib/list-item-block/index.js.map +1 -0
- package/lib/list-item-block/view.d.ts +3 -0
- package/lib/list-item-block/view.d.ts.map +1 -0
- package/lib/table-block/config.d.ts +8 -0
- package/lib/table-block/config.d.ts.map +1 -0
- package/lib/table-block/dnd/calc-drag-over.d.ts +3 -0
- package/lib/table-block/dnd/calc-drag-over.d.ts.map +1 -0
- package/lib/table-block/dnd/create-drag-handler.d.ts +5 -0
- package/lib/table-block/dnd/create-drag-handler.d.ts.map +1 -0
- package/lib/table-block/dnd/drag-over-handler.d.ts +3 -0
- package/lib/table-block/dnd/drag-over-handler.d.ts.map +1 -0
- package/lib/table-block/dnd/prepare-dnd-context.d.ts +3 -0
- package/lib/table-block/dnd/prepare-dnd-context.d.ts.map +1 -0
- package/lib/table-block/dnd/preview.d.ts +3 -0
- package/lib/table-block/dnd/preview.d.ts.map +1 -0
- package/lib/table-block/index.d.ts +5 -0
- package/lib/table-block/index.d.ts.map +1 -0
- package/lib/table-block/index.js +3961 -0
- package/lib/table-block/index.js.map +1 -0
- package/lib/table-block/view/component.d.ts +16 -0
- package/lib/table-block/view/component.d.ts.map +1 -0
- package/lib/table-block/view/drag.d.ts +7 -0
- package/lib/table-block/view/drag.d.ts.map +1 -0
- package/lib/table-block/view/index.d.ts +2 -0
- package/lib/table-block/view/index.d.ts.map +1 -0
- package/lib/table-block/view/operation.d.ts +11 -0
- package/lib/table-block/view/operation.d.ts.map +1 -0
- package/lib/table-block/view/pointer.d.ts +7 -0
- package/lib/table-block/view/pointer.d.ts.map +1 -0
- package/lib/table-block/view/types.d.ts +32 -0
- package/lib/table-block/view/types.d.ts.map +1 -0
- package/lib/table-block/view/utils.d.ts +21 -0
- package/lib/table-block/view/utils.d.ts.map +1 -0
- package/lib/table-block/view/view.d.ts +22 -0
- package/lib/table-block/view/view.d.ts.map +1 -0
- package/lib/tsconfig.tsbuildinfo +1 -0
- package/package.json +110 -0
- package/src/__internal__/components/icon.tsx +38 -0
- package/src/__internal__/components/image-input.tsx +182 -0
- package/src/__internal__/keep-alive.ts +3 -0
- package/src/__internal__/meta.ts +15 -0
- package/src/__tests__/setup.ts +6 -0
- package/src/code-block/config.ts +54 -0
- package/src/code-block/index.ts +12 -0
- package/src/code-block/view/components/code-block.tsx +170 -0
- package/src/code-block/view/components/copy-button.tsx +96 -0
- package/src/code-block/view/components/language-picker.tsx +239 -0
- package/src/code-block/view/components/preview-panel.tsx +79 -0
- package/src/code-block/view/index.ts +24 -0
- package/src/code-block/view/loader.ts +40 -0
- package/src/code-block/view/node-view.ts +310 -0
- package/src/image-block/config.ts +37 -0
- package/src/image-block/index.ts +18 -0
- package/src/image-block/remark-plugin.ts +51 -0
- package/src/image-block/schema.ts +71 -0
- package/src/image-block/view/components/__tests__/image-viewer.onImageLoadError.spec.tsx +42 -0
- package/src/image-block/view/components/image-block.tsx +80 -0
- package/src/image-block/view/components/image-viewer.tsx +186 -0
- package/src/image-block/view/index.ts +111 -0
- package/src/image-inline/components/image-inline.tsx +85 -0
- package/src/image-inline/config.ts +30 -0
- package/src/image-inline/index.ts +12 -0
- package/src/image-inline/view.ts +109 -0
- package/src/index.ts +1 -0
- package/src/link-tooltip/command.ts +19 -0
- package/src/link-tooltip/configure.ts +9 -0
- package/src/link-tooltip/edit/component.tsx +82 -0
- package/src/link-tooltip/edit/edit-configure.ts +29 -0
- package/src/link-tooltip/edit/edit-view.ts +165 -0
- package/src/link-tooltip/index.ts +19 -0
- package/src/link-tooltip/preview/component.tsx +87 -0
- package/src/link-tooltip/preview/preview-configure.ts +65 -0
- package/src/link-tooltip/preview/preview-view.ts +101 -0
- package/src/link-tooltip/slices.ts +69 -0
- package/src/link-tooltip/tooltips.ts +22 -0
- package/src/link-tooltip/utils.ts +56 -0
- package/src/list-item-block/component.tsx +133 -0
- package/src/list-item-block/config.ts +39 -0
- package/src/list-item-block/index.ts +13 -0
- package/src/list-item-block/view.ts +130 -0
- package/src/table-block/config.ts +53 -0
- package/src/table-block/dnd/calc-drag-over.ts +46 -0
- package/src/table-block/dnd/create-drag-handler.ts +99 -0
- package/src/table-block/dnd/drag-over-handler.ts +113 -0
- package/src/table-block/dnd/prepare-dnd-context.ts +46 -0
- package/src/table-block/dnd/preview.ts +58 -0
- package/src/table-block/index.ts +9 -0
- package/src/table-block/view/component.tsx +219 -0
- package/src/table-block/view/drag.ts +121 -0
- package/src/table-block/view/index.ts +1 -0
- package/src/table-block/view/operation.ts +148 -0
- package/src/table-block/view/pointer.ts +165 -0
- package/src/table-block/view/types.ts +35 -0
- package/src/table-block/view/utils.ts +192 -0
- 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":";;;;;;;;;;;;;;;;;;;;;;;;AAEO,SAAS,QAAA,CACd,QACA,IAAA,EACG;AACH,EAAA,MAAA,CAAO,OAAO,MAAA,EAAQ;AAAA,IACpB,IAAA,EAAMA,gBAAA,CAAA;AAAA,MACJ,OAAA,EAAS;AAAA,KAAA,EACN,IAAA;AAAA,GAEN,CAAA;AAED,EAAA,OAAO,MAAA;AACT;;ACIO,MAAM,uBAAA,GAA4C;AAAA,EACvD,SAAA,EAAW,WAAA;AAAA,EACX,WAAA,EAAa,WAAA;AAAA,EACb,YAAA,EAAc,aAAA;AAAA,EACd,aAAA,EAAe,gBAAA;AAAA,EACf,qBAAA,EAAuB,6BAAA;AAAA,EACvB,sBAAA,EAAwB,eAAA;AAAA,EACxB,QAAA,EAAU,CAAC,IAAA,KAAS,OAAA,CAAQ,QAAQ,GAAA,CAAI,eAAA,CAAgB,IAAI,CAAC;AAC/D;AAEO,MAAM,gBAAA,GAAmB,IAAA;AAAA,EAC9B,uBAAA;AAAA,EACA;AACF;AAEA,QAAA,CAAS,gBAAA,EAAkB;AAAA,EACzB,WAAA,EAAa,qBAAA;AAAA,EACb,KAAA,EAAO;AACT,CAAC,CAAA;;AC7BD,SAAS,WAAW,GAAA,EAAW;AAC7B,EAAA,OAAO,KAAA;AAAA,IACL,GAAA;AAAA,IACA,WAAA;AAAA,IACA,CACE,IAAA,EACA,KAAA,EACA,MAAA,KACG;AAfT,MAAA,IAAA,EAAA,EAAA,EAAA;AAgBM,MAAA,IAAA,CAAA,CAAI,EAAA,GAAA,IAAA,CAAK,QAAA,KAAL,IAAA,GAAA,MAAA,GAAA,EAAA,CAAe,MAAA,MAAW,CAAA,EAAG;AACjC,MAAA,MAAM,UAAA,GAAA,CAAa,EAAA,GAAA,IAAA,CAAK,QAAA,KAAL,IAAA,GAAA,MAAA,GAAA,EAAA,CAAgB,CAAA,CAAA;AACnC,MAAA,IAAI,CAAC,UAAA,IAAc,UAAA,CAAW,IAAA,KAAS,OAAA,EAAS;AAEhD,MAAA,MAAM,EAAE,GAAA,EAAK,GAAA,EAAK,KAAA,EAAM,GAAI,UAAA;AAK5B,MAAA,MAAM,OAAA,GAAU;AAAA,QACd,IAAA,EAAM,aAAA;AAAA,QACN,GAAA;AAAA,QACA,GAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,MAAA,CAAO,QAAA,CAAS,MAAA,CAAO,KAAA,EAAO,CAAA,EAAG,OAAO,CAAA;AAAA,IAC1C;AAAA,GACF;AACF;AAEO,MAAM,sBAAA,GAAyB,OAAA;AAAA,EACpC,oBAAA;AAAA,EACA,MAAM,MAAM;AACd;AAEA,QAAA,CAAS,uBAAuB,MAAA,EAAQ;AAAA,EACtC,WAAA,EAAa,0BAAA;AAAA,EACb,KAAA,EAAO;AACT,CAAC,CAAA;AAED,QAAA,CAAS,uBAAuB,OAAA,EAAS;AAAA,EACvC,WAAA,EAAa,gCAAA;AAAA,EACb,KAAA,EAAO;AACT,CAAC,CAAA;;;;;;;;;;;;;;;;;;AC7CM,MAAM,eAAA,GAAkB;AAExB,MAAM,gBAAA,GAAmB,WAAA,CAAY,aAAA,EAAe,MAAM;AAC/D,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,KAAA;AAAA,IACR,KAAA,EAAO,OAAA;AAAA,IACP,UAAA,EAAY,IAAA;AAAA,IACZ,SAAA,EAAW,IAAA;AAAA,IACX,SAAA,EAAW,IAAA;AAAA,IACX,KAAA,EAAO,EAAA;AAAA,IACP,IAAA,EAAM,IAAA;AAAA,IACN,QAAA,EAAU,GAAA;AAAA,IACV,KAAA,EAAO;AAAA,MACL,GAAA,EAAK,EAAE,OAAA,EAAS,EAAA,EAAI,UAAU,QAAA,EAAS;AAAA,MACvC,OAAA,EAAS,EAAE,OAAA,EAAS,EAAA,EAAI,UAAU,QAAA,EAAS;AAAA,MAC3C,KAAA,EAAO,EAAE,OAAA,EAAS,CAAA,EAAG,UAAU,QAAA;AAAS,KAC1C;AAAA,IACA,QAAA,EAAU;AAAA,MACR;AAAA,QACE,GAAA,EAAK,kBAAkB,eAAe,CAAA,EAAA,CAAA;AAAA,QACtC,QAAA,EAAU,CAAC,GAAA,KAAQ;AAzB3B,UAAA,IAAA,EAAA;AA0BU,UAAA,IAAI,EAAE,GAAA,YAAe,WAAA,CAAA,EAAc,MAAM,mBAAmB,GAAG,CAAA;AAE/D,UAAA,OAAO;AAAA,YACL,GAAA,EAAK,GAAA,CAAI,YAAA,CAAa,KAAK,CAAA,IAAK,EAAA;AAAA,YAChC,OAAA,EAAS,GAAA,CAAI,YAAA,CAAa,SAAS,CAAA,IAAK,EAAA;AAAA,YACxC,OAAO,MAAA,CAAA,CAAO,EAAA,GAAA,GAAA,CAAI,aAAa,OAAO,CAAA,KAAxB,YAA6B,CAAC;AAAA,WAC9C;AAAA,QACF;AAAA;AACF,KACF;AAAA,IACA,KAAA,EAAO,CAAC,IAAA,KAAS,CAAC,OAAOA,gBAAA,CAAA,EAAE,WAAA,EAAa,eAAA,EAAA,EAAoB,IAAA,CAAK,KAAA,CAAO,CAAA;AAAA,IACxE,aAAA,EAAe;AAAA,MACb,KAAA,EAAO,CAAC,EAAE,IAAA,OAAW,IAAA,KAAS,aAAA;AAAA,MAC9B,MAAA,EAAQ,CAAC,KAAA,EAAO,IAAA,EAAM,IAAA,KAAS;AAC7B,QAAA,MAAM,MAAM,IAAA,CAAK,GAAA;AACjB,QAAA,MAAM,UAAU,IAAA,CAAK,KAAA;AACrB,QAAA,IAAI,KAAA,GAAQ,MAAA,CAAQ,IAAA,CAAK,GAAA,IAAkB,CAAC,CAAA;AAC5C,QAAA,IAAI,OAAO,KAAA,CAAM,KAAK,CAAA,IAAK,KAAA,KAAU,GAAG,KAAA,GAAQ,CAAA;AAEhD,QAAA,KAAA,CAAM,QAAQ,IAAA,EAAM;AAAA,UAClB,GAAA;AAAA,UACA,OAAA;AAAA,UACA;AAAA,SACD,CAAA;AAAA,MACH;AAAA,KACF;AAAA,IACA,UAAA,EAAY;AAAA,MACV,KAAA,EAAO,CAAC,IAAA,KAAS,IAAA,CAAK,KAAK,IAAA,KAAS,aAAA;AAAA,MACpC,MAAA,EAAQ,CAAC,KAAA,EAAO,IAAA,KAAS;AACvB,QAAA,KAAA,CAAM,SAAS,WAAW,CAAA;AAC1B,QAAA,KAAA,CAAM,OAAA,CAAQ,OAAA,EAAS,MAAA,EAAW,MAAA,EAAW;AAAA,UAC3C,KAAA,EAAO,KAAK,KAAA,CAAM,OAAA;AAAA,UAClB,GAAA,EAAK,KAAK,KAAA,CAAM,GAAA;AAAA,UAChB,GAAA,EAAK,CAAA,EAAG,MAAA,CAAO,UAAA,CAAW,IAAA,CAAK,MAAM,KAAK,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,SACvD,CAAA;AACD,QAAA,KAAA,CAAM,SAAA,EAAU;AAAA,MAClB;AAAA;AACF,GACF;AACF,CAAC;AAED,QAAA,CAAS,iBAAiB,IAAA,EAAM;AAAA,EAC9B,WAAA,EAAa,yBAAA;AAAA,EACb,KAAA,EAAO;AACT,CAAC,CAAA;;ACpEM,SAAS,aAAa,KAAA,EAAkB;AAAC;;ACIhD,SAAA,CAAU,CAAC,CAAA;AAQJ,SAAS,KAAK,EAAE,IAAA,EAAM,KAAA,EAAO,SAAA,EAAW,SAAQ,EAAc;AACnE,EAAA,uBACE,CAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,IAAA,CAAK,eAAA,EAAiB,SAAS,CAAA;AAAA,MACtC,aAAA,EAAe,OAAA;AAAA,MACf,WAAW,IAAA,GAAO,SAAA,CAAU,SAAS,IAAA,CAAK,IAAA,EAAM,CAAA,GAAI;AAAA;AAAA,GACtD;AAEJ;AAEA,IAAA,CAAK,KAAA,GAAQ;AAAA,EACX,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,MAAA;AAAA,IACN,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,MAAA;AAAA,IACN,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,OAAA,EAAS;AAAA,IACP,IAAA,EAAM,QAAA;AAAA,IACN,QAAA,EAAU;AAAA;AAEd,CAAA;;AC9BA,SAAA,CAAU,CAAC,CAAA;AAEX,MAAM,MAAA,GAAS,cAAA,CAAe,SAAA,EAAW,CAAC,CAAA;AAmBnC,MAAM,aAAa,eAAA,CAAiC;AAAA,EACzD,KAAA,EAAO;AAAA,IACL,GAAA,EAAK;AAAA,MACH,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,QAAA,EAAU;AAAA,MACR,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,QAAA,EAAU;AAAA,MACR,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,OAAA,EAAS;AAAA,MACP,IAAA,EAAM,QAAA;AAAA,MACN,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,SAAA,EAAW;AAAA,MACT,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,aAAA,EAAe;AAAA,MACb,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,qBAAA,EAAuB;AAAA,MACrB,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,QAAA,EAAU;AAAA,MACR,IAAA,EAAM,QAAA;AAAA,MACN,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,gBAAA,EAAkB;AAAA,MAChB,IAAA,EAAM,QAAA;AAAA,MACN,QAAA,EAAU;AAAA;AACZ,GACF;AAAA,EACA,KAAA,CAAM;AAAA,IACJ,QAAA;AAAA,IACA,GAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA;AAAA,IACA,YAAA;AAAA,IACA,aAAA;AAAA,IACA,qBAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACF,EAAG;AAlFL,IAAA,IAAA,EAAA,EAAA,EAAA;AAmFI,IAAA,MAAM,cAAA,GAAiB,IAAI,KAAK,CAAA;AAChC,IAAA,MAAM,eAAe,GAAA,EAAsB;AAC3C,IAAA,MAAM,WAAA,GAAc,GAAA,CAAA,CAAI,EAAA,GAAA,GAAA,CAAI,KAAA,KAAJ,YAAa,EAAE,CAAA;AACvC,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,MAAA,EAAQ,CAAA;AACzB,IAAA,MAAM,kBAAkB,GAAA,CAAA,CAAA,CAAI,EAAA,GAAA,GAAA,CAAI,KAAA,KAAJ,IAAA,GAAA,MAAA,GAAA,EAAA,CAAW,YAAW,CAAC,CAAA;AACnD,IAAA,MAAM,UAAA,GAAa,CAAC,CAAA,KAAa;AAC/B,MAAA,MAAM,SAAS,CAAA,CAAE,MAAA;AACjB,MAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AACrB,MAAA,eAAA,CAAgB,KAAA,GAAQ,MAAM,MAAA,KAAW,CAAA;AACzC,MAAA,WAAA,CAAY,KAAA,GAAQ,KAAA;AAAA,IACtB,CAAA;AAEA,IAAA,MAAM,SAAA,GAAY,CAAC,CAAA,KAAqB;AA/F5C,MAAA,IAAAC,GAAAA,EAAAC,GAAAA;AAgGM,MAAA,IAAI,CAAA,CAAE,QAAQ,OAAA,EAAS;AACrB,QAAA,OAAA,CAAA,CAAQA,GAAAA,GAAAA,CAAAD,MAAA,YAAA,CAAa,KAAA,KAAb,gBAAAA,GAAAA,CAAoB,KAAA,KAApB,IAAA,GAAAC,GAAAA,GAA6B,EAAE,CAAA;AAAA,MACzC;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,qBAAqB,MAAM;AArGrC,MAAA,IAAAD,GAAAA,EAAAC,GAAAA;AAsGM,MAAA,OAAA,CAAA,CAAQA,GAAAA,GAAAA,CAAAD,MAAA,YAAA,CAAa,KAAA,KAAb,gBAAAA,GAAAA,CAAoB,KAAA,KAApB,IAAA,GAAAC,GAAAA,GAA6B,EAAE,CAAA;AAAA,IACzC,CAAA;AAEA,IAAA,MAAM,YAAA,GAAe,CAAC,CAAA,KAAa;AAzGvC,MAAA,IAAAD,GAAAA;AA0GM,MAAA,MAAM,QAAQA,GAAAA,GAAA,CAAA,CAAE,MAAA,CAA4B,KAAA,KAA9B,gBAAAA,GAAAA,CAAsC,CAAA,CAAA;AACpD,MAAA,IAAI,CAAC,IAAA,EAAM;AAEX,MAAA,QAAA,CAAS,IAAI,CAAA,CACV,IAAA,CAAK,CAAC,GAAA,KAAQ;AACb,QAAA,IAAI,CAAC,GAAA,EAAK;AAEV,QAAA,OAAA,CAAQ,GAAG,CAAA;AACX,QAAA,eAAA,CAAgB,KAAA,GAAQ,IAAA;AAAA,MAC1B,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,GAAA,KAAQ;AACd,QAAA,OAAA,CAAQ,MAAM,yCAAyC,CAAA;AACvD,QAAA,OAAA,CAAQ,MAAM,GAAG,CAAA;AAAA,MACnB,CAAC,CAAA;AAAA,IACL,CAAA;AAEA,IAAA,OAAO,MAAM;AACX,MAAA,uBACE,CAAA,CAAC,SAAI,KAAA,EAAO,IAAA,CAAK,cAAc,SAAS,CAAA,EAAA,kBACtC,CAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAM,SAAA,EAAW,OAAM,YAAA,EAAa,CAAA,oBACzC,KAAA,EAAA,EAAI,KAAA,EAAO,KAAK,eAAA,EAAiB,cAAA,CAAe,KAAA,IAAS,OAAO,CAAA,EAAA,kBAC/D,CAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAK,YAAA;AAAA,UACL,SAAA,EAAU,MAAA;AAAA,UACV,WAAA,EAAa,CAAC,CAAA,KAAM;AAClB,YAAA,CAAA,CAAE,cAAA,EAAe;AACjB,YAAA,CAAA,CAAE,eAAA,EAAgB;AAAA,UACpB,CAAA;AAAA,UACA,UAAU,QAAA,CAAS,KAAA;AAAA,UACnB,KAAA,EAAM,iBAAA;AAAA,UACN,OAAO,WAAA,CAAY,KAAA;AAAA,UACnB,OAAA,EAAS,UAAA;AAAA,UACT,SAAA;AAAA,UACA,OAAA,EAAS,MAAO,cAAA,CAAe,KAAA,GAAQ,IAAA;AAAA,UACvC,MAAA,EAAQ,MAAO,cAAA,CAAe,KAAA,GAAQ;AAAA;AAAA,SAEvC,CAAC,eAAA,CAAgB,yBAChB,CAAA,CAAC,KAAA,EAAA,EAAI,OAAM,aAAA,EAAA,kBACT,CAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,UAAU,QAAA,CAAS,KAAA;AAAA,UACnB,KAAA,EAAM,QAAA;AAAA,UACN,IAAI,IAAA,CAAK,KAAA;AAAA,UACT,IAAA,EAAK,MAAA;AAAA,UACL,MAAA,EAAO,SAAA;AAAA,UACP,QAAA,EAAU;AAAA;AAAA,yBAEZ,CAAA,CAAC,OAAA,EAAA,EAAM,OAAM,UAAA,EAAW,GAAA,EAAK,KAAK,KAAA,EAAA,kBAChC,CAAA,CAAC,QAAK,IAAA,EAAM,YAAA,EAAc,CAC5B,CAAA,kBACA,CAAA,CAAC,UAAK,KAAA,EAAM,MAAA,EAAO,SAAS,MAAG;AA3J/C,QAAA,IAAAA,GAAAA;AA2JkD,QAAA,OAAA,CAAAA,GAAAA,GAAA,YAAA,CAAa,KAAA,KAAb,IAAA,GAAA,MAAA,GAAAA,GAAAA,CAAoB,KAAA,EAAA;AAAA,MAAA,CAAA,EAAA,EACnD,qBACH,CACF,CAEJ,CAAA,EACC,WAAA,CAAY,yBACX,CAAA,CAAA,QAAA,EAAA,IAAA,kBACE,CAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,eAAA,EAAA,kBACT,CAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,KAAK,WAAA,CAAY,KAAA;AAAA,UACjB,GAAA,EAAI,EAAA;AAAA,UACJ,OAAA,EAAS,CAAC,CAAA,KACR,OAAA,CAAQ,QAAQ,gBAAA,IAAA,IAAA,GAAA,MAAA,GAAA,gBAAA,CAAmB,CAAA,CAAE,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,UAAC,CAAC;AAAA;AAAA,OAG3D,CAAA,kBACA,CAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,WAAU,OAAA,EAAS,MAAM,kBAAA,EAAmB,EAAA,oBACpD,IAAA,EAAA,EAAK,IAAA,EAAM,aAAA,EAAe,CAC7B,CACF,CAEJ,CAAA;AAAA,IAEJ,CAAA;AAAA,EACF;AACF,CAAC,CAAA;;AC7KD,SAAA,CAAU,GAAGE,UAAQ,CAAA;AAEd,MAAM,cAAc,eAAA,CAAyC;AAAA,EAClE,KAAA,EAAO;AAAA,IACL,GAAA,EAAK;AAAA,MACH,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,OAAA,EAAS;AAAA,MACP,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,KAAA,EAAO;AAAA,MACL,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,QAAA,EAAU;AAAA,MACR,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,QAAA,EAAU;AAAA,MACR,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,OAAA,EAAS;AAAA,MACP,IAAA,EAAM,QAAA;AAAA,MACN,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU;AAAA;AACZ,GACF;AAAA,EACA,KAAA,CAAM,EAAE,GAAA,EAAK,OAAA,EAAS,OAAO,QAAA,EAAU,OAAA,EAAS,QAAO,EAAG;AAzC5D,IAAA,IAAA,EAAA;AA0CI,IAAA,MAAM,WAAW,GAAA,EAAsB;AACvC,IAAA,MAAM,eAAe,GAAA,EAAoB;AACzC,IAAA,MAAM,cAAc,GAAA,CAAI,OAAA,CAAA,CAAQ,aAAQ,KAAA,KAAR,IAAA,GAAA,MAAA,GAAA,EAAA,CAAe,MAAM,CAAC,CAAA;AACtD,IAAA,MAAM,KAAA,GAAQ,IAAI,CAAC,CAAA;AAEnB,IAAA,MAAM,cAAc,MAAM;AA/C9B,MAAA,IAAAF,GAAAA;AAgDM,MAAA,MAAM,QAAQ,QAAA,CAAS,KAAA;AACvB,MAAA,IAAI,CAAC,KAAA,EAAO;AACZ,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,OAAA,CAAQ,uBAAuB,CAAA;AAClD,MAAA,IAAI,CAAC,IAAA,EAAM;AAEX,MAAA,IAAI,QAAA,GAAW,IAAA,CAAK,qBAAA,EAAsB,CAAE,KAAA;AAC5C,MAAA,IAAI,CAAC,QAAA,EAAU;AAEf,MAAA,IAAI,MAAA,CAAO,QAAA,IAAY,MAAA,CAAO,QAAA,GAAW,QAAA;AACvC,QAAA,QAAA,GAAW,MAAA,CAAO,QAAA;AAEpB,MAAA,MAAM,SAAS,KAAA,CAAM,aAAA;AACrB,MAAA,MAAM,QAAQ,KAAA,CAAM,YAAA;AACpB,MAAA,IAAI,iBAAA,GACF,KAAA,GAAQ,QAAA,GAAW,MAAA,GAAS,YAAY,MAAA,GAAS,KAAA,CAAA;AAEnD,MAAA,IAAI,MAAA,CAAO,SAAA,IAAa,iBAAA,GAAoB,MAAA,CAAO,SAAA;AACjD,QAAA,iBAAA,GAAoB,MAAA,CAAO,SAAA;AAE7B,MAAA,MAAMG,EAAAA,GAAAA,CAAK,sBAAqBH,GAAAA,GAAA,KAAA,CAAM,UAAN,IAAA,GAAAA,GAAAA,GAAe,CAAA,CAAA,EAAI,OAAA,CAAQ,CAAC,CAAA;AAC5D,MAAA,KAAA,CAAM,OAAA,CAAQ,MAAA,GAAS,iBAAA,CAAkB,OAAA,CAAQ,CAAC,CAAA;AAClD,MAAA,KAAA,CAAM,QAAQ,MAAA,GAASG,EAAAA;AACvB,MAAA,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAA,EAAGA,EAAC,CAAA,EAAA,CAAA;AAEzB,MAAA,IAAI,OAAO,QAAA,EAAU,KAAA,CAAM,MAAM,QAAA,GAAW,CAAA,EAAG,OAAO,QAAQ,CAAA,EAAA,CAAA;AAAA,IAChE,CAAA;AAEA,IAAA,MAAM,eAAA,GAAkB,CAAC,CAAA,KAAoB;AAC3C,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,MAAA,IAAI,SAAS,KAAA,EAAO;AACpB,MAAA,WAAA,CAAY,KAAA,GAAQ,CAAC,WAAA,CAAY,KAAA;AAAA,IACnC,CAAA;AAEA,IAAA,MAAM,cAAA,GAAiB,CAAC,CAAA,KAAa;AACnC,MAAA,MAAM,SAAS,CAAA,CAAE,MAAA;AACjB,MAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AACrB,MAAA,IAAI,KAAA,CAAM,KAAA,EAAO,MAAA,CAAO,YAAA,CAAa,MAAM,KAAK,CAAA;AAEhD,MAAA,KAAA,CAAM,KAAA,GAAQ,MAAA,CAAO,UAAA,CAAW,MAAM;AACpC,QAAA,OAAA,CAAQ,WAAW,KAAK,CAAA;AAAA,MAC1B,GAAG,GAAI,CAAA;AAAA,IACT,CAAA;AAEA,IAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAAa;AAClC,MAAA,MAAM,SAAS,CAAA,CAAE,MAAA;AACjB,MAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AACrB,MAAA,IAAI,MAAM,KAAA,EAAO;AACf,QAAA,MAAA,CAAO,YAAA,CAAa,MAAM,KAAK,CAAA;AAC/B,QAAA,KAAA,CAAM,KAAA,GAAQ,CAAA;AAAA,MAChB;AAEA,MAAA,OAAA,CAAQ,WAAW,KAAK,CAAA;AAAA,IAC1B,CAAA;AAEA,IAAA,MAAM,yBAAA,GAA4B,CAAC,CAAA,KAAoB;AACrD,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,MAAM,QAAQ,QAAA,CAAS,KAAA;AACvB,MAAA,IAAI,CAAC,KAAA,EAAO;AACZ,MAAA,MAAM,GAAA,GAAM,KAAA,CAAM,qBAAA,EAAsB,CAAE,GAAA;AAC1C,MAAA,IAAI,MAAA,GAAS,EAAE,OAAA,GAAU,GAAA;AACzB,MAAA,IAAI,MAAA,GAAS,KAAK,MAAA,GAAS,GAAA;AAC3B,MAAA,IAAI,MAAA,CAAO,SAAA,IAAa,MAAA,GAAS,MAAA,CAAO,SAAA;AACtC,QAAA,MAAA,GAAS,MAAA,CAAO,SAAA;AAClB,MAAA,MAAMA,EAAAA,GAAI,MAAA,CAAO,MAAM,CAAA,CAAE,QAAQ,CAAC,CAAA;AAClC,MAAA,KAAA,CAAM,QAAQ,MAAA,GAASA,EAAAA;AACvB,MAAA,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAA,EAAGA,EAAC,CAAA,EAAA,CAAA;AAAA,IAC3B,CAAA;AAEA,IAAA,MAAM,0BAA0B,MAAM;AACpC,MAAA,MAAA,CAAO,mBAAA,CAAoB,eAAe,yBAAyB,CAAA;AACnE,MAAA,MAAA,CAAO,mBAAA,CAAoB,aAAa,uBAAuB,CAAA;AAE/D,MAAA,MAAM,QAAQ,QAAA,CAAS,KAAA;AACvB,MAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,MAAA,MAAM,YAAA,GAAe,MAAA,CAAO,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA;AAChD,MAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA;AACjD,MAAA,MAAMC,SAAQ,MAAA,CAAO,UAAA;AAAA,QACnB,MAAA,CAAO,aAAA,GAAgB,YAAY,CAAA,CAAE,QAAQ,CAAC;AAAA,OAChD;AACA,MAAA,IAAI,MAAA,CAAO,KAAA,CAAMA,MAAK,CAAA,EAAG;AAEzB,MAAA,OAAA,CAAQ,SAASA,MAAK,CAAA;AAAA,IACxB,CAAA;AAEA,IAAA,MAAM,yBAAA,GAA4B,CAAC,CAAA,KAAoB;AACrD,MAAA,IAAI,SAAS,KAAA,EAAO;AACpB,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,MAAA,MAAA,CAAO,gBAAA,CAAiB,eAAe,yBAAyB,CAAA;AAChE,MAAA,MAAA,CAAO,gBAAA,CAAiB,aAAa,uBAAuB,CAAA;AAAA,IAC9D,CAAA;AAEA,IAAA,OAAO,MAAM;AACX,MAAA,uBACE,CAAA,CAAAF,UAAA,EAAA,IAAA,oBACG,KAAA,EAAA,EAAI,KAAA,EAAM,mCACT,CAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,WAAA,EAAA,kBACT,CAAA,CAAC,KAAA,EAAA,EAAI,OAAM,gBAAA,EAAiB,aAAA,EAAe,mCACzC,CAAA,CAAC,IAAA,EAAA,EAAK,MAAM,MAAA,CAAO,WAAA,EAAa,CAClC,CACF,CAAA,kBACA,CAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAK,QAAA;AAAA,UACL,WAAA,EAAW,eAAA;AAAA,UACX,MAAA,EAAQ,WAAA;AAAA,UACR,KAAK,GAAA,CAAI,KAAA;AAAA,UACT,KAAK,OAAA,CAAQ,KAAA;AAAA,UACb,OAAA,EAAS,CAAC,CAAA,KAAG;AA7J3B,YAAA,IAAAF,GAAAA;AA8JgB,YAAA,OAAA,OAAA,CAAQ,OAAA,CAAA,CAAQA,GAAAA,GAAA,MAAA,CAAO,gBAAA,KAAP,IAAA,GAAA,MAAA,GAAAA,IAAA,IAAA,CAAA,MAAA,EAA0B,CAAA,CAAE,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,YAAC,CAAC,CAAA;AAAA,UAAA;AAAA;AAAA,OAEhE,kBACA,CAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAK,YAAA;AAAA,UACL,KAAA,EAAM,qBAAA;AAAA,UACN,aAAA,EAAe;AAAA;AAAA,OAEnB,CAAA,EACC,WAAA,CAAY,KAAA,oBACX,CAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,MAAA;AAAA,UACV,WAAA,EAAa,CAAC,CAAA,KAAM;AAClB,YAAA,CAAA,CAAE,cAAA,EAAe;AACjB,YAAA,CAAA,CAAE,eAAA,EAAgB;AAAA,UACpB,CAAA;AAAA,UACA,KAAA,EAAM,eAAA;AAAA,UACN,aAAa,MAAA,IAAA,IAAA,GAAA,MAAA,GAAA,MAAA,CAAQ,sBAAA;AAAA,UACrB,OAAA,EAAS,cAAA;AAAA,UACT,MAAA,EAAQ,aAAA;AAAA,UACR,OAAO,OAAA,CAAQ;AAAA;AAAA,OAGrB,CAAA;AAAA,IAEJ,CAAA;AAAA,EACF;AACF,CAAC,CAAA;;;;;;;;;;;;;;;;;;ACjLD,SAAA,CAAU,GAAGE,UAAQ,CAAA;AAiBd,MAAM,qBAAqB,eAAA,CAAyC;AAAA,EACzE,KAAA,EAAO;AAAA,IACL,GAAA,EAAK;AAAA,MACH,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,OAAA,EAAS;AAAA,MACP,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,KAAA,EAAO;AAAA,MACL,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,QAAA,EAAU;AAAA,MACR,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,QAAA,EAAU;AAAA,MACR,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,OAAA,EAAS;AAAA,MACP,IAAA,EAAM,QAAA;AAAA,MACN,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU;AAAA;AACZ,GACF;AAAA,EACA,MAAM,KAAA,EAAO;AACX,IAAA,MAAM,EAAE,KAAI,GAAI,KAAA;AAEhB,IAAA,OAAO,MAAM;AA3DjB,MAAA,IAAA,EAAA;AA4DM,MAAA,IAAI,EAAA,CAAC,EAAA,GAAA,GAAA,CAAI,KAAA,KAAJ,IAAA,GAAA,MAAA,GAAA,EAAA,CAAW,MAAA,CAAA,EAAQ;AACtB,QAAA,uBACE,CAAA;AAAA,UAAC,UAAA;AAAA,UAAA;AAAA,YACC,KAAK,KAAA,CAAM,GAAA;AAAA,YACX,UAAU,KAAA,CAAM,QAAA;AAAA,YAChB,UAAU,KAAA,CAAM,QAAA;AAAA,YAChB,SAAS,CAAC,IAAA,KAAS,KAAA,CAAM,OAAA,CAAQ,OAAO,IAAI,CAAA;AAAA,YAC5C,SAAA,EAAW,MAAM,MAAA,CAAO,SAAA;AAAA,YACxB,YAAA,EAAc,MAAM,MAAA,CAAO,YAAA;AAAA,YAC3B,aAAA,EAAe,MAAM,MAAA,CAAO,aAAA;AAAA,YAC5B,qBAAA,EAAuB,MAAM,MAAA,CAAO,qBAAA;AAAA,YACpC,QAAA,EAAU,MAAM,MAAA,CAAO,QAAA;AAAA,YACvB,gBAAA,EAAkB,MAAM,MAAA,CAAO;AAAA;AAAA,SACjC;AAAA,MAEJ;AACA,MAAA,uBAAO,CAAA,CAAC,gCAAgB,KAAA,CAAO,CAAA;AAAA,IACjC,CAAA;AAAA,EACF;AACF,CAAC,CAAA;;ACnEM,MAAM,cAAA,GAAiB,KAAA;AAAA,EAC5B,gBAAA,CAAiB,IAAA;AAAA,EACjB,CAAC,GAAA,KAA6B;AAC5B,IAAA,OAAO,CAAC,WAAA,EAAa,IAAA,EAAM,MAAA,KAAW;AACpC,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,WAAA,CAAY,KAAA,CAAM,GAAG,CAAA;AACrC,MAAA,MAAM,OAAA,GAAU,GAAA,CAAI,WAAA,CAAY,KAAA,CAAM,OAAO,CAAA;AAC7C,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,WAAA,CAAY,KAAA,CAAM,KAAK,CAAA;AACzC,MAAA,MAAM,QAAA,GAAW,IAAI,KAAK,CAAA;AAC1B,MAAA,MAAM,QAAA,GAAW,GAAA,CAAI,CAAC,IAAA,CAAK,QAAQ,CAAA;AACnC,MAAA,MAAM,OAAA,GAAU,CAAC,IAAA,EAAc,KAAA,KAAmB;AAChD,QAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AACpB,QAAA,MAAM,MAAM,MAAA,EAAO;AACnB,QAAA,IAAI,OAAO,IAAA,EAAM;AACjB,QAAA,IAAA,CAAK,QAAA;AAAA,UACH,IAAA,CAAK,MAAM,EAAA,CAAG,gBAAA;AAAA,YACZ,GAAA;AAAA,YACA,IAAA;AAAA,YACA,IAAA,KAAS,KAAA,GAAQ,SAAA,CAAU,QAAA,CAAS,KAAe,CAAA,GAAI;AAAA;AACzD,SACF;AAAA,MACF,CAAA;AACA,MAAA,MAAM,MAAA,GAAS,GAAA,CAAI,GAAA,CAAI,gBAAA,CAAiB,GAAG,CAAA;AAC3C,MAAA,MAAM,GAAA,GAAM,UAAU,kBAAA,EAAoB;AAAA,QACxC,GAAA;AAAA,QACA,OAAA;AAAA,QACA,KAAA;AAAA,QACA,QAAA;AAAA,QACA,QAAA;AAAA,QACA,OAAA;AAAA,QACA;AAAA,OACD,CAAA;AACD,MAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACxC,MAAA,GAAA,CAAI,SAAA,GAAY,sBAAA;AAChB,MAAA,MAAM,sBAAA,GAAyB,YAAY,MAAM;AAC/C,QAAA,MAAM,aAAa,QAAA,CAAS,KAAA;AAC5B,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,GAAA,CAAI,SAAA,CAAU,IAAI,UAAU,CAAA;AAAA,QAC9B,CAAA,MAAO;AACL,UAAA,GAAA,CAAI,SAAA,CAAU,OAAO,UAAU,CAAA;AAAA,QACjC;AAAA,MACF,CAAC,CAAA;AACD,MAAA,MAAM,cAAc,MAAA,CAAO,WAAA;AAC3B,MAAA,MAAM,SAAA,GAAY,CAAC,IAAA,KAAe;AAChC,QAAA,IAAI,CAAC,WAAA,EAAa;AAChB,UAAA,GAAA,CAAI,KAAA,GAAQ,KAAK,KAAA,CAAM,GAAA;AAAA,QACzB,CAAA,MAAO;AACL,UAAA,MAAM,UAAA,GAAa,WAAA,CAAY,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC7C,UAAA,IAAI,OAAO,eAAe,QAAA,EAAU;AAClC,YAAA,GAAA,CAAI,KAAA,GAAQ,UAAA;AAAA,UACd,CAAA,MAAO;AACL,YAAA,UAAA,CACG,IAAA,CAAK,CAAC,GAAA,KAAQ;AACb,cAAA,GAAA,CAAI,KAAA,GAAQ,GAAA;AAAA,YACd,CAAC,CAAA,CACA,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA;AAAA,UACxB;AAAA,QACF;AACA,QAAA,KAAA,CAAM,KAAA,GAAQ,KAAK,KAAA,CAAM,KAAA;AACzB,QAAA,OAAA,CAAQ,KAAA,GAAQ,KAAK,KAAA,CAAM,OAAA;AAE3B,QAAA,QAAA,CAAS,KAAA,GAAQ,CAAC,IAAA,CAAK,QAAA;AAAA,MACzB,CAAA;AAEA,MAAA,SAAA,CAAU,WAAW,CAAA;AACrB,MAAA,GAAA,CAAI,MAAM,GAAG,CAAA;AAEb,MAAA,OAAO;AAAA,QACL,GAAA;AAAA,QACA,MAAA,EAAQ,CAAC,WAAA,KAAgB;AACvB,UAAA,IAAI,WAAA,CAAY,IAAA,KAAS,WAAA,CAAY,IAAA,EAAM,OAAO,KAAA;AAElD,UAAA,SAAA,CAAU,WAAW,CAAA;AACrB,UAAA,OAAO,IAAA;AAAA,QACT,CAAA;AAAA,QACA,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,UAAA,IAAI,CAAA,CAAE,MAAA,YAAkB,gBAAA,EAAkB,OAAO,IAAA;AAEjD,UAAA,OAAO,KAAA;AAAA,QACT,CAAA;AAAA,QACA,YAAY,MAAM;AAChB,UAAA,QAAA,CAAS,KAAA,GAAQ,IAAA;AAAA,QACnB,CAAA;AAAA,QACA,cAAc,MAAM;AAClB,UAAA,QAAA,CAAS,KAAA,GAAQ,KAAA;AAAA,QACnB,CAAA;AAAA,QACA,SAAS,MAAM;AACb,UAAA,sBAAA,EAAuB;AACvB,UAAA,GAAA,CAAI,OAAA,EAAQ;AACZ,UAAA,GAAA,CAAI,MAAA,EAAO;AAAA,QACb;AAAA,OACF;AAAA,IACF,CAAA;AAAA,EACF;AACF;AAEA,QAAA,CAAS,cAAA,EAAgB;AAAA,EACvB,WAAA,EAAa,uBAAA;AAAA,EACb,KAAA,EAAO;AACT,CAAC,CAAA;;AClGM,MAAM,mBAAA,GAAwC;AAAA,EACnD,sBAAA;AAAA,EACA,gBAAA;AAAA,EACA,cAAA;AAAA,EACA;AACF,CAAA,CAAE,IAAA;;;;"}
|
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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":";;;;;;;;;;;;;;;;;;;;;;;AAEO,SAAS,QAAA,CACd,QACA,IAAA,EACG;AACH,EAAA,MAAA,CAAO,OAAO,MAAA,EAAQ;AAAA,IACpB,IAAA,EAAM,cAAA,CAAA;AAAA,MACJ,OAAA,EAAS;AAAA,KAAA,EACN,IAAA;AAAA,GAEN,CAAA;AAED,EAAA,OAAO,MAAA;AACT;;ACDO,MAAM,wBAAA,GAA8C;AAAA,EACzD,SAAA,EAAW,WAAA;AAAA,EACX,YAAA,EAAc,QAAA;AAAA,EACd,aAAA,EAAe,QAAA;AAAA,EACf,qBAAA,EAAuB,QAAA;AAAA,EACvB,QAAA,EAAU,CAAC,IAAA,KAAS,OAAA,CAAQ,QAAQ,GAAA,CAAI,eAAA,CAAgB,IAAI,CAAC;AAC/D;AAEO,MAAM,iBAAA,GAAoB,IAAA;AAAA,EAC/B,wBAAA;AAAA,EACA;AACF;AAEA,QAAA,CAAS,iBAAA,EAAmB;AAAA,EAC1B,WAAA,EAAa,sBAAA;AAAA,EACb,KAAA,EAAO;AACT,CAAC,CAAA;;AC3BM,SAAS,aAAa,KAAA,EAAkB;AAAC;;ACIhD,SAAA,CAAU,CAAC,CAAA;AAQJ,SAAS,KAAK,EAAE,IAAA,EAAM,KAAA,EAAO,SAAA,EAAW,SAAQ,EAAc;AACnE,EAAA,uBACE,CAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,IAAA,CAAK,eAAA,EAAiB,SAAS,CAAA;AAAA,MACtC,aAAA,EAAe,OAAA;AAAA,MACf,WAAW,IAAA,GAAO,SAAA,CAAU,SAAS,IAAA,CAAK,IAAA,EAAM,CAAA,GAAI;AAAA;AAAA,GACtD;AAEJ;AAEA,IAAA,CAAK,KAAA,GAAQ;AAAA,EACX,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,MAAA;AAAA,IACN,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,MAAA;AAAA,IACN,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,OAAA,EAAS;AAAA,IACP,IAAA,EAAM,QAAA;AAAA,IACN,QAAA,EAAU;AAAA;AAEd,CAAA;;AC9BA,SAAA,CAAU,CAAC,CAAA;AAEX,MAAM,MAAA,GAAS,cAAA,CAAe,SAAA,EAAW,CAAC,CAAA;AAmBnC,MAAM,aAAa,eAAA,CAAiC;AAAA,EACzD,KAAA,EAAO;AAAA,IACL,GAAA,EAAK;AAAA,MACH,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,QAAA,EAAU;AAAA,MACR,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,QAAA,EAAU;AAAA,MACR,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,OAAA,EAAS;AAAA,MACP,IAAA,EAAM,QAAA;AAAA,MACN,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,SAAA,EAAW;AAAA,MACT,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,aAAA,EAAe;AAAA,MACb,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,qBAAA,EAAuB;AAAA,MACrB,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,QAAA,EAAU;AAAA,MACR,IAAA,EAAM,QAAA;AAAA,MACN,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,gBAAA,EAAkB;AAAA,MAChB,IAAA,EAAM,QAAA;AAAA,MACN,QAAA,EAAU;AAAA;AACZ,GACF;AAAA,EACA,KAAA,CAAM;AAAA,IACJ,QAAA;AAAA,IACA,GAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA;AAAA,IACA,YAAA;AAAA,IACA,aAAA;AAAA,IACA,qBAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACF,EAAG;AAlFL,IAAA,IAAA,EAAA,EAAA,EAAA;AAmFI,IAAA,MAAM,cAAA,GAAiB,IAAI,KAAK,CAAA;AAChC,IAAA,MAAM,eAAe,GAAA,EAAsB;AAC3C,IAAA,MAAM,WAAA,GAAc,GAAA,CAAA,CAAI,EAAA,GAAA,GAAA,CAAI,KAAA,KAAJ,YAAa,EAAE,CAAA;AACvC,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,MAAA,EAAQ,CAAA;AACzB,IAAA,MAAM,kBAAkB,GAAA,CAAA,CAAA,CAAI,EAAA,GAAA,GAAA,CAAI,KAAA,KAAJ,IAAA,GAAA,MAAA,GAAA,EAAA,CAAW,YAAW,CAAC,CAAA;AACnD,IAAA,MAAM,UAAA,GAAa,CAAC,CAAA,KAAa;AAC/B,MAAA,MAAM,SAAS,CAAA,CAAE,MAAA;AACjB,MAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AACrB,MAAA,eAAA,CAAgB,KAAA,GAAQ,MAAM,MAAA,KAAW,CAAA;AACzC,MAAA,WAAA,CAAY,KAAA,GAAQ,KAAA;AAAA,IACtB,CAAA;AAEA,IAAA,MAAM,SAAA,GAAY,CAAC,CAAA,KAAqB;AA/F5C,MAAA,IAAAA,GAAAA,EAAAC,GAAAA;AAgGM,MAAA,IAAI,CAAA,CAAE,QAAQ,OAAA,EAAS;AACrB,QAAA,OAAA,CAAA,CAAQA,GAAAA,GAAAA,CAAAD,MAAA,YAAA,CAAa,KAAA,KAAb,gBAAAA,GAAAA,CAAoB,KAAA,KAApB,IAAA,GAAAC,GAAAA,GAA6B,EAAE,CAAA;AAAA,MACzC;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,qBAAqB,MAAM;AArGrC,MAAA,IAAAD,GAAAA,EAAAC,GAAAA;AAsGM,MAAA,OAAA,CAAA,CAAQA,GAAAA,GAAAA,CAAAD,MAAA,YAAA,CAAa,KAAA,KAAb,gBAAAA,GAAAA,CAAoB,KAAA,KAApB,IAAA,GAAAC,GAAAA,GAA6B,EAAE,CAAA;AAAA,IACzC,CAAA;AAEA,IAAA,MAAM,YAAA,GAAe,CAAC,CAAA,KAAa;AAzGvC,MAAA,IAAAD,GAAAA;AA0GM,MAAA,MAAM,QAAQA,GAAAA,GAAA,CAAA,CAAE,MAAA,CAA4B,KAAA,KAA9B,gBAAAA,GAAAA,CAAsC,CAAA,CAAA;AACpD,MAAA,IAAI,CAAC,IAAA,EAAM;AAEX,MAAA,QAAA,CAAS,IAAI,CAAA,CACV,IAAA,CAAK,CAAC,GAAA,KAAQ;AACb,QAAA,IAAI,CAAC,GAAA,EAAK;AAEV,QAAA,OAAA,CAAQ,GAAG,CAAA;AACX,QAAA,eAAA,CAAgB,KAAA,GAAQ,IAAA;AAAA,MAC1B,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,GAAA,KAAQ;AACd,QAAA,OAAA,CAAQ,MAAM,yCAAyC,CAAA;AACvD,QAAA,OAAA,CAAQ,MAAM,GAAG,CAAA;AAAA,MACnB,CAAC,CAAA;AAAA,IACL,CAAA;AAEA,IAAA,OAAO,MAAM;AACX,MAAA,uBACE,CAAA,CAAC,SAAI,KAAA,EAAO,IAAA,CAAK,cAAc,SAAS,CAAA,EAAA,kBACtC,CAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAM,SAAA,EAAW,OAAM,YAAA,EAAa,CAAA,oBACzC,KAAA,EAAA,EAAI,KAAA,EAAO,KAAK,eAAA,EAAiB,cAAA,CAAe,KAAA,IAAS,OAAO,CAAA,EAAA,kBAC/D,CAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAK,YAAA;AAAA,UACL,SAAA,EAAU,MAAA;AAAA,UACV,WAAA,EAAa,CAAC,CAAA,KAAM;AAClB,YAAA,CAAA,CAAE,cAAA,EAAe;AACjB,YAAA,CAAA,CAAE,eAAA,EAAgB;AAAA,UACpB,CAAA;AAAA,UACA,UAAU,QAAA,CAAS,KAAA;AAAA,UACnB,KAAA,EAAM,iBAAA;AAAA,UACN,OAAO,WAAA,CAAY,KAAA;AAAA,UACnB,OAAA,EAAS,UAAA;AAAA,UACT,SAAA;AAAA,UACA,OAAA,EAAS,MAAO,cAAA,CAAe,KAAA,GAAQ,IAAA;AAAA,UACvC,MAAA,EAAQ,MAAO,cAAA,CAAe,KAAA,GAAQ;AAAA;AAAA,SAEvC,CAAC,eAAA,CAAgB,yBAChB,CAAA,CAAC,KAAA,EAAA,EAAI,OAAM,aAAA,EAAA,kBACT,CAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,UAAU,QAAA,CAAS,KAAA;AAAA,UACnB,KAAA,EAAM,QAAA;AAAA,UACN,IAAI,IAAA,CAAK,KAAA;AAAA,UACT,IAAA,EAAK,MAAA;AAAA,UACL,MAAA,EAAO,SAAA;AAAA,UACP,QAAA,EAAU;AAAA;AAAA,yBAEZ,CAAA,CAAC,OAAA,EAAA,EAAM,OAAM,UAAA,EAAW,GAAA,EAAK,KAAK,KAAA,EAAA,kBAChC,CAAA,CAAC,QAAK,IAAA,EAAM,YAAA,EAAc,CAC5B,CAAA,kBACA,CAAA,CAAC,UAAK,KAAA,EAAM,MAAA,EAAO,SAAS,MAAG;AA3J/C,QAAA,IAAAA,GAAAA;AA2JkD,QAAA,OAAA,CAAAA,GAAAA,GAAA,YAAA,CAAa,KAAA,KAAb,IAAA,GAAA,MAAA,GAAAA,GAAAA,CAAoB,KAAA,EAAA;AAAA,MAAA,CAAA,EAAA,EACnD,qBACH,CACF,CAEJ,CAAA,EACC,WAAA,CAAY,yBACX,CAAA,CAAA,QAAA,EAAA,IAAA,kBACE,CAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,eAAA,EAAA,kBACT,CAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,KAAK,WAAA,CAAY,KAAA;AAAA,UACjB,GAAA,EAAI,EAAA;AAAA,UACJ,OAAA,EAAS,CAAC,CAAA,KACR,OAAA,CAAQ,QAAQ,gBAAA,IAAA,IAAA,GAAA,MAAA,GAAA,gBAAA,CAAmB,CAAA,CAAE,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,UAAC,CAAC;AAAA;AAAA,OAG3D,CAAA,kBACA,CAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,WAAU,OAAA,EAAS,MAAM,kBAAA,EAAmB,EAAA,oBACpD,IAAA,EAAA,EAAK,IAAA,EAAM,aAAA,EAAe,CAC7B,CACF,CAEJ,CAAA;AAAA,IAEJ,CAAA;AAAA,EACF;AACF,CAAC,CAAA;;AC9KD,SAAA,CAAU,GAAGE,UAAQ,CAAA;AAiBd,MAAM,sBAAsB,eAAA,CAA0C;AAAA,EAC3E,KAAA,EAAO;AAAA,IACL,GAAA,EAAK;AAAA,MACH,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,GAAA,EAAK;AAAA,MACH,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,KAAA,EAAO;AAAA,MACL,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,QAAA,EAAU;AAAA,MACR,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,QAAA,EAAU;AAAA,MACR,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,OAAA,EAAS;AAAA,MACP,IAAA,EAAM,QAAA;AAAA,MACN,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU;AAAA;AACZ,GACF;AAAA,EACA,MAAM,KAAA,EAAO;AACX,IAAA,MAAM,EAAE,GAAA,EAAK,GAAA,EAAK,KAAA,EAAM,GAAI,KAAA;AAC5B,IAAA,OAAO,MAAM;AAzDjB,MAAA,IAAA,EAAA;AA0DM,MAAA,IAAI,EAAA,CAAC,EAAA,GAAA,GAAA,CAAI,KAAA,KAAJ,IAAA,GAAA,MAAA,GAAA,EAAA,CAAW,MAAA,CAAA,EAAQ;AACtB,QAAA,uBACE,CAAA;AAAA,UAAC,UAAA;AAAA,UAAA;AAAA,YACC,KAAK,KAAA,CAAM,GAAA;AAAA,YACX,UAAU,KAAA,CAAM,QAAA;AAAA,YAChB,UAAU,KAAA,CAAM,QAAA;AAAA,YAChB,SAAS,CAAC,IAAA,KAAS,KAAA,CAAM,OAAA,CAAQ,OAAO,IAAI,CAAA;AAAA,YAC5C,SAAA,EAAW,MAAM,MAAA,CAAO,SAAA;AAAA,YACxB,YAAA,EAAc,MAAM,MAAA,CAAO,YAAA;AAAA,YAC3B,aAAA,EAAe,MAAM,MAAA,CAAO,aAAA;AAAA,YAC5B,qBAAA,EAAuB,MAAM,MAAA,CAAO,qBAAA;AAAA,YACpC,QAAA,EAAU,MAAM,MAAA,CAAO,QAAA;AAAA,YACvB,SAAA,EAAU;AAAA;AAAA,SACZ;AAAA,MAEJ;AACA,MAAA,uBACE,CAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,cAAA;AAAA,UACN,KAAK,GAAA,CAAI,KAAA;AAAA,UACT,KAAK,GAAA,CAAI,KAAA;AAAA,UACT,OAAO,KAAA,CAAM;AAAA;AAAA,OACf;AAAA,IAEJ,CAAA;AAAA,EACF;AACF,CAAC,CAAA;;ACxEM,MAAM,eAAA,GAAkB,KAAA;AAAA,EAC7B,WAAA,CAAY,IAAA;AAAA,EACZ,CAAC,GAAA,KAA6B;AAC5B,IAAA,OAAO,CAAC,WAAA,EAAa,IAAA,EAAM,MAAA,KAAW;AACpC,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,WAAA,CAAY,KAAA,CAAM,GAAG,CAAA;AACrC,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,WAAA,CAAY,KAAA,CAAM,GAAG,CAAA;AACrC,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,WAAA,CAAY,KAAA,CAAM,KAAK,CAAA;AACzC,MAAA,MAAM,QAAA,GAAW,IAAI,KAAK,CAAA;AAC1B,MAAA,MAAM,QAAA,GAAW,GAAA,CAAI,CAAC,IAAA,CAAK,QAAQ,CAAA;AACnC,MAAA,MAAM,OAAA,GAAU,CAAC,IAAA,EAAc,KAAA,KAAmB;AAChD,QAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AACpB,QAAA,MAAM,MAAM,MAAA,EAAO;AACnB,QAAA,IAAI,OAAO,IAAA,EAAM;AACjB,QAAA,IAAA,CAAK,QAAA;AAAA,UACH,IAAA,CAAK,MAAM,EAAA,CAAG,gBAAA;AAAA,YACZ,GAAA;AAAA,YACA,IAAA;AAAA,YACA,IAAA,KAAS,KAAA,GAAQ,SAAA,CAAU,QAAA,CAAS,KAAe,CAAA,GAAI;AAAA;AACzD,SACF;AAAA,MACF,CAAA;AAEA,MAAA,MAAM,MAAA,GAAS,GAAA,CAAI,GAAA,CAAI,iBAAA,CAAkB,GAAG,CAAA;AAC5C,MAAA,MAAM,GAAA,GAAM,UAAU,mBAAA,EAAqB;AAAA,QACzC,GAAA;AAAA,QACA,GAAA;AAAA,QACA,KAAA;AAAA,QACA,QAAA;AAAA,QACA,QAAA;AAAA,QACA,OAAA;AAAA,QACA;AAAA,OACD,CAAA;AACD,MAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AACzC,MAAA,GAAA,CAAI,SAAA,GAAY,uBAAA;AAChB,MAAA,MAAM,sBAAA,GAAyB,YAAY,MAAM;AAC/C,QAAA,MAAM,aAAa,QAAA,CAAS,KAAA;AAC5B,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,GAAA,CAAI,SAAA,CAAU,IAAI,UAAU,CAAA;AAAA,QAC9B,CAAA,MAAO;AACL,UAAA,GAAA,CAAI,SAAA,CAAU,OAAO,UAAU,CAAA;AAAA,QACjC;AAAA,MACF,CAAC,CAAA;AACD,MAAA,MAAM,cAAc,MAAA,CAAO,WAAA;AAC3B,MAAA,MAAM,SAAA,GAAY,CAAC,IAAA,KAAe;AAChC,QAAA,IAAI,CAAC,WAAA,EAAa;AAChB,UAAA,GAAA,CAAI,KAAA,GAAQ,KAAK,KAAA,CAAM,GAAA;AAAA,QACzB,CAAA,MAAO;AACL,UAAA,MAAM,UAAA,GAAa,WAAA,CAAY,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC7C,UAAA,IAAI,OAAO,eAAe,QAAA,EAAU;AAClC,YAAA,GAAA,CAAI,KAAA,GAAQ,UAAA;AAAA,UACd,CAAA,MAAO;AACL,YAAA,UAAA,CACG,IAAA,CAAK,CAAC,GAAA,KAAQ;AACb,cAAA,GAAA,CAAI,KAAA,GAAQ,GAAA;AAAA,YACd,CAAC,CAAA,CACA,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA;AAAA,UACxB;AAAA,QACF;AACA,QAAA,GAAA,CAAI,KAAA,GAAQ,KAAK,KAAA,CAAM,GAAA;AACvB,QAAA,KAAA,CAAM,KAAA,GAAQ,KAAK,KAAA,CAAM,KAAA;AAAA,MAC3B,CAAA;AACA,MAAA,SAAA,CAAU,WAAW,CAAA;AACrB,MAAA,GAAA,CAAI,MAAM,GAAG,CAAA;AAEb,MAAA,OAAO;AAAA,QACL,GAAA;AAAA,QACA,MAAA,EAAQ,CAAC,WAAA,KAAgB;AACvB,UAAA,IAAI,WAAA,CAAY,IAAA,KAAS,WAAA,CAAY,IAAA,EAAM,OAAO,KAAA;AAElD,UAAA,SAAA,CAAU,WAAW,CAAA;AACrB,UAAA,OAAO,IAAA;AAAA,QACT,CAAA;AAAA,QACA,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,UAAA,IAAI,CAAA,CAAE,MAAA,YAAkB,gBAAA,EAAkB,OAAO,IAAA;AAEjD,UAAA,OAAO,KAAA;AAAA,QACT,CAAA;AAAA,QACA,YAAY,MAAM;AAChB,UAAA,QAAA,CAAS,KAAA,GAAQ,IAAA;AAAA,QACnB,CAAA;AAAA,QACA,cAAc,MAAM;AAClB,UAAA,QAAA,CAAS,KAAA,GAAQ,KAAA;AAAA,QACnB,CAAA;AAAA,QACA,SAAS,MAAM;AACb,UAAA,sBAAA,EAAuB;AACvB,UAAA,GAAA,CAAI,OAAA,EAAQ;AACZ,UAAA,GAAA,CAAI,MAAA,EAAO;AAAA,QACb;AAAA,OACF;AAAA,IACF,CAAA;AAAA,EACF;AACF;AAEA,QAAA,CAAS,eAAA,EAAiB;AAAA,EACxB,WAAA,EAAa,wBAAA;AAAA,EACb,KAAA,EAAO;AACT,CAAC,CAAA;;ACpGM,MAAM,oBAAA,GAAyC;AAAA,EACpD,iBAAA;AAAA,EACA;AACF;;;;"}
|