pillardash-ui-react 0.1.152 → 0.1.154

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (27) hide show
  1. package/dist/cjs/components/Form/TextEditor/ImagePopover.js +1 -1
  2. package/dist/cjs/components/Form/TextEditor/ImagePopover.js.map +1 -1
  3. package/dist/cjs/components/Form/TextEditor/LinkPopover.js +1 -1
  4. package/dist/cjs/components/Form/TextEditor/LinkPopover.js.map +1 -1
  5. package/dist/cjs/components/Form/TextEditor/TextEditor.js +1 -1
  6. package/dist/cjs/components/Form/TextEditor/TextEditor.js.map +1 -1
  7. package/dist/cjs/components/Form/TextEditor/ToolbarGroups.js +1 -1
  8. package/dist/cjs/components/Form/TextEditor/ToolbarGroups.js.map +1 -1
  9. package/dist/cjs/components/Form/TextEditor/extensions.js +1 -1
  10. package/dist/cjs/components/Form/TextEditor/extensions.js.map +1 -1
  11. package/dist/cjs/components/Form/TextEditor/toolbar.js +1 -1
  12. package/dist/cjs/components/Form/TextEditor/toolbar.js.map +1 -1
  13. package/dist/esm/components/Form/TextEditor/ImagePopover.mjs +1 -1
  14. package/dist/esm/components/Form/TextEditor/ImagePopover.mjs.map +1 -1
  15. package/dist/esm/components/Form/TextEditor/LinkPopover.mjs +1 -1
  16. package/dist/esm/components/Form/TextEditor/LinkPopover.mjs.map +1 -1
  17. package/dist/esm/components/Form/TextEditor/TextEditor.mjs +1 -1
  18. package/dist/esm/components/Form/TextEditor/TextEditor.mjs.map +1 -1
  19. package/dist/esm/components/Form/TextEditor/ToolbarGroups.mjs +1 -1
  20. package/dist/esm/components/Form/TextEditor/ToolbarGroups.mjs.map +1 -1
  21. package/dist/esm/components/Form/TextEditor/extensions.mjs +1 -1
  22. package/dist/esm/components/Form/TextEditor/extensions.mjs.map +1 -1
  23. package/dist/esm/components/Form/TextEditor/toolbar.mjs +1 -1
  24. package/dist/esm/components/Form/TextEditor/toolbar.mjs.map +1 -1
  25. package/dist/styles.css +1 -1
  26. package/dist/text-editor.d.ts +6 -1
  27. package/package.json +11 -1
@@ -1 +1 @@
1
- {"version":3,"file":"toolbar.js","sources":["../../../../../src/components/Form/TextEditor/toolbar.tsx"],"sourcesContent":["import React from \"react\";\nimport { Heading1, Heading2, Heading3, SeparatorVertical } from \"lucide-react\";\n\nexport type HeadingLevel = 0 | 1 | 2 | 3;\n\nexport const ToolbarButton: React.FC<{\n onClick: () => void;\n active?: boolean;\n disabled?: boolean;\n title: string;\n children: React.ReactNode;\n ariaPressed?: boolean;\n}> = ({\n onClick,\n active = false,\n disabled = false,\n title,\n children,\n ariaPressed,\n}) => (\n <button\n onClick={onClick}\n className={`p-2 rounded transition-colors ${active ? \"bg-blue-200 text-blue-800\" : \"hover:bg-gray-200\"} ${disabled ? \"opacity-50 cursor-not-allowed\" : \"\"}`}\n type=\"button\"\n disabled={disabled}\n title={title}\n aria-label={title}\n aria-pressed={ariaPressed}\n >\n {children}\n </button>\n);\n\nexport const ToolbarDivider = () => (\n <SeparatorVertical className=\"mx-2 h-6 w-px bg-gray-300\" />\n);\n\nexport const HeadingSelect: React.FC<{\n value: HeadingLevel;\n onChange: (value: HeadingLevel) => void;\n}> = ({ value, onChange }) => (\n <div className=\"flex items-center gap-2\">\n <select\n className=\"rounded border border-gray-300 bg-white px-2 py-1 text-sm\"\n aria-label=\"Heading level\"\n value={value}\n onChange={(e) => onChange(Number(e.target.value) as HeadingLevel)}\n >\n <option value={0}>Normal</option>\n <option value={1} className=\"text-2xl\">\n Heading 1\n </option>\n <option value={2} className=\"text-xl\">\n Heading 2\n </option>\n <option value={3} className=\"text-lg\">\n Heading 3\n </option>\n </select>\n {/*<Heading1 size={14} className=\"text-gray-500\" />\n <Heading2 size={14} className=\"text-gray-500\" />\n <Heading3 size={14} className=\"text-gray-500\" />*/}\n </div>\n);\n"],"names":["_a","value","onChange","_jsx","className","children","_jsxs","e","Number","target","onClick","_b","active","_c","disabled","title","ariaPressed","concat","type","SeparatorVertical"],"mappings":"gGAwCK,SAACA,OAAEC,EAAKD,EAAAC,MAAEC,EAAQF,EAAAE,SAAO,OAC5BC,EAAAA,IAAA,MAAA,CAAKC,UAAU,0BAAyBC,SACtCC,EAAAA,KAAA,SAAA,CACEF,UAAU,4DAA2D,aAC1D,gBACXH,MAAOA,EACPC,SAAU,SAACK,GAAM,OAAAL,EAASM,OAAOD,EAAEE,OAAOR,OAAzB,EAAgDI,SAAA,CAEjEF,EAAAA,IAAA,SAAA,CAAQF,MAAO,EAACI,SAAA,WAChBF,EAAAA,cAAQF,MAAO,EAAGG,UAAU,WAAUC,SAAA,cAGtCF,EAAAA,cAAQF,MAAO,EAAGG,UAAU,UAASC,SAAA,cAGrCF,EAAAA,cAAQF,MAAO,EAAGG,UAAU,UAASC,SAAA,kBAfb,wBA5BzB,SAACL,OACJU,EAAOV,EAAAU,QACPC,EAAAX,EAAAY,OAAAA,OAAM,IAAAD,GAAQA,EACdE,EAAAb,EAAAc,SAAAA,OAAQ,IAAAD,GAAQA,EAChBE,EAAKf,EAAAe,MACLV,EAAQL,EAAAK,SACRW,EAAWhB,EAAAgB,YACP,OACJb,EAAAA,cACEO,QAASA,EACTN,UAAW,iCAAAa,OAAiCL,EAAS,4BAA8B,oBAAmB,KAAAK,OAAIH,EAAW,gCAAkC,IACvJI,KAAK,SACLJ,SAAUA,EACVC,MAAOA,EAAK,aACAA,iBACEC,EAAWX,SAExBA,GAVC,yBAcwB,WAAM,OAClCF,MAACgB,EAAAA,kBAAiB,CAACf,UAAU,6BADK"}
1
+ {"version":3,"file":"toolbar.js","sources":["../../../../../src/components/Form/TextEditor/toolbar.tsx"],"sourcesContent":["import React from \"react\";\nimport { SeparatorVertical } from \"lucide-react\";\n\nexport type HeadingLevel = 0 | 1 | 2 | 3;\n\nexport const ToolbarButton: React.FC<{\n onClick: () => void;\n active?: boolean;\n disabled?: boolean;\n title: string;\n children: React.ReactNode;\n ariaPressed?: boolean;\n className?: string;\n}> = ({\n onClick,\n active = false,\n disabled = false,\n title,\n children,\n ariaPressed,\n className = \"\",\n}) => (\n <button\n onClick={onClick}\n className={`inline-flex h-8 min-w-8 items-center justify-center rounded-md px-2 text-gray-500 transition-colors hover:bg-gray-100 hover:text-gray-900 focus:outline-none focus:ring-2 focus:ring-primary-500/30 focus:ring-offset-1 focus:ring-offset-white dark:text-gray-400 dark:hover:bg-gray-800 dark:hover:text-gray-100 dark:focus:ring-offset-gray-950 ${active ? \"bg-primary-50 text-primary-700 dark:bg-primary-900/40 dark:text-primary-300\" : \"\"} ${disabled ? \"cursor-not-allowed opacity-40 hover:bg-transparent\" : \"\"} ${className}`.trim()}\n type=\"button\"\n disabled={disabled}\n title={title}\n aria-label={title}\n aria-pressed={ariaPressed}\n >\n {children}\n </button>\n);\n\nexport const ToolbarDivider = () => (\n <SeparatorVertical className=\"mx-1 h-5 w-px bg-gray-200 text-transparent dark:bg-gray-800\" />\n);\n\nexport const HeadingSelect: React.FC<{\n value: HeadingLevel;\n onChange: (value: HeadingLevel) => void;\n}> = ({ value, onChange }) => (\n <div className=\"flex items-center gap-2\">\n <select\n className=\"h-8 rounded-md border-0 bg-transparent px-2 text-sm font-medium text-gray-700 outline-none transition-colors hover:bg-gray-100 focus:ring-2 focus:ring-primary-500/30 dark:text-gray-200 dark:hover:bg-gray-800\"\n aria-label=\"Heading level\"\n value={value}\n onChange={(e) => onChange(Number(e.target.value) as HeadingLevel)}\n >\n <option value={0}>Normal</option>\n <option value={1} className=\"text-2xl\">\n Heading 1\n </option>\n <option value={2} className=\"text-xl\">\n Heading 2\n </option>\n <option value={3} className=\"text-lg\">\n Heading 3\n </option>\n </select>\n </div>\n);\n"],"names":["_a","value","onChange","_jsx","className","children","_jsxs","e","Number","target","onClick","_b","active","_c","disabled","title","ariaPressed","_d","concat","trim","type","SeparatorVertical"],"mappings":"gGA0CK,SAACA,OAAEC,EAAKD,EAAAC,MAAEC,EAAQF,EAAAE,SAAO,OAC5BC,EAAAA,IAAA,MAAA,CAAKC,UAAU,0BAAyBC,SACtCC,EAAAA,KAAA,SAAA,CACEF,UAAU,kNAAiN,aAChN,gBACXH,MAAOA,EACPC,SAAU,SAACK,GAAM,OAAAL,EAASM,OAAOD,EAAEE,OAAOR,OAAzB,EAAgDI,SAAA,CAEjEF,EAAAA,IAAA,SAAA,CAAQF,MAAO,EAACI,SAAA,WAChBF,EAAAA,cAAQF,MAAO,EAAGG,UAAU,WAAUC,SAAA,cAGtCF,EAAAA,cAAQF,MAAO,EAAGG,UAAU,UAASC,SAAA,cAGrCF,EAAAA,cAAQF,MAAO,EAAGG,UAAU,UAASC,SAAA,kBAfb,wBA7BzB,SAACL,GACJ,IAAAU,EAAOV,EAAAU,QACPC,EAAAX,EAAAY,OAAAA,OAAM,IAAAD,GAAQA,EACdE,EAAAb,EAAAc,SAAAA,cAAgBD,EAChBE,EAAKf,EAAAe,MACLV,EAAQL,EAAAK,SACRW,EAAWhB,EAAAgB,YACXC,EAAAjB,EAAAI,UAAAA,OAAS,IAAAa,EAAG,GAAEA,EACV,OACJd,EAAAA,IAAA,SAAA,CACEO,QAASA,EACTN,UAAW,sVAAAc,OAAsVN,EAAS,8EAAgF,GAAE,KAAAM,OAAIJ,EAAW,qDAAuD,GAAE,KAAAI,OAAId,GAAYe,OACphBC,KAAK,SACLN,SAAUA,EACVC,MAAOA,EAAK,aACAA,EAAK,eACHC,EAAWX,SAExBA,GAVC,yBAcwB,WAAM,OAClCF,MAACkB,EAAAA,kBAAiB,CAACjB,UAAU,+DADK"}
@@ -1,2 +1,2 @@
1
- import{__awaiter as e,__generator as t}from"../../../node_modules/tslib/tslib.es6.mjs";import{jsxs as r,jsx as n}from"react/jsx-runtime";import a from"react";import{ImagePlus as o}from"lucide-react";import{ToolbarButton as i}from"./toolbar.mjs";var l=function(l){var s=l.editor,u=l.onImageUpload,c=a.useState(!1),d=c[0],m=c[1],f=a.useState(""),b=f[0],g=f[1],p=a.useState(""),v=p[0],h=p[1],x=a.useState(!1),y=x[0],w=x[1],N=a.useRef(null);a.useEffect((function(){if(d){var e=function(e){N.current&&(N.current.contains(e.target)||m(!1))},t=function(e){"Escape"===e.key&&m(!1)};return window.addEventListener("mousedown",e),window.addEventListener("keydown",t),function(){window.removeEventListener("mousedown",e),window.removeEventListener("keydown",t)}}}),[d]);return r("div",{className:"relative",ref:N,children:[n(i,{onClick:function(){return m((function(e){return!e}))},title:"Insert image",children:n(o,{size:16})}),d&&r("div",{className:"absolute left-1/2 z-10 mt-2 w-72 -translate-x-1/2 rounded-lg border border-gray-200 bg-white p-3 shadow-lg",children:[n("label",{className:"mb-1 block text-xs font-medium text-gray-600",children:"Image URL"}),n("input",{className:"mb-2 w-full rounded border border-gray-300 px-2 py-1 text-sm",value:b,onChange:function(e){return g(e.target.value)},placeholder:"https://example.com/image.jpg"}),n("label",{className:"mb-1 block text-xs font-medium text-gray-600",children:"Alt text"}),n("input",{className:"mb-3 w-full rounded border border-gray-300 px-2 py-1 text-sm",value:v,onChange:function(e){return h(e.target.value)},placeholder:"Describe the image"}),n("label",{className:"mb-1 block text-xs font-medium text-gray-600",children:"Upload image"}),n("input",{className:"mb-3 block w-full text-sm text-gray-700 file:mr-3 file:rounded file:border-0 file:bg-gray-100 file:px-3 file:py-1 file:text-sm file:hover:bg-gray-200",type:"file",accept:"image/*",onChange:function(r){return e(void 0,void 0,void 0,(function(){var e,n,a,o;return t(this,(function(t){switch(t.label){case 0:if(!(e=null===(o=r.target.files)||void 0===o?void 0:o[0]))return[2];if(!e.type.startsWith("image/"))return r.target.value="",[2];w(!0),t.label=1;case 1:return t.trys.push([1,,6,7]),n="",u?[4,u(e)]:[3,3];case 2:return a=t.sent(),n=a.url,[3,5];case 3:return[4,new Promise((function(t,r){var n=new FileReader;n.onload=function(){"string"==typeof n.result?t(n.result):r(new Error("Invalid file result"))},n.onerror=function(){var e;return r(null!==(e=n.error)&&void 0!==e?e:new Error("Failed to read file"))},n.readAsDataURL(e)}))];case 4:n=t.sent(),t.label=5;case 5:return s.chain().focus().setImage({src:n,alt:v.trim()||e.name}).run(),m(!1),g(""),h(""),[3,7];case 6:return w(!1),r.target.value="",[7];case 7:return[2]}}))}))},disabled:y}),r("div",{className:"flex gap-2",children:[n("button",{type:"button",className:"rounded bg-gray-100 px-3 py-1 text-sm hover:bg-gray-200",onClick:function(){return m(!1)},children:"Cancel"}),n("button",{type:"button",className:"ml-auto rounded bg-blue-600 px-3 py-1 text-sm text-white hover:bg-blue-700 disabled:cursor-not-allowed disabled:opacity-50",onClick:function(){var e=b.trim();if(e)try{var t=new URL(e.includes(":")?e:"https://".concat(e));if(!["http:","https:"].includes(t.protocol))return;s.chain().focus().setImage({src:t.toString(),alt:v.trim()||void 0}).run(),m(!1),g(""),h("")}catch(e){return}},disabled:y,children:y?"Uploading...":"Insert"})]})]})]})};export{l as default};
1
+ import{__awaiter as e,__generator as r}from"../../../node_modules/tslib/tslib.es6.mjs";import{jsxs as t,jsx as a}from"react/jsx-runtime";import n from"react";import{ImagePlus as l}from"lucide-react";import{ToolbarButton as o}from"./toolbar.mjs";var i=function(i){var d=i.editor,s=i.onImageUpload,u=n.useState(!1),c=u[0],g=u[1],m=n.useState(""),f=m[0],b=m[1],y=n.useState(""),p=y[0],h=y[1],x=n.useState(!1),v=x[0],k=x[1],w=n.useRef(null);n.useEffect((function(){if(c){var e=function(e){w.current&&(w.current.contains(e.target)||g(!1))},r=function(e){"Escape"===e.key&&g(!1)};return window.addEventListener("mousedown",e),window.addEventListener("keydown",r),function(){window.removeEventListener("mousedown",e),window.removeEventListener("keydown",r)}}}),[c]);return t("div",{className:"relative",ref:w,children:[a(o,{onClick:function(){return g((function(e){return!e}))},title:"Insert image",children:a(l,{size:16})}),c&&t("div",{className:"absolute left-1/2 z-10 mt-2 w-72 -translate-x-1/2 rounded-lg border border-gray-200 bg-white p-3 text-gray-700 shadow-lg dark:border-gray-700 dark:bg-gray-900 dark:text-gray-200",children:[a("label",{className:"mb-1 block text-xs font-medium text-gray-600 dark:text-gray-300",children:"Image URL"}),a("input",{className:"mb-2 w-full rounded border border-gray-300 bg-white px-2 py-1 text-sm text-gray-900 placeholder-gray-400 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-100 dark:placeholder-gray-500",value:f,onChange:function(e){return b(e.target.value)},placeholder:"https://example.com/image.jpg"}),a("label",{className:"mb-1 block text-xs font-medium text-gray-600 dark:text-gray-300",children:"Alt text"}),a("input",{className:"mb-3 w-full rounded border border-gray-300 bg-white px-2 py-1 text-sm text-gray-900 placeholder-gray-400 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-100 dark:placeholder-gray-500",value:p,onChange:function(e){return h(e.target.value)},placeholder:"Describe the image"}),a("label",{className:"mb-1 block text-xs font-medium text-gray-600 dark:text-gray-300",children:"Upload image"}),a("input",{className:"mb-3 block w-full text-sm text-gray-700 file:mr-3 file:rounded file:border-0 file:bg-gray-100 file:px-3 file:py-1 file:text-sm file:text-gray-700 file:hover:bg-gray-200 dark:text-gray-300 dark:file:bg-gray-800 dark:file:text-gray-200 dark:file:hover:bg-gray-700",type:"file",accept:"image/*",onChange:function(t){return e(void 0,void 0,void 0,(function(){var e,a,n,l;return r(this,(function(r){switch(r.label){case 0:if(!(e=null===(l=t.target.files)||void 0===l?void 0:l[0]))return[2];if(!e.type.startsWith("image/"))return t.target.value="",[2];k(!0),r.label=1;case 1:return r.trys.push([1,,6,7]),a="",s?[4,s(e)]:[3,3];case 2:return n=r.sent(),a="string"==typeof n.url?n.url.trim():"",[3,5];case 3:return[4,new Promise((function(r,t){var a=new FileReader;a.onload=function(){"string"==typeof a.result?r(a.result):t(new Error("Invalid file result"))},a.onerror=function(){var e;return t(null!==(e=a.error)&&void 0!==e?e:new Error("Failed to read file"))},a.readAsDataURL(e)}))];case 4:a=r.sent(),r.label=5;case 5:return a?(d.chain().focus().setImage({src:a,alt:p.trim()||e.name}).run(),g(!1),b(""),h(""),[3,7]):[2];case 6:return k(!1),t.target.value="",[7];case 7:return[2]}}))}))},disabled:v}),t("div",{className:"flex gap-2",children:[a("button",{type:"button",className:"rounded bg-gray-100 px-3 py-1 text-sm hover:bg-gray-200 dark:bg-gray-800 dark:hover:bg-gray-700",onClick:function(){return g(!1)},children:"Cancel"}),a("button",{type:"button",className:"ml-auto rounded bg-blue-600 px-3 py-1 text-sm text-white hover:bg-blue-700 disabled:cursor-not-allowed disabled:opacity-50",onClick:function(){var e=f.trim();if(e)try{var r=new URL(e.includes(":")?e:"https://".concat(e));if(!["http:","https:"].includes(r.protocol))return;d.chain().focus().setImage({src:r.toString(),alt:p.trim()||void 0}).run(),g(!1),b(""),h("")}catch(e){return}},disabled:v,children:v?"Uploading...":"Insert"})]})]})]})};export{i as default};
2
2
  //# sourceMappingURL=ImagePopover.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ImagePopover.mjs","sources":["../../../../../src/components/Form/TextEditor/ImagePopover.tsx"],"sourcesContent":["import React from \"react\";\nimport type { Editor } from \"@tiptap/react\";\nimport { ImagePlus } from \"lucide-react\";\n\nimport { ToolbarButton } from \"./toolbar\";\n\ninterface ImagePopoverProps {\n editor: Editor;\n onImageUpload?: (file: File) => Promise<{ url: string; assetId?: string }>;\n}\n\nconst ImagePopover: React.FC<ImagePopoverProps> = ({ editor, onImageUpload }) => {\n const [isOpen, setIsOpen] = React.useState(false);\n const [src, setSrc] = React.useState(\"\");\n const [alt, setAlt] = React.useState(\"\");\n const [isUploading, setIsUploading] = React.useState(false);\n const popoverRef = React.useRef<HTMLDivElement | null>(null);\n\n React.useEffect(() => {\n if (!isOpen) return;\n\n const onPointerDown = (event: MouseEvent) => {\n if (!popoverRef.current) return;\n if (!popoverRef.current.contains(event.target as Node)) {\n setIsOpen(false);\n }\n };\n\n const onEscape = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") setIsOpen(false);\n };\n\n window.addEventListener(\"mousedown\", onPointerDown);\n window.addEventListener(\"keydown\", onEscape);\n return () => {\n window.removeEventListener(\"mousedown\", onPointerDown);\n window.removeEventListener(\"keydown\", onEscape);\n };\n }, [isOpen]);\n\n const applyImage = () => {\n const normalizedSrc = src.trim();\n if (!normalizedSrc) return;\n\n try {\n const parsedUrl = new URL(normalizedSrc.includes(\":\") ? normalizedSrc : `https://${normalizedSrc}`);\n if (![\"http:\", \"https:\"].includes(parsedUrl.protocol)) return;\n\n editor.chain().focus().setImage({ src: parsedUrl.toString(), alt: alt.trim() || undefined }).run();\n setIsOpen(false);\n setSrc(\"\");\n setAlt(\"\");\n } catch {\n return;\n }\n };\n\n const handleFileUpload = async (event: React.ChangeEvent<HTMLInputElement>) => {\n const file = event.target.files?.[0];\n if (!file) {\n return;\n }\n\n if (!file.type.startsWith(\"image/\")) {\n event.target.value = \"\";\n return;\n }\n\n setIsUploading(true);\n try {\n let imageSrc = \"\";\n\n if (onImageUpload) {\n const uploaded = await onImageUpload(file);\n imageSrc = uploaded.url;\n } else {\n imageSrc = await new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => {\n if (typeof reader.result === \"string\") {\n resolve(reader.result);\n } else {\n reject(new Error(\"Invalid file result\"));\n }\n };\n reader.onerror = () => reject(reader.error ?? new Error(\"Failed to read file\"));\n reader.readAsDataURL(file);\n });\n }\n\n editor.chain().focus().setImage({ src: imageSrc, alt: alt.trim() || file.name }).run();\n setIsOpen(false);\n setSrc(\"\");\n setAlt(\"\");\n } finally {\n setIsUploading(false);\n event.target.value = \"\";\n }\n };\n\n return (\n <div className=\"relative\" ref={popoverRef}>\n <ToolbarButton\n onClick={() => setIsOpen((prev) => !prev)}\n title=\"Insert image\"\n >\n <ImagePlus size={16} />\n </ToolbarButton>\n\n {isOpen && (\n <div className=\"absolute left-1/2 z-10 mt-2 w-72 -translate-x-1/2 rounded-lg border border-gray-200 bg-white p-3 shadow-lg\">\n <label className=\"mb-1 block text-xs font-medium text-gray-600\">Image URL</label>\n <input\n className=\"mb-2 w-full rounded border border-gray-300 px-2 py-1 text-sm\"\n value={src}\n onChange={(e) => setSrc(e.target.value)}\n placeholder=\"https://example.com/image.jpg\"\n />\n <label className=\"mb-1 block text-xs font-medium text-gray-600\">Alt text</label>\n <input\n className=\"mb-3 w-full rounded border border-gray-300 px-2 py-1 text-sm\"\n value={alt}\n onChange={(e) => setAlt(e.target.value)}\n placeholder=\"Describe the image\"\n />\n <label className=\"mb-1 block text-xs font-medium text-gray-600\">Upload image</label>\n <input\n className=\"mb-3 block w-full text-sm text-gray-700 file:mr-3 file:rounded file:border-0 file:bg-gray-100 file:px-3 file:py-1 file:text-sm file:hover:bg-gray-200\"\n type=\"file\"\n accept=\"image/*\"\n onChange={handleFileUpload}\n disabled={isUploading}\n />\n <div className=\"flex gap-2\">\n <button type=\"button\" className=\"rounded bg-gray-100 px-3 py-1 text-sm hover:bg-gray-200\" onClick={() => setIsOpen(false)}>Cancel</button>\n <button type=\"button\" className=\"ml-auto rounded bg-blue-600 px-3 py-1 text-sm text-white hover:bg-blue-700 disabled:cursor-not-allowed disabled:opacity-50\" onClick={applyImage} disabled={isUploading}>{isUploading ? \"Uploading...\" : \"Insert\"}</button>\n </div>\n </div>\n )}\n </div>\n );\n};\n\nexport default ImagePopover;\n"],"names":["ImagePopover","_a","editor","onImageUpload","_b","React","useState","isOpen","setIsOpen","_c","src","setSrc","_d","alt","setAlt","_e","isUploading","setIsUploading","popoverRef","useRef","useEffect","onPointerDown","event","current","contains","target","onEscape","key","window","addEventListener","removeEventListener","_jsxs","className","ref","children","_jsx","ToolbarButton","onClick","prev","title","ImagePlus","size","value","onChange","e","placeholder","type","accept","__awaiter","file","files","startsWith","imageSrc","uploaded","sent","url","Promise","resolve","reject","reader","FileReader","onload","result","Error","onerror","error","readAsDataURL","chain","focus","setImage","trim","name","run","disabled","normalizedSrc","parsedUrl","URL","includes","concat","protocol","toString","undefined"],"mappings":"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"}
1
+ {"version":3,"file":"ImagePopover.mjs","sources":["../../../../../src/components/Form/TextEditor/ImagePopover.tsx"],"sourcesContent":["import React from \"react\";\nimport type { Editor } from \"@tiptap/react\";\nimport { ImagePlus } from \"lucide-react\";\n\nimport { ToolbarButton } from \"./toolbar\";\n\ninterface ImagePopoverProps {\n editor: Editor;\n onImageUpload?: (file: File) => Promise<{ url: string; assetId?: string }>;\n}\n\nconst ImagePopover: React.FC<ImagePopoverProps> = ({ editor, onImageUpload }) => {\n const [isOpen, setIsOpen] = React.useState(false);\n const [src, setSrc] = React.useState(\"\");\n const [alt, setAlt] = React.useState(\"\");\n const [isUploading, setIsUploading] = React.useState(false);\n const popoverRef = React.useRef<HTMLDivElement | null>(null);\n\n React.useEffect(() => {\n if (!isOpen) return;\n\n const onPointerDown = (event: MouseEvent) => {\n if (!popoverRef.current) return;\n if (!popoverRef.current.contains(event.target as Node)) {\n setIsOpen(false);\n }\n };\n\n const onEscape = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") setIsOpen(false);\n };\n\n window.addEventListener(\"mousedown\", onPointerDown);\n window.addEventListener(\"keydown\", onEscape);\n return () => {\n window.removeEventListener(\"mousedown\", onPointerDown);\n window.removeEventListener(\"keydown\", onEscape);\n };\n }, [isOpen]);\n\n const applyImage = () => {\n const normalizedSrc = src.trim();\n if (!normalizedSrc) return;\n\n try {\n const parsedUrl = new URL(normalizedSrc.includes(\":\") ? normalizedSrc : `https://${normalizedSrc}`);\n if (![\"http:\", \"https:\"].includes(parsedUrl.protocol)) return;\n\n editor.chain().focus().setImage({ src: parsedUrl.toString(), alt: alt.trim() || undefined }).run();\n setIsOpen(false);\n setSrc(\"\");\n setAlt(\"\");\n } catch {\n return;\n }\n };\n\n const handleFileUpload = async (event: React.ChangeEvent<HTMLInputElement>) => {\n const file = event.target.files?.[0];\n if (!file) {\n return;\n }\n\n if (!file.type.startsWith(\"image/\")) {\n event.target.value = \"\";\n return;\n }\n\n setIsUploading(true);\n try {\n let imageSrc = \"\";\n\n if (onImageUpload) {\n const uploaded = await onImageUpload(file);\n imageSrc = typeof uploaded.url === \"string\" ? uploaded.url.trim() : \"\";\n } else {\n imageSrc = await new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => {\n if (typeof reader.result === \"string\") {\n resolve(reader.result);\n } else {\n reject(new Error(\"Invalid file result\"));\n }\n };\n reader.onerror = () => reject(reader.error ?? new Error(\"Failed to read file\"));\n reader.readAsDataURL(file);\n });\n }\n\n if (!imageSrc) {\n return;\n }\n\n editor.chain().focus().setImage({ src: imageSrc, alt: alt.trim() || file.name }).run();\n setIsOpen(false);\n setSrc(\"\");\n setAlt(\"\");\n } finally {\n setIsUploading(false);\n event.target.value = \"\";\n }\n };\n\n return (\n <div className=\"relative\" ref={popoverRef}>\n <ToolbarButton\n onClick={() => setIsOpen((prev) => !prev)}\n title=\"Insert image\"\n >\n <ImagePlus size={16} />\n </ToolbarButton>\n\n {isOpen && (\n <div className=\"absolute left-1/2 z-10 mt-2 w-72 -translate-x-1/2 rounded-lg border border-gray-200 bg-white p-3 text-gray-700 shadow-lg dark:border-gray-700 dark:bg-gray-900 dark:text-gray-200\">\n <label className=\"mb-1 block text-xs font-medium text-gray-600 dark:text-gray-300\">Image URL</label>\n <input\n className=\"mb-2 w-full rounded border border-gray-300 bg-white px-2 py-1 text-sm text-gray-900 placeholder-gray-400 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-100 dark:placeholder-gray-500\"\n value={src}\n onChange={(e) => setSrc(e.target.value)}\n placeholder=\"https://example.com/image.jpg\"\n />\n <label className=\"mb-1 block text-xs font-medium text-gray-600 dark:text-gray-300\">Alt text</label>\n <input\n className=\"mb-3 w-full rounded border border-gray-300 bg-white px-2 py-1 text-sm text-gray-900 placeholder-gray-400 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-100 dark:placeholder-gray-500\"\n value={alt}\n onChange={(e) => setAlt(e.target.value)}\n placeholder=\"Describe the image\"\n />\n <label className=\"mb-1 block text-xs font-medium text-gray-600 dark:text-gray-300\">Upload image</label>\n <input\n className=\"mb-3 block w-full text-sm text-gray-700 file:mr-3 file:rounded file:border-0 file:bg-gray-100 file:px-3 file:py-1 file:text-sm file:text-gray-700 file:hover:bg-gray-200 dark:text-gray-300 dark:file:bg-gray-800 dark:file:text-gray-200 dark:file:hover:bg-gray-700\"\n type=\"file\"\n accept=\"image/*\"\n onChange={handleFileUpload}\n disabled={isUploading}\n />\n <div className=\"flex gap-2\">\n <button type=\"button\" className=\"rounded bg-gray-100 px-3 py-1 text-sm hover:bg-gray-200 dark:bg-gray-800 dark:hover:bg-gray-700\" onClick={() => setIsOpen(false)}>Cancel</button>\n <button type=\"button\" className=\"ml-auto rounded bg-blue-600 px-3 py-1 text-sm text-white hover:bg-blue-700 disabled:cursor-not-allowed disabled:opacity-50\" onClick={applyImage} disabled={isUploading}>{isUploading ? \"Uploading...\" : \"Insert\"}</button>\n </div>\n </div>\n )}\n </div>\n );\n};\n\nexport default ImagePopover;\n"],"names":["ImagePopover","_a","editor","onImageUpload","_b","React","useState","isOpen","setIsOpen","_c","src","setSrc","_d","alt","setAlt","_e","isUploading","setIsUploading","popoverRef","useRef","useEffect","onPointerDown","event","current","contains","target","onEscape","key","window","addEventListener","removeEventListener","_jsxs","className","ref","children","_jsx","ToolbarButton","onClick","prev","title","ImagePlus","size","value","onChange","e","placeholder","type","accept","__awaiter","file","files","startsWith","imageSrc","uploaded","sent","url","trim","Promise","resolve","reject","reader","FileReader","onload","result","Error","onerror","error","readAsDataURL","chain","focus","setImage","name","run","disabled","normalizedSrc","parsedUrl","URL","includes","concat","protocol","toString","undefined"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{jsxs as e,jsx as t}from"react/jsx-runtime";import n from"react";import{Link as r}from"lucide-react";import{ToolbarButton as o}from"./toolbar.mjs";var l=function(l){var a=l.editor,i=n.useState(!1),u=i[0],c=i[1],d=n.useRef(null),s=n.useState(""),m=s[0],b=s[1],p=n.useState("_blank"),f=p[0],v=p[1],h=n.useState("noopener"),g=h[0],x=h[1];n.useEffect((function(){if(u){var e=function(e){d.current&&(d.current.contains(e.target)||c(!1))},t=function(e){"Escape"===e.key&&c(!1)};return window.addEventListener("mousedown",e),window.addEventListener("keydown",t),function(){window.removeEventListener("mousedown",e),window.removeEventListener("keydown",t)}}}),[u]);return e("div",{className:"relative",ref:d,children:[t(o,{onClick:function(){var e,t,n,r=a.getAttributes("link");b(null!==(e=null==r?void 0:r.href)&&void 0!==e?e:""),v(null!==(t=null==r?void 0:r.target)&&void 0!==t?t:"_blank"),x(null!==(n=null==r?void 0:r.rel)&&void 0!==n?n:"noopener"),c((function(e){return!e}))},active:a.isActive("link"),title:"Link",ariaPressed:a.isActive("link"),children:t(r,{size:16})}),u&&e("div",{className:"absolute left-1/2 z-10 mt-2 w-72 -translate-x-1/2 rounded-lg border border-gray-200 bg-white p-3 shadow-lg",children:[t("label",{className:"mb-1 block text-xs font-medium text-gray-600",children:"URL"}),t("input",{className:"mb-2 w-full rounded border border-gray-300 px-2 py-1 text-sm",value:m,onChange:function(e){return b(e.target.value)},placeholder:"https://example.com"}),t("label",{className:"mb-1 block text-xs font-medium text-gray-600",children:"Target"}),e("select",{className:"mb-2 w-full rounded border border-gray-300 px-2 py-1 text-sm",value:f,onChange:function(e){return v(e.target.value)},children:[t("option",{value:"_blank",children:"New Tab"}),t("option",{value:"_self",children:"Same Window"})]}),t("label",{className:"mb-1 block text-xs font-medium text-gray-600",children:"Rel"}),t("input",{className:"mb-3 w-full rounded border border-gray-300 px-2 py-1 text-sm",value:g,onChange:function(e){return x(e.target.value)},placeholder:"noopener"}),e("div",{className:"flex gap-2",children:[t("button",{type:"button",className:"rounded bg-gray-100 px-3 py-1 text-sm hover:bg-gray-200",onClick:function(){return c(!1)},children:"Cancel"}),a.isActive("link")&&t("button",{type:"button",className:"rounded bg-red-100 px-3 py-1 text-sm text-red-700 hover:bg-red-200",onClick:function(){a.chain().focus().unsetLink().run(),c(!1)},children:"Unlink"}),t("button",{type:"button",className:"ml-auto rounded bg-blue-600 px-3 py-1 text-sm text-white hover:bg-blue-700",onClick:function(){var e=m.trim();if(e)try{var t=new URL(e.includes(":")?e:"https://".concat(e));if(!["http:","https:","mailto:"].includes(t.protocol))return;a.chain().focus().setLink({href:t.toString(),target:f,rel:g}).run(),c(!1)}catch(e){return}},children:"Apply"})]})]})]})};export{l as default};
1
+ import{jsxs as e,jsx as r}from"react/jsx-runtime";import t from"react";import{Link as a}from"lucide-react";import{ToolbarButton as n}from"./toolbar.mjs";var o="noopener noreferrer",l=function(l){var d=l.editor,i=t.useState(!1),u=i[0],c=i[1],s=t.useRef(null),g=t.useState(""),b=g[0],m=g[1],y=t.useState("_blank"),k=y[0],p=y[1],f=t.useState(o),h=f[0],x=f[1];t.useEffect((function(){if(u){var e=function(e){s.current&&(s.current.contains(e.target)||c(!1))},r=function(e){"Escape"===e.key&&c(!1)};return window.addEventListener("mousedown",e),window.addEventListener("keydown",r),function(){window.removeEventListener("mousedown",e),window.removeEventListener("keydown",r)}}}),[u]);return e("div",{className:"relative",ref:s,children:[r(n,{onClick:function(){var e,r=d.getAttributes("link");m("string"==typeof(null==r?void 0:r.href)?r.href:""),p("_blank"===(e=null==r?void 0:r.target)||"_self"===e?r.target:"_blank"),x("string"==typeof(null==r?void 0:r.rel)?r.rel:o),c((function(e){return!e}))},active:d.isActive("link"),title:"Link",ariaPressed:d.isActive("link"),children:r(a,{size:16})}),u&&e("div",{className:"absolute left-1/2 z-10 mt-2 w-72 -translate-x-1/2 rounded-lg border border-gray-200 bg-white p-3 text-gray-700 shadow-lg dark:border-gray-700 dark:bg-gray-900 dark:text-gray-200",children:[r("label",{className:"mb-1 block text-xs font-medium text-gray-600 dark:text-gray-300",children:"URL"}),r("input",{className:"mb-2 w-full rounded border border-gray-300 bg-white px-2 py-1 text-sm text-gray-900 placeholder-gray-400 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-100 dark:placeholder-gray-500",value:b,onChange:function(e){return m(e.target.value)},placeholder:"https://example.com"}),r("label",{className:"mb-1 block text-xs font-medium text-gray-600 dark:text-gray-300",children:"Target"}),e("select",{className:"mb-2 w-full rounded border border-gray-300 bg-white px-2 py-1 text-sm text-gray-900 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-100",value:k,onChange:function(e){return p(e.target.value)},children:[r("option",{value:"_blank",children:"New Tab"}),r("option",{value:"_self",children:"Same Window"})]}),r("label",{className:"mb-1 block text-xs font-medium text-gray-600 dark:text-gray-300",children:"Rel"}),r("input",{className:"mb-3 w-full rounded border border-gray-300 bg-white px-2 py-1 text-sm text-gray-900 placeholder-gray-400 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-100 dark:placeholder-gray-500",value:h,onChange:function(e){return x(e.target.value)},placeholder:o}),e("div",{className:"flex gap-2",children:[r("button",{type:"button",className:"rounded bg-gray-100 px-3 py-1 text-sm hover:bg-gray-200 dark:bg-gray-800 dark:hover:bg-gray-700",onClick:function(){return c(!1)},children:"Cancel"}),d.isActive("link")&&r("button",{type:"button",className:"rounded bg-red-100 px-3 py-1 text-sm text-red-700 hover:bg-red-200 dark:bg-red-950/50 dark:text-red-300 dark:hover:bg-red-950",onClick:function(){d.chain().focus().unsetLink().run(),c(!1)},children:"Unlink"}),r("button",{type:"button",className:"ml-auto rounded bg-blue-600 px-3 py-1 text-sm text-white hover:bg-blue-700",onClick:function(){var e=b.trim(),r=h.trim()||void 0;if(e)try{var t=new URL(e.includes(":")?e:"https://".concat(e));if(!["http:","https:","mailto:"].includes(t.protocol))return;d.chain().focus().setLink({href:t.toString(),target:k,rel:r}).run(),c(!1)}catch(e){return}},children:"Apply"})]})]})]})};export{l as default};
2
2
  //# sourceMappingURL=LinkPopover.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"LinkPopover.mjs","sources":["../../../../../src/components/Form/TextEditor/LinkPopover.tsx"],"sourcesContent":["import React from \"react\";\nimport type { Editor } from \"@tiptap/react\";\n\nimport { Link as LinkIcon } from \"lucide-react\";\nimport { ToolbarButton } from \"./toolbar\";\n\ninterface LinkPopoverProps {\n editor: Editor;\n}\n\ntype LinkTarget = \"_blank\" | \"_self\";\n\nconst LinkPopover: React.FC<LinkPopoverProps> = ({ editor }) => {\n const [isOpen, setIsOpen] = React.useState(false);\n const popoverRef = React.useRef<HTMLDivElement | null>(null);\n const [href, setHref] = React.useState(\"\");\n const [target, setTarget] = React.useState<LinkTarget>(\"_blank\");\n const [rel, setRel] = React.useState(\"noopener\");\n\n React.useEffect(() => {\n if (!isOpen) {\n return;\n }\n\n const onPointerDown = (event: MouseEvent) => {\n if (!popoverRef.current) {\n return;\n }\n\n if (!popoverRef.current.contains(event.target as Node)) {\n setIsOpen(false);\n }\n };\n\n const onEscape = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n setIsOpen(false);\n }\n };\n\n window.addEventListener(\"mousedown\", onPointerDown);\n window.addEventListener(\"keydown\", onEscape);\n return () => {\n window.removeEventListener(\"mousedown\", onPointerDown);\n window.removeEventListener(\"keydown\", onEscape);\n };\n }, [isOpen]);\n\n const removeLink = () => {\n editor.chain().focus().unsetLink().run();\n };\n\n const applyLink = () => {\n const normalizedUrl = href.trim();\n if (!normalizedUrl) return;\n\n try {\n const parsedUrl = new URL(normalizedUrl.includes(\":\") ? normalizedUrl : `https://${normalizedUrl}`);\n if (![\"http:\", \"https:\", \"mailto:\"].includes(parsedUrl.protocol)) return;\n\n editor.chain().focus().setLink({ href: parsedUrl.toString(), target, rel }).run();\n setIsOpen(false);\n } catch {\n return;\n }\n };\n\n return (\n <div className=\"relative\" ref={popoverRef}>\n <ToolbarButton\n onClick={() => {\n const activeLink = editor.getAttributes(\"link\");\n setHref(activeLink?.href ?? \"\");\n setTarget(activeLink?.target ?? \"_blank\");\n setRel(activeLink?.rel ?? \"noopener\");\n setIsOpen((prev) => !prev);\n }}\n active={editor.isActive(\"link\")}\n title=\"Link\"\n ariaPressed={editor.isActive(\"link\")}\n >\n <LinkIcon size={16} />\n </ToolbarButton>\n\n {isOpen && (\n <div className=\"absolute left-1/2 z-10 mt-2 w-72 -translate-x-1/2 rounded-lg border border-gray-200 bg-white p-3 shadow-lg\">\n <label className=\"mb-1 block text-xs font-medium text-gray-600\">URL</label>\n <input className=\"mb-2 w-full rounded border border-gray-300 px-2 py-1 text-sm\" value={href} onChange={(e) => setHref(e.target.value)} placeholder=\"https://example.com\" />\n <label className=\"mb-1 block text-xs font-medium text-gray-600\">Target</label>\n <select className=\"mb-2 w-full rounded border border-gray-300 px-2 py-1 text-sm\" value={target} onChange={(e) => setTarget(e.target.value as LinkTarget)}>\n <option value=\"_blank\">New Tab</option>\n <option value=\"_self\">Same Window</option>\n </select>\n <label className=\"mb-1 block text-xs font-medium text-gray-600\">Rel</label>\n <input className=\"mb-3 w-full rounded border border-gray-300 px-2 py-1 text-sm\" value={rel} onChange={(e) => setRel(e.target.value)} placeholder=\"noopener\" />\n <div className=\"flex gap-2\">\n <button type=\"button\" className=\"rounded bg-gray-100 px-3 py-1 text-sm hover:bg-gray-200\" onClick={() => setIsOpen(false)}>Cancel</button>\n {editor.isActive(\"link\") && <button type=\"button\" className=\"rounded bg-red-100 px-3 py-1 text-sm text-red-700 hover:bg-red-200\" onClick={() => { removeLink(); setIsOpen(false); }}>Unlink</button>}\n <button type=\"button\" className=\"ml-auto rounded bg-blue-600 px-3 py-1 text-sm text-white hover:bg-blue-700\" onClick={applyLink}>Apply</button>\n </div>\n </div>\n )}\n </div>\n );\n};\n\nexport default LinkPopover;\n"],"names":["LinkPopover","_a","editor","_b","React","useState","isOpen","setIsOpen","popoverRef","useRef","_c","href","setHref","_d","target","setTarget","_e","rel","setRel","useEffect","onPointerDown","event","current","contains","onEscape","key","window","addEventListener","removeEventListener","_jsxs","className","ref","children","_jsx","ToolbarButton","onClick","activeLink","getAttributes","prev","active","isActive","title","ariaPressed","LinkIcon","size","value","onChange","e","placeholder","type","chain","focus","unsetLink","run","normalizedUrl","trim","parsedUrl","URL","includes","concat","protocol","setLink","toString"],"mappings":"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"}
1
+ {"version":3,"file":"LinkPopover.mjs","sources":["../../../../../src/components/Form/TextEditor/LinkPopover.tsx"],"sourcesContent":["import React from \"react\";\nimport type { Editor } from \"@tiptap/react\";\n\nimport { Link as LinkIcon } from \"lucide-react\";\nimport { ToolbarButton } from \"./toolbar\";\n\ninterface LinkPopoverProps {\n editor: Editor;\n}\n\ntype LinkTarget = \"_blank\" | \"_self\";\n\nconst DEFAULT_LINK_REL = \"noopener noreferrer\";\n\nconst isLinkTarget = (value: unknown): value is LinkTarget =>\n value === \"_blank\" || value === \"_self\";\n\nconst LinkPopover: React.FC<LinkPopoverProps> = ({ editor }) => {\n const [isOpen, setIsOpen] = React.useState(false);\n const popoverRef = React.useRef<HTMLDivElement | null>(null);\n const [href, setHref] = React.useState(\"\");\n const [target, setTarget] = React.useState<LinkTarget>(\"_blank\");\n const [rel, setRel] = React.useState(DEFAULT_LINK_REL);\n\n React.useEffect(() => {\n if (!isOpen) {\n return;\n }\n\n const onPointerDown = (event: MouseEvent) => {\n if (!popoverRef.current) {\n return;\n }\n\n if (!popoverRef.current.contains(event.target as Node)) {\n setIsOpen(false);\n }\n };\n\n const onEscape = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n setIsOpen(false);\n }\n };\n\n window.addEventListener(\"mousedown\", onPointerDown);\n window.addEventListener(\"keydown\", onEscape);\n return () => {\n window.removeEventListener(\"mousedown\", onPointerDown);\n window.removeEventListener(\"keydown\", onEscape);\n };\n }, [isOpen]);\n\n const removeLink = () => {\n editor.chain().focus().unsetLink().run();\n };\n\n const applyLink = () => {\n const normalizedUrl = href.trim();\n const normalizedRel = rel.trim() || undefined;\n if (!normalizedUrl) return;\n\n try {\n const parsedUrl = new URL(normalizedUrl.includes(\":\") ? normalizedUrl : `https://${normalizedUrl}`);\n if (![\"http:\", \"https:\", \"mailto:\"].includes(parsedUrl.protocol)) return;\n\n editor.chain().focus().setLink({ href: parsedUrl.toString(), target, rel: normalizedRel }).run();\n setIsOpen(false);\n } catch {\n return;\n }\n };\n\n return (\n <div className=\"relative\" ref={popoverRef}>\n <ToolbarButton\n onClick={() => {\n const activeLink = editor.getAttributes(\"link\");\n setHref(typeof activeLink?.href === \"string\" ? activeLink.href : \"\");\n setTarget(isLinkTarget(activeLink?.target) ? activeLink.target : \"_blank\");\n setRel(typeof activeLink?.rel === \"string\" ? activeLink.rel : DEFAULT_LINK_REL);\n setIsOpen((prev) => !prev);\n }}\n active={editor.isActive(\"link\")}\n title=\"Link\"\n ariaPressed={editor.isActive(\"link\")}\n >\n <LinkIcon size={16} />\n </ToolbarButton>\n\n {isOpen && (\n <div className=\"absolute left-1/2 z-10 mt-2 w-72 -translate-x-1/2 rounded-lg border border-gray-200 bg-white p-3 text-gray-700 shadow-lg dark:border-gray-700 dark:bg-gray-900 dark:text-gray-200\">\n <label className=\"mb-1 block text-xs font-medium text-gray-600 dark:text-gray-300\">URL</label>\n <input className=\"mb-2 w-full rounded border border-gray-300 bg-white px-2 py-1 text-sm text-gray-900 placeholder-gray-400 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-100 dark:placeholder-gray-500\" value={href} onChange={(e) => setHref(e.target.value)} placeholder=\"https://example.com\" />\n <label className=\"mb-1 block text-xs font-medium text-gray-600 dark:text-gray-300\">Target</label>\n <select className=\"mb-2 w-full rounded border border-gray-300 bg-white px-2 py-1 text-sm text-gray-900 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-100\" value={target} onChange={(e) => setTarget(e.target.value as LinkTarget)}>\n <option value=\"_blank\">New Tab</option>\n <option value=\"_self\">Same Window</option>\n </select>\n <label className=\"mb-1 block text-xs font-medium text-gray-600 dark:text-gray-300\">Rel</label>\n <input className=\"mb-3 w-full rounded border border-gray-300 bg-white px-2 py-1 text-sm text-gray-900 placeholder-gray-400 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-100 dark:placeholder-gray-500\" value={rel} onChange={(e) => setRel(e.target.value)} placeholder={DEFAULT_LINK_REL} />\n <div className=\"flex gap-2\">\n <button type=\"button\" className=\"rounded bg-gray-100 px-3 py-1 text-sm hover:bg-gray-200 dark:bg-gray-800 dark:hover:bg-gray-700\" onClick={() => setIsOpen(false)}>Cancel</button>\n {editor.isActive(\"link\") && <button type=\"button\" className=\"rounded bg-red-100 px-3 py-1 text-sm text-red-700 hover:bg-red-200 dark:bg-red-950/50 dark:text-red-300 dark:hover:bg-red-950\" onClick={() => { removeLink(); setIsOpen(false); }}>Unlink</button>}\n <button type=\"button\" className=\"ml-auto rounded bg-blue-600 px-3 py-1 text-sm text-white hover:bg-blue-700\" onClick={applyLink}>Apply</button>\n </div>\n </div>\n )}\n </div>\n );\n};\n\nexport default LinkPopover;\n"],"names":["DEFAULT_LINK_REL","LinkPopover","_a","editor","_b","React","useState","isOpen","setIsOpen","popoverRef","useRef","_c","href","setHref","_d","target","setTarget","_e","rel","setRel","useEffect","onPointerDown","event","current","contains","onEscape","key","window","addEventListener","removeEventListener","_jsxs","className","ref","children","_jsx","ToolbarButton","onClick","value","activeLink","getAttributes","prev","active","isActive","title","ariaPressed","LinkIcon","size","onChange","e","placeholder","type","chain","focus","unsetLink","run","normalizedUrl","trim","normalizedRel","undefined","parsedUrl","URL","includes","concat","protocol","setLink","toString"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{__assign as e}from"../../../node_modules/tslib/tslib.es6.mjs";import{jsx as t,jsxs as o}from"react/jsx-runtime";import i from"react";import{useEditor as n,EditorContent as a}from"@tiptap/react";import l from"./ImagePopover.mjs";import r from"./LinkPopover.mjs";import{HistoryTools as s,FormattingTools as d,AlignmentTools as c,ListTools as u,CodeTools as m,QuoteTools as g,TableTools as f,InsertTools as p}from"./ToolbarGroups.mjs";import{withDefaultFeatures as b,toolbarPresetFeatures as h,editorContentClassName as v,createTextEditorExtensions as k}from"./extensions.mjs";import{ToolbarDivider as y,HeadingSelect as w}from"./toolbar.mjs";var x=function(x){var L=x.initialContent,C=void 0===L?"":L,N=x.onUpdate,q=x.features,j=x.stickyToolbar,U=void 0===j||j,B=x.toolbarPreset,H=void 0===B?"standard":B,P=x.onImageUpload,A=x.className,R=void 0===A?"":A,T=x.editorClassName,z=void 0===T?"":T,E=x.contentClassName,I=void 0===E?"":E,M=i.useMemo((function(){return b(e(e({},h[H]),q))}),[q,H]),S=i.useState(!1),D=S[0],F=S[1],G=i.useState(null),K=G[0],X=G[1],Y=n({extensions:k(M),content:C,onUpdate:function(e){var t=e.editor;N(t.getHTML())},editorProps:{attributes:{class:"".concat(v," ").concat(I).trim()},handleKeyDown:function(e,t){return!!M.slashCommand&&("/"===t.key?(F(!0),!1):("Escape"===t.key&&F(!1),!1))}},immediatelyRender:!1});i.useEffect((function(){if(Y){var e=function(){var e=Y.state.selection;if(e.from!==e.to&&Y.isFocused){var t=window.getSelection();if(t&&0!==t.rangeCount){var o=t.getRangeAt(0).getBoundingClientRect();X({top:o.top+window.scrollY-48,left:o.left+window.scrollX+o.width/2})}else X(null)}else X(null)},t=function(){return X(null)};return Y.on("selectionUpdate",e),Y.on("blur",t),function(){Y.off("selectionUpdate",e),Y.off("blur",t)}}}),[Y]);var _=i.useRef(C);i.useEffect((function(){Y&&(C!==_.current&&Y.getHTML()===_.current&&(Y.commands.setContent(C||"",{emitUpdate:!1}),_.current=C))}),[Y,C]);var J=M.heading||M.formatting||M.lists||M.code||M.quote||M.link||M.table||M.image||M.taskList||M.alignment;return Y?o("div",{className:"pd-text-editor w-full rounded-lg border border-gray-200 shadow-sm ".concat(R).trim(),children:[U&&o("div",{className:"sticky top-0 z-10 flex flex-wrap items-center gap-1 border-b bg-gray-50 p-3",children:[M.history&&t(s,{editor:Y}),M.history&&J&&t(y,{}),M.heading&&t(w,{value:(null==Y?void 0:Y.isActive("heading",{level:1}))?1:(null==Y?void 0:Y.isActive("heading",{level:2}))?2:(null==Y?void 0:Y.isActive("heading",{level:3}))?3:0,onChange:function(e){0===e?Y.chain().focus().setParagraph().run():Y.chain().focus().toggleHeading({level:e}).run()}}),M.heading&&(M.formatting||M.lists||M.code||M.quote||M.link||M.table||M.image||M.taskList)&&t(y,{}),M.formatting&&t(d,{editor:Y}),M.formatting&&(M.alignment||M.lists||M.code||M.quote||M.link||M.table||M.image||M.taskList)&&t(y,{}),M.alignment&&t(c,{editor:Y}),M.alignment&&(M.lists||M.code||M.quote||M.link||M.table||M.image||M.taskList)&&t(y,{}),M.lists&&t(u,{editor:Y}),M.lists&&(M.code||M.quote||M.link||M.table||M.image||M.taskList)&&t(y,{}),M.code&&t(m,{editor:Y}),M.code&&(M.quote||M.link||M.table||M.image||M.taskList)&&t(y,{}),M.quote&&t(g,{editor:Y}),M.quote&&(M.link||M.table||M.image||M.taskList)&&t(y,{}),M.link&&t(r,{editor:Y}),M.link&&(M.table||M.image||M.taskList)&&t(y,{}),M.table&&t(f,{editor:Y}),M.table&&(M.image||M.taskList)&&t(y,{}),M.image&&t(l,{editor:Y,onImageUpload:P}),M.image&&M.taskList&&t(y,{}),M.taskList&&t(p,{editor:Y})]}),!1===U&&K&&o("div",{className:"fixed z-20 -translate-x-1/2 rounded-lg border border-gray-200 bg-white p-1 shadow-lg",style:{top:K.top,left:K.left},children:[t(d,{editor:Y}),M.link&&t(r,{editor:Y})]}),M.slashCommand&&D&&o("div",{className:"absolute left-4 top-16 z-20 w-56 rounded-lg border border-gray-200 bg-white p-2 shadow-lg",children:[t("button",{type:"button",className:"block w-full rounded px-2 py-1 text-left text-sm hover:bg-gray-100",onClick:function(){Y.chain().focus().toggleHeading({level:1}).run(),F(!1)},children:"Heading 1"}),t("button",{type:"button",className:"block w-full rounded px-2 py-1 text-left text-sm hover:bg-gray-100",onClick:function(){Y.chain().focus().toggleBulletList().run(),F(!1)},children:"Bullet List"}),t("button",{type:"button",className:"block w-full rounded px-2 py-1 text-left text-sm hover:bg-gray-100",onClick:function(){Y.chain().focus().toggleCodeBlock().run(),F(!1)},children:"Code Block"})]}),t(a,{editor:Y,className:"w-full min-h-[300px] focus-within:bg-white ".concat(z).trim()})]}):t("div",{className:"rounded-lg border bg-gray-50 h-48 animate-pulse"})};export{x as default};
1
+ import{__assign as e}from"../../../node_modules/tslib/tslib.es6.mjs";import{jsx as r,jsxs as t}from"react/jsx-runtime";import n from"react";import{useEditor as a,EditorContent as o}from"@tiptap/react";import i from"./ImagePopover.mjs";import d from"./LinkPopover.mjs";import{HistoryTools as l,FormattingTools as u,AlignmentTools as s,ListTools as c,CodeTools as g,QuoteTools as f,TableTools as m,InsertTools as b}from"./ToolbarGroups.mjs";import{withDefaultFeatures as p,toolbarPresetFeatures as h,createTextEditorExtensions as y,editorContentClassName as k}from"./extensions.mjs";import{HeadingSelect as v,ToolbarDivider as w}from"./toolbar.mjs";var x=function(e){var r=e.trim();return{words:r?r.split(/\s+/).length:0,characters:e.length}},C=function(e,r){return"markdown"===r?e.getMarkdown():e.getHTML()},N=function(N){var j=N.initialContent,R=void 0===j?"":j,T=N.onUpdate,U=N.contentFormat,L=void 0===U?"html":U,B=N.features,P=N.stickyToolbar,S=void 0===P||P,A=N.toolbarPreset,E=void 0===A?"standard":A,F=N.onImageUpload,H=N.placeholder,M=void 0===H?"Start writing...":H,z=N.showCounts,I=void 0===z||z,q=N.status,D=N.className,G=void 0===D?"":D,K=N.editorClassName,X=void 0===K?"":K,Y=N.contentClassName,_=void 0===Y?"":Y,J=n.useMemo((function(){return p(e(e({},h[E]),B))}),[B,E]),O=n.useState(!1),Q=O[0],V=O[1],W=n.useState(null),Z=W[0],$=W[1],ee=n.useState({words:0,characters:0}),re=ee[0],te=ee[1],ne=n.useRef(T),ae=n.useRef(L);ne.current=T,ae.current=L;var oe=n.useMemo((function(){return y(J,{contentFormat:L,placeholder:M})}),[L,J,M]),ie=n.useCallback((function(e){return C(e,L)}),[L]),de=a({extensions:oe,content:R,contentType:"markdown"===L?"markdown":void 0,onUpdate:function(e){var r=e.editor;ne.current(C(r,ae.current))},editorProps:{attributes:{class:"".concat(k," ").concat(_).trim()},handleKeyDown:function(e,r){return!!J.slashCommand&&("/"===r.key?(V(!0),!1):("Escape"===r.key&&V(!1),!1))}},immediatelyRender:!1},[_,L,oe,J.slashCommand]);n.useEffect((function(){if(de){var e=function(){te(x(de.getText()))};return e(),de.on("update",e),function(){de.off("update",e)}}}),[de]),n.useEffect((function(){if(de){var e=function(){var e=de.state.selection;if(e.from!==e.to&&de.isFocused){var r=window.getSelection();if(r&&0!==r.rangeCount){var t=r.getRangeAt(0).getBoundingClientRect();$({top:t.top+window.scrollY-48,left:t.left+window.scrollX+t.width/2})}else $(null)}else $(null)},r=function(){return $(null)};return de.on("selectionUpdate",e),de.on("blur",r),function(){de.off("selectionUpdate",e),de.off("blur",r)}}}),[de]);var le=n.useRef(R),ue=n.useRef(null),se=n.useRef(null);n.useEffect((function(){if(de){if(se.current!==de)return se.current=de,le.current=R,void(ue.current=ie(de));if(null===ue.current&&(ue.current=ie(de)),R!==le.current)ie(de)===ue.current&&(de.commands.setContent(R||"",{emitUpdate:!1,contentType:"markdown"===L?"markdown":void 0}),le.current=R,ue.current=ie(de),te(x(de.getText())))}}),[L,de,ie,R]);var ce=[{label:"Heading 1",enabled:J.heading,run:function(){return null==de?void 0:de.chain().focus().toggleHeading({level:1}).run()}},{label:"Bullet List",enabled:J.lists,run:function(){return null==de?void 0:de.chain().focus().toggleBulletList().run()}},{label:"Code Block",enabled:J.code,run:function(){return null==de?void 0:de.chain().focus().toggleCodeBlock().run()}}].filter((function(e){return e.enabled}));if(!de)return r("div",{className:"h-48 animate-pulse rounded-xl border border-gray-200 bg-gray-50 shadow-sm dark:border-gray-700 dark:bg-gray-800"});var ge=[{key:"history",enabled:J.history,render:function(){return r(l,{editor:de})}},{key:"heading",enabled:J.heading,render:function(){return r(v,{value:(null==de?void 0:de.isActive("heading",{level:1}))?1:(null==de?void 0:de.isActive("heading",{level:2}))?2:(null==de?void 0:de.isActive("heading",{level:3}))?3:0,onChange:function(e){0===e?de.chain().focus().setParagraph().run():de.chain().focus().toggleHeading({level:e}).run()}})}},{key:"formatting",enabled:J.formatting,render:function(){return r(u,{editor:de})}},{key:"alignment",enabled:J.alignment,render:function(){return r(s,{editor:de})}},{key:"lists",enabled:J.lists,render:function(){return r(c,{editor:de})}},{key:"code",enabled:J.code,render:function(){return r(g,{editor:de})}},{key:"quote",enabled:J.quote,render:function(){return r(f,{editor:de})}},{key:"link",enabled:J.link,render:function(){return r(d,{editor:de})}},{key:"table",enabled:J.table,render:function(){return r(m,{editor:de})}},{key:"image",enabled:J.image,render:function(){return r(i,{editor:de,onImageUpload:F})}},{key:"taskList",enabled:J.taskList,render:function(){return r(b,{editor:de})}}].filter((function(e){return e.enabled}));return t("div",{className:"pd-text-editor relative w-full overflow-hidden rounded-xl border border-gray-200 bg-white text-gray-900 shadow-sm ring-1 ring-black/[0.02] dark:border-gray-700 dark:bg-gray-950 dark:text-gray-100 dark:ring-white/[0.04] ".concat(G).trim(),children:[S&&r("div",{className:"sticky top-0 z-10 flex flex-wrap items-center gap-1 border-b border-gray-200 bg-white/95 px-3 py-2 text-gray-700 backdrop-blur dark:border-gray-800 dark:bg-gray-950/95 dark:text-gray-200",children:ge.map((function(e,a){return t(n.Fragment,{children:[a>0&&r(w,{}),e.render()]},e.key)}))}),!1===S&&Z&&t("div",{className:"fixed z-20 flex -translate-x-1/2 items-center gap-1 rounded-xl border border-gray-200 bg-white/95 p-1 text-gray-700 shadow-xl shadow-gray-900/10 ring-1 ring-black/5 backdrop-blur dark:border-gray-700 dark:bg-gray-900/95 dark:text-gray-200 dark:shadow-black/30 dark:ring-white/10",style:{top:Z.top,left:Z.left},children:[r(u,{editor:de}),J.link&&r(d,{editor:de})]}),J.slashCommand&&Q&&ce.length>0&&r("div",{className:"absolute left-4 top-16 z-20 w-56 rounded-lg border border-gray-200 bg-white p-2 text-gray-700 shadow-lg dark:border-gray-700 dark:bg-gray-900 dark:text-gray-200",children:ce.map((function(e){return r("button",{type:"button",className:"block w-full rounded px-2 py-1 text-left text-sm hover:bg-gray-100 dark:hover:bg-gray-800",onClick:function(){e.run(),V(!1)},children:e.label},e.label)}))}),r(o,{editor:de,className:"min-h-[300px] w-full focus-within:bg-white dark:focus-within:bg-gray-950 ".concat(X).trim()}),(I||q)&&t("div",{className:"flex items-center justify-between gap-3 border-t border-gray-200 bg-gray-50/70 px-4 py-2 text-[11px] font-medium text-gray-500 dark:border-gray-800 dark:bg-gray-900/60 dark:text-gray-400",children:[I?t("div",{className:"flex items-center gap-3 font-mono",children:[t("span",{children:[re.words," words"]}),t("span",{children:[re.characters," chars"]})]}):r("span",{}),q&&t("div",{className:"flex items-center gap-2 text-gray-500 dark:text-gray-400",children:[r("span",{children:q}),r("span",{className:"h-1.5 w-1.5 rounded-full bg-primary-500","aria-hidden":"true"})]})]})]})};export{N as default};
2
2
  //# sourceMappingURL=TextEditor.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"TextEditor.mjs","sources":["../../../../../src/components/Form/TextEditor/TextEditor.tsx"],"sourcesContent":["import React from \"react\";\nimport { EditorContent, useEditor } from \"@tiptap/react\";\nimport ImagePopover from \"./ImagePopover\";\nimport LinkPopover from \"./LinkPopover\";\nimport {\n AlignmentTools,\n CodeTools,\n FormattingTools,\n HistoryTools,\n InsertTools,\n ListTools,\n QuoteTools,\n TableTools,\n} from \"./ToolbarGroups\";\nimport {\n createTextEditorExtensions,\n editorContentClassName,\n type TextEditorFeatures,\n type ToolbarPreset,\n toolbarPresetFeatures,\n withDefaultFeatures,\n} from \"./extensions\";\nimport { HeadingLevel, HeadingSelect, ToolbarDivider } from \"./toolbar\";\n\nexport interface TextEditorProps {\n initialContent?: string;\n onUpdate: (content: string) => void;\n features?: TextEditorFeatures;\n stickyToolbar?: boolean;\n toolbarPreset?: ToolbarPreset;\n onImageUpload?: (file: File) => Promise<{ url: string; assetId?: string }>;\n className?: string;\n editorClassName?: string;\n contentClassName?: string;\n}\n\nconst TextEditor: React.FC<TextEditorProps> = ({\n initialContent = \"\",\n onUpdate,\n features,\n stickyToolbar = true,\n toolbarPreset = \"standard\",\n onImageUpload,\n className = \"\",\n editorClassName = \"\",\n contentClassName = \"\",\n}) => {\n const enabledFeatures = React.useMemo(\n () =>\n withDefaultFeatures({\n ...toolbarPresetFeatures[toolbarPreset],\n ...features,\n }),\n [features, toolbarPreset],\n );\n const [slashOpen, setSlashOpen] = React.useState(false);\n const [bubblePos, setBubblePos] = React.useState<{\n top: number;\n left: number;\n } | null>(null);\n\n const editor = useEditor({\n extensions: createTextEditorExtensions(enabledFeatures),\n content: initialContent,\n onUpdate: ({ editor }) => {\n onUpdate(editor.getHTML());\n },\n editorProps: {\n attributes: {\n class: `${editorContentClassName} ${contentClassName}`.trim(),\n },\n handleKeyDown: (_view, event) => {\n if (!enabledFeatures.slashCommand) return false;\n if (event.key === \"/\") {\n setSlashOpen(true);\n return false;\n }\n if (event.key === \"Escape\") {\n setSlashOpen(false);\n }\n return false;\n },\n },\n immediatelyRender: false,\n });\n\n React.useEffect(() => {\n if (!editor) return;\n const updateBubble = () => {\n const { from, to } = editor.state.selection;\n if (from === to || !editor.isFocused) {\n setBubblePos(null);\n return;\n }\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) {\n setBubblePos(null);\n return;\n }\n const rect = selection.getRangeAt(0).getBoundingClientRect();\n setBubblePos({\n top: rect.top + window.scrollY - 48,\n left: rect.left + window.scrollX + rect.width / 2,\n });\n };\n const onBlur = () => setBubblePos(null);\n editor.on(\"selectionUpdate\", updateBubble);\n editor.on(\"blur\", onBlur);\n return () => {\n editor.off(\"selectionUpdate\", updateBubble);\n editor.off(\"blur\", onBlur);\n };\n }, [editor]);\n\n const lastAppliedInitialContentRef = React.useRef(initialContent);\n\n React.useEffect(() => {\n if (!editor) {\n return;\n }\n\n if (initialContent === lastAppliedInitialContentRef.current) {\n return;\n }\n\n const currentContent = editor.getHTML();\n const wasUntouchedSinceLastSync =\n currentContent === lastAppliedInitialContentRef.current;\n\n if (!wasUntouchedSinceLastSync) {\n return;\n }\n\n editor.commands.setContent(initialContent || \"\", { emitUpdate: false });\n lastAppliedInitialContentRef.current = initialContent;\n }, [editor, initialContent]);\n\n const getActiveHeadingLevel = (): HeadingLevel => {\n if (editor?.isActive(\"heading\", { level: 1 })) return 1;\n if (editor?.isActive(\"heading\", { level: 2 })) return 2;\n if (editor?.isActive(\"heading\", { level: 3 })) return 3;\n return 0;\n };\n\n const hasAnyMainTools =\n enabledFeatures.heading ||\n enabledFeatures.formatting ||\n enabledFeatures.lists ||\n enabledFeatures.code ||\n enabledFeatures.quote ||\n enabledFeatures.link ||\n enabledFeatures.table ||\n enabledFeatures.image ||\n enabledFeatures.taskList ||\n enabledFeatures.alignment;\n\n if (!editor) {\n return (\n <div className=\"rounded-lg border bg-gray-50 h-48 animate-pulse\"></div>\n );\n }\n\n return (\n <div\n className={`pd-text-editor w-full rounded-lg border border-gray-200 shadow-sm ${className}`.trim()}\n >\n {stickyToolbar && (\n <div className=\"sticky top-0 z-10 flex flex-wrap items-center gap-1 border-b bg-gray-50 p-3\">\n {enabledFeatures.history && <HistoryTools editor={editor} />}\n\n {enabledFeatures.history && hasAnyMainTools && <ToolbarDivider />}\n\n {enabledFeatures.heading && (\n <HeadingSelect\n value={getActiveHeadingLevel()}\n onChange={(level) => {\n if (level === 0) editor.chain().focus().setParagraph().run();\n else editor.chain().focus().toggleHeading({ level }).run();\n }}\n />\n )}\n\n {enabledFeatures.heading &&\n (enabledFeatures.formatting ||\n enabledFeatures.lists ||\n enabledFeatures.code ||\n enabledFeatures.quote ||\n enabledFeatures.link ||\n enabledFeatures.table ||\n enabledFeatures.image ||\n enabledFeatures.taskList) && <ToolbarDivider />}\n\n {enabledFeatures.formatting && <FormattingTools editor={editor} />}\n\n {enabledFeatures.formatting &&\n (enabledFeatures.alignment ||\n enabledFeatures.lists ||\n enabledFeatures.code ||\n enabledFeatures.quote ||\n enabledFeatures.link ||\n enabledFeatures.table ||\n enabledFeatures.image ||\n enabledFeatures.taskList) && <ToolbarDivider />}\n\n {enabledFeatures.alignment && <AlignmentTools editor={editor} />}\n\n {enabledFeatures.alignment &&\n (enabledFeatures.lists ||\n enabledFeatures.code ||\n enabledFeatures.quote ||\n enabledFeatures.link ||\n enabledFeatures.table ||\n enabledFeatures.image ||\n enabledFeatures.taskList) && <ToolbarDivider />}\n\n {enabledFeatures.lists && <ListTools editor={editor} />}\n\n {enabledFeatures.lists &&\n (enabledFeatures.code ||\n enabledFeatures.quote ||\n enabledFeatures.link ||\n enabledFeatures.table ||\n enabledFeatures.image ||\n enabledFeatures.taskList) && <ToolbarDivider />}\n\n {enabledFeatures.code && <CodeTools editor={editor} />}\n\n {enabledFeatures.code &&\n (enabledFeatures.quote ||\n enabledFeatures.link ||\n enabledFeatures.table ||\n enabledFeatures.image ||\n enabledFeatures.taskList) && <ToolbarDivider />}\n\n {enabledFeatures.quote && <QuoteTools editor={editor} />}\n\n {enabledFeatures.quote &&\n (enabledFeatures.link ||\n enabledFeatures.table ||\n enabledFeatures.image ||\n enabledFeatures.taskList) && <ToolbarDivider />}\n\n {enabledFeatures.link && <LinkPopover editor={editor} />}\n\n {enabledFeatures.link &&\n (enabledFeatures.table ||\n enabledFeatures.image ||\n enabledFeatures.taskList) && <ToolbarDivider />}\n\n {enabledFeatures.table && <TableTools editor={editor} />}\n\n {enabledFeatures.table &&\n (enabledFeatures.image || enabledFeatures.taskList) && (\n <ToolbarDivider />\n )}\n\n {enabledFeatures.image && (\n <ImagePopover editor={editor} onImageUpload={onImageUpload} />\n )}\n\n {enabledFeatures.image && enabledFeatures.taskList && (\n <ToolbarDivider />\n )}\n\n {enabledFeatures.taskList && <InsertTools editor={editor} />}\n </div>\n )}\n\n {stickyToolbar === false && bubblePos && (\n <div\n className=\"fixed z-20 -translate-x-1/2 rounded-lg border border-gray-200 bg-white p-1 shadow-lg\"\n style={{ top: bubblePos.top, left: bubblePos.left }}\n >\n <FormattingTools editor={editor} />\n {enabledFeatures.link && <LinkPopover editor={editor} />}\n </div>\n )}\n\n {enabledFeatures.slashCommand && slashOpen && (\n <div className=\"absolute left-4 top-16 z-20 w-56 rounded-lg border border-gray-200 bg-white p-2 shadow-lg\">\n <button\n type=\"button\"\n className=\"block w-full rounded px-2 py-1 text-left text-sm hover:bg-gray-100\"\n onClick={() => {\n editor.chain().focus().toggleHeading({ level: 1 }).run();\n setSlashOpen(false);\n }}\n >\n Heading 1\n </button>\n <button\n type=\"button\"\n className=\"block w-full rounded px-2 py-1 text-left text-sm hover:bg-gray-100\"\n onClick={() => {\n editor.chain().focus().toggleBulletList().run();\n setSlashOpen(false);\n }}\n >\n Bullet List\n </button>\n <button\n type=\"button\"\n className=\"block w-full rounded px-2 py-1 text-left text-sm hover:bg-gray-100\"\n onClick={() => {\n editor.chain().focus().toggleCodeBlock().run();\n setSlashOpen(false);\n }}\n >\n Code Block\n </button>\n </div>\n )}\n\n {/* Editor */}\n <EditorContent\n editor={editor}\n className={`w-full min-h-[300px] focus-within:bg-white ${editorClassName}`.trim()}\n />\n </div>\n );\n};\n\nexport default TextEditor;\n"],"names":["TextEditor","_a","_b","initialContent","onUpdate","features","_c","stickyToolbar","_d","toolbarPreset","onImageUpload","_e","className","_f","editorClassName","_g","contentClassName","enabledFeatures","React","useMemo","withDefaultFeatures","toolbarPresetFeatures","_h","useState","slashOpen","setSlashOpen","_j","bubblePos","setBubblePos","editor","useEditor","extensions","createTextEditorExtensions","content","getHTML","editorProps","attributes","class","editorContentClassName","concat","trim","handleKeyDown","_view","event","slashCommand","key","immediatelyRender","useEffect","updateBubble","state","selection","from","to","isFocused","window","getSelection","rangeCount","rect","getRangeAt","getBoundingClientRect","top","scrollY","left","scrollX","width","onBlur","on","off","lastAppliedInitialContentRef","useRef","current","commands","setContent","emitUpdate","hasAnyMainTools","heading","formatting","lists","code","quote","link","table","image","taskList","alignment","_jsxs","children","history","_jsx","HistoryTools","ToolbarDivider","HeadingSelect","value","isActive","level","onChange","chain","focus","setParagraph","run","toggleHeading","FormattingTools","AlignmentTools","ListTools","CodeTools","QuoteTools","LinkPopover","TableTools","ImagePopover","InsertTools","style","type","onClick","toggleBulletList","toggleCodeBlock","EditorContent"],"mappings":"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"}
1
+ {"version":3,"file":"TextEditor.mjs","sources":["../../../../../src/components/Form/TextEditor/TextEditor.tsx"],"sourcesContent":["import React from \"react\";\nimport { EditorContent, useEditor, type Editor } from \"@tiptap/react\";\nimport ImagePopover from \"./ImagePopover\";\nimport LinkPopover from \"./LinkPopover\";\nimport {\n AlignmentTools,\n CodeTools,\n FormattingTools,\n HistoryTools,\n InsertTools,\n ListTools,\n QuoteTools,\n TableTools,\n} from \"./ToolbarGroups\";\nimport {\n createTextEditorExtensions,\n editorContentClassName,\n type TextEditorContentFormat,\n type TextEditorFeatures,\n type ToolbarPreset,\n toolbarPresetFeatures,\n withDefaultFeatures,\n} from \"./extensions\";\nimport { HeadingLevel, HeadingSelect, ToolbarDivider } from \"./toolbar\";\n\nexport interface TextEditorProps {\n initialContent?: string;\n onUpdate: (content: string) => void;\n contentFormat?: TextEditorContentFormat;\n features?: TextEditorFeatures;\n stickyToolbar?: boolean;\n toolbarPreset?: ToolbarPreset;\n onImageUpload?: (file: File) => Promise<{ url: string; assetId?: string }>;\n placeholder?: string;\n showCounts?: boolean;\n status?: React.ReactNode;\n className?: string;\n editorClassName?: string;\n contentClassName?: string;\n}\n\nconst getTextEditorCounts = (text: string) => {\n const trimmedText = text.trim();\n\n return {\n words: trimmedText ? trimmedText.split(/\\s+/).length : 0,\n characters: text.length,\n };\n};\n\nconst getEditorContentByFormat = (\n editor: Editor,\n contentFormat: TextEditorContentFormat,\n) => {\n return contentFormat === \"markdown\" ? editor.getMarkdown() : editor.getHTML();\n};\n\nconst TextEditor: React.FC<TextEditorProps> = ({\n initialContent = \"\",\n onUpdate,\n contentFormat = \"html\",\n features,\n stickyToolbar = true,\n toolbarPreset = \"standard\",\n onImageUpload,\n placeholder = \"Start writing...\",\n showCounts = true,\n status,\n className = \"\",\n editorClassName = \"\",\n contentClassName = \"\",\n}) => {\n const enabledFeatures = React.useMemo(\n () =>\n withDefaultFeatures({\n ...toolbarPresetFeatures[toolbarPreset],\n ...features,\n }),\n [features, toolbarPreset],\n );\n const [slashOpen, setSlashOpen] = React.useState(false);\n const [bubblePos, setBubblePos] = React.useState<{\n top: number;\n left: number;\n } | null>(null);\n const [counts, setCounts] = React.useState({ words: 0, characters: 0 });\n const onUpdateRef = React.useRef(onUpdate);\n const contentFormatRef = React.useRef(contentFormat);\n onUpdateRef.current = onUpdate;\n contentFormatRef.current = contentFormat;\n\n const editorExtensions = React.useMemo(\n () =>\n createTextEditorExtensions(enabledFeatures, {\n contentFormat,\n placeholder,\n }),\n [contentFormat, enabledFeatures, placeholder],\n );\n\n const getEditorContent = React.useCallback(\n (editorInstance: Editor) => {\n return getEditorContentByFormat(editorInstance, contentFormat);\n },\n [contentFormat],\n );\n\n const editor = useEditor(\n {\n extensions: editorExtensions,\n content: initialContent,\n contentType: contentFormat === \"markdown\" ? \"markdown\" : undefined,\n onUpdate: ({ editor }) => {\n onUpdateRef.current(\n getEditorContentByFormat(editor, contentFormatRef.current),\n );\n },\n editorProps: {\n attributes: {\n class: `${editorContentClassName} ${contentClassName}`.trim(),\n },\n handleKeyDown: (_view, event) => {\n if (!enabledFeatures.slashCommand) return false;\n if (event.key === \"/\") {\n setSlashOpen(true);\n return false;\n }\n if (event.key === \"Escape\") {\n setSlashOpen(false);\n }\n return false;\n },\n },\n immediatelyRender: false,\n },\n [\n contentClassName,\n contentFormat,\n editorExtensions,\n enabledFeatures.slashCommand,\n ],\n );\n\n React.useEffect(() => {\n if (!editor) return;\n const updateCounts = () => {\n setCounts(getTextEditorCounts(editor.getText()));\n };\n\n updateCounts();\n editor.on(\"update\", updateCounts);\n\n return () => {\n editor.off(\"update\", updateCounts);\n };\n }, [editor]);\n\n React.useEffect(() => {\n if (!editor) return;\n const updateBubble = () => {\n const { from, to } = editor.state.selection;\n if (from === to || !editor.isFocused) {\n setBubblePos(null);\n return;\n }\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) {\n setBubblePos(null);\n return;\n }\n const rect = selection.getRangeAt(0).getBoundingClientRect();\n setBubblePos({\n top: rect.top + window.scrollY - 48,\n left: rect.left + window.scrollX + rect.width / 2,\n });\n };\n const onBlur = () => setBubblePos(null);\n editor.on(\"selectionUpdate\", updateBubble);\n editor.on(\"blur\", onBlur);\n return () => {\n editor.off(\"selectionUpdate\", updateBubble);\n editor.off(\"blur\", onBlur);\n };\n }, [editor]);\n\n const lastAppliedInitialContentRef = React.useRef(initialContent);\n const lastAppliedEditorContentRef = React.useRef<string | null>(null);\n const lastEditorRef = React.useRef<Editor | null>(null);\n\n React.useEffect(() => {\n if (!editor) {\n return;\n }\n\n if (lastEditorRef.current !== editor) {\n lastEditorRef.current = editor;\n lastAppliedInitialContentRef.current = initialContent;\n lastAppliedEditorContentRef.current = getEditorContent(editor);\n return;\n }\n\n if (lastAppliedEditorContentRef.current === null) {\n lastAppliedEditorContentRef.current = getEditorContent(editor);\n }\n\n if (initialContent === lastAppliedInitialContentRef.current) {\n return;\n }\n\n const currentContent = getEditorContent(editor);\n const wasUntouchedSinceLastSync =\n currentContent === lastAppliedEditorContentRef.current;\n\n if (!wasUntouchedSinceLastSync) {\n return;\n }\n\n editor.commands.setContent(initialContent || \"\", {\n emitUpdate: false,\n contentType: contentFormat === \"markdown\" ? \"markdown\" : undefined,\n });\n lastAppliedInitialContentRef.current = initialContent;\n lastAppliedEditorContentRef.current = getEditorContent(editor);\n\n setCounts(getTextEditorCounts(editor.getText()));\n }, [contentFormat, editor, getEditorContent, initialContent]);\n\n const getActiveHeadingLevel = (): HeadingLevel => {\n if (editor?.isActive(\"heading\", { level: 1 })) return 1;\n if (editor?.isActive(\"heading\", { level: 2 })) return 2;\n if (editor?.isActive(\"heading\", { level: 3 })) return 3;\n return 0;\n };\n\n const slashCommands = [\n {\n label: \"Heading 1\",\n enabled: enabledFeatures.heading,\n run: () => editor?.chain().focus().toggleHeading({ level: 1 }).run(),\n },\n {\n label: \"Bullet List\",\n enabled: enabledFeatures.lists,\n run: () => editor?.chain().focus().toggleBulletList().run(),\n },\n {\n label: \"Code Block\",\n enabled: enabledFeatures.code,\n run: () => editor?.chain().focus().toggleCodeBlock().run(),\n },\n ].filter((item) => item.enabled);\n\n if (!editor) {\n return (\n <div className=\"h-48 animate-pulse rounded-xl border border-gray-200 bg-gray-50 shadow-sm dark:border-gray-700 dark:bg-gray-800\"></div>\n );\n }\n\n const toolbarGroups = [\n {\n key: \"history\",\n enabled: enabledFeatures.history,\n render: () => <HistoryTools editor={editor} />,\n },\n {\n key: \"heading\",\n enabled: enabledFeatures.heading,\n render: () => (\n <HeadingSelect\n value={getActiveHeadingLevel()}\n onChange={(level) => {\n if (level === 0) editor.chain().focus().setParagraph().run();\n else editor.chain().focus().toggleHeading({ level }).run();\n }}\n />\n ),\n },\n {\n key: \"formatting\",\n enabled: enabledFeatures.formatting,\n render: () => <FormattingTools editor={editor} />,\n },\n {\n key: \"alignment\",\n enabled: enabledFeatures.alignment,\n render: () => <AlignmentTools editor={editor} />,\n },\n {\n key: \"lists\",\n enabled: enabledFeatures.lists,\n render: () => <ListTools editor={editor} />,\n },\n {\n key: \"code\",\n enabled: enabledFeatures.code,\n render: () => <CodeTools editor={editor} />,\n },\n {\n key: \"quote\",\n enabled: enabledFeatures.quote,\n render: () => <QuoteTools editor={editor} />,\n },\n {\n key: \"link\",\n enabled: enabledFeatures.link,\n render: () => <LinkPopover editor={editor} />,\n },\n {\n key: \"table\",\n enabled: enabledFeatures.table,\n render: () => <TableTools editor={editor} />,\n },\n {\n key: \"image\",\n enabled: enabledFeatures.image,\n render: () => <ImagePopover editor={editor} onImageUpload={onImageUpload} />,\n },\n {\n key: \"taskList\",\n enabled: enabledFeatures.taskList,\n render: () => <InsertTools editor={editor} />,\n },\n ].filter((group) => group.enabled);\n\n return (\n <div\n className={`pd-text-editor relative w-full overflow-hidden rounded-xl border border-gray-200 bg-white text-gray-900 shadow-sm ring-1 ring-black/[0.02] dark:border-gray-700 dark:bg-gray-950 dark:text-gray-100 dark:ring-white/[0.04] ${className}`.trim()}\n >\n {stickyToolbar && (\n <div className=\"sticky top-0 z-10 flex flex-wrap items-center gap-1 border-b border-gray-200 bg-white/95 px-3 py-2 text-gray-700 backdrop-blur dark:border-gray-800 dark:bg-gray-950/95 dark:text-gray-200\">\n {toolbarGroups.map((group, index) => (\n <React.Fragment key={group.key}>\n {index > 0 && <ToolbarDivider />}\n {group.render()}\n </React.Fragment>\n ))}\n </div>\n )}\n\n {stickyToolbar === false && bubblePos && (\n <div\n className=\"fixed z-20 flex -translate-x-1/2 items-center gap-1 rounded-xl border border-gray-200 bg-white/95 p-1 text-gray-700 shadow-xl shadow-gray-900/10 ring-1 ring-black/5 backdrop-blur dark:border-gray-700 dark:bg-gray-900/95 dark:text-gray-200 dark:shadow-black/30 dark:ring-white/10\"\n style={{ top: bubblePos.top, left: bubblePos.left }}\n >\n <FormattingTools editor={editor} />\n {enabledFeatures.link && <LinkPopover editor={editor} />}\n </div>\n )}\n\n {enabledFeatures.slashCommand && slashOpen && slashCommands.length > 0 && (\n <div className=\"absolute left-4 top-16 z-20 w-56 rounded-lg border border-gray-200 bg-white p-2 text-gray-700 shadow-lg dark:border-gray-700 dark:bg-gray-900 dark:text-gray-200\">\n {slashCommands.map((item) => (\n <button\n key={item.label}\n type=\"button\"\n className=\"block w-full rounded px-2 py-1 text-left text-sm hover:bg-gray-100 dark:hover:bg-gray-800\"\n onClick={() => {\n item.run();\n setSlashOpen(false);\n }}\n >\n {item.label}\n </button>\n ))}\n </div>\n )}\n\n {/* Editor */}\n <EditorContent\n editor={editor}\n className={`min-h-[300px] w-full focus-within:bg-white dark:focus-within:bg-gray-950 ${editorClassName}`.trim()}\n />\n\n {(showCounts || status) && (\n <div className=\"flex items-center justify-between gap-3 border-t border-gray-200 bg-gray-50/70 px-4 py-2 text-[11px] font-medium text-gray-500 dark:border-gray-800 dark:bg-gray-900/60 dark:text-gray-400\">\n {showCounts ? (\n <div className=\"flex items-center gap-3 font-mono\">\n <span>{counts.words} words</span>\n <span>{counts.characters} chars</span>\n </div>\n ) : (\n <span />\n )}\n\n {status && (\n <div className=\"flex items-center gap-2 text-gray-500 dark:text-gray-400\">\n <span>{status}</span>\n <span className=\"h-1.5 w-1.5 rounded-full bg-primary-500\" aria-hidden=\"true\" />\n </div>\n )}\n </div>\n )}\n </div>\n );\n};\n\nexport default TextEditor;\n"],"names":["getTextEditorCounts","text","trimmedText","trim","words","split","length","characters","getEditorContentByFormat","editor","contentFormat","getMarkdown","getHTML","TextEditor","_a","_b","initialContent","onUpdate","_c","features","_d","stickyToolbar","_e","toolbarPreset","onImageUpload","_f","placeholder","_g","showCounts","status","_h","className","_j","editorClassName","_k","contentClassName","enabledFeatures","React","useMemo","withDefaultFeatures","toolbarPresetFeatures","_l","useState","slashOpen","setSlashOpen","_m","bubblePos","setBubblePos","_o","counts","setCounts","onUpdateRef","useRef","contentFormatRef","current","editorExtensions","createTextEditorExtensions","getEditorContent","useCallback","editorInstance","useEditor","extensions","content","contentType","undefined","editorProps","attributes","class","editorContentClassName","concat","handleKeyDown","_view","event","slashCommand","key","immediatelyRender","useEffect","updateCounts","getText","on","off","updateBubble","state","selection","from","to","isFocused","window","getSelection","rangeCount","rect","getRangeAt","getBoundingClientRect","top","scrollY","left","scrollX","width","onBlur","lastAppliedInitialContentRef","lastAppliedEditorContentRef","lastEditorRef","commands","setContent","emitUpdate","slashCommands","label","enabled","heading","run","chain","focus","toggleHeading","level","lists","toggleBulletList","code","toggleCodeBlock","filter","item","_jsx","toolbarGroups","history","render","HistoryTools","HeadingSelect","value","isActive","onChange","setParagraph","formatting","FormattingTools","alignment","AlignmentTools","ListTools","CodeTools","quote","QuoteTools","link","LinkPopover","table","TableTools","image","ImagePopover","taskList","InsertTools","group","_jsxs","children","map","index","Fragment","ToolbarDivider","style","type","onClick","EditorContent"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{jsxs as e,Fragment as t,jsx as i}from"react/jsx-runtime";import n from"react";import{Undo2 as r,Redo2 as c,Minus as l,Bold as o,Italic as s,Underline as u,Strikethrough as a,AlignLeft as d,AlignCenter as f,AlignRight as v,AlignJustify as h,List as g,ListOrdered as b,Code as A,FileCode as m,Quote as k,Table2 as x,Rows3 as p,Trash2 as w,Columns3 as y,TableProperties as C,Split as z,ListTodo as P}from"lucide-react";import{ToolbarButton as L}from"./toolbar.mjs";var N=function(n){var o=n.editor;return e(t,{children:[i(L,{onClick:function(){return o.chain().focus().undo().run()},disabled:!o.can().undo(),title:"Undo",children:i(r,{size:16})}),i(L,{onClick:function(){return o.chain().focus().redo().run()},disabled:!o.can().redo(),title:"Redo",children:i(c,{size:16})}),i(L,{onClick:function(){return o.chain().focus().unsetAllMarks().run()},title:"Clear formatting",children:i(l,{size:16})})]})},T=function(n){var r=n.editor;return e(t,{children:[i(L,{onClick:function(){return r.chain().focus().toggleBold().run()},active:r.isActive("bold"),ariaPressed:r.isActive("bold"),title:"Bold",children:i(o,{size:16})}),i(L,{onClick:function(){return r.chain().focus().toggleItalic().run()},active:r.isActive("italic"),ariaPressed:r.isActive("italic"),title:"Italic",children:i(s,{size:16})}),i(L,{onClick:function(){return r.chain().focus().toggleUnderline().run()},active:r.isActive("underline"),ariaPressed:r.isActive("underline"),title:"Underline",children:i(u,{size:16})}),i(L,{onClick:function(){return r.chain().focus().toggleStrike().run()},active:r.isActive("strike"),ariaPressed:r.isActive("strike"),title:"Strikethrough",children:i(a,{size:16})})]})},B=function(n){var r=n.editor;return e(t,{children:[i(L,{onClick:function(){return r.chain().focus().toggleBulletList().run()},active:r.isActive("bulletList"),ariaPressed:r.isActive("bulletList"),title:"Bullet list",children:i(g,{size:16})}),i(L,{onClick:function(){return r.chain().focus().toggleOrderedList().run()},active:r.isActive("orderedList"),ariaPressed:r.isActive("orderedList"),title:"Numbered list",children:i(b,{size:16})})]})},E=function(n){var r=n.editor;return e(t,{children:[i(L,{onClick:function(){return r.chain().focus().toggleCode().run()},active:r.isActive("code"),ariaPressed:r.isActive("code"),title:"Inline code",children:i(A,{size:16})}),i(L,{onClick:function(){return r.chain().focus().toggleCodeBlock().run()},active:r.isActive("codeBlock"),ariaPressed:r.isActive("codeBlock"),title:"Code block",children:i(m,{size:16})})]})},j=function(e){var t=e.editor;return i(L,{onClick:function(){return t.chain().focus().toggleBlockquote().run()},active:t.isActive("blockquote"),ariaPressed:t.isActive("blockquote"),title:"Quote",children:i(k,{size:16})})},R=function(t){var r=t.editor,c=n.useState(!1),l=c[0],o=c[1],s=n.useRef(null),u=r.isActive("table");n.useEffect((function(){if(l){var e=function(e){var t;(null===(t=s.current)||void 0===t?void 0:t.contains(e.target))||o(!1)},t=function(e){"Escape"===e.key&&o(!1)};return window.addEventListener("mousedown",e),window.addEventListener("keydown",t),function(){window.removeEventListener("mousedown",e),window.removeEventListener("keydown",t)}}}),[l]);var a=function(e){e(),o(!1)};return e("div",{className:"relative",ref:s,children:[i(L,{onClick:function(){return o((function(e){return!e}))},title:"Table actions",active:u,ariaPressed:l,children:i(x,{size:16})}),l&&e("div",{className:"absolute left-1/2 z-10 mt-2 w-56 -translate-x-1/2 rounded-lg border border-gray-200 bg-white p-1 shadow-lg",children:[e("button",{type:"button",className:"flex w-full items-center gap-2 rounded px-2 py-1 text-left text-sm hover:bg-gray-100",onClick:function(){return a((function(){return r.chain().focus().insertTable({rows:3,cols:3,withHeaderRow:!0}).run()}))},children:[i(x,{size:14})," Insert table"]}),e("button",{type:"button",disabled:!u,className:"flex w-full items-center gap-2 rounded px-2 py-1 text-left text-sm hover:bg-gray-100 disabled:cursor-not-allowed disabled:opacity-50",onClick:function(){return a((function(){return r.chain().focus().addRowAfter().run()}))},children:[i(p,{size:14})," Add row"]}),e("button",{type:"button",disabled:!u,className:"flex w-full items-center gap-2 rounded px-2 py-1 text-left text-sm hover:bg-gray-100 disabled:cursor-not-allowed disabled:opacity-50",onClick:function(){return a((function(){return r.chain().focus().deleteRow().run()}))},children:[i(w,{size:14})," Delete row"]}),e("button",{type:"button",disabled:!u,className:"flex w-full items-center gap-2 rounded px-2 py-1 text-left text-sm hover:bg-gray-100 disabled:cursor-not-allowed disabled:opacity-50",onClick:function(){return a((function(){return r.chain().focus().addColumnAfter().run()}))},children:[i(y,{size:14})," Add column"]}),e("button",{type:"button",disabled:!u,className:"flex w-full items-center gap-2 rounded px-2 py-1 text-left text-sm hover:bg-gray-100 disabled:cursor-not-allowed disabled:opacity-50",onClick:function(){return a((function(){return r.chain().focus().deleteColumn().run()}))},children:[i(C,{size:14})," Delete column"]}),e("button",{type:"button",disabled:!u,className:"flex w-full items-center gap-2 rounded px-2 py-1 text-left text-sm hover:bg-gray-100 disabled:cursor-not-allowed disabled:opacity-50",onClick:function(){return a((function(){return r.chain().focus().mergeOrSplit().run()}))},children:[i(z,{size:14})," Merge/Split cells"]}),e("button",{type:"button",disabled:!u,className:"flex w-full items-center gap-2 rounded px-2 py-1 text-left text-sm text-red-700 hover:bg-red-50 disabled:cursor-not-allowed disabled:opacity-50",onClick:function(){return a((function(){return r.chain().focus().deleteTable().run()}))},children:[i(w,{size:14})," Delete table"]})]})]})},S=function(e){var n=e.editor;return i(t,{children:i(L,{onClick:function(){return n.chain().focus().toggleTaskList().run()},active:n.isActive("taskList"),ariaPressed:n.isActive("taskList"),title:"Task list",children:i(P,{size:16})})})},I=function(n){var r=n.editor;return e(t,{children:[i(L,{onClick:function(){return r.chain().focus().setTextAlign("left").run()},active:r.isActive({textAlign:"left"}),ariaPressed:r.isActive({textAlign:"left"}),title:"Align left",children:i(d,{size:16})}),i(L,{onClick:function(){return r.chain().focus().setTextAlign("center").run()},active:r.isActive({textAlign:"center"}),ariaPressed:r.isActive({textAlign:"center"}),title:"Align center",children:i(f,{size:16})}),i(L,{onClick:function(){return r.chain().focus().setTextAlign("right").run()},active:r.isActive({textAlign:"right"}),ariaPressed:r.isActive({textAlign:"right"}),title:"Align right",children:i(v,{size:16})}),i(L,{onClick:function(){return r.chain().focus().setTextAlign("justify").run()},active:r.isActive({textAlign:"justify"}),ariaPressed:r.isActive({textAlign:"justify"}),title:"Justify",children:i(h,{size:16})})]})};export{I as AlignmentTools,E as CodeTools,T as FormattingTools,N as HistoryTools,S as InsertTools,B as ListTools,j as QuoteTools,R as TableTools};
1
+ import{jsxs as e,Fragment as t,jsx as r}from"react/jsx-runtime";import n from"react";import{Undo2 as i,Redo2 as c,Minus as o,Bold as a,Italic as l,Underline as u,Strikethrough as s,AlignLeft as d,AlignCenter as f,AlignRight as b,AlignJustify as v,ChevronDown as h,List as g,ListOrdered as m,Code as k,FileCode as y,Quote as p,Table2 as A,Rows3 as w,Trash2 as x,Columns3 as C,TableProperties as z,Split as N,ListTodo as L}from"lucide-react";import{ToolbarButton as P}from"./toolbar.mjs";var B="absolute left-1/2 z-20 mt-2 -translate-x-1/2 rounded-xl border border-gray-200 bg-white p-2 text-gray-700 shadow-xl shadow-gray-900/10 ring-1 ring-black/5 dark:border-gray-700 dark:bg-gray-900 dark:text-gray-200 dark:shadow-black/30 dark:ring-white/10",E="flex w-full items-center gap-2 rounded-lg px-2.5 py-2 text-left text-sm transition-colors hover:bg-gray-100 disabled:cursor-not-allowed disabled:opacity-50 dark:hover:bg-gray-800",S=function(e,t,r){n.useEffect((function(){if(e){var n=function(e){var n;(null===(n=t.current)||void 0===n?void 0:n.contains(e.target))||r()},i=function(e){"Escape"===e.key&&r()};return window.addEventListener("mousedown",n),window.addEventListener("keydown",i),function(){window.removeEventListener("mousedown",n),window.removeEventListener("keydown",i)}}}),[r,e,t])},I=function(n){var a=n.editor;return e(t,{children:[r(P,{onClick:function(){return a.chain().focus().undo().run()},disabled:!a.can().undo(),title:"Undo",children:r(i,{size:16})}),r(P,{onClick:function(){return a.chain().focus().redo().run()},disabled:!a.can().redo(),title:"Redo",children:r(c,{size:16})}),r(P,{onClick:function(){return a.chain().focus().unsetAllMarks().run()},title:"Clear formatting",children:r(o,{size:16})})]})},R=function(n){var i=n.editor;return e(t,{children:[r(P,{onClick:function(){return i.chain().focus().toggleBold().run()},active:i.isActive("bold"),ariaPressed:i.isActive("bold"),title:"Bold",children:r(a,{size:16})}),r(P,{onClick:function(){return i.chain().focus().toggleItalic().run()},active:i.isActive("italic"),ariaPressed:i.isActive("italic"),title:"Italic",children:r(l,{size:16})}),r(P,{onClick:function(){return i.chain().focus().toggleUnderline().run()},active:i.isActive("underline"),ariaPressed:i.isActive("underline"),title:"Underline",children:r(u,{size:16})}),r(P,{onClick:function(){return i.chain().focus().toggleStrike().run()},active:i.isActive("strike"),ariaPressed:i.isActive("strike"),title:"Strikethrough",children:r(s,{size:16})})]})},T=function(n){var i=n.editor;return e(t,{children:[r(P,{onClick:function(){return i.chain().focus().toggleBulletList().run()},active:i.isActive("bulletList"),ariaPressed:i.isActive("bulletList"),title:"Bullet list",children:r(g,{size:16})}),r(P,{onClick:function(){return i.chain().focus().toggleOrderedList().run()},active:i.isActive("orderedList"),ariaPressed:i.isActive("orderedList"),title:"Numbered list",children:r(m,{size:16})})]})},j=function(n){var i=n.editor;return e(t,{children:[r(P,{onClick:function(){return i.chain().focus().toggleCode().run()},active:i.isActive("code"),ariaPressed:i.isActive("code"),title:"Inline code",children:r(k,{size:16})}),r(P,{onClick:function(){return i.chain().focus().toggleCodeBlock().run()},active:i.isActive("codeBlock"),ariaPressed:i.isActive("codeBlock"),title:"Code block",children:r(y,{size:16})})]})},q=function(e){var t=e.editor;return r(P,{onClick:function(){return t.chain().focus().toggleBlockquote().run()},active:t.isActive("blockquote"),ariaPressed:t.isActive("blockquote"),title:"Quote",children:r(p,{size:16})})},D=function(t){var i=t.editor,c=n.useState(!1),o=c[0],a=c[1],l=n.useState({rows:3,cols:3}),u=l[0],s=l[1],d=n.useRef(null),f=i.isActive("table"),b=n.useCallback((function(){return a(!1)}),[]);S(o,d,b);var v=function(e){e(),a(!1)};return e("div",{className:"relative",ref:d,children:[r(P,{onClick:function(){return a((function(e){return!e}))},title:"Table actions",active:f,ariaPressed:o,children:r(A,{size:16})}),o&&e("div",{className:"".concat(B," w-64"),children:[e("div",{className:"mb-2 flex items-center justify-between px-1",children:[r("span",{className:"text-xs font-medium text-gray-500 dark:text-gray-400",children:"Insert table"}),e("span",{className:"rounded-full bg-primary-50 px-2 py-0.5 text-xs font-medium text-primary-700 dark:bg-primary-900/40 dark:text-primary-300",children:[u.rows," x ",u.cols]})]}),r("div",{className:"grid grid-cols-6 gap-1 px-1 pb-2",children:Array.from({length:6}).map((function(e,t){return Array.from({length:6}).map((function(e,n){var c=t+1,o=n+1,a=c<=u.rows&&o<=u.cols;return r("button",{type:"button",className:"h-7 rounded-md border transition-colors ".concat(a?"border-primary-500 bg-primary-500/20 dark:bg-primary-500/25":"border-gray-200 bg-gray-50 hover:border-primary-400 dark:border-gray-700 dark:bg-gray-950"),title:"Insert ".concat(c," x ").concat(o," table"),"aria-label":"Insert ".concat(c," x ").concat(o," table"),onMouseEnter:function(){return s({rows:c,cols:o})},onFocus:function(){return s({rows:c,cols:o})},onClick:function(){return v((function(){return i.chain().focus().insertTable({rows:c,cols:o,withHeaderRow:!0}).run()}))}},"".concat(c,"-").concat(o))}))}))}),e("div",{className:"border-t border-gray-100 pt-2 dark:border-gray-800",children:[e("button",{type:"button",disabled:!f,className:E,onClick:function(){return v((function(){return i.chain().focus().addRowAfter().run()}))},children:[r(w,{size:14})," Add row"]}),e("button",{type:"button",disabled:!f,className:E,onClick:function(){return v((function(){return i.chain().focus().deleteRow().run()}))},children:[r(x,{size:14})," Delete row"]}),e("button",{type:"button",disabled:!f,className:E,onClick:function(){return v((function(){return i.chain().focus().addColumnAfter().run()}))},children:[r(C,{size:14})," Add column"]}),e("button",{type:"button",disabled:!f,className:E,onClick:function(){return v((function(){return i.chain().focus().deleteColumn().run()}))},children:[r(z,{size:14})," Delete column"]}),e("button",{type:"button",disabled:!f,className:E,onClick:function(){return v((function(){return i.chain().focus().mergeOrSplit().run()}))},children:[r(N,{size:14})," Merge/Split cells"]}),e("button",{type:"button",disabled:!f,className:"".concat(E," text-red-700 hover:bg-red-50 dark:text-red-400 dark:hover:bg-red-950/40"),onClick:function(){return v((function(){return i.chain().focus().deleteTable().run()}))},children:[r(x,{size:14})," Delete table"]})]})]})]})},M=function(e){var n=e.editor;return r(t,{children:r(P,{onClick:function(){return n.chain().focus().toggleTaskList().run()},active:n.isActive("taskList"),ariaPressed:n.isActive("taskList"),title:"Task list",children:r(L,{size:16})})})},U=[{value:"left",label:"Align left",icon:d},{value:"center",label:"Align center",icon:f},{value:"right",label:"Align right",icon:b},{value:"justify",label:"Justify",icon:v}],O=function(t){var i,c=t.editor,o=n.useState(!1),a=o[0],l=o[1],u=n.useRef(null),s=null!==(i=U.find((function(e){return c.isActive({textAlign:e.value})})))&&void 0!==i?i:U[0],d=s.icon,f=n.useCallback((function(){return l(!1)}),[]);return S(a,u,f),e("div",{className:"relative",ref:u,children:[e(P,{onClick:function(){return l((function(e){return!e}))},active:a,ariaPressed:a,title:s.label,className:"gap-1",children:[r(d,{size:16}),r(h,{size:12})]}),a&&r("div",{className:"".concat(B," w-44"),children:U.map((function(t){var n=t.icon,i=c.isActive({textAlign:t.value});return e("button",{type:"button",className:"".concat(E," ").concat(i?"bg-primary-50 text-primary-700 dark:bg-primary-900/40 dark:text-primary-300":""),onClick:function(){c.chain().focus().setTextAlign(t.value).run(),l(!1)},children:[r(n,{size:14})," ",t.label]},t.value)}))})]})};export{O as AlignmentTools,j as CodeTools,R as FormattingTools,I as HistoryTools,M as InsertTools,T as ListTools,q as QuoteTools,D as TableTools};
2
2
  //# sourceMappingURL=ToolbarGroups.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ToolbarGroups.mjs","sources":["../../../../../src/components/Form/TextEditor/ToolbarGroups.tsx"],"sourcesContent":["import React from \"react\";\nimport type { Editor } from \"@tiptap/react\";\nimport {\n Bold as BoldIcon,\n Italic as ItalicIcon,\n Underline as UnderlineIcon,\n List,\n ListOrdered,\n Code as CodeIcon,\n FileCode,\n Strikethrough,\n Quote,\n Minus,\n Undo2,\n Redo2,\n Table2,\n Rows3,\n Columns3,\n TableProperties,\n Split,\n Trash2,\n ListTodo,\n AlignLeft,\n AlignCenter,\n AlignRight,\n AlignJustify,\n} from \"lucide-react\";\n\nimport { ToolbarButton } from \"./toolbar\";\n\nexport const HistoryTools: React.FC<{ editor: Editor }> = ({ editor }) => (\n <>\n <ToolbarButton onClick={() => editor.chain().focus().undo().run()} disabled={!editor.can().undo()} title=\"Undo\"><Undo2 size={16} /></ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().redo().run()} disabled={!editor.can().redo()} title=\"Redo\"><Redo2 size={16} /></ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().unsetAllMarks().run()} title=\"Clear formatting\"><Minus size={16} /></ToolbarButton>\n </>\n);\n\nexport const FormattingTools: React.FC<{ editor: Editor }> = ({ editor }) => (\n <>\n <ToolbarButton onClick={() => editor.chain().focus().toggleBold().run()} active={editor.isActive(\"bold\")} ariaPressed={editor.isActive(\"bold\")} title=\"Bold\"><BoldIcon size={16} /></ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().toggleItalic().run()} active={editor.isActive(\"italic\")} ariaPressed={editor.isActive(\"italic\")} title=\"Italic\"><ItalicIcon size={16} /></ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().toggleUnderline().run()} active={editor.isActive(\"underline\")} ariaPressed={editor.isActive(\"underline\")} title=\"Underline\"><UnderlineIcon size={16} /></ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().toggleStrike().run()} active={editor.isActive(\"strike\")} ariaPressed={editor.isActive(\"strike\")} title=\"Strikethrough\"><Strikethrough size={16} /></ToolbarButton>\n </>\n);\n\nexport const ListTools: React.FC<{ editor: Editor }> = ({ editor }) => (\n <>\n <ToolbarButton onClick={() => editor.chain().focus().toggleBulletList().run()} active={editor.isActive(\"bulletList\")} ariaPressed={editor.isActive(\"bulletList\")} title=\"Bullet list\"><List size={16} /></ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().toggleOrderedList().run()} active={editor.isActive(\"orderedList\")} ariaPressed={editor.isActive(\"orderedList\")} title=\"Numbered list\"><ListOrdered size={16} /></ToolbarButton>\n </>\n);\n\nexport const CodeTools: React.FC<{ editor: Editor }> = ({ editor }) => (\n <>\n <ToolbarButton onClick={() => editor.chain().focus().toggleCode().run()} active={editor.isActive(\"code\")} ariaPressed={editor.isActive(\"code\")} title=\"Inline code\"><CodeIcon size={16} /></ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().toggleCodeBlock().run()} active={editor.isActive(\"codeBlock\")} ariaPressed={editor.isActive(\"codeBlock\")} title=\"Code block\"><FileCode size={16} /></ToolbarButton>\n </>\n);\n\nexport const QuoteTools: React.FC<{ editor: Editor }> = ({ editor }) => (\n <ToolbarButton onClick={() => editor.chain().focus().toggleBlockquote().run()} active={editor.isActive(\"blockquote\")} ariaPressed={editor.isActive(\"blockquote\")} title=\"Quote\"><Quote size={16} /></ToolbarButton>\n);\n\nexport const TableTools: React.FC<{ editor: Editor }> = ({ editor }) => {\n const [open, setOpen] = React.useState(false);\n const ref = React.useRef<HTMLDivElement | null>(null);\n const inTable = editor.isActive(\"table\");\n\n React.useEffect(() => {\n if (!open) return;\n const onDown = (event: MouseEvent) => {\n if (!ref.current?.contains(event.target as Node)) setOpen(false);\n };\n const onEsc = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") setOpen(false);\n };\n window.addEventListener(\"mousedown\", onDown);\n window.addEventListener(\"keydown\", onEsc);\n return () => {\n window.removeEventListener(\"mousedown\", onDown);\n window.removeEventListener(\"keydown\", onEsc);\n };\n }, [open]);\n\n const run = (action: () => void) => {\n action();\n setOpen(false);\n };\n\n return (\n <div className=\"relative\" ref={ref}>\n <ToolbarButton onClick={() => setOpen((prev) => !prev)} title=\"Table actions\" active={inTable} ariaPressed={open}>\n <Table2 size={16} />\n </ToolbarButton>\n {open && (\n <div className=\"absolute left-1/2 z-10 mt-2 w-56 -translate-x-1/2 rounded-lg border border-gray-200 bg-white p-1 shadow-lg\">\n <button type=\"button\" className=\"flex w-full items-center gap-2 rounded px-2 py-1 text-left text-sm hover:bg-gray-100\" onClick={() => run(() => editor.chain().focus().insertTable({ rows: 3, cols: 3, withHeaderRow: true }).run())}><Table2 size={14} /> Insert table</button>\n <button type=\"button\" disabled={!inTable} className=\"flex w-full items-center gap-2 rounded px-2 py-1 text-left text-sm hover:bg-gray-100 disabled:cursor-not-allowed disabled:opacity-50\" onClick={() => run(() => editor.chain().focus().addRowAfter().run())}><Rows3 size={14} /> Add row</button>\n <button type=\"button\" disabled={!inTable} className=\"flex w-full items-center gap-2 rounded px-2 py-1 text-left text-sm hover:bg-gray-100 disabled:cursor-not-allowed disabled:opacity-50\" onClick={() => run(() => editor.chain().focus().deleteRow().run())}><Trash2 size={14} /> Delete row</button>\n <button type=\"button\" disabled={!inTable} className=\"flex w-full items-center gap-2 rounded px-2 py-1 text-left text-sm hover:bg-gray-100 disabled:cursor-not-allowed disabled:opacity-50\" onClick={() => run(() => editor.chain().focus().addColumnAfter().run())}><Columns3 size={14} /> Add column</button>\n <button type=\"button\" disabled={!inTable} className=\"flex w-full items-center gap-2 rounded px-2 py-1 text-left text-sm hover:bg-gray-100 disabled:cursor-not-allowed disabled:opacity-50\" onClick={() => run(() => editor.chain().focus().deleteColumn().run())}><TableProperties size={14} /> Delete column</button>\n <button type=\"button\" disabled={!inTable} className=\"flex w-full items-center gap-2 rounded px-2 py-1 text-left text-sm hover:bg-gray-100 disabled:cursor-not-allowed disabled:opacity-50\" onClick={() => run(() => editor.chain().focus().mergeOrSplit().run())}><Split size={14} /> Merge/Split cells</button>\n <button type=\"button\" disabled={!inTable} className=\"flex w-full items-center gap-2 rounded px-2 py-1 text-left text-sm text-red-700 hover:bg-red-50 disabled:cursor-not-allowed disabled:opacity-50\" onClick={() => run(() => editor.chain().focus().deleteTable().run())}><Trash2 size={14} /> Delete table</button>\n </div>\n )}\n </div>\n );\n};\n\nexport const InsertTools: React.FC<{ editor: Editor }> = ({ editor }) => (\n <>\n <ToolbarButton onClick={() => editor.chain().focus().toggleTaskList().run()} active={editor.isActive(\"taskList\")} ariaPressed={editor.isActive(\"taskList\")} title=\"Task list\"><ListTodo size={16} /></ToolbarButton>\n </>\n);\n\nexport const AlignmentTools: React.FC<{ editor: Editor }> = ({ editor }) => (\n <>\n <ToolbarButton onClick={() => editor.chain().focus().setTextAlign(\"left\").run()} active={editor.isActive({ textAlign: \"left\" })} ariaPressed={editor.isActive({ textAlign: \"left\" })} title=\"Align left\"><AlignLeft size={16} /></ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().setTextAlign(\"center\").run()} active={editor.isActive({ textAlign: \"center\" })} ariaPressed={editor.isActive({ textAlign: \"center\" })} title=\"Align center\"><AlignCenter size={16} /></ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().setTextAlign(\"right\").run()} active={editor.isActive({ textAlign: \"right\" })} ariaPressed={editor.isActive({ textAlign: \"right\" })} title=\"Align right\"><AlignRight size={16} /></ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().setTextAlign(\"justify\").run()} active={editor.isActive({ textAlign: \"justify\" })} ariaPressed={editor.isActive({ textAlign: \"justify\" })} title=\"Justify\"><AlignJustify size={16} /></ToolbarButton>\n </>\n);\n"],"names":["HistoryTools","_a","editor","_jsxs","_Fragment","children","_jsx","ToolbarButton","onClick","chain","focus","undo","run","disabled","can","title","Undo2","size","redo","Redo2","unsetAllMarks","Minus","FormattingTools","toggleBold","active","isActive","ariaPressed","BoldIcon","toggleItalic","ItalicIcon","toggleUnderline","UnderlineIcon","toggleStrike","Strikethrough","ListTools","toggleBulletList","List","toggleOrderedList","ListOrdered","CodeTools","toggleCode","CodeIcon","toggleCodeBlock","FileCode","QuoteTools","toggleBlockquote","Quote","TableTools","_b","React","useState","open","setOpen","ref","useRef","inTable","useEffect","onDown","event","current","contains","target","onEsc","key","window","addEventListener","removeEventListener","action","className","prev","Table2","type","insertTable","rows","cols","withHeaderRow","addRowAfter","Rows3","deleteRow","Trash2","addColumnAfter","Columns3","deleteColumn","TableProperties","mergeOrSplit","Split","deleteTable","InsertTools","toggleTaskList","ListTodo","AlignmentTools","setTextAlign","textAlign","AlignLeft","AlignCenter","AlignRight","AlignJustify"],"mappings":"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"}
1
+ {"version":3,"file":"ToolbarGroups.mjs","sources":["../../../../../src/components/Form/TextEditor/ToolbarGroups.tsx"],"sourcesContent":["import React from \"react\";\nimport type { Editor } from \"@tiptap/react\";\nimport {\n Bold as BoldIcon,\n Italic as ItalicIcon,\n Underline as UnderlineIcon,\n List,\n ListOrdered,\n Code as CodeIcon,\n FileCode,\n Strikethrough,\n Quote,\n Minus,\n Undo2,\n Redo2,\n Table2,\n Rows3,\n Columns3,\n TableProperties,\n Split,\n Trash2,\n ListTodo,\n AlignLeft,\n AlignCenter,\n AlignRight,\n AlignJustify,\n ChevronDown,\n} from \"lucide-react\";\n\nimport { ToolbarButton } from \"./toolbar\";\n\nconst menuSurfaceClassName =\n \"absolute left-1/2 z-20 mt-2 -translate-x-1/2 rounded-xl border border-gray-200 bg-white p-2 text-gray-700 shadow-xl shadow-gray-900/10 ring-1 ring-black/5 dark:border-gray-700 dark:bg-gray-900 dark:text-gray-200 dark:shadow-black/30 dark:ring-white/10\";\n\nconst menuItemClassName =\n \"flex w-full items-center gap-2 rounded-lg px-2.5 py-2 text-left text-sm transition-colors hover:bg-gray-100 disabled:cursor-not-allowed disabled:opacity-50 dark:hover:bg-gray-800\";\n\nconst tableGridSize = 6;\n\nconst useDismissiblePopover = (\n open: boolean,\n ref: React.RefObject<HTMLElement>,\n onClose: () => void,\n) => {\n React.useEffect(() => {\n if (!open) return;\n\n const onDown = (event: MouseEvent) => {\n if (!ref.current?.contains(event.target as Node)) onClose();\n };\n const onEsc = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") onClose();\n };\n\n window.addEventListener(\"mousedown\", onDown);\n window.addEventListener(\"keydown\", onEsc);\n return () => {\n window.removeEventListener(\"mousedown\", onDown);\n window.removeEventListener(\"keydown\", onEsc);\n };\n }, [onClose, open, ref]);\n};\n\nexport const HistoryTools: React.FC<{ editor: Editor }> = ({ editor }) => (\n <>\n <ToolbarButton onClick={() => editor.chain().focus().undo().run()} disabled={!editor.can().undo()} title=\"Undo\"><Undo2 size={16} /></ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().redo().run()} disabled={!editor.can().redo()} title=\"Redo\"><Redo2 size={16} /></ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().unsetAllMarks().run()} title=\"Clear formatting\"><Minus size={16} /></ToolbarButton>\n </>\n);\n\nexport const FormattingTools: React.FC<{ editor: Editor }> = ({ editor }) => (\n <>\n <ToolbarButton onClick={() => editor.chain().focus().toggleBold().run()} active={editor.isActive(\"bold\")} ariaPressed={editor.isActive(\"bold\")} title=\"Bold\"><BoldIcon size={16} /></ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().toggleItalic().run()} active={editor.isActive(\"italic\")} ariaPressed={editor.isActive(\"italic\")} title=\"Italic\"><ItalicIcon size={16} /></ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().toggleUnderline().run()} active={editor.isActive(\"underline\")} ariaPressed={editor.isActive(\"underline\")} title=\"Underline\"><UnderlineIcon size={16} /></ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().toggleStrike().run()} active={editor.isActive(\"strike\")} ariaPressed={editor.isActive(\"strike\")} title=\"Strikethrough\"><Strikethrough size={16} /></ToolbarButton>\n </>\n);\n\nexport const ListTools: React.FC<{ editor: Editor }> = ({ editor }) => (\n <>\n <ToolbarButton onClick={() => editor.chain().focus().toggleBulletList().run()} active={editor.isActive(\"bulletList\")} ariaPressed={editor.isActive(\"bulletList\")} title=\"Bullet list\"><List size={16} /></ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().toggleOrderedList().run()} active={editor.isActive(\"orderedList\")} ariaPressed={editor.isActive(\"orderedList\")} title=\"Numbered list\"><ListOrdered size={16} /></ToolbarButton>\n </>\n);\n\nexport const CodeTools: React.FC<{ editor: Editor }> = ({ editor }) => (\n <>\n <ToolbarButton onClick={() => editor.chain().focus().toggleCode().run()} active={editor.isActive(\"code\")} ariaPressed={editor.isActive(\"code\")} title=\"Inline code\"><CodeIcon size={16} /></ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().toggleCodeBlock().run()} active={editor.isActive(\"codeBlock\")} ariaPressed={editor.isActive(\"codeBlock\")} title=\"Code block\"><FileCode size={16} /></ToolbarButton>\n </>\n);\n\nexport const QuoteTools: React.FC<{ editor: Editor }> = ({ editor }) => (\n <ToolbarButton onClick={() => editor.chain().focus().toggleBlockquote().run()} active={editor.isActive(\"blockquote\")} ariaPressed={editor.isActive(\"blockquote\")} title=\"Quote\"><Quote size={16} /></ToolbarButton>\n);\n\nexport const TableTools: React.FC<{ editor: Editor }> = ({ editor }) => {\n const [open, setOpen] = React.useState(false);\n const [hoveredSize, setHoveredSize] = React.useState({ rows: 3, cols: 3 });\n const ref = React.useRef<HTMLDivElement | null>(null);\n const inTable = editor.isActive(\"table\");\n const close = React.useCallback(() => setOpen(false), []);\n\n useDismissiblePopover(open, ref, close);\n\n const run = (action: () => void) => {\n action();\n setOpen(false);\n };\n\n return (\n <div className=\"relative\" ref={ref}>\n <ToolbarButton onClick={() => setOpen((prev) => !prev)} title=\"Table actions\" active={inTable} ariaPressed={open}>\n <Table2 size={16} />\n </ToolbarButton>\n {open && (\n <div className={`${menuSurfaceClassName} w-64`}>\n <div className=\"mb-2 flex items-center justify-between px-1\">\n <span className=\"text-xs font-medium text-gray-500 dark:text-gray-400\">Insert table</span>\n <span className=\"rounded-full bg-primary-50 px-2 py-0.5 text-xs font-medium text-primary-700 dark:bg-primary-900/40 dark:text-primary-300\">\n {hoveredSize.rows} x {hoveredSize.cols}\n </span>\n </div>\n <div className=\"grid grid-cols-6 gap-1 px-1 pb-2\">\n {Array.from({ length: tableGridSize }).map((_, rowIndex) =>\n Array.from({ length: tableGridSize }).map((__, colIndex) => {\n const rows = rowIndex + 1;\n const cols = colIndex + 1;\n const selected = rows <= hoveredSize.rows && cols <= hoveredSize.cols;\n\n return (\n <button\n key={`${rows}-${cols}`}\n type=\"button\"\n className={`h-7 rounded-md border transition-colors ${\n selected\n ? \"border-primary-500 bg-primary-500/20 dark:bg-primary-500/25\"\n : \"border-gray-200 bg-gray-50 hover:border-primary-400 dark:border-gray-700 dark:bg-gray-950\"\n }`}\n title={`Insert ${rows} x ${cols} table`}\n aria-label={`Insert ${rows} x ${cols} table`}\n onMouseEnter={() => setHoveredSize({ rows, cols })}\n onFocus={() => setHoveredSize({ rows, cols })}\n onClick={() => run(() => editor.chain().focus().insertTable({ rows, cols, withHeaderRow: true }).run())}\n />\n );\n }),\n )}\n </div>\n\n <div className=\"border-t border-gray-100 pt-2 dark:border-gray-800\">\n <button type=\"button\" disabled={!inTable} className={menuItemClassName} onClick={() => run(() => editor.chain().focus().addRowAfter().run())}><Rows3 size={14} /> Add row</button>\n <button type=\"button\" disabled={!inTable} className={menuItemClassName} onClick={() => run(() => editor.chain().focus().deleteRow().run())}><Trash2 size={14} /> Delete row</button>\n <button type=\"button\" disabled={!inTable} className={menuItemClassName} onClick={() => run(() => editor.chain().focus().addColumnAfter().run())}><Columns3 size={14} /> Add column</button>\n <button type=\"button\" disabled={!inTable} className={menuItemClassName} onClick={() => run(() => editor.chain().focus().deleteColumn().run())}><TableProperties size={14} /> Delete column</button>\n <button type=\"button\" disabled={!inTable} className={menuItemClassName} onClick={() => run(() => editor.chain().focus().mergeOrSplit().run())}><Split size={14} /> Merge/Split cells</button>\n <button type=\"button\" disabled={!inTable} className={`${menuItemClassName} text-red-700 hover:bg-red-50 dark:text-red-400 dark:hover:bg-red-950/40`} onClick={() => run(() => editor.chain().focus().deleteTable().run())}><Trash2 size={14} /> Delete table</button>\n </div>\n </div>\n )}\n </div>\n );\n};\n\nexport const InsertTools: React.FC<{ editor: Editor }> = ({ editor }) => (\n <>\n <ToolbarButton onClick={() => editor.chain().focus().toggleTaskList().run()} active={editor.isActive(\"taskList\")} ariaPressed={editor.isActive(\"taskList\")} title=\"Task list\"><ListTodo size={16} /></ToolbarButton>\n </>\n);\n\nconst alignments = [\n { value: \"left\", label: \"Align left\", icon: AlignLeft },\n { value: \"center\", label: \"Align center\", icon: AlignCenter },\n { value: \"right\", label: \"Align right\", icon: AlignRight },\n { value: \"justify\", label: \"Justify\", icon: AlignJustify },\n] as const;\n\nexport const AlignmentTools: React.FC<{ editor: Editor }> = ({ editor }) => {\n const [open, setOpen] = React.useState(false);\n const ref = React.useRef<HTMLDivElement | null>(null);\n const activeAlignment = alignments.find((alignment) => editor.isActive({ textAlign: alignment.value })) ?? alignments[0];\n const ActiveIcon = activeAlignment.icon;\n const close = React.useCallback(() => setOpen(false), []);\n\n useDismissiblePopover(open, ref, close);\n\n return (\n <div className=\"relative\" ref={ref}>\n <ToolbarButton onClick={() => setOpen((prev) => !prev)} active={open} ariaPressed={open} title={activeAlignment.label} className=\"gap-1\">\n <ActiveIcon size={16} />\n <ChevronDown size={12} />\n </ToolbarButton>\n {open && (\n <div className={`${menuSurfaceClassName} w-44`}>\n {alignments.map((alignment) => {\n const Icon = alignment.icon;\n const active = editor.isActive({ textAlign: alignment.value });\n\n return (\n <button\n key={alignment.value}\n type=\"button\"\n className={`${menuItemClassName} ${active ? \"bg-primary-50 text-primary-700 dark:bg-primary-900/40 dark:text-primary-300\" : \"\"}`}\n onClick={() => {\n editor.chain().focus().setTextAlign(alignment.value).run();\n setOpen(false);\n }}\n >\n <Icon size={14} /> {alignment.label}\n </button>\n );\n })}\n </div>\n )}\n </div>\n );\n};\n"],"names":["menuSurfaceClassName","menuItemClassName","useDismissiblePopover","open","ref","onClose","React","useEffect","onDown","event","_a","current","contains","target","onEsc","key","window","addEventListener","removeEventListener","HistoryTools","editor","_jsxs","_Fragment","children","_jsx","ToolbarButton","onClick","chain","focus","undo","run","disabled","can","title","Undo2","size","redo","Redo2","unsetAllMarks","Minus","FormattingTools","toggleBold","active","isActive","ariaPressed","BoldIcon","toggleItalic","ItalicIcon","toggleUnderline","UnderlineIcon","toggleStrike","Strikethrough","ListTools","toggleBulletList","List","toggleOrderedList","ListOrdered","CodeTools","toggleCode","CodeIcon","toggleCodeBlock","FileCode","QuoteTools","toggleBlockquote","Quote","TableTools","_b","useState","setOpen","_c","rows","cols","hoveredSize","setHoveredSize","useRef","inTable","close","useCallback","action","className","prev","Table2","concat","Array","from","length","map","_","rowIndex","__","colIndex","selected","type","onMouseEnter","onFocus","insertTable","withHeaderRow","addRowAfter","Rows3","deleteRow","Trash2","addColumnAfter","Columns3","deleteColumn","TableProperties","mergeOrSplit","Split","deleteTable","InsertTools","toggleTaskList","ListTodo","alignments","value","label","icon","AlignLeft","AlignCenter","AlignRight","AlignJustify","AlignmentTools","activeAlignment","find","alignment","textAlign","ActiveIcon","ChevronDown","Icon","setTextAlign"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{__assign as e,__spreadArray as t}from"../../../node_modules/tslib/tslib.es6.mjs";import i from"../../../node_modules/@tiptap/extension-bold/dist/index.mjs";import o from"../../../node_modules/@tiptap/extension-bullet-list/dist/index.mjs";import n from"../../../node_modules/@tiptap/extension-code/dist/index.mjs";import s from"../../../node_modules/@tiptap/extension-code-block/dist/index.mjs";import m from"../../../node_modules/@tiptap/extension-heading/dist/index.mjs";import d from"@tiptap/extension-image";import r from"../../../node_modules/@tiptap/extension-italic/dist/index.mjs";import l from"@tiptap/extension-link";import a from"../../../node_modules/@tiptap/extension-list-item/dist/index.mjs";import p from"../../../node_modules/@tiptap/extension-ordered-list/dist/index.mjs";import x from"../../../node_modules/@tiptap/extension-strike/dist/index.mjs";import{Table as u}from"../../../node_modules/@tiptap/extension-table/dist/index.mjs";import f from"../../../node_modules/@tiptap/extension-table-cell/dist/index.mjs";import g from"../../../node_modules/@tiptap/extension-table-header/dist/index.mjs";import c from"../../../node_modules/@tiptap/extension-table-row/dist/index.mjs";import b from"../../../node_modules/@tiptap/extension-task-item/dist/index.mjs";import h from"../../../node_modules/@tiptap/extension-task-list/dist/index.mjs";import j from"../../../node_modules/@tiptap/extension-text-align/dist/index.mjs";import _ from"@tiptap/extension-underline";import k from"@tiptap/starter-kit";var L={heading:!0,formatting:!0,lists:!0,code:!0,quote:!0,link:!0,history:!0,placeholder:!0,slashCommand:!1,table:!1,image:!1,taskList:!1,alignment:!0},y={minimal:{heading:!1,formatting:!0,lists:!0,code:!1,quote:!1,link:!0,history:!0,placeholder:!0,slashCommand:!1,table:!1,image:!1,taskList:!1,alignment:!1},standard:e({},L),full:e(e({},L),{slashCommand:!0,table:!0,image:!0,taskList:!0,alignment:!0})},C=function(t){return e(e({},L),t)},v=function(e){var L=C(e);return t(t(t(t(t(t(t(t(t([k.configure({heading:!1,bulletList:!1,orderedList:!1,listItem:!1,codeBlock:!1})],L.formatting?[i,r,_,x]:[],!0),L.code?[n,s.configure({HTMLAttributes:{class:"bg-gray-100 p-3 rounded text-sm font-mono"}})]:[],!0),L.heading?[m.configure({levels:[1,2,3]})]:[],!0),L.alignment?[j.configure({types:["heading","paragraph"]})]:[],!0),L.lists?[o,p,a]:[],!0),L.link?[l.configure({openOnClick:!1,HTMLAttributes:{class:"text-blue-600 underline"}})]:[],!0),L.taskList?[h,b.configure({nested:!0})]:[],!0),L.image?[d.configure({inline:!1,allowBase64:!0})]:[],!0),L.table?[u.configure({resizable:!0}),c,g,f]:[],!0)},w="prose prose-sm max-w-none prose-h1:text-3xl prose-h1:font-bold prose-h2:text-2xl prose-h2:font-semibold prose-h3:text-xl prose-h3:font-semibold mx-auto focus:outline-none min-h-[200px] p-4";export{v as createTextEditorExtensions,L as defaultTextEditorFeatures,w as editorContentClassName,y as toolbarPresetFeatures,C as withDefaultFeatures};
1
+ import{__assign as e,__spreadArray as t}from"../../../node_modules/tslib/tslib.es6.mjs";import o from"../../../node_modules/@tiptap/extension-bold/dist/index.mjs";import i from"../../../node_modules/@tiptap/extension-bullet-list/dist/index.mjs";import n from"../../../node_modules/@tiptap/extension-code/dist/index.mjs";import s from"../../../node_modules/@tiptap/extension-code-block/dist/index.mjs";import r from"../../../node_modules/@tiptap/extension-heading/dist/index.mjs";import d from"@tiptap/extension-image";import m from"../../../node_modules/@tiptap/extension-italic/dist/index.mjs";import l from"@tiptap/extension-link";import a from"../../../node_modules/@tiptap/extension-list-item/dist/index.mjs";import p from"../../../node_modules/@tiptap/extension-ordered-list/dist/index.mjs";import x from"@tiptap/extension-placeholder";import u from"../../../node_modules/@tiptap/extension-strike/dist/index.mjs";import{Table as f}from"../../../node_modules/@tiptap/extension-table/dist/index.mjs";import c from"../../../node_modules/@tiptap/extension-table-cell/dist/index.mjs";import g from"../../../node_modules/@tiptap/extension-table-header/dist/index.mjs";import b from"../../../node_modules/@tiptap/extension-table-row/dist/index.mjs";import h from"../../../node_modules/@tiptap/extension-task-item/dist/index.mjs";import k from"../../../node_modules/@tiptap/extension-task-list/dist/index.mjs";import j from"../../../node_modules/@tiptap/extension-text-align/dist/index.mjs";import _ from"@tiptap/extension-underline";import{Markdown as v}from"@tiptap/markdown";import y from"@tiptap/starter-kit";var L={heading:!0,formatting:!0,lists:!0,code:!0,quote:!0,link:!0,history:!0,placeholder:!0,slashCommand:!1,table:!1,image:!1,taskList:!1,alignment:!0},w={minimal:{heading:!1,formatting:!0,lists:!0,code:!1,quote:!1,link:!0,history:!0,placeholder:!0,slashCommand:!1,table:!1,image:!1,taskList:!1,alignment:!1},standard:e({},L),full:e(e({},L),{slashCommand:!0,table:!0,image:!0,taskList:!0,alignment:!0})},C=function(t){return e(e({},L),t)},q=function(e,L){var w,q,A=C(e),B=null!==(w=null==L?void 0:L.contentFormat)&&void 0!==w?w:"html";return t(t(t(t(t(t(t(t(t(t(t([y.configure({heading:!1,bulletList:!1,orderedList:!1,listItem:!1,codeBlock:!1})],A.formatting?[o,m,_,u]:[],!0),A.code?[n,s.configure({HTMLAttributes:{class:"rounded bg-gray-100 p-3 font-mono text-sm dark:bg-gray-800"}})]:[],!0),A.heading?[r.configure({levels:[1,2,3]})]:[],!0),A.alignment?[j.configure({types:["heading","paragraph"]})]:[],!0),A.lists?[i,p,a]:[],!0),A.link?[l.configure({openOnClick:!1,HTMLAttributes:{class:"text-blue-600 underline dark:text-blue-400"}})]:[],!0),A.taskList?[k,h.configure({nested:!0})]:[],!0),A.image?[d.configure({inline:!1,allowBase64:!0})]:[],!0),A.table?[f.configure({resizable:!0}),b,g,c]:[],!0),A.placeholder?[x.configure({placeholder:null!==(q=null==L?void 0:L.placeholder)&&void 0!==q?q:"Start writing..."})]:[],!0),"markdown"===B?[v]:[],!0)},A="prose prose-sm max-w-none prose-h1:text-3xl prose-h1:font-bold prose-h2:text-2xl prose-h2:font-semibold prose-h3:text-xl prose-h3:font-semibold prose-a:text-blue-600 prose-code:rounded prose-code:bg-gray-100 prose-code:px-1 prose-code:py-0.5 prose-code:before:content-none prose-code:after:content-none mx-auto min-h-[200px] p-4 focus:outline-none dark:prose-invert dark:prose-a:text-blue-400 dark:prose-code:bg-gray-800";export{q as createTextEditorExtensions,L as defaultTextEditorFeatures,A as editorContentClassName,w as toolbarPresetFeatures,C as withDefaultFeatures};
2
2
  //# sourceMappingURL=extensions.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"extensions.mjs","sources":["../../../../../src/components/Form/TextEditor/extensions.ts"],"sourcesContent":["import Bold from \"@tiptap/extension-bold\";\nimport BulletList from \"@tiptap/extension-bullet-list\";\nimport Code from \"@tiptap/extension-code\";\nimport CodeBlock from \"@tiptap/extension-code-block\";\nimport Heading from \"@tiptap/extension-heading\";\nimport Image from \"@tiptap/extension-image\";\nimport Italic from \"@tiptap/extension-italic\";\nimport Link from \"@tiptap/extension-link\";\nimport ListItem from \"@tiptap/extension-list-item\";\nimport OrderedList from \"@tiptap/extension-ordered-list\";\nimport Strike from \"@tiptap/extension-strike\";\nimport { Table } from \"@tiptap/extension-table\";\nimport TableCell from \"@tiptap/extension-table-cell\";\nimport TableHeader from \"@tiptap/extension-table-header\";\nimport TableRow from \"@tiptap/extension-table-row\";\nimport TaskItem from \"@tiptap/extension-task-item\";\nimport TaskList from \"@tiptap/extension-task-list\";\nimport TextAlign from \"@tiptap/extension-text-align\";\nimport Underline from \"@tiptap/extension-underline\";\nimport StarterKit from \"@tiptap/starter-kit\";\n\nexport interface TextEditorFeatures {\n heading?: boolean;\n formatting?: boolean;\n lists?: boolean;\n code?: boolean;\n quote?: boolean;\n link?: boolean;\n history?: boolean;\n placeholder?: boolean;\n slashCommand?: boolean;\n table?: boolean;\n image?: boolean;\n taskList?: boolean;\n alignment?: boolean;\n}\n\nexport type ToolbarPreset = \"minimal\" | \"standard\" | \"full\";\n\nexport const defaultTextEditorFeatures: Required<TextEditorFeatures> = {\n heading: true,\n formatting: true,\n lists: true,\n code: true,\n quote: true,\n link: true,\n history: true,\n placeholder: true,\n slashCommand: false,\n table: false,\n image: false,\n taskList: false,\n alignment: true,\n};\n\nexport const toolbarPresetFeatures: Record<ToolbarPreset, Required<TextEditorFeatures>> = {\n minimal: {\n heading: false,\n formatting: true,\n lists: true,\n code: false,\n quote: false,\n link: true,\n history: true,\n placeholder: true,\n slashCommand: false,\n table: false,\n image: false,\n taskList: false,\n alignment: false,\n },\n standard: {\n ...defaultTextEditorFeatures,\n },\n full: {\n ...defaultTextEditorFeatures,\n slashCommand: true,\n table: true,\n image: true,\n taskList: true,\n alignment: true,\n },\n};\n\nexport const withDefaultFeatures = (features?: TextEditorFeatures): Required<TextEditorFeatures> => ({\n ...defaultTextEditorFeatures,\n ...features,\n});\n\nexport const createTextEditorExtensions = (features?: TextEditorFeatures) => {\n const f = withDefaultFeatures(features);\n\n return [\n StarterKit.configure({\n heading: false,\n bulletList: false,\n orderedList: false,\n listItem: false,\n codeBlock: false,\n }),\n ...(f.formatting ? [Bold, Italic, Underline, Strike] : []),\n ...(f.code\n ? [\n Code,\n CodeBlock.configure({\n HTMLAttributes: {\n class: \"bg-gray-100 p-3 rounded text-sm font-mono\",\n },\n }),\n ]\n : []),\n ...(f.heading ? [Heading.configure({ levels: [1, 2, 3] })] : []),\n ...(f.alignment ? [TextAlign.configure({ types: [\"heading\", \"paragraph\"] })] : []),\n ...(f.lists ? [BulletList, OrderedList, ListItem] : []),\n ...(f.link\n ? [\n Link.configure({\n openOnClick: false,\n HTMLAttributes: {\n class: \"text-blue-600 underline\",\n },\n }),\n ]\n : []),\n ...(f.taskList ? [TaskList, TaskItem.configure({ nested: true })] : []),\n ...(f.image ? [Image.configure({ inline: false, allowBase64: true })] : []),\n ...(f.table\n ? [\n Table.configure({ resizable: true }),\n TableRow,\n TableHeader,\n TableCell,\n ]\n : []),\n ];\n};\n\nexport const editorContentClassName =\n \"prose prose-sm max-w-none prose-h1:text-3xl prose-h1:font-bold prose-h2:text-2xl prose-h2:font-semibold prose-h3:text-xl prose-h3:font-semibold mx-auto focus:outline-none min-h-[200px] p-4\";\n"],"names":["defaultTextEditorFeatures","heading","formatting","lists","code","quote","link","history","placeholder","slashCommand","table","image","taskList","alignment","toolbarPresetFeatures","minimal","standard","__assign","full","withDefaultFeatures","features","createTextEditorExtensions","f","__spreadArray","StarterKit","configure","bulletList","orderedList","listItem","codeBlock","Bold","Italic","Underline","Strike","Code","CodeBlock","HTMLAttributes","class","Heading","levels","TextAlign","types","BulletList","OrderedList","ListItem","Link","openOnClick","TaskList","TaskItem","nested","Image","inline","allowBase64","Table","resizable","TableRow","TableHeader","TableCell","editorContentClassName"],"mappings":"i/CAuCO,IAAMA,EAA0D,CACnEC,SAAS,EACTC,YAAY,EACZC,OAAO,EACPC,MAAM,EACNC,OAAO,EACPC,MAAM,EACNC,SAAS,EACTC,aAAa,EACbC,cAAc,EACdC,OAAO,EACPC,OAAO,EACPC,UAAU,EACVC,WAAW,GAGFC,EAA6E,CACtFC,QAAS,CACLd,SAAS,EACTC,YAAY,EACZC,OAAO,EACPC,MAAM,EACNC,OAAO,EACPC,MAAM,EACNC,SAAS,EACTC,aAAa,EACbC,cAAc,EACdC,OAAO,EACPC,OAAO,EACPC,UAAU,EACVC,WAAW,GAEfG,SAAQC,EAAA,CAAA,EACDjB,GAEPkB,KAAID,EAAAA,EAAA,CAAA,EACGjB,GAAyB,CAC5BS,cAAc,EACdC,OAAO,EACPC,OAAO,EACPC,UAAU,EACVC,WAAW,KAINM,EAAsB,SAACC,GAAgE,OAAAH,EAAAA,EAAA,CAAA,EAC7FjB,GACAoB,EAF6F,EAKvFC,EAA6B,SAACD,GACvC,IAAME,EAAIH,EAAoBC,GAE9B,OAAAG,EAAAA,EAAAA,EAAAA,EAAAA,EAAAA,EAAAA,EAAAA,EAAAA,EAAA,CACIC,EAAWC,UAAU,CACjBxB,SAAS,EACTyB,YAAY,EACZC,aAAa,EACbC,UAAU,EACVC,WAAW,KAEXP,EAAEpB,WAAa,CAAC4B,EAAMC,EAAQC,EAAWC,GAAU,IAAG,GACtDX,EAAElB,KACA,CACI8B,EACAC,EAAUV,UAAU,CAChBW,eAAgB,CACZC,MAAO,gDAInB,OACFf,EAAErB,QAAU,CAACqC,EAAQb,UAAU,CAAEc,OAAQ,CAAC,EAAG,EAAG,MAAS,OACzDjB,EAAET,UAAY,CAAC2B,EAAUf,UAAU,CAAEgB,MAAO,CAAC,UAAW,gBAAmB,OAC3EnB,EAAEnB,MAAQ,CAACuC,EAAYC,EAAaC,GAAY,OAChDtB,EAAEhB,KACA,CACIuC,EAAKpB,UAAU,CACXqB,aAAa,EACbV,eAAgB,CACZC,MAAO,8BAInB,IAAG,GACLf,EAAEV,SAAW,CAACmC,EAAUC,EAASvB,UAAU,CAAEwB,QAAQ,KAAW,IAAG,GACnE3B,EAAEX,MAAQ,CAACuC,EAAMzB,UAAU,CAAE0B,QAAQ,EAAOC,aAAa,KAAW,IAAG,GACvE9B,EAAEZ,MACA,CACI2C,EAAM5B,UAAU,CAAE6B,WAAW,IAC7BC,EACAC,EACAC,GAEJ,IAAG,EAEjB,EAEaC,EACT"}
1
+ {"version":3,"file":"extensions.mjs","sources":["../../../../../src/components/Form/TextEditor/extensions.ts"],"sourcesContent":["import Bold from \"@tiptap/extension-bold\";\nimport BulletList from \"@tiptap/extension-bullet-list\";\nimport Code from \"@tiptap/extension-code\";\nimport CodeBlock from \"@tiptap/extension-code-block\";\nimport Heading from \"@tiptap/extension-heading\";\nimport Image from \"@tiptap/extension-image\";\nimport Italic from \"@tiptap/extension-italic\";\nimport Link from \"@tiptap/extension-link\";\nimport ListItem from \"@tiptap/extension-list-item\";\nimport OrderedList from \"@tiptap/extension-ordered-list\";\nimport Placeholder from \"@tiptap/extension-placeholder\";\nimport Strike from \"@tiptap/extension-strike\";\nimport { Table } from \"@tiptap/extension-table\";\nimport TableCell from \"@tiptap/extension-table-cell\";\nimport TableHeader from \"@tiptap/extension-table-header\";\nimport TableRow from \"@tiptap/extension-table-row\";\nimport TaskItem from \"@tiptap/extension-task-item\";\nimport TaskList from \"@tiptap/extension-task-list\";\nimport TextAlign from \"@tiptap/extension-text-align\";\nimport Underline from \"@tiptap/extension-underline\";\nimport { Markdown } from \"@tiptap/markdown\";\nimport StarterKit from \"@tiptap/starter-kit\";\n\nexport interface TextEditorFeatures {\n heading?: boolean;\n formatting?: boolean;\n lists?: boolean;\n code?: boolean;\n quote?: boolean;\n link?: boolean;\n history?: boolean;\n placeholder?: boolean;\n slashCommand?: boolean;\n table?: boolean;\n image?: boolean;\n taskList?: boolean;\n alignment?: boolean;\n}\n\nexport type ToolbarPreset = \"minimal\" | \"standard\" | \"full\";\n\nexport type TextEditorContentFormat = \"html\" | \"markdown\";\n\nexport const defaultTextEditorFeatures: Required<TextEditorFeatures> = {\n heading: true,\n formatting: true,\n lists: true,\n code: true,\n quote: true,\n link: true,\n history: true,\n placeholder: true,\n slashCommand: false,\n table: false,\n image: false,\n taskList: false,\n alignment: true,\n};\n\nexport const toolbarPresetFeatures: Record<ToolbarPreset, Required<TextEditorFeatures>> = {\n minimal: {\n heading: false,\n formatting: true,\n lists: true,\n code: false,\n quote: false,\n link: true,\n history: true,\n placeholder: true,\n slashCommand: false,\n table: false,\n image: false,\n taskList: false,\n alignment: false,\n },\n standard: {\n ...defaultTextEditorFeatures,\n },\n full: {\n ...defaultTextEditorFeatures,\n slashCommand: true,\n table: true,\n image: true,\n taskList: true,\n alignment: true,\n },\n};\n\nexport const withDefaultFeatures = (features?: TextEditorFeatures): Required<TextEditorFeatures> => ({\n ...defaultTextEditorFeatures,\n ...features,\n});\n\nexport const createTextEditorExtensions = (\n features?: TextEditorFeatures,\n options?: { contentFormat?: TextEditorContentFormat; placeholder?: string },\n) => {\n const f = withDefaultFeatures(features);\n const contentFormat = options?.contentFormat ?? \"html\";\n\n return [\n StarterKit.configure({\n heading: false,\n bulletList: false,\n orderedList: false,\n listItem: false,\n codeBlock: false,\n }),\n ...(f.formatting ? [Bold, Italic, Underline, Strike] : []),\n ...(f.code\n ? [\n Code,\n CodeBlock.configure({\n HTMLAttributes: {\n class: \"rounded bg-gray-100 p-3 font-mono text-sm dark:bg-gray-800\",\n },\n }),\n ]\n : []),\n ...(f.heading ? [Heading.configure({ levels: [1, 2, 3] })] : []),\n ...(f.alignment ? [TextAlign.configure({ types: [\"heading\", \"paragraph\"] })] : []),\n ...(f.lists ? [BulletList, OrderedList, ListItem] : []),\n ...(f.link\n ? [\n Link.configure({\n openOnClick: false,\n HTMLAttributes: {\n class: \"text-blue-600 underline dark:text-blue-400\",\n },\n }),\n ]\n : []),\n ...(f.taskList ? [TaskList, TaskItem.configure({ nested: true })] : []),\n ...(f.image ? [Image.configure({ inline: false, allowBase64: true })] : []),\n ...(f.table\n ? [\n Table.configure({ resizable: true }),\n TableRow,\n TableHeader,\n TableCell,\n ]\n : []),\n ...(f.placeholder\n ? [\n Placeholder.configure({\n placeholder: options?.placeholder ?? \"Start writing...\",\n }),\n ]\n : []),\n ...(contentFormat === \"markdown\" ? [Markdown] : []),\n ];\n};\n\nexport const editorContentClassName =\n \"prose prose-sm max-w-none prose-h1:text-3xl prose-h1:font-bold prose-h2:text-2xl prose-h2:font-semibold prose-h3:text-xl prose-h3:font-semibold prose-a:text-blue-600 prose-code:rounded prose-code:bg-gray-100 prose-code:px-1 prose-code:py-0.5 prose-code:before:content-none prose-code:after:content-none mx-auto min-h-[200px] p-4 focus:outline-none dark:prose-invert dark:prose-a:text-blue-400 dark:prose-code:bg-gray-800\";\n"],"names":["defaultTextEditorFeatures","heading","formatting","lists","code","quote","link","history","placeholder","slashCommand","table","image","taskList","alignment","toolbarPresetFeatures","minimal","standard","__assign","full","withDefaultFeatures","features","createTextEditorExtensions","options","f","contentFormat","_a","__spreadArray","StarterKit","configure","bulletList","orderedList","listItem","codeBlock","Bold","Italic","Underline","Strike","Code","CodeBlock","HTMLAttributes","class","Heading","levels","TextAlign","types","BulletList","OrderedList","ListItem","Link","openOnClick","TaskList","TaskItem","nested","Image","inline","allowBase64","Table","resizable","TableRow","TableHeader","TableCell","Placeholder","_b","Markdown","editorContentClassName"],"mappings":"0kDA2CO,IAAMA,EAA0D,CACnEC,SAAS,EACTC,YAAY,EACZC,OAAO,EACPC,MAAM,EACNC,OAAO,EACPC,MAAM,EACNC,SAAS,EACTC,aAAa,EACbC,cAAc,EACdC,OAAO,EACPC,OAAO,EACPC,UAAU,EACVC,WAAW,GAGFC,EAA6E,CACtFC,QAAS,CACLd,SAAS,EACTC,YAAY,EACZC,OAAO,EACPC,MAAM,EACNC,OAAO,EACPC,MAAM,EACNC,SAAS,EACTC,aAAa,EACbC,cAAc,EACdC,OAAO,EACPC,OAAO,EACPC,UAAU,EACVC,WAAW,GAEfG,SAAQC,EAAA,CAAA,EACDjB,GAEPkB,KAAID,EAAAA,EAAA,CAAA,EACGjB,GAAyB,CAC5BS,cAAc,EACdC,OAAO,EACPC,OAAO,EACPC,UAAU,EACVC,WAAW,KAINM,EAAsB,SAACC,GAAgE,OAAAH,EAAAA,EAAA,CAAA,EAC7FjB,GACAoB,EAF6F,EAKvFC,EAA6B,SACtCD,EACAE,WAEMC,EAAIJ,EAAoBC,GACxBI,EAAsC,QAAtBC,EAAAH,aAAO,EAAPA,EAASE,qBAAa,IAAAC,EAAAA,EAAI,OAEhD,OAAAC,EAAAA,EAAAA,EAAAA,EAAAA,EAAAA,EAAAA,EAAAA,EAAAA,EAAAA,EAAAA,EAAA,CACIC,EAAWC,UAAU,CACjB3B,SAAS,EACT4B,YAAY,EACZC,aAAa,EACbC,UAAU,EACVC,WAAW,KAEXT,EAAErB,WAAa,CAAC+B,EAAMC,EAAQC,EAAWC,GAAU,IAAG,GACtDb,EAAEnB,KACA,CACIiC,EACAC,EAAUV,UAAU,CAChBW,eAAgB,CACZC,MAAO,iEAInB,OACFjB,EAAEtB,QAAU,CAACwC,EAAQb,UAAU,CAAEc,OAAQ,CAAC,EAAG,EAAG,MAAS,OACzDnB,EAAEV,UAAY,CAAC8B,EAAUf,UAAU,CAAEgB,MAAO,CAAC,UAAW,gBAAmB,OAC3ErB,EAAEpB,MAAQ,CAAC0C,EAAYC,EAAaC,GAAY,OAChDxB,EAAEjB,KACA,CACI0C,EAAKpB,UAAU,CACXqB,aAAa,EACbV,eAAgB,CACZC,MAAO,iDAInB,IAAG,GACLjB,EAAEX,SAAW,CAACsC,EAAUC,EAASvB,UAAU,CAAEwB,QAAQ,KAAW,IAAG,GACnE7B,EAAEZ,MAAQ,CAAC0C,EAAMzB,UAAU,CAAE0B,QAAQ,EAAOC,aAAa,KAAW,IAAG,GACvEhC,EAAEb,MACA,CACI8C,EAAM5B,UAAU,CAAE6B,WAAW,IAC7BC,EACAC,EACAC,GAEJ,OACFrC,EAAEf,YACA,CACIqD,EAAYjC,UAAU,CAClBpB,YAAiC,QAApBsD,EAAAxC,eAAAA,EAASd,mBAAW,IAAAsD,EAAAA,EAAI,sBAG7C,OACgB,aAAlBtC,EAA+B,CAACuC,GAAY,IAAG,EAE3D,EAEaC,EACT"}