notra-editor 0.8.0 → 0.8.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/blockquote-button/blockquote-button.cjs +5 -3
- package/dist/components/blockquote-button/blockquote-button.cjs.map +1 -1
- package/dist/components/blockquote-button/blockquote-button.mjs +5 -3
- package/dist/components/blockquote-button/blockquote-button.mjs.map +1 -1
- package/dist/components/code-block-button/code-block-button.cjs +5 -3
- package/dist/components/code-block-button/code-block-button.cjs.map +1 -1
- package/dist/components/code-block-button/code-block-button.mjs +5 -3
- package/dist/components/code-block-button/code-block-button.mjs.map +1 -1
- package/dist/components/code-block-view/code-block-shell.cjs +4 -2
- package/dist/components/code-block-view/code-block-shell.cjs.map +1 -1
- package/dist/components/code-block-view/code-block-shell.mjs +3 -2
- package/dist/components/code-block-view/code-block-shell.mjs.map +1 -1
- package/dist/components/code-block-view/code-block-view.cjs +6 -4
- package/dist/components/code-block-view/code-block-view.cjs.map +1 -1
- package/dist/components/code-block-view/code-block-view.mjs +6 -4
- package/dist/components/code-block-view/code-block-view.mjs.map +1 -1
- package/dist/components/code-block-view/language-select.cjs +9 -7
- package/dist/components/code-block-view/language-select.cjs.map +1 -1
- package/dist/components/code-block-view/language-select.mjs +9 -7
- package/dist/components/code-block-view/language-select.mjs.map +1 -1
- package/dist/components/copy-button.cjs +6 -4
- package/dist/components/copy-button.cjs.map +1 -1
- package/dist/components/copy-button.mjs +6 -4
- package/dist/components/copy-button.mjs.map +1 -1
- package/dist/components/heading-dropdown-menu/heading-dropdown-menu.cjs +8 -6
- package/dist/components/heading-dropdown-menu/heading-dropdown-menu.cjs.map +1 -1
- package/dist/components/heading-dropdown-menu/heading-dropdown-menu.mjs +8 -6
- package/dist/components/heading-dropdown-menu/heading-dropdown-menu.mjs.map +1 -1
- package/dist/components/heading-dropdown-menu/heading-menu-item.cjs +6 -4
- package/dist/components/heading-dropdown-menu/heading-menu-item.cjs.map +1 -1
- package/dist/components/heading-dropdown-menu/heading-menu-item.mjs +5 -4
- package/dist/components/heading-dropdown-menu/heading-menu-item.mjs.map +1 -1
- package/dist/components/heading-dropdown-menu/use-heading.cjs +4 -2
- package/dist/components/heading-dropdown-menu/use-heading.cjs.map +1 -1
- package/dist/components/heading-dropdown-menu/use-heading.mjs +3 -2
- package/dist/components/heading-dropdown-menu/use-heading.mjs.map +1 -1
- package/dist/components/image-popover/image-input-form.cjs +127 -0
- package/dist/components/image-popover/image-input-form.cjs.map +1 -0
- package/dist/components/image-popover/image-input-form.d.cts +16 -0
- package/dist/components/image-popover/image-input-form.d.ts +16 -0
- package/dist/components/image-popover/image-input-form.mjs +103 -0
- package/dist/components/image-popover/image-input-form.mjs.map +1 -0
- package/dist/components/image-popover/image-popover.cjs +35 -92
- package/dist/components/image-popover/image-popover.cjs.map +1 -1
- package/dist/components/image-popover/image-popover.mjs +36 -93
- package/dist/components/image-popover/image-popover.mjs.map +1 -1
- package/dist/components/image-popover/use-image-popover.cjs +2 -0
- package/dist/components/image-popover/use-image-popover.cjs.map +1 -1
- package/dist/components/image-popover/use-image-popover.mjs +1 -0
- package/dist/components/image-popover/use-image-popover.mjs.map +1 -1
- package/dist/components/link-popover/link-popover.cjs +10 -8
- package/dist/components/link-popover/link-popover.cjs.map +1 -1
- package/dist/components/link-popover/link-popover.mjs +10 -8
- package/dist/components/link-popover/link-popover.mjs.map +1 -1
- package/dist/components/link-popover/use-link-popover.cjs +2 -0
- package/dist/components/link-popover/use-link-popover.cjs.map +1 -1
- package/dist/components/link-popover/use-link-popover.mjs +1 -0
- package/dist/components/link-popover/use-link-popover.mjs.map +1 -1
- package/dist/components/list-dropdown-menu/list-dropdown-menu.cjs +8 -6
- package/dist/components/list-dropdown-menu/list-dropdown-menu.cjs.map +1 -1
- package/dist/components/list-dropdown-menu/list-dropdown-menu.mjs +8 -6
- package/dist/components/list-dropdown-menu/list-dropdown-menu.mjs.map +1 -1
- package/dist/components/list-dropdown-menu/list-menu-item.cjs +6 -4
- package/dist/components/list-dropdown-menu/list-menu-item.cjs.map +1 -1
- package/dist/components/list-dropdown-menu/list-menu-item.mjs +5 -4
- package/dist/components/list-dropdown-menu/list-menu-item.mjs.map +1 -1
- package/dist/components/list-dropdown-menu/use-list.cjs +5 -3
- package/dist/components/list-dropdown-menu/use-list.cjs.map +1 -1
- package/dist/components/list-dropdown-menu/use-list.mjs +4 -3
- package/dist/components/list-dropdown-menu/use-list.mjs.map +1 -1
- package/dist/components/mark-button/mark-button.cjs +6 -4
- package/dist/components/mark-button/mark-button.cjs.map +1 -1
- package/dist/components/mark-button/mark-button.mjs +6 -4
- package/dist/components/mark-button/mark-button.mjs.map +1 -1
- package/dist/components/mark-button/use-mark.cjs +4 -2
- package/dist/components/mark-button/use-mark.cjs.map +1 -1
- package/dist/components/mark-button/use-mark.mjs +3 -2
- package/dist/components/mark-button/use-mark.mjs.map +1 -1
- package/dist/components/slash-dropdown-menu/slash-dropdown-menu.cjs +151 -0
- package/dist/components/slash-dropdown-menu/slash-dropdown-menu.cjs.map +1 -0
- package/dist/components/slash-dropdown-menu/slash-dropdown-menu.d.cts +9 -0
- package/dist/components/slash-dropdown-menu/slash-dropdown-menu.d.ts +9 -0
- package/dist/components/slash-dropdown-menu/slash-dropdown-menu.mjs +127 -0
- package/dist/components/slash-dropdown-menu/slash-dropdown-menu.mjs.map +1 -0
- package/dist/components/slash-dropdown-menu/slash-image-popover.cjs +80 -0
- package/dist/components/slash-dropdown-menu/slash-image-popover.cjs.map +1 -0
- package/dist/components/slash-dropdown-menu/slash-image-popover.d.cts +11 -0
- package/dist/components/slash-dropdown-menu/slash-image-popover.d.ts +11 -0
- package/dist/components/slash-dropdown-menu/slash-image-popover.mjs +56 -0
- package/dist/components/slash-dropdown-menu/slash-image-popover.mjs.map +1 -0
- package/dist/components/slash-dropdown-menu/use-slash-items.cjs +138 -0
- package/dist/components/slash-dropdown-menu/use-slash-items.cjs.map +1 -0
- package/dist/components/slash-dropdown-menu/use-slash-items.d.cts +11 -0
- package/dist/components/slash-dropdown-menu/use-slash-items.d.ts +11 -0
- package/dist/components/slash-dropdown-menu/use-slash-items.mjs +125 -0
- package/dist/components/slash-dropdown-menu/use-slash-items.mjs.map +1 -0
- package/dist/components/suggestion-menu/filter-suggestion-items.cjs +57 -0
- package/dist/components/suggestion-menu/filter-suggestion-items.cjs.map +1 -0
- package/dist/components/suggestion-menu/filter-suggestion-items.d.cts +6 -0
- package/dist/components/suggestion-menu/filter-suggestion-items.d.ts +6 -0
- package/dist/components/suggestion-menu/filter-suggestion-items.mjs +32 -0
- package/dist/components/suggestion-menu/filter-suggestion-items.mjs.map +1 -0
- package/dist/components/suggestion-menu/suggestion-menu-types.cjs +19 -0
- package/dist/components/suggestion-menu/suggestion-menu-types.cjs.map +1 -0
- package/dist/components/suggestion-menu/suggestion-menu-types.d.cts +22 -0
- package/dist/components/suggestion-menu/suggestion-menu-types.d.ts +22 -0
- package/dist/components/suggestion-menu/suggestion-menu-types.mjs +1 -0
- package/dist/components/suggestion-menu/suggestion-menu-types.mjs.map +1 -0
- package/dist/components/suggestion-menu/suggestion-menu.cjs +205 -0
- package/dist/components/suggestion-menu/suggestion-menu.cjs.map +1 -0
- package/dist/components/suggestion-menu/suggestion-menu.d.cts +27 -0
- package/dist/components/suggestion-menu/suggestion-menu.d.ts +27 -0
- package/dist/components/suggestion-menu/suggestion-menu.mjs +181 -0
- package/dist/components/suggestion-menu/suggestion-menu.mjs.map +1 -0
- package/dist/components/toolbar/toolbar.cjs +4 -2
- package/dist/components/toolbar/toolbar.cjs.map +1 -1
- package/dist/components/toolbar/toolbar.mjs +3 -2
- package/dist/components/toolbar/toolbar.mjs.map +1 -1
- package/dist/components/ui/button.cjs +5 -3
- package/dist/components/ui/button.cjs.map +1 -1
- package/dist/components/ui/button.mjs +4 -3
- package/dist/components/ui/button.mjs.map +1 -1
- package/dist/components/ui/command.cjs +6 -5
- package/dist/components/ui/command.cjs.map +1 -1
- package/dist/components/ui/command.mjs +5 -5
- package/dist/components/ui/command.mjs.map +1 -1
- package/dist/components/ui/dialog.cjs +5 -4
- package/dist/components/ui/dialog.cjs.map +1 -1
- package/dist/components/ui/dialog.mjs +4 -4
- package/dist/components/ui/dialog.mjs.map +1 -1
- package/dist/components/ui/dropdown-menu.cjs +4 -3
- package/dist/components/ui/dropdown-menu.cjs.map +1 -1
- package/dist/components/ui/dropdown-menu.mjs +3 -3
- package/dist/components/ui/dropdown-menu.mjs.map +1 -1
- package/dist/components/ui/input-group.cjs +9 -7
- package/dist/components/ui/input-group.cjs.map +1 -1
- package/dist/components/ui/input-group.d.cts +1 -1
- package/dist/components/ui/input-group.d.ts +1 -1
- package/dist/components/ui/input-group.mjs +9 -7
- package/dist/components/ui/input-group.mjs.map +1 -1
- package/dist/components/ui/input.cjs +3 -1
- package/dist/components/ui/input.cjs.map +1 -1
- package/dist/components/ui/input.mjs +2 -1
- package/dist/components/ui/input.mjs.map +1 -1
- package/dist/components/ui/popover.cjs +4 -3
- package/dist/components/ui/popover.cjs.map +1 -1
- package/dist/components/ui/popover.mjs +3 -3
- package/dist/components/ui/popover.mjs.map +1 -1
- package/dist/components/ui/separator.cjs +4 -3
- package/dist/components/ui/separator.cjs.map +1 -1
- package/dist/components/ui/separator.mjs +3 -3
- package/dist/components/ui/separator.mjs.map +1 -1
- package/dist/components/ui/spacer.cjs +2 -0
- package/dist/components/ui/spacer.cjs.map +1 -1
- package/dist/components/ui/spacer.mjs +1 -0
- package/dist/components/ui/spacer.mjs.map +1 -1
- package/dist/components/ui/textarea.cjs +3 -1
- package/dist/components/ui/textarea.cjs.map +1 -1
- package/dist/components/ui/textarea.mjs +2 -1
- package/dist/components/ui/textarea.mjs.map +1 -1
- package/dist/components/undo-redo-button/undo-redo-button.cjs +6 -4
- package/dist/components/undo-redo-button/undo-redo-button.cjs.map +1 -1
- package/dist/components/undo-redo-button/undo-redo-button.mjs +6 -4
- package/dist/components/undo-redo-button/undo-redo-button.mjs.map +1 -1
- package/dist/components/undo-redo-button/use-undo-redo.cjs +4 -2
- package/dist/components/undo-redo-button/use-undo-redo.cjs.map +1 -1
- package/dist/components/undo-redo-button/use-undo-redo.mjs +3 -2
- package/dist/components/undo-redo-button/use-undo-redo.mjs.map +1 -1
- package/dist/extensions/code-block.cjs +8 -6
- package/dist/extensions/code-block.cjs.map +1 -1
- package/dist/extensions/code-block.mjs +7 -6
- package/dist/extensions/code-block.mjs.map +1 -1
- package/dist/extensions/editor.cjs +5 -3
- package/dist/extensions/editor.cjs.map +1 -1
- package/dist/extensions/editor.mjs +4 -3
- package/dist/extensions/editor.mjs.map +1 -1
- package/dist/extensions/index.cjs +4 -2
- package/dist/extensions/index.cjs.map +1 -1
- package/dist/extensions/index.mjs +3 -2
- package/dist/extensions/index.mjs.map +1 -1
- package/dist/extensions/shared.cjs +5 -3
- package/dist/extensions/shared.cjs.map +1 -1
- package/dist/extensions/shared.mjs +4 -3
- package/dist/extensions/shared.mjs.map +1 -1
- package/dist/hooks/use-copy-to-clipboard.cjs +3 -2
- package/dist/hooks/use-copy-to-clipboard.cjs.map +1 -1
- package/dist/hooks/use-copy-to-clipboard.mjs +2 -2
- package/dist/hooks/use-copy-to-clipboard.mjs.map +1 -1
- package/dist/hooks/use-floating-element.cjs +55 -0
- package/dist/hooks/use-floating-element.cjs.map +1 -0
- package/dist/hooks/use-floating-element.d.cts +21 -0
- package/dist/hooks/use-floating-element.d.ts +21 -0
- package/dist/hooks/use-floating-element.mjs +35 -0
- package/dist/hooks/use-floating-element.mjs.map +1 -0
- package/dist/hooks/use-markdown-editor.cjs +6 -1
- package/dist/hooks/use-markdown-editor.cjs.map +1 -1
- package/dist/hooks/use-markdown-editor.d.cts +1 -1
- package/dist/hooks/use-markdown-editor.d.ts +1 -1
- package/dist/hooks/use-markdown-editor.mjs +5 -1
- package/dist/hooks/use-markdown-editor.mjs.map +1 -1
- package/dist/index.cjs +18 -16
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +17 -16
- package/dist/index.mjs.map +1 -1
- package/dist/lib/highlight-code-to-html.cjs +2 -0
- package/dist/lib/highlight-code-to-html.cjs.map +1 -1
- package/dist/lib/highlight-code-to-html.mjs +1 -0
- package/dist/lib/highlight-code-to-html.mjs.map +1 -1
- package/dist/lib/languages.cjs +4 -2
- package/dist/lib/languages.cjs.map +1 -1
- package/dist/lib/languages.mjs +3 -2
- package/dist/lib/languages.mjs.map +1 -1
- package/dist/lib/utils.cjs +2 -0
- package/dist/lib/utils.cjs.map +1 -1
- package/dist/lib/utils.mjs +1 -0
- package/dist/lib/utils.mjs.map +1 -1
- package/dist/notra-editor.cjs +17 -13
- package/dist/notra-editor.cjs.map +1 -1
- package/dist/notra-editor.mjs +17 -13
- package/dist/notra-editor.mjs.map +1 -1
- package/dist/notra-reader.cjs +9 -7
- package/dist/notra-reader.cjs.map +1 -1
- package/dist/notra-reader.mjs +8 -7
- package/dist/notra-reader.mjs.map +1 -1
- package/dist/styles/globals.css +6 -0
- package/dist/themes/default/editor.css +50 -0
- package/dist/utils/markdown-to-json.cjs +5 -3
- package/dist/utils/markdown-to-json.cjs.map +1 -1
- package/dist/utils/markdown-to-json.mjs +4 -3
- package/dist/utils/markdown-to-json.mjs.map +1 -1
- package/package.json +4 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/heading-dropdown-menu/heading-menu-item.tsx"],"sourcesContent":["import { forwardRef } from 'react';\n\nimport { useHeading, type HeadingLevel } from './use-heading';\nimport { DropdownMenuItem } from '../ui/dropdown-menu';\n\nimport type { Editor } from '@tiptap/core';\n\nexport interface HeadingMenuItemProps {\n\teditor: Editor | null;\n\tlevel: HeadingLevel;\n}\n\nexport const HeadingMenuItem = forwardRef<HTMLDivElement, HeadingMenuItemProps>(\n\t({ editor, level }, ref) => {\n\t\tconst { isActive, canToggle, handleToggle, label, Icon } = useHeading({\n\t\t\teditor,\n\t\t\tlevel\n\t\t});\n\n\t\treturn (\n\t\t\t<DropdownMenuItem\n\t\t\t\tref={ref}\n\t\t\t\taria-label={label}\n\t\t\t\tclassName=\"nt:data-[active-state=on]:bg-accent nt:data-[active-state=on]:text-[var(--tt-brand-color-500)]\"\n\t\t\t\tdata-active-state={isActive ? 'on' : 'off'}\n\t\t\t\tdisabled={!canToggle}\n\t\t\t\tonSelect={handleToggle}\n\t\t\t>\n\t\t\t\t<Icon />\n\t\t\t\t<span>{label}</span>\n\t\t\t</DropdownMenuItem>\n\t\t);\n\t}\n);\n\nHeadingMenuItem.displayName = 'HeadingMenuItem';\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../../src/components/heading-dropdown-menu/heading-menu-item.tsx"],"sourcesContent":["import { forwardRef } from 'react';\n\nimport { useHeading, type HeadingLevel } from './use-heading.js';\nimport { DropdownMenuItem } from '../ui/dropdown-menu.js';\n\nimport type { Editor } from '@tiptap/core';\n\nexport interface HeadingMenuItemProps {\n\teditor: Editor | null;\n\tlevel: HeadingLevel;\n}\n\nexport const HeadingMenuItem = forwardRef<HTMLDivElement, HeadingMenuItemProps>(\n\t({ editor, level }, ref) => {\n\t\tconst { isActive, canToggle, handleToggle, label, Icon } = useHeading({\n\t\t\teditor,\n\t\t\tlevel\n\t\t});\n\n\t\treturn (\n\t\t\t<DropdownMenuItem\n\t\t\t\tref={ref}\n\t\t\t\taria-label={label}\n\t\t\t\tclassName=\"nt:data-[active-state=on]:bg-accent nt:data-[active-state=on]:text-[var(--tt-brand-color-500)]\"\n\t\t\t\tdata-active-state={isActive ? 'on' : 'off'}\n\t\t\t\tdisabled={!canToggle}\n\t\t\t\tonSelect={handleToggle}\n\t\t\t>\n\t\t\t\t<Icon />\n\t\t\t\t<span>{label}</span>\n\t\t\t</DropdownMenuItem>\n\t\t);\n\t}\n);\n\nHeadingMenuItem.displayName = 'HeadingMenuItem';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAA2B;AAE3B,yBAA8C;AAC9C,2BAAiC;AAiB9B;AARI,IAAM,sBAAkB;AAAA,EAC9B,CAAC,EAAE,QAAQ,MAAM,GAAG,QAAQ;AAC3B,UAAM,EAAE,UAAU,WAAW,cAAc,OAAO,KAAK,QAAI,+BAAW;AAAA,MACrE;AAAA,MACA;AAAA,IACD,CAAC;AAED,WACC;AAAA,MAAC;AAAA;AAAA,QACA;AAAA,QACA,cAAY;AAAA,QACZ,WAAU;AAAA,QACV,qBAAmB,WAAW,OAAO;AAAA,QACrC,UAAU,CAAC;AAAA,QACX,UAAU;AAAA,QAEV;AAAA,sDAAC,QAAK;AAAA,UACN,4CAAC,UAAM,iBAAM;AAAA;AAAA;AAAA,IACd;AAAA,EAEF;AACD;AAEA,gBAAgB,cAAc;","names":[]}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
|
|
1
|
+
// src/components/heading-dropdown-menu/heading-menu-item.tsx
|
|
2
2
|
import { forwardRef } from "react";
|
|
3
|
-
import { useHeading } from "./use-heading";
|
|
4
|
-
import { DropdownMenuItem } from "../ui/dropdown-menu";
|
|
5
|
-
|
|
3
|
+
import { useHeading } from "./use-heading.mjs";
|
|
4
|
+
import { DropdownMenuItem } from "../ui/dropdown-menu.mjs";
|
|
5
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
6
|
+
var HeadingMenuItem = forwardRef(
|
|
6
7
|
({ editor, level }, ref) => {
|
|
7
8
|
const { isActive, canToggle, handleToggle, label, Icon } = useHeading({
|
|
8
9
|
editor,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/heading-dropdown-menu/heading-menu-item.tsx"],"sourcesContent":["import { forwardRef } from 'react';\n\nimport { useHeading, type HeadingLevel } from './use-heading';\nimport { DropdownMenuItem } from '../ui/dropdown-menu';\n\nimport type { Editor } from '@tiptap/core';\n\nexport interface HeadingMenuItemProps {\n\teditor: Editor | null;\n\tlevel: HeadingLevel;\n}\n\nexport const HeadingMenuItem = forwardRef<HTMLDivElement, HeadingMenuItemProps>(\n\t({ editor, level }, ref) => {\n\t\tconst { isActive, canToggle, handleToggle, label, Icon } = useHeading({\n\t\t\teditor,\n\t\t\tlevel\n\t\t});\n\n\t\treturn (\n\t\t\t<DropdownMenuItem\n\t\t\t\tref={ref}\n\t\t\t\taria-label={label}\n\t\t\t\tclassName=\"nt:data-[active-state=on]:bg-accent nt:data-[active-state=on]:text-[var(--tt-brand-color-500)]\"\n\t\t\t\tdata-active-state={isActive ? 'on' : 'off'}\n\t\t\t\tdisabled={!canToggle}\n\t\t\t\tonSelect={handleToggle}\n\t\t\t>\n\t\t\t\t<Icon />\n\t\t\t\t<span>{label}</span>\n\t\t\t</DropdownMenuItem>\n\t\t);\n\t}\n);\n\nHeadingMenuItem.displayName = 'HeadingMenuItem';\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../../src/components/heading-dropdown-menu/heading-menu-item.tsx"],"sourcesContent":["import { forwardRef } from 'react';\n\nimport { useHeading, type HeadingLevel } from './use-heading.js';\nimport { DropdownMenuItem } from '../ui/dropdown-menu.js';\n\nimport type { Editor } from '@tiptap/core';\n\nexport interface HeadingMenuItemProps {\n\teditor: Editor | null;\n\tlevel: HeadingLevel;\n}\n\nexport const HeadingMenuItem = forwardRef<HTMLDivElement, HeadingMenuItemProps>(\n\t({ editor, level }, ref) => {\n\t\tconst { isActive, canToggle, handleToggle, label, Icon } = useHeading({\n\t\t\teditor,\n\t\t\tlevel\n\t\t});\n\n\t\treturn (\n\t\t\t<DropdownMenuItem\n\t\t\t\tref={ref}\n\t\t\t\taria-label={label}\n\t\t\t\tclassName=\"nt:data-[active-state=on]:bg-accent nt:data-[active-state=on]:text-[var(--tt-brand-color-500)]\"\n\t\t\t\tdata-active-state={isActive ? 'on' : 'off'}\n\t\t\t\tdisabled={!canToggle}\n\t\t\t\tonSelect={handleToggle}\n\t\t\t>\n\t\t\t\t<Icon />\n\t\t\t\t<span>{label}</span>\n\t\t\t</DropdownMenuItem>\n\t\t);\n\t}\n);\n\nHeadingMenuItem.displayName = 'HeadingMenuItem';\n"],"mappings":";AAAA,SAAS,kBAAkB;AAE3B,SAAS,kBAAqC;AAC9C,SAAS,wBAAwB;AAiB9B,SAQC,KARD;AARI,IAAM,kBAAkB;AAAA,EAC9B,CAAC,EAAE,QAAQ,MAAM,GAAG,QAAQ;AAC3B,UAAM,EAAE,UAAU,WAAW,cAAc,OAAO,KAAK,IAAI,WAAW;AAAA,MACrE;AAAA,MACA;AAAA,IACD,CAAC;AAED,WACC;AAAA,MAAC;AAAA;AAAA,QACA;AAAA,QACA,cAAY;AAAA,QACZ,WAAU;AAAA,QACV,qBAAmB,WAAW,OAAO;AAAA,QACrC,UAAU,CAAC;AAAA,QACX,UAAU;AAAA,QAEV;AAAA,8BAAC,QAAK;AAAA,UACN,oBAAC,UAAM,iBAAM;AAAA;AAAA;AAAA,IACd;AAAA,EAEF;AACD;AAEA,gBAAgB,cAAc;","names":[]}
|
|
@@ -16,6 +16,8 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
16
16
|
return to;
|
|
17
17
|
};
|
|
18
18
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/components/heading-dropdown-menu/use-heading.ts
|
|
19
21
|
var use_heading_exports = {};
|
|
20
22
|
__export(use_heading_exports, {
|
|
21
23
|
getHeadingTriggerIcon: () => getHeadingTriggerIcon,
|
|
@@ -25,13 +27,13 @@ __export(use_heading_exports, {
|
|
|
25
27
|
module.exports = __toCommonJS(use_heading_exports);
|
|
26
28
|
var import_lucide_react = require("lucide-react");
|
|
27
29
|
var import_react = require("react");
|
|
28
|
-
|
|
30
|
+
var headingIcons = {
|
|
29
31
|
1: import_lucide_react.Heading1,
|
|
30
32
|
2: import_lucide_react.Heading2,
|
|
31
33
|
3: import_lucide_react.Heading3,
|
|
32
34
|
4: import_lucide_react.Heading4
|
|
33
35
|
};
|
|
34
|
-
|
|
36
|
+
var headingLabels = {
|
|
35
37
|
1: "Heading 1",
|
|
36
38
|
2: "Heading 2",
|
|
37
39
|
3: "Heading 3",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/heading-dropdown-menu/use-heading.ts"],"sourcesContent":["import { Heading, Heading1, Heading2, Heading3, Heading4 } from 'lucide-react';\nimport { useCallback, useEffect, useState } from 'react';\n\nimport type { Editor } from '@tiptap/core';\nimport type { LucideIcon } from 'lucide-react';\n\nexport type HeadingLevel = 1 | 2 | 3 | 4;\n\ntype IconComponent = LucideIcon;\n\nconst headingIcons: Record<HeadingLevel, IconComponent> = {\n\t1: Heading1,\n\t2: Heading2,\n\t3: Heading3,\n\t4: Heading4\n};\n\nconst headingLabels: Record<HeadingLevel, string> = {\n\t1: 'Heading 1',\n\t2: 'Heading 2',\n\t3: 'Heading 3',\n\t4: 'Heading 4'\n};\n\nfunction canToggleHeading(editor: Editor | null, level: HeadingLevel): boolean {\n\tif (!editor || !editor.isEditable) return false;\n\n\treturn (\n\t\teditor.can().setNode('heading', { level }) || editor.can().clearNodes()\n\t);\n}\n\nexport function useHeading({\n\teditor,\n\tlevel\n}: {\n\teditor: Editor | null;\n\tlevel: HeadingLevel;\n}) {\n\tconst [isActive, setIsActive] = useState(false);\n\tconst [canToggle, setCanToggle] = useState(false);\n\n\tuseEffect(() => {\n\t\tif (!editor) return;\n\n\t\tconst handleUpdate = () => {\n\t\t\tsetIsActive(editor.isActive('heading', { level }));\n\t\t\tsetCanToggle(canToggleHeading(editor, level));\n\t\t};\n\n\t\thandleUpdate();\n\n\t\teditor.on('selectionUpdate', handleUpdate);\n\t\teditor.on('transaction', handleUpdate);\n\n\t\treturn () => {\n\t\t\teditor.off('selectionUpdate', handleUpdate);\n\t\t\teditor.off('transaction', handleUpdate);\n\t\t};\n\t}, [editor, level]);\n\n\tconst handleToggle = useCallback(() => {\n\t\tif (!editor || !editor.isEditable) return false;\n\n\t\tif (editor.isActive('heading', { level })) {\n\t\t\treturn editor.chain().focus().setNode('paragraph').run();\n\t\t}\n\n\t\t// clearNodes first to convert any block type to paragraph,\n\t\t// then set heading\n\t\treturn editor\n\t\t\t.chain()\n\t\t\t.focus()\n\t\t\t.clearNodes()\n\t\t\t.setNode('heading', { level })\n\t\t\t.run();\n\t}, [editor, level]);\n\n\treturn {\n\t\tisActive,\n\t\tcanToggle,\n\t\thandleToggle,\n\t\tlabel: headingLabels[level],\n\t\tIcon: headingIcons[level]\n\t};\n}\n\nexport function useActiveHeadingLevel(\n\teditor: Editor | null,\n\tlevels: HeadingLevel[]\n): HeadingLevel | null {\n\tconst [activeLevel, setActiveLevel] = useState<HeadingLevel | null>(null);\n\n\tuseEffect(() => {\n\t\tif (!editor) return;\n\n\t\tconst handleUpdate = () => {\n\t\t\tconst found = levels.find((level) =>\n\t\t\t\teditor.isActive('heading', { level })\n\t\t\t);\n\n\t\t\tsetActiveLevel(found ?? null);\n\t\t};\n\n\t\thandleUpdate();\n\n\t\teditor.on('selectionUpdate', handleUpdate);\n\t\teditor.on('transaction', handleUpdate);\n\n\t\treturn () => {\n\t\t\teditor.off('selectionUpdate', handleUpdate);\n\t\t\teditor.off('transaction', handleUpdate);\n\t\t};\n\t}, [editor, levels]);\n\n\treturn activeLevel;\n}\n\nexport function getHeadingTriggerIcon(\n\tactiveLevel: HeadingLevel | null\n): IconComponent {\n\tif (activeLevel === null) return Heading;\n\n\treturn headingIcons[activeLevel];\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../../src/components/heading-dropdown-menu/use-heading.ts"],"sourcesContent":["import { Heading, Heading1, Heading2, Heading3, Heading4 } from 'lucide-react';\nimport { useCallback, useEffect, useState } from 'react';\n\nimport type { Editor } from '@tiptap/core';\nimport type { LucideIcon } from 'lucide-react';\n\nexport type HeadingLevel = 1 | 2 | 3 | 4;\n\ntype IconComponent = LucideIcon;\n\nconst headingIcons: Record<HeadingLevel, IconComponent> = {\n\t1: Heading1,\n\t2: Heading2,\n\t3: Heading3,\n\t4: Heading4\n};\n\nconst headingLabels: Record<HeadingLevel, string> = {\n\t1: 'Heading 1',\n\t2: 'Heading 2',\n\t3: 'Heading 3',\n\t4: 'Heading 4'\n};\n\nfunction canToggleHeading(editor: Editor | null, level: HeadingLevel): boolean {\n\tif (!editor || !editor.isEditable) return false;\n\n\treturn (\n\t\teditor.can().setNode('heading', { level }) || editor.can().clearNodes()\n\t);\n}\n\nexport function useHeading({\n\teditor,\n\tlevel\n}: {\n\teditor: Editor | null;\n\tlevel: HeadingLevel;\n}) {\n\tconst [isActive, setIsActive] = useState(false);\n\tconst [canToggle, setCanToggle] = useState(false);\n\n\tuseEffect(() => {\n\t\tif (!editor) return;\n\n\t\tconst handleUpdate = () => {\n\t\t\tsetIsActive(editor.isActive('heading', { level }));\n\t\t\tsetCanToggle(canToggleHeading(editor, level));\n\t\t};\n\n\t\thandleUpdate();\n\n\t\teditor.on('selectionUpdate', handleUpdate);\n\t\teditor.on('transaction', handleUpdate);\n\n\t\treturn () => {\n\t\t\teditor.off('selectionUpdate', handleUpdate);\n\t\t\teditor.off('transaction', handleUpdate);\n\t\t};\n\t}, [editor, level]);\n\n\tconst handleToggle = useCallback(() => {\n\t\tif (!editor || !editor.isEditable) return false;\n\n\t\tif (editor.isActive('heading', { level })) {\n\t\t\treturn editor.chain().focus().setNode('paragraph').run();\n\t\t}\n\n\t\t// clearNodes first to convert any block type to paragraph,\n\t\t// then set heading\n\t\treturn editor\n\t\t\t.chain()\n\t\t\t.focus()\n\t\t\t.clearNodes()\n\t\t\t.setNode('heading', { level })\n\t\t\t.run();\n\t}, [editor, level]);\n\n\treturn {\n\t\tisActive,\n\t\tcanToggle,\n\t\thandleToggle,\n\t\tlabel: headingLabels[level],\n\t\tIcon: headingIcons[level]\n\t};\n}\n\nexport function useActiveHeadingLevel(\n\teditor: Editor | null,\n\tlevels: HeadingLevel[]\n): HeadingLevel | null {\n\tconst [activeLevel, setActiveLevel] = useState<HeadingLevel | null>(null);\n\n\tuseEffect(() => {\n\t\tif (!editor) return;\n\n\t\tconst handleUpdate = () => {\n\t\t\tconst found = levels.find((level) =>\n\t\t\t\teditor.isActive('heading', { level })\n\t\t\t);\n\n\t\t\tsetActiveLevel(found ?? null);\n\t\t};\n\n\t\thandleUpdate();\n\n\t\teditor.on('selectionUpdate', handleUpdate);\n\t\teditor.on('transaction', handleUpdate);\n\n\t\treturn () => {\n\t\t\teditor.off('selectionUpdate', handleUpdate);\n\t\t\teditor.off('transaction', handleUpdate);\n\t\t};\n\t}, [editor, levels]);\n\n\treturn activeLevel;\n}\n\nexport function getHeadingTriggerIcon(\n\tactiveLevel: HeadingLevel | null\n): IconComponent {\n\tif (activeLevel === null) return Heading;\n\n\treturn headingIcons[activeLevel];\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAAgE;AAChE,mBAAiD;AASjD,IAAM,eAAoD;AAAA,EACzD,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACJ;AAEA,IAAM,gBAA8C;AAAA,EACnD,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACJ;AAEA,SAAS,iBAAiB,QAAuB,OAA8B;AAC9E,MAAI,CAAC,UAAU,CAAC,OAAO,WAAY,QAAO;AAE1C,SACC,OAAO,IAAI,EAAE,QAAQ,WAAW,EAAE,MAAM,CAAC,KAAK,OAAO,IAAI,EAAE,WAAW;AAExE;AAEO,SAAS,WAAW;AAAA,EAC1B;AAAA,EACA;AACD,GAGG;AACF,QAAM,CAAC,UAAU,WAAW,QAAI,uBAAS,KAAK;AAC9C,QAAM,CAAC,WAAW,YAAY,QAAI,uBAAS,KAAK;AAEhD,8BAAU,MAAM;AACf,QAAI,CAAC,OAAQ;AAEb,UAAM,eAAe,MAAM;AAC1B,kBAAY,OAAO,SAAS,WAAW,EAAE,MAAM,CAAC,CAAC;AACjD,mBAAa,iBAAiB,QAAQ,KAAK,CAAC;AAAA,IAC7C;AAEA,iBAAa;AAEb,WAAO,GAAG,mBAAmB,YAAY;AACzC,WAAO,GAAG,eAAe,YAAY;AAErC,WAAO,MAAM;AACZ,aAAO,IAAI,mBAAmB,YAAY;AAC1C,aAAO,IAAI,eAAe,YAAY;AAAA,IACvC;AAAA,EACD,GAAG,CAAC,QAAQ,KAAK,CAAC;AAElB,QAAM,mBAAe,0BAAY,MAAM;AACtC,QAAI,CAAC,UAAU,CAAC,OAAO,WAAY,QAAO;AAE1C,QAAI,OAAO,SAAS,WAAW,EAAE,MAAM,CAAC,GAAG;AAC1C,aAAO,OAAO,MAAM,EAAE,MAAM,EAAE,QAAQ,WAAW,EAAE,IAAI;AAAA,IACxD;AAIA,WAAO,OACL,MAAM,EACN,MAAM,EACN,WAAW,EACX,QAAQ,WAAW,EAAE,MAAM,CAAC,EAC5B,IAAI;AAAA,EACP,GAAG,CAAC,QAAQ,KAAK,CAAC;AAElB,SAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,cAAc,KAAK;AAAA,IAC1B,MAAM,aAAa,KAAK;AAAA,EACzB;AACD;AAEO,SAAS,sBACf,QACA,QACsB;AACtB,QAAM,CAAC,aAAa,cAAc,QAAI,uBAA8B,IAAI;AAExE,8BAAU,MAAM;AACf,QAAI,CAAC,OAAQ;AAEb,UAAM,eAAe,MAAM;AAC1B,YAAM,QAAQ,OAAO;AAAA,QAAK,CAAC,UAC1B,OAAO,SAAS,WAAW,EAAE,MAAM,CAAC;AAAA,MACrC;AAEA,qBAAe,SAAS,IAAI;AAAA,IAC7B;AAEA,iBAAa;AAEb,WAAO,GAAG,mBAAmB,YAAY;AACzC,WAAO,GAAG,eAAe,YAAY;AAErC,WAAO,MAAM;AACZ,aAAO,IAAI,mBAAmB,YAAY;AAC1C,aAAO,IAAI,eAAe,YAAY;AAAA,IACvC;AAAA,EACD,GAAG,CAAC,QAAQ,MAAM,CAAC;AAEnB,SAAO;AACR;AAEO,SAAS,sBACf,aACgB;AAChB,MAAI,gBAAgB,KAAM,QAAO;AAEjC,SAAO,aAAa,WAAW;AAChC;","names":[]}
|
|
@@ -1,12 +1,13 @@
|
|
|
1
|
+
// src/components/heading-dropdown-menu/use-heading.ts
|
|
1
2
|
import { Heading, Heading1, Heading2, Heading3, Heading4 } from "lucide-react";
|
|
2
3
|
import { useCallback, useEffect, useState } from "react";
|
|
3
|
-
|
|
4
|
+
var headingIcons = {
|
|
4
5
|
1: Heading1,
|
|
5
6
|
2: Heading2,
|
|
6
7
|
3: Heading3,
|
|
7
8
|
4: Heading4
|
|
8
9
|
};
|
|
9
|
-
|
|
10
|
+
var headingLabels = {
|
|
10
11
|
1: "Heading 1",
|
|
11
12
|
2: "Heading 2",
|
|
12
13
|
3: "Heading 3",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/heading-dropdown-menu/use-heading.ts"],"sourcesContent":["import { Heading, Heading1, Heading2, Heading3, Heading4 } from 'lucide-react';\nimport { useCallback, useEffect, useState } from 'react';\n\nimport type { Editor } from '@tiptap/core';\nimport type { LucideIcon } from 'lucide-react';\n\nexport type HeadingLevel = 1 | 2 | 3 | 4;\n\ntype IconComponent = LucideIcon;\n\nconst headingIcons: Record<HeadingLevel, IconComponent> = {\n\t1: Heading1,\n\t2: Heading2,\n\t3: Heading3,\n\t4: Heading4\n};\n\nconst headingLabels: Record<HeadingLevel, string> = {\n\t1: 'Heading 1',\n\t2: 'Heading 2',\n\t3: 'Heading 3',\n\t4: 'Heading 4'\n};\n\nfunction canToggleHeading(editor: Editor | null, level: HeadingLevel): boolean {\n\tif (!editor || !editor.isEditable) return false;\n\n\treturn (\n\t\teditor.can().setNode('heading', { level }) || editor.can().clearNodes()\n\t);\n}\n\nexport function useHeading({\n\teditor,\n\tlevel\n}: {\n\teditor: Editor | null;\n\tlevel: HeadingLevel;\n}) {\n\tconst [isActive, setIsActive] = useState(false);\n\tconst [canToggle, setCanToggle] = useState(false);\n\n\tuseEffect(() => {\n\t\tif (!editor) return;\n\n\t\tconst handleUpdate = () => {\n\t\t\tsetIsActive(editor.isActive('heading', { level }));\n\t\t\tsetCanToggle(canToggleHeading(editor, level));\n\t\t};\n\n\t\thandleUpdate();\n\n\t\teditor.on('selectionUpdate', handleUpdate);\n\t\teditor.on('transaction', handleUpdate);\n\n\t\treturn () => {\n\t\t\teditor.off('selectionUpdate', handleUpdate);\n\t\t\teditor.off('transaction', handleUpdate);\n\t\t};\n\t}, [editor, level]);\n\n\tconst handleToggle = useCallback(() => {\n\t\tif (!editor || !editor.isEditable) return false;\n\n\t\tif (editor.isActive('heading', { level })) {\n\t\t\treturn editor.chain().focus().setNode('paragraph').run();\n\t\t}\n\n\t\t// clearNodes first to convert any block type to paragraph,\n\t\t// then set heading\n\t\treturn editor\n\t\t\t.chain()\n\t\t\t.focus()\n\t\t\t.clearNodes()\n\t\t\t.setNode('heading', { level })\n\t\t\t.run();\n\t}, [editor, level]);\n\n\treturn {\n\t\tisActive,\n\t\tcanToggle,\n\t\thandleToggle,\n\t\tlabel: headingLabels[level],\n\t\tIcon: headingIcons[level]\n\t};\n}\n\nexport function useActiveHeadingLevel(\n\teditor: Editor | null,\n\tlevels: HeadingLevel[]\n): HeadingLevel | null {\n\tconst [activeLevel, setActiveLevel] = useState<HeadingLevel | null>(null);\n\n\tuseEffect(() => {\n\t\tif (!editor) return;\n\n\t\tconst handleUpdate = () => {\n\t\t\tconst found = levels.find((level) =>\n\t\t\t\teditor.isActive('heading', { level })\n\t\t\t);\n\n\t\t\tsetActiveLevel(found ?? null);\n\t\t};\n\n\t\thandleUpdate();\n\n\t\teditor.on('selectionUpdate', handleUpdate);\n\t\teditor.on('transaction', handleUpdate);\n\n\t\treturn () => {\n\t\t\teditor.off('selectionUpdate', handleUpdate);\n\t\t\teditor.off('transaction', handleUpdate);\n\t\t};\n\t}, [editor, levels]);\n\n\treturn activeLevel;\n}\n\nexport function getHeadingTriggerIcon(\n\tactiveLevel: HeadingLevel | null\n): IconComponent {\n\tif (activeLevel === null) return Heading;\n\n\treturn headingIcons[activeLevel];\n}\n"],"mappings":"AAAA,SAAS,SAAS,UAAU,UAAU,UAAU,gBAAgB;AAChE,SAAS,aAAa,WAAW,gBAAgB;AASjD,
|
|
1
|
+
{"version":3,"sources":["../../../src/components/heading-dropdown-menu/use-heading.ts"],"sourcesContent":["import { Heading, Heading1, Heading2, Heading3, Heading4 } from 'lucide-react';\nimport { useCallback, useEffect, useState } from 'react';\n\nimport type { Editor } from '@tiptap/core';\nimport type { LucideIcon } from 'lucide-react';\n\nexport type HeadingLevel = 1 | 2 | 3 | 4;\n\ntype IconComponent = LucideIcon;\n\nconst headingIcons: Record<HeadingLevel, IconComponent> = {\n\t1: Heading1,\n\t2: Heading2,\n\t3: Heading3,\n\t4: Heading4\n};\n\nconst headingLabels: Record<HeadingLevel, string> = {\n\t1: 'Heading 1',\n\t2: 'Heading 2',\n\t3: 'Heading 3',\n\t4: 'Heading 4'\n};\n\nfunction canToggleHeading(editor: Editor | null, level: HeadingLevel): boolean {\n\tif (!editor || !editor.isEditable) return false;\n\n\treturn (\n\t\teditor.can().setNode('heading', { level }) || editor.can().clearNodes()\n\t);\n}\n\nexport function useHeading({\n\teditor,\n\tlevel\n}: {\n\teditor: Editor | null;\n\tlevel: HeadingLevel;\n}) {\n\tconst [isActive, setIsActive] = useState(false);\n\tconst [canToggle, setCanToggle] = useState(false);\n\n\tuseEffect(() => {\n\t\tif (!editor) return;\n\n\t\tconst handleUpdate = () => {\n\t\t\tsetIsActive(editor.isActive('heading', { level }));\n\t\t\tsetCanToggle(canToggleHeading(editor, level));\n\t\t};\n\n\t\thandleUpdate();\n\n\t\teditor.on('selectionUpdate', handleUpdate);\n\t\teditor.on('transaction', handleUpdate);\n\n\t\treturn () => {\n\t\t\teditor.off('selectionUpdate', handleUpdate);\n\t\t\teditor.off('transaction', handleUpdate);\n\t\t};\n\t}, [editor, level]);\n\n\tconst handleToggle = useCallback(() => {\n\t\tif (!editor || !editor.isEditable) return false;\n\n\t\tif (editor.isActive('heading', { level })) {\n\t\t\treturn editor.chain().focus().setNode('paragraph').run();\n\t\t}\n\n\t\t// clearNodes first to convert any block type to paragraph,\n\t\t// then set heading\n\t\treturn editor\n\t\t\t.chain()\n\t\t\t.focus()\n\t\t\t.clearNodes()\n\t\t\t.setNode('heading', { level })\n\t\t\t.run();\n\t}, [editor, level]);\n\n\treturn {\n\t\tisActive,\n\t\tcanToggle,\n\t\thandleToggle,\n\t\tlabel: headingLabels[level],\n\t\tIcon: headingIcons[level]\n\t};\n}\n\nexport function useActiveHeadingLevel(\n\teditor: Editor | null,\n\tlevels: HeadingLevel[]\n): HeadingLevel | null {\n\tconst [activeLevel, setActiveLevel] = useState<HeadingLevel | null>(null);\n\n\tuseEffect(() => {\n\t\tif (!editor) return;\n\n\t\tconst handleUpdate = () => {\n\t\t\tconst found = levels.find((level) =>\n\t\t\t\teditor.isActive('heading', { level })\n\t\t\t);\n\n\t\t\tsetActiveLevel(found ?? null);\n\t\t};\n\n\t\thandleUpdate();\n\n\t\teditor.on('selectionUpdate', handleUpdate);\n\t\teditor.on('transaction', handleUpdate);\n\n\t\treturn () => {\n\t\t\teditor.off('selectionUpdate', handleUpdate);\n\t\t\teditor.off('transaction', handleUpdate);\n\t\t};\n\t}, [editor, levels]);\n\n\treturn activeLevel;\n}\n\nexport function getHeadingTriggerIcon(\n\tactiveLevel: HeadingLevel | null\n): IconComponent {\n\tif (activeLevel === null) return Heading;\n\n\treturn headingIcons[activeLevel];\n}\n"],"mappings":";AAAA,SAAS,SAAS,UAAU,UAAU,UAAU,gBAAgB;AAChE,SAAS,aAAa,WAAW,gBAAgB;AASjD,IAAM,eAAoD;AAAA,EACzD,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACJ;AAEA,IAAM,gBAA8C;AAAA,EACnD,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACJ;AAEA,SAAS,iBAAiB,QAAuB,OAA8B;AAC9E,MAAI,CAAC,UAAU,CAAC,OAAO,WAAY,QAAO;AAE1C,SACC,OAAO,IAAI,EAAE,QAAQ,WAAW,EAAE,MAAM,CAAC,KAAK,OAAO,IAAI,EAAE,WAAW;AAExE;AAEO,SAAS,WAAW;AAAA,EAC1B;AAAA,EACA;AACD,GAGG;AACF,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,KAAK;AAC9C,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,KAAK;AAEhD,YAAU,MAAM;AACf,QAAI,CAAC,OAAQ;AAEb,UAAM,eAAe,MAAM;AAC1B,kBAAY,OAAO,SAAS,WAAW,EAAE,MAAM,CAAC,CAAC;AACjD,mBAAa,iBAAiB,QAAQ,KAAK,CAAC;AAAA,IAC7C;AAEA,iBAAa;AAEb,WAAO,GAAG,mBAAmB,YAAY;AACzC,WAAO,GAAG,eAAe,YAAY;AAErC,WAAO,MAAM;AACZ,aAAO,IAAI,mBAAmB,YAAY;AAC1C,aAAO,IAAI,eAAe,YAAY;AAAA,IACvC;AAAA,EACD,GAAG,CAAC,QAAQ,KAAK,CAAC;AAElB,QAAM,eAAe,YAAY,MAAM;AACtC,QAAI,CAAC,UAAU,CAAC,OAAO,WAAY,QAAO;AAE1C,QAAI,OAAO,SAAS,WAAW,EAAE,MAAM,CAAC,GAAG;AAC1C,aAAO,OAAO,MAAM,EAAE,MAAM,EAAE,QAAQ,WAAW,EAAE,IAAI;AAAA,IACxD;AAIA,WAAO,OACL,MAAM,EACN,MAAM,EACN,WAAW,EACX,QAAQ,WAAW,EAAE,MAAM,CAAC,EAC5B,IAAI;AAAA,EACP,GAAG,CAAC,QAAQ,KAAK,CAAC;AAElB,SAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,cAAc,KAAK;AAAA,IAC1B,MAAM,aAAa,KAAK;AAAA,EACzB;AACD;AAEO,SAAS,sBACf,QACA,QACsB;AACtB,QAAM,CAAC,aAAa,cAAc,IAAI,SAA8B,IAAI;AAExE,YAAU,MAAM;AACf,QAAI,CAAC,OAAQ;AAEb,UAAM,eAAe,MAAM;AAC1B,YAAM,QAAQ,OAAO;AAAA,QAAK,CAAC,UAC1B,OAAO,SAAS,WAAW,EAAE,MAAM,CAAC;AAAA,MACrC;AAEA,qBAAe,SAAS,IAAI;AAAA,IAC7B;AAEA,iBAAa;AAEb,WAAO,GAAG,mBAAmB,YAAY;AACzC,WAAO,GAAG,eAAe,YAAY;AAErC,WAAO,MAAM;AACZ,aAAO,IAAI,mBAAmB,YAAY;AAC1C,aAAO,IAAI,eAAe,YAAY;AAAA,IACvC;AAAA,EACD,GAAG,CAAC,QAAQ,MAAM,CAAC;AAEnB,SAAO;AACR;AAEO,SAAS,sBACf,aACgB;AAChB,MAAI,gBAAgB,KAAM,QAAO;AAEjC,SAAO,aAAa,WAAW;AAChC;","names":[]}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
"use client";
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from))
|
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
20
|
+
|
|
21
|
+
// src/components/image-popover/image-input-form.tsx
|
|
22
|
+
var image_input_form_exports = {};
|
|
23
|
+
__export(image_input_form_exports, {
|
|
24
|
+
ImageInputForm: () => ImageInputForm
|
|
25
|
+
});
|
|
26
|
+
module.exports = __toCommonJS(image_input_form_exports);
|
|
27
|
+
var import_lucide_react = require("lucide-react");
|
|
28
|
+
var import_react = require("react");
|
|
29
|
+
var import_button = require("../ui/button.cjs");
|
|
30
|
+
var import_input = require("../ui/input.cjs");
|
|
31
|
+
var import_separator = require("../ui/separator.cjs");
|
|
32
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
33
|
+
function ImageInputForm({
|
|
34
|
+
initialUrl = "",
|
|
35
|
+
initialAlt = "",
|
|
36
|
+
showRemove = false,
|
|
37
|
+
onSubmit,
|
|
38
|
+
onRemove,
|
|
39
|
+
onCancel
|
|
40
|
+
}) {
|
|
41
|
+
const [url, setUrl] = (0, import_react.useState)(initialUrl);
|
|
42
|
+
const [alt, setAlt] = (0, import_react.useState)(initialAlt);
|
|
43
|
+
(0, import_react.useEffect)(() => {
|
|
44
|
+
setUrl(initialUrl);
|
|
45
|
+
}, [initialUrl]);
|
|
46
|
+
(0, import_react.useEffect)(() => {
|
|
47
|
+
setAlt(initialAlt);
|
|
48
|
+
}, [initialAlt]);
|
|
49
|
+
const submit = (0, import_react.useCallback)(() => {
|
|
50
|
+
onSubmit({ url, alt });
|
|
51
|
+
}, [url, alt, onSubmit]);
|
|
52
|
+
const handleKeyDown = (0, import_react.useCallback)(
|
|
53
|
+
(event) => {
|
|
54
|
+
if (event.key === "Enter") {
|
|
55
|
+
event.preventDefault();
|
|
56
|
+
submit();
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
if (event.key === "Escape" && onCancel) {
|
|
60
|
+
event.preventDefault();
|
|
61
|
+
onCancel();
|
|
62
|
+
}
|
|
63
|
+
},
|
|
64
|
+
[submit, onCancel]
|
|
65
|
+
);
|
|
66
|
+
const submitDisabled = !url && !showRemove;
|
|
67
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "nt:flex nt:w-72 nt:flex-col nt:gap-1 nt:p-1", children: [
|
|
68
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
69
|
+
import_input.Input,
|
|
70
|
+
{
|
|
71
|
+
autoFocus: true,
|
|
72
|
+
className: "nt:h-7 nt:border-none nt:shadow-none nt:focus-visible:ring-0",
|
|
73
|
+
placeholder: "Paste image URL...",
|
|
74
|
+
type: "url",
|
|
75
|
+
value: url,
|
|
76
|
+
onChange: (e) => setUrl(e.target.value),
|
|
77
|
+
onKeyDown: handleKeyDown
|
|
78
|
+
}
|
|
79
|
+
),
|
|
80
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
81
|
+
import_input.Input,
|
|
82
|
+
{
|
|
83
|
+
className: "nt:h-7 nt:border-none nt:shadow-none nt:focus-visible:ring-0",
|
|
84
|
+
placeholder: "Alt text (optional)",
|
|
85
|
+
type: "text",
|
|
86
|
+
value: alt,
|
|
87
|
+
onChange: (e) => setAlt(e.target.value),
|
|
88
|
+
onKeyDown: handleKeyDown
|
|
89
|
+
}
|
|
90
|
+
),
|
|
91
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "nt:flex nt:items-center nt:justify-end nt:gap-1", children: [
|
|
92
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
93
|
+
import_button.Button,
|
|
94
|
+
{
|
|
95
|
+
"aria-label": "Apply image",
|
|
96
|
+
disabled: submitDisabled,
|
|
97
|
+
size: "icon-sm",
|
|
98
|
+
tabIndex: -1,
|
|
99
|
+
type: "button",
|
|
100
|
+
variant: "ghost",
|
|
101
|
+
onClick: submit,
|
|
102
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.CornerDownLeft, {})
|
|
103
|
+
}
|
|
104
|
+
),
|
|
105
|
+
showRemove && onRemove && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
|
|
106
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_separator.Separator, { className: "nt:h-5", orientation: "vertical" }),
|
|
107
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
108
|
+
import_button.Button,
|
|
109
|
+
{
|
|
110
|
+
"aria-label": "Remove image",
|
|
111
|
+
size: "icon-sm",
|
|
112
|
+
tabIndex: -1,
|
|
113
|
+
type: "button",
|
|
114
|
+
variant: "ghost",
|
|
115
|
+
onClick: onRemove,
|
|
116
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Trash2, {})
|
|
117
|
+
}
|
|
118
|
+
)
|
|
119
|
+
] })
|
|
120
|
+
] })
|
|
121
|
+
] });
|
|
122
|
+
}
|
|
123
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
124
|
+
0 && (module.exports = {
|
|
125
|
+
ImageInputForm
|
|
126
|
+
});
|
|
127
|
+
//# sourceMappingURL=image-input-form.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/image-popover/image-input-form.tsx"],"sourcesContent":["'use client';\n\nimport { CornerDownLeft, Trash2 } from 'lucide-react';\nimport { useCallback, useEffect, useState } from 'react';\n\nimport { Button } from '../ui/button.js';\nimport { Input } from '../ui/input.js';\nimport { Separator } from '../ui/separator.js';\n\nexport interface ImageInputFormProps {\n\tinitialUrl?: string;\n\tinitialAlt?: string;\n\tshowRemove?: boolean;\n\tonSubmit: (values: { url: string; alt: string }) => void;\n\tonRemove?: () => void;\n\tonCancel?: () => void;\n}\n\nexport function ImageInputForm({\n\tinitialUrl = '',\n\tinitialAlt = '',\n\tshowRemove = false,\n\tonSubmit,\n\tonRemove,\n\tonCancel\n}: ImageInputFormProps) {\n\tconst [url, setUrl] = useState(initialUrl);\n\tconst [alt, setAlt] = useState(initialAlt);\n\n\tuseEffect(() => {\n\t\tsetUrl(initialUrl);\n\t}, [initialUrl]);\n\n\tuseEffect(() => {\n\t\tsetAlt(initialAlt);\n\t}, [initialAlt]);\n\n\tconst submit = useCallback(() => {\n\t\tonSubmit({ url, alt });\n\t}, [url, alt, onSubmit]);\n\n\tconst handleKeyDown = useCallback(\n\t\t(event: React.KeyboardEvent<HTMLInputElement>) => {\n\t\t\tif (event.key === 'Enter') {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tsubmit();\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (event.key === 'Escape' && onCancel) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tonCancel();\n\t\t\t}\n\t\t},\n\t\t[submit, onCancel]\n\t);\n\n\tconst submitDisabled = !url && !showRemove;\n\n\treturn (\n\t\t<div className=\"nt:flex nt:w-72 nt:flex-col nt:gap-1 nt:p-1\">\n\t\t\t<Input\n\t\t\t\tautoFocus\n\t\t\t\tclassName=\"nt:h-7 nt:border-none nt:shadow-none nt:focus-visible:ring-0\"\n\t\t\t\tplaceholder=\"Paste image URL...\"\n\t\t\t\ttype=\"url\"\n\t\t\t\tvalue={url}\n\t\t\t\tonChange={(e) => setUrl(e.target.value)}\n\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t/>\n\t\t\t<Input\n\t\t\t\tclassName=\"nt:h-7 nt:border-none nt:shadow-none nt:focus-visible:ring-0\"\n\t\t\t\tplaceholder=\"Alt text (optional)\"\n\t\t\t\ttype=\"text\"\n\t\t\t\tvalue={alt}\n\t\t\t\tonChange={(e) => setAlt(e.target.value)}\n\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t/>\n\t\t\t<div className=\"nt:flex nt:items-center nt:justify-end nt:gap-1\">\n\t\t\t\t<Button\n\t\t\t\t\taria-label=\"Apply image\"\n\t\t\t\t\tdisabled={submitDisabled}\n\t\t\t\t\tsize=\"icon-sm\"\n\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\tonClick={submit}\n\t\t\t\t>\n\t\t\t\t\t<CornerDownLeft />\n\t\t\t\t</Button>\n\t\t\t\t{showRemove && onRemove && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<Separator className=\"nt:h-5\" orientation=\"vertical\" />\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\taria-label=\"Remove image\"\n\t\t\t\t\t\t\tsize=\"icon-sm\"\n\t\t\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\tonClick={onRemove}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Trash2 />\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,0BAAuC;AACvC,mBAAiD;AAEjD,oBAAuB;AACvB,mBAAsB;AACtB,uBAA0B;AAuDvB;AA5CI,SAAS,eAAe;AAAA,EAC9B,aAAa;AAAA,EACb,aAAa;AAAA,EACb,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA;AACD,GAAwB;AACvB,QAAM,CAAC,KAAK,MAAM,QAAI,uBAAS,UAAU;AACzC,QAAM,CAAC,KAAK,MAAM,QAAI,uBAAS,UAAU;AAEzC,8BAAU,MAAM;AACf,WAAO,UAAU;AAAA,EAClB,GAAG,CAAC,UAAU,CAAC;AAEf,8BAAU,MAAM;AACf,WAAO,UAAU;AAAA,EAClB,GAAG,CAAC,UAAU,CAAC;AAEf,QAAM,aAAS,0BAAY,MAAM;AAChC,aAAS,EAAE,KAAK,IAAI,CAAC;AAAA,EACtB,GAAG,CAAC,KAAK,KAAK,QAAQ,CAAC;AAEvB,QAAM,oBAAgB;AAAA,IACrB,CAAC,UAAiD;AACjD,UAAI,MAAM,QAAQ,SAAS;AAC1B,cAAM,eAAe;AACrB,eAAO;AAEP;AAAA,MACD;AAEA,UAAI,MAAM,QAAQ,YAAY,UAAU;AACvC,cAAM,eAAe;AACrB,iBAAS;AAAA,MACV;AAAA,IACD;AAAA,IACA,CAAC,QAAQ,QAAQ;AAAA,EAClB;AAEA,QAAM,iBAAiB,CAAC,OAAO,CAAC;AAEhC,SACC,6CAAC,SAAI,WAAU,+CACd;AAAA;AAAA,MAAC;AAAA;AAAA,QACA,WAAS;AAAA,QACT,WAAU;AAAA,QACV,aAAY;AAAA,QACZ,MAAK;AAAA,QACL,OAAO;AAAA,QACP,UAAU,CAAC,MAAM,OAAO,EAAE,OAAO,KAAK;AAAA,QACtC,WAAW;AAAA;AAAA,IACZ;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACA,WAAU;AAAA,QACV,aAAY;AAAA,QACZ,MAAK;AAAA,QACL,OAAO;AAAA,QACP,UAAU,CAAC,MAAM,OAAO,EAAE,OAAO,KAAK;AAAA,QACtC,WAAW;AAAA;AAAA,IACZ;AAAA,IACA,6CAAC,SAAI,WAAU,mDACd;AAAA;AAAA,QAAC;AAAA;AAAA,UACA,cAAW;AAAA,UACX,UAAU;AAAA,UACV,MAAK;AAAA,UACL,UAAU;AAAA,UACV,MAAK;AAAA,UACL,SAAQ;AAAA,UACR,SAAS;AAAA,UAET,sDAAC,sCAAe;AAAA;AAAA,MACjB;AAAA,MACC,cAAc,YACd,4EACC;AAAA,oDAAC,8BAAU,WAAU,UAAS,aAAY,YAAW;AAAA,QACrD;AAAA,UAAC;AAAA;AAAA,YACA,cAAW;AAAA,YACX,MAAK;AAAA,YACL,UAAU;AAAA,YACV,MAAK;AAAA,YACL,SAAQ;AAAA,YACR,SAAS;AAAA,YAET,sDAAC,8BAAO;AAAA;AAAA,QACT;AAAA,SACD;AAAA,OAEF;AAAA,KACD;AAEF;","names":[]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
|
|
3
|
+
interface ImageInputFormProps {
|
|
4
|
+
initialUrl?: string;
|
|
5
|
+
initialAlt?: string;
|
|
6
|
+
showRemove?: boolean;
|
|
7
|
+
onSubmit: (values: {
|
|
8
|
+
url: string;
|
|
9
|
+
alt: string;
|
|
10
|
+
}) => void;
|
|
11
|
+
onRemove?: () => void;
|
|
12
|
+
onCancel?: () => void;
|
|
13
|
+
}
|
|
14
|
+
declare function ImageInputForm({ initialUrl, initialAlt, showRemove, onSubmit, onRemove, onCancel }: ImageInputFormProps): react_jsx_runtime.JSX.Element;
|
|
15
|
+
|
|
16
|
+
export { ImageInputForm, type ImageInputFormProps };
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
|
|
3
|
+
interface ImageInputFormProps {
|
|
4
|
+
initialUrl?: string;
|
|
5
|
+
initialAlt?: string;
|
|
6
|
+
showRemove?: boolean;
|
|
7
|
+
onSubmit: (values: {
|
|
8
|
+
url: string;
|
|
9
|
+
alt: string;
|
|
10
|
+
}) => void;
|
|
11
|
+
onRemove?: () => void;
|
|
12
|
+
onCancel?: () => void;
|
|
13
|
+
}
|
|
14
|
+
declare function ImageInputForm({ initialUrl, initialAlt, showRemove, onSubmit, onRemove, onCancel }: ImageInputFormProps): react_jsx_runtime.JSX.Element;
|
|
15
|
+
|
|
16
|
+
export { ImageInputForm, type ImageInputFormProps };
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// src/components/image-popover/image-input-form.tsx
|
|
4
|
+
import { CornerDownLeft, Trash2 } from "lucide-react";
|
|
5
|
+
import { useCallback, useEffect, useState } from "react";
|
|
6
|
+
import { Button } from "../ui/button.mjs";
|
|
7
|
+
import { Input } from "../ui/input.mjs";
|
|
8
|
+
import { Separator } from "../ui/separator.mjs";
|
|
9
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
10
|
+
function ImageInputForm({
|
|
11
|
+
initialUrl = "",
|
|
12
|
+
initialAlt = "",
|
|
13
|
+
showRemove = false,
|
|
14
|
+
onSubmit,
|
|
15
|
+
onRemove,
|
|
16
|
+
onCancel
|
|
17
|
+
}) {
|
|
18
|
+
const [url, setUrl] = useState(initialUrl);
|
|
19
|
+
const [alt, setAlt] = useState(initialAlt);
|
|
20
|
+
useEffect(() => {
|
|
21
|
+
setUrl(initialUrl);
|
|
22
|
+
}, [initialUrl]);
|
|
23
|
+
useEffect(() => {
|
|
24
|
+
setAlt(initialAlt);
|
|
25
|
+
}, [initialAlt]);
|
|
26
|
+
const submit = useCallback(() => {
|
|
27
|
+
onSubmit({ url, alt });
|
|
28
|
+
}, [url, alt, onSubmit]);
|
|
29
|
+
const handleKeyDown = useCallback(
|
|
30
|
+
(event) => {
|
|
31
|
+
if (event.key === "Enter") {
|
|
32
|
+
event.preventDefault();
|
|
33
|
+
submit();
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
if (event.key === "Escape" && onCancel) {
|
|
37
|
+
event.preventDefault();
|
|
38
|
+
onCancel();
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
[submit, onCancel]
|
|
42
|
+
);
|
|
43
|
+
const submitDisabled = !url && !showRemove;
|
|
44
|
+
return /* @__PURE__ */ jsxs("div", { className: "nt:flex nt:w-72 nt:flex-col nt:gap-1 nt:p-1", children: [
|
|
45
|
+
/* @__PURE__ */ jsx(
|
|
46
|
+
Input,
|
|
47
|
+
{
|
|
48
|
+
autoFocus: true,
|
|
49
|
+
className: "nt:h-7 nt:border-none nt:shadow-none nt:focus-visible:ring-0",
|
|
50
|
+
placeholder: "Paste image URL...",
|
|
51
|
+
type: "url",
|
|
52
|
+
value: url,
|
|
53
|
+
onChange: (e) => setUrl(e.target.value),
|
|
54
|
+
onKeyDown: handleKeyDown
|
|
55
|
+
}
|
|
56
|
+
),
|
|
57
|
+
/* @__PURE__ */ jsx(
|
|
58
|
+
Input,
|
|
59
|
+
{
|
|
60
|
+
className: "nt:h-7 nt:border-none nt:shadow-none nt:focus-visible:ring-0",
|
|
61
|
+
placeholder: "Alt text (optional)",
|
|
62
|
+
type: "text",
|
|
63
|
+
value: alt,
|
|
64
|
+
onChange: (e) => setAlt(e.target.value),
|
|
65
|
+
onKeyDown: handleKeyDown
|
|
66
|
+
}
|
|
67
|
+
),
|
|
68
|
+
/* @__PURE__ */ jsxs("div", { className: "nt:flex nt:items-center nt:justify-end nt:gap-1", children: [
|
|
69
|
+
/* @__PURE__ */ jsx(
|
|
70
|
+
Button,
|
|
71
|
+
{
|
|
72
|
+
"aria-label": "Apply image",
|
|
73
|
+
disabled: submitDisabled,
|
|
74
|
+
size: "icon-sm",
|
|
75
|
+
tabIndex: -1,
|
|
76
|
+
type: "button",
|
|
77
|
+
variant: "ghost",
|
|
78
|
+
onClick: submit,
|
|
79
|
+
children: /* @__PURE__ */ jsx(CornerDownLeft, {})
|
|
80
|
+
}
|
|
81
|
+
),
|
|
82
|
+
showRemove && onRemove && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
83
|
+
/* @__PURE__ */ jsx(Separator, { className: "nt:h-5", orientation: "vertical" }),
|
|
84
|
+
/* @__PURE__ */ jsx(
|
|
85
|
+
Button,
|
|
86
|
+
{
|
|
87
|
+
"aria-label": "Remove image",
|
|
88
|
+
size: "icon-sm",
|
|
89
|
+
tabIndex: -1,
|
|
90
|
+
type: "button",
|
|
91
|
+
variant: "ghost",
|
|
92
|
+
onClick: onRemove,
|
|
93
|
+
children: /* @__PURE__ */ jsx(Trash2, {})
|
|
94
|
+
}
|
|
95
|
+
)
|
|
96
|
+
] })
|
|
97
|
+
] })
|
|
98
|
+
] });
|
|
99
|
+
}
|
|
100
|
+
export {
|
|
101
|
+
ImageInputForm
|
|
102
|
+
};
|
|
103
|
+
//# sourceMappingURL=image-input-form.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/image-popover/image-input-form.tsx"],"sourcesContent":["'use client';\n\nimport { CornerDownLeft, Trash2 } from 'lucide-react';\nimport { useCallback, useEffect, useState } from 'react';\n\nimport { Button } from '../ui/button.js';\nimport { Input } from '../ui/input.js';\nimport { Separator } from '../ui/separator.js';\n\nexport interface ImageInputFormProps {\n\tinitialUrl?: string;\n\tinitialAlt?: string;\n\tshowRemove?: boolean;\n\tonSubmit: (values: { url: string; alt: string }) => void;\n\tonRemove?: () => void;\n\tonCancel?: () => void;\n}\n\nexport function ImageInputForm({\n\tinitialUrl = '',\n\tinitialAlt = '',\n\tshowRemove = false,\n\tonSubmit,\n\tonRemove,\n\tonCancel\n}: ImageInputFormProps) {\n\tconst [url, setUrl] = useState(initialUrl);\n\tconst [alt, setAlt] = useState(initialAlt);\n\n\tuseEffect(() => {\n\t\tsetUrl(initialUrl);\n\t}, [initialUrl]);\n\n\tuseEffect(() => {\n\t\tsetAlt(initialAlt);\n\t}, [initialAlt]);\n\n\tconst submit = useCallback(() => {\n\t\tonSubmit({ url, alt });\n\t}, [url, alt, onSubmit]);\n\n\tconst handleKeyDown = useCallback(\n\t\t(event: React.KeyboardEvent<HTMLInputElement>) => {\n\t\t\tif (event.key === 'Enter') {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tsubmit();\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (event.key === 'Escape' && onCancel) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tonCancel();\n\t\t\t}\n\t\t},\n\t\t[submit, onCancel]\n\t);\n\n\tconst submitDisabled = !url && !showRemove;\n\n\treturn (\n\t\t<div className=\"nt:flex nt:w-72 nt:flex-col nt:gap-1 nt:p-1\">\n\t\t\t<Input\n\t\t\t\tautoFocus\n\t\t\t\tclassName=\"nt:h-7 nt:border-none nt:shadow-none nt:focus-visible:ring-0\"\n\t\t\t\tplaceholder=\"Paste image URL...\"\n\t\t\t\ttype=\"url\"\n\t\t\t\tvalue={url}\n\t\t\t\tonChange={(e) => setUrl(e.target.value)}\n\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t/>\n\t\t\t<Input\n\t\t\t\tclassName=\"nt:h-7 nt:border-none nt:shadow-none nt:focus-visible:ring-0\"\n\t\t\t\tplaceholder=\"Alt text (optional)\"\n\t\t\t\ttype=\"text\"\n\t\t\t\tvalue={alt}\n\t\t\t\tonChange={(e) => setAlt(e.target.value)}\n\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t/>\n\t\t\t<div className=\"nt:flex nt:items-center nt:justify-end nt:gap-1\">\n\t\t\t\t<Button\n\t\t\t\t\taria-label=\"Apply image\"\n\t\t\t\t\tdisabled={submitDisabled}\n\t\t\t\t\tsize=\"icon-sm\"\n\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\tonClick={submit}\n\t\t\t\t>\n\t\t\t\t\t<CornerDownLeft />\n\t\t\t\t</Button>\n\t\t\t\t{showRemove && onRemove && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<Separator className=\"nt:h-5\" orientation=\"vertical\" />\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\taria-label=\"Remove image\"\n\t\t\t\t\t\t\tsize=\"icon-sm\"\n\t\t\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\tonClick={onRemove}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Trash2 />\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n"],"mappings":";;;AAEA,SAAS,gBAAgB,cAAc;AACvC,SAAS,aAAa,WAAW,gBAAgB;AAEjD,SAAS,cAAc;AACvB,SAAS,aAAa;AACtB,SAAS,iBAAiB;AAuDvB,SA8BE,UA9BF,KA8BE,YA9BF;AA5CI,SAAS,eAAe;AAAA,EAC9B,aAAa;AAAA,EACb,aAAa;AAAA,EACb,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA;AACD,GAAwB;AACvB,QAAM,CAAC,KAAK,MAAM,IAAI,SAAS,UAAU;AACzC,QAAM,CAAC,KAAK,MAAM,IAAI,SAAS,UAAU;AAEzC,YAAU,MAAM;AACf,WAAO,UAAU;AAAA,EAClB,GAAG,CAAC,UAAU,CAAC;AAEf,YAAU,MAAM;AACf,WAAO,UAAU;AAAA,EAClB,GAAG,CAAC,UAAU,CAAC;AAEf,QAAM,SAAS,YAAY,MAAM;AAChC,aAAS,EAAE,KAAK,IAAI,CAAC;AAAA,EACtB,GAAG,CAAC,KAAK,KAAK,QAAQ,CAAC;AAEvB,QAAM,gBAAgB;AAAA,IACrB,CAAC,UAAiD;AACjD,UAAI,MAAM,QAAQ,SAAS;AAC1B,cAAM,eAAe;AACrB,eAAO;AAEP;AAAA,MACD;AAEA,UAAI,MAAM,QAAQ,YAAY,UAAU;AACvC,cAAM,eAAe;AACrB,iBAAS;AAAA,MACV;AAAA,IACD;AAAA,IACA,CAAC,QAAQ,QAAQ;AAAA,EAClB;AAEA,QAAM,iBAAiB,CAAC,OAAO,CAAC;AAEhC,SACC,qBAAC,SAAI,WAAU,+CACd;AAAA;AAAA,MAAC;AAAA;AAAA,QACA,WAAS;AAAA,QACT,WAAU;AAAA,QACV,aAAY;AAAA,QACZ,MAAK;AAAA,QACL,OAAO;AAAA,QACP,UAAU,CAAC,MAAM,OAAO,EAAE,OAAO,KAAK;AAAA,QACtC,WAAW;AAAA;AAAA,IACZ;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACA,WAAU;AAAA,QACV,aAAY;AAAA,QACZ,MAAK;AAAA,QACL,OAAO;AAAA,QACP,UAAU,CAAC,MAAM,OAAO,EAAE,OAAO,KAAK;AAAA,QACtC,WAAW;AAAA;AAAA,IACZ;AAAA,IACA,qBAAC,SAAI,WAAU,mDACd;AAAA;AAAA,QAAC;AAAA;AAAA,UACA,cAAW;AAAA,UACX,UAAU;AAAA,UACV,MAAK;AAAA,UACL,UAAU;AAAA,UACV,MAAK;AAAA,UACL,SAAQ;AAAA,UACR,SAAS;AAAA,UAET,8BAAC,kBAAe;AAAA;AAAA,MACjB;AAAA,MACC,cAAc,YACd,iCACC;AAAA,4BAAC,aAAU,WAAU,UAAS,aAAY,YAAW;AAAA,QACrD;AAAA,UAAC;AAAA;AAAA,YACA,cAAW;AAAA,YACX,MAAK;AAAA,YACL,UAAU;AAAA,YACV,MAAK;AAAA,YACL,SAAQ;AAAA,YACR,SAAS;AAAA,YAET,8BAAC,UAAO;AAAA;AAAA,QACT;AAAA,SACD;AAAA,OAEF;AAAA,KACD;AAEF;","names":[]}
|
|
@@ -17,55 +17,49 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
17
17
|
return to;
|
|
18
18
|
};
|
|
19
19
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
20
|
+
|
|
21
|
+
// src/components/image-popover/image-popover.tsx
|
|
20
22
|
var image_popover_exports = {};
|
|
21
23
|
__export(image_popover_exports, {
|
|
22
24
|
ImagePopover: () => ImagePopover
|
|
23
25
|
});
|
|
24
26
|
module.exports = __toCommonJS(image_popover_exports);
|
|
25
|
-
var import_jsx_runtime = require("react/jsx-runtime");
|
|
26
27
|
var import_lucide_react = require("lucide-react");
|
|
27
28
|
var import_react = require("react");
|
|
28
|
-
var
|
|
29
|
-
var
|
|
30
|
-
var
|
|
31
|
-
var import_popover = require("../ui/popover");
|
|
32
|
-
var
|
|
33
|
-
|
|
29
|
+
var import_image_input_form = require("./image-input-form.cjs");
|
|
30
|
+
var import_use_image_popover = require("./use-image-popover.cjs");
|
|
31
|
+
var import_button = require("../ui/button.cjs");
|
|
32
|
+
var import_popover = require("../ui/popover.cjs");
|
|
33
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
34
|
+
var ImagePopover = (0, import_react.forwardRef)(
|
|
34
35
|
({ editor, ...buttonProps }, ref) => {
|
|
35
36
|
const [isOpen, setIsOpen] = (0, import_react.useState)(false);
|
|
36
|
-
const {
|
|
37
|
-
url,
|
|
38
|
-
setUrl,
|
|
39
|
-
alt,
|
|
40
|
-
setAlt,
|
|
41
|
-
isActive,
|
|
42
|
-
canSet,
|
|
43
|
-
setImage,
|
|
44
|
-
removeImage,
|
|
45
|
-
wasSelectionMove
|
|
46
|
-
} = (0, import_use_image_popover.useImagePopover)({ editor });
|
|
37
|
+
const { url, alt, isActive, canSet, removeImage, wasSelectionMove } = (0, import_use_image_popover.useImagePopover)({ editor });
|
|
47
38
|
(0, import_react.useEffect)(() => {
|
|
48
39
|
if (isActive && wasSelectionMove) {
|
|
49
40
|
setIsOpen(true);
|
|
50
41
|
}
|
|
51
42
|
}, [isActive, wasSelectionMove]);
|
|
52
|
-
const
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
}, [removeImage]);
|
|
60
|
-
const handleKeyDown = (0, import_react.useCallback)(
|
|
61
|
-
(event) => {
|
|
62
|
-
if (event.key === "Enter") {
|
|
63
|
-
event.preventDefault();
|
|
64
|
-
handleSetImage();
|
|
43
|
+
const handleSubmit = (0, import_react.useCallback)(
|
|
44
|
+
(values) => {
|
|
45
|
+
if (!editor) return;
|
|
46
|
+
if (!values.url) {
|
|
47
|
+
if (isActive) removeImage();
|
|
48
|
+
setIsOpen(false);
|
|
49
|
+
return;
|
|
65
50
|
}
|
|
51
|
+
editor.chain().focus().setImage({
|
|
52
|
+
src: values.url,
|
|
53
|
+
alt: values.alt || void 0
|
|
54
|
+
}).run();
|
|
55
|
+
setIsOpen(false);
|
|
66
56
|
},
|
|
67
|
-
[
|
|
57
|
+
[editor, isActive, removeImage]
|
|
68
58
|
);
|
|
59
|
+
const handleRemove = (0, import_react.useCallback)(() => {
|
|
60
|
+
removeImage();
|
|
61
|
+
setIsOpen(false);
|
|
62
|
+
}, [removeImage]);
|
|
69
63
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_popover.Popover, { open: isOpen, onOpenChange: setIsOpen, children: [
|
|
70
64
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_popover.PopoverTrigger, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
71
65
|
import_button.Button,
|
|
@@ -88,68 +82,17 @@ const ImagePopover = (0, import_react.forwardRef)(
|
|
|
88
82
|
)
|
|
89
83
|
}
|
|
90
84
|
) }),
|
|
91
|
-
/* @__PURE__ */ (0, import_jsx_runtime.
|
|
92
|
-
|
|
85
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_popover.PopoverContent, { align: "start", className: "nt:w-auto nt:p-0", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
86
|
+
import_image_input_form.ImageInputForm,
|
|
93
87
|
{
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
autoFocus: true,
|
|
101
|
-
className: "nt:h-7 nt:border-none nt:shadow-none nt:focus-visible:ring-0",
|
|
102
|
-
placeholder: "Paste image URL...",
|
|
103
|
-
type: "url",
|
|
104
|
-
value: url,
|
|
105
|
-
onChange: (e) => setUrl(e.target.value),
|
|
106
|
-
onKeyDown: handleKeyDown
|
|
107
|
-
}
|
|
108
|
-
),
|
|
109
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
110
|
-
import_input.Input,
|
|
111
|
-
{
|
|
112
|
-
className: "nt:h-7 nt:border-none nt:shadow-none nt:focus-visible:ring-0",
|
|
113
|
-
placeholder: "Alt text (optional)",
|
|
114
|
-
type: "text",
|
|
115
|
-
value: alt,
|
|
116
|
-
onChange: (e) => setAlt(e.target.value),
|
|
117
|
-
onKeyDown: handleKeyDown
|
|
118
|
-
}
|
|
119
|
-
),
|
|
120
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "nt:flex nt:items-center nt:justify-end nt:gap-1", children: [
|
|
121
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
122
|
-
import_button.Button,
|
|
123
|
-
{
|
|
124
|
-
"aria-label": "Apply image",
|
|
125
|
-
disabled: !url && !isActive,
|
|
126
|
-
size: "icon-sm",
|
|
127
|
-
tabIndex: -1,
|
|
128
|
-
type: "button",
|
|
129
|
-
variant: "ghost",
|
|
130
|
-
onClick: handleSetImage,
|
|
131
|
-
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.CornerDownLeft, {})
|
|
132
|
-
}
|
|
133
|
-
),
|
|
134
|
-
isActive && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
|
|
135
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_separator.Separator, { className: "nt:h-5", orientation: "vertical" }),
|
|
136
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
137
|
-
import_button.Button,
|
|
138
|
-
{
|
|
139
|
-
"aria-label": "Remove image",
|
|
140
|
-
size: "icon-sm",
|
|
141
|
-
tabIndex: -1,
|
|
142
|
-
type: "button",
|
|
143
|
-
variant: "ghost",
|
|
144
|
-
onClick: handleRemoveImage,
|
|
145
|
-
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Trash2, {})
|
|
146
|
-
}
|
|
147
|
-
)
|
|
148
|
-
] })
|
|
149
|
-
] })
|
|
150
|
-
]
|
|
88
|
+
initialAlt: alt,
|
|
89
|
+
initialUrl: url,
|
|
90
|
+
showRemove: isActive,
|
|
91
|
+
onCancel: () => setIsOpen(false),
|
|
92
|
+
onRemove: handleRemove,
|
|
93
|
+
onSubmit: handleSubmit
|
|
151
94
|
}
|
|
152
|
-
)
|
|
95
|
+
) })
|
|
153
96
|
] });
|
|
154
97
|
}
|
|
155
98
|
);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/image-popover/image-popover.tsx"],"sourcesContent":["'use client';\n\nimport {
|
|
1
|
+
{"version":3,"sources":["../../../src/components/image-popover/image-popover.tsx"],"sourcesContent":["'use client';\n\nimport { ImageIcon } from 'lucide-react';\nimport { forwardRef, useCallback, useEffect, useState } from 'react';\n\nimport { ImageInputForm } from './image-input-form.js';\nimport { useImagePopover } from './use-image-popover.js';\nimport { Button } from '../ui/button.js';\nimport { Popover, PopoverContent, PopoverTrigger } from '../ui/popover.js';\n\nimport type { Editor } from '@tiptap/core';\n\nexport interface ImagePopoverProps extends Omit<\n\tReact.ButtonHTMLAttributes<HTMLButtonElement>,\n\t'type'\n> {\n\teditor: Editor | null;\n}\n\nexport const ImagePopover = forwardRef<HTMLButtonElement, ImagePopoverProps>(\n\t({ editor, ...buttonProps }, ref) => {\n\t\tconst [isOpen, setIsOpen] = useState(false);\n\n\t\tconst { url, alt, isActive, canSet, removeImage, wasSelectionMove } =\n\t\t\tuseImagePopover({ editor });\n\n\t\tuseEffect(() => {\n\t\t\tif (isActive && wasSelectionMove) {\n\t\t\t\tsetIsOpen(true);\n\t\t\t}\n\t\t}, [isActive, wasSelectionMove]);\n\n\t\t// Bypass useImagePopover.setImage — it reads url/alt from hook state,\n\t\t// which lags behind the form values when called synchronously after the\n\t\t// hook's setUrl/setAlt setters. Submit values directly to the editor.\n\t\tconst handleSubmit = useCallback(\n\t\t\t(values: { url: string; alt: string }) => {\n\t\t\t\tif (!editor) return;\n\n\t\t\t\tif (!values.url) {\n\t\t\t\t\tif (isActive) removeImage();\n\n\t\t\t\t\tsetIsOpen(false);\n\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\teditor\n\t\t\t\t\t.chain()\n\t\t\t\t\t.focus()\n\t\t\t\t\t.setImage({\n\t\t\t\t\t\tsrc: values.url,\n\t\t\t\t\t\talt: values.alt || undefined\n\t\t\t\t\t})\n\t\t\t\t\t.run();\n\t\t\t\tsetIsOpen(false);\n\t\t\t},\n\t\t\t[editor, isActive, removeImage]\n\t\t);\n\n\t\tconst handleRemove = useCallback(() => {\n\t\t\tremoveImage();\n\t\t\tsetIsOpen(false);\n\t\t}, [removeImage]);\n\n\t\treturn (\n\t\t\t<Popover open={isOpen} onOpenChange={setIsOpen}>\n\t\t\t\t<PopoverTrigger asChild>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tref={ref}\n\t\t\t\t\t\taria-label=\"Image\"\n\t\t\t\t\t\taria-pressed={isActive}\n\t\t\t\t\t\tdata-active-state={isActive ? 'on' : 'off'}\n\t\t\t\t\t\tdisabled={!canSet}\n\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t{...buttonProps}\n\t\t\t\t\t>\n\t\t\t\t\t\t<ImageIcon\n\t\t\t\t\t\t\tclassName={\n\t\t\t\t\t\t\t\tisActive ? 'nt:text-[var(--tt-brand-color-500)]' : undefined\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</Button>\n\t\t\t\t</PopoverTrigger>\n\t\t\t\t<PopoverContent align=\"start\" className=\"nt:w-auto nt:p-0\">\n\t\t\t\t\t<ImageInputForm\n\t\t\t\t\t\tinitialAlt={alt}\n\t\t\t\t\t\tinitialUrl={url}\n\t\t\t\t\t\tshowRemove={isActive}\n\t\t\t\t\t\tonCancel={() => setIsOpen(false)}\n\t\t\t\t\t\tonRemove={handleRemove}\n\t\t\t\t\t\tonSubmit={handleSubmit}\n\t\t\t\t\t/>\n\t\t\t\t</PopoverContent>\n\t\t\t</Popover>\n\t\t);\n\t}\n);\n\nImagePopover.displayName = 'ImagePopover';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,0BAA0B;AAC1B,mBAA6D;AAE7D,8BAA+B;AAC/B,+BAAgC;AAChC,oBAAuB;AACvB,qBAAwD;AA0DrD;AA/CI,IAAM,mBAAe;AAAA,EAC3B,CAAC,EAAE,QAAQ,GAAG,YAAY,GAAG,QAAQ;AACpC,UAAM,CAAC,QAAQ,SAAS,QAAI,uBAAS,KAAK;AAE1C,UAAM,EAAE,KAAK,KAAK,UAAU,QAAQ,aAAa,iBAAiB,QACjE,0CAAgB,EAAE,OAAO,CAAC;AAE3B,gCAAU,MAAM;AACf,UAAI,YAAY,kBAAkB;AACjC,kBAAU,IAAI;AAAA,MACf;AAAA,IACD,GAAG,CAAC,UAAU,gBAAgB,CAAC;AAK/B,UAAM,mBAAe;AAAA,MACpB,CAAC,WAAyC;AACzC,YAAI,CAAC,OAAQ;AAEb,YAAI,CAAC,OAAO,KAAK;AAChB,cAAI,SAAU,aAAY;AAE1B,oBAAU,KAAK;AAEf;AAAA,QACD;AAEA,eACE,MAAM,EACN,MAAM,EACN,SAAS;AAAA,UACT,KAAK,OAAO;AAAA,UACZ,KAAK,OAAO,OAAO;AAAA,QACpB,CAAC,EACA,IAAI;AACN,kBAAU,KAAK;AAAA,MAChB;AAAA,MACA,CAAC,QAAQ,UAAU,WAAW;AAAA,IAC/B;AAEA,UAAM,mBAAe,0BAAY,MAAM;AACtC,kBAAY;AACZ,gBAAU,KAAK;AAAA,IAChB,GAAG,CAAC,WAAW,CAAC;AAEhB,WACC,6CAAC,0BAAQ,MAAM,QAAQ,cAAc,WACpC;AAAA,kDAAC,iCAAe,SAAO,MACtB;AAAA,QAAC;AAAA;AAAA,UACA;AAAA,UACA,cAAW;AAAA,UACX,gBAAc;AAAA,UACd,qBAAmB,WAAW,OAAO;AAAA,UACrC,UAAU,CAAC;AAAA,UACX,MAAK;AAAA,UACL,UAAU;AAAA,UACV,MAAK;AAAA,UACL,SAAQ;AAAA,UACP,GAAG;AAAA,UAEJ;AAAA,YAAC;AAAA;AAAA,cACA,WACC,WAAW,wCAAwC;AAAA;AAAA,UAErD;AAAA;AAAA,MACD,GACD;AAAA,MACA,4CAAC,iCAAe,OAAM,SAAQ,WAAU,oBACvC;AAAA,QAAC;AAAA;AAAA,UACA,YAAY;AAAA,UACZ,YAAY;AAAA,UACZ,YAAY;AAAA,UACZ,UAAU,MAAM,UAAU,KAAK;AAAA,UAC/B,UAAU;AAAA,UACV,UAAU;AAAA;AAAA,MACX,GACD;AAAA,OACD;AAAA,EAEF;AACD;AAEA,aAAa,cAAc;","names":[]}
|