pillardash-ui-react 0.1.151 → 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 (32) hide show
  1. package/dist/cjs/components/Cards/Card.js +1 -1
  2. package/dist/cjs/components/Cards/Card.js.map +1 -1
  3. package/dist/cjs/components/Form/TextEditor/ImagePopover.js +1 -1
  4. package/dist/cjs/components/Form/TextEditor/ImagePopover.js.map +1 -1
  5. package/dist/cjs/components/Form/TextEditor/LinkPopover.js +1 -1
  6. package/dist/cjs/components/Form/TextEditor/LinkPopover.js.map +1 -1
  7. package/dist/cjs/components/Form/TextEditor/TextEditor.js +1 -1
  8. package/dist/cjs/components/Form/TextEditor/TextEditor.js.map +1 -1
  9. package/dist/cjs/components/Form/TextEditor/ToolbarGroups.js +1 -1
  10. package/dist/cjs/components/Form/TextEditor/ToolbarGroups.js.map +1 -1
  11. package/dist/cjs/components/Form/TextEditor/extensions.js +1 -1
  12. package/dist/cjs/components/Form/TextEditor/extensions.js.map +1 -1
  13. package/dist/cjs/components/Form/TextEditor/toolbar.js +1 -1
  14. package/dist/cjs/components/Form/TextEditor/toolbar.js.map +1 -1
  15. package/dist/esm/components/Cards/Card.mjs +1 -1
  16. package/dist/esm/components/Cards/Card.mjs.map +1 -1
  17. package/dist/esm/components/Form/TextEditor/ImagePopover.mjs +1 -1
  18. package/dist/esm/components/Form/TextEditor/ImagePopover.mjs.map +1 -1
  19. package/dist/esm/components/Form/TextEditor/LinkPopover.mjs +1 -1
  20. package/dist/esm/components/Form/TextEditor/LinkPopover.mjs.map +1 -1
  21. package/dist/esm/components/Form/TextEditor/TextEditor.mjs +1 -1
  22. package/dist/esm/components/Form/TextEditor/TextEditor.mjs.map +1 -1
  23. package/dist/esm/components/Form/TextEditor/ToolbarGroups.mjs +1 -1
  24. package/dist/esm/components/Form/TextEditor/ToolbarGroups.mjs.map +1 -1
  25. package/dist/esm/components/Form/TextEditor/extensions.mjs +1 -1
  26. package/dist/esm/components/Form/TextEditor/extensions.mjs.map +1 -1
  27. package/dist/esm/components/Form/TextEditor/toolbar.mjs +1 -1
  28. package/dist/esm/components/Form/TextEditor/toolbar.mjs.map +1 -1
  29. package/dist/index.d.ts +6 -2
  30. package/dist/styles.css +1 -1
  31. package/dist/text-editor.d.ts +6 -1
  32. package/package.json +11 -1
@@ -1,2 +1,2 @@
1
- "use strict";var n=require("react/jsx-runtime");module.exports=function(r){var e=r.children,o=r.className,a=void 0===o?"":o,t=r.glass,d=void 0!==t&&t,b="".concat("\n w-full\n rounded-2xl\n shadow-xl\n transition-all\n duration-300\n ease-out\n hover:-translate-y-0.5\n p-5\n relative\n z-0\n "," ").concat(d?"\n backdrop-blur-xl\n bg-white/20\n dark:bg-gray-800/20\n border\n border-white/30\n dark:border-gray-700/30\n shadow-lg\n hover:shadow-xl\n hover:bg-white/30\n dark:hover:bg-gray-800/30\n before:absolute\n before:inset-0\n before:rounded-2xl\n before:bg-gradient-to-br\n before:from-white/10\n before:dark:from-gray-900/10\n before:to-transparent\n before:pointer-events-none\n ":"\n backdrop-blur-2xl\n bg-white\n dark:bg-gray-800\n "," ").concat(a);return n.jsx("div",{className:b,children:e})};
1
+ "use strict";var r=require("react/jsx-runtime");module.exports=function(e){var o=e.children,a=e.className,d=void 0===a?"":a,b=e.variant,t=void 0===b?"default":b,n=e.padding,g=void 0===n?"md":n,s=e.glass,i=void 0!==s&&s?"glass":t,l="".concat("\n w-full\n relative\n rounded-2xl\n transition-all\n duration-200\n ease-out\n z-0\n "," ").concat({none:"p-0",sm:"p-4",md:"p-6",lg:"p-8"}[g]," ").concat({default:"border border-gray-200/70 bg-white shadow-sm hover:shadow-md dark:border-gray-800 dark:bg-gray-900",elevated:"border border-gray-100 bg-white shadow-lg hover:shadow-xl dark:border-gray-800 dark:bg-gray-900",outline:"border border-gray-200 bg-white shadow-none dark:border-gray-800 dark:bg-gray-900",glass:"border border-white/30 bg-white/20 shadow-lg backdrop-blur-xl hover:bg-white/30 hover:shadow-xl dark:border-gray-700/30 dark:bg-gray-800/20 dark:hover:bg-gray-800/30 before:pointer-events-none before:absolute before:inset-0 before:rounded-2xl before:bg-gradient-to-br before:from-white/10 before:to-transparent before:dark:from-gray-900/10",premium:"border border-gray-200/70 bg-white shadow-sm hover:shadow-md dark:border-gray-800 dark:bg-gray-900 before:pointer-events-none before:absolute before:inset-x-6 before:top-0 before:h-px before:bg-gradient-to-r before:from-transparent before:via-primary/50 before:to-transparent"}[i]," ").concat(d);return r.jsx("div",{className:l,children:o})};
2
2
  //# sourceMappingURL=Card.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Card.js","sources":["../../../../src/components/Cards/Card.tsx"],"sourcesContent":["import { ReactNode } from \"react\";\n\ninterface CardProps {\n children: ReactNode;\n className?: string;\n glass?: boolean;\n}\n\nconst Card = ({ children, className = \"\", glass = false }: CardProps) => {\n const baseClasses = `\n w-full\n rounded-2xl\n shadow-xl\n transition-all\n duration-300\n ease-out\n hover:-translate-y-0.5\n p-5\n relative\n z-0\n `;\n\n const glassClasses = `\n backdrop-blur-xl\n bg-white/20\n dark:bg-gray-800/20\n border\n border-white/30\n dark:border-gray-700/30\n shadow-lg\n hover:shadow-xl\n hover:bg-white/30\n dark:hover:bg-gray-800/30\n before:absolute\n before:inset-0\n before:rounded-2xl\n before:bg-gradient-to-br\n before:from-white/10\n before:dark:from-gray-900/10\n before:to-transparent\n before:pointer-events-none\n `;\n\n const solidClasses = `\n backdrop-blur-2xl\n bg-white\n dark:bg-gray-800\n `;\n\n const combinedClasses = `${baseClasses} ${glass ? glassClasses : solidClasses} ${className}`;\n\n return (\n <div className={combinedClasses}>\n {children}\n </div>\n );\n};\n\nexport default Card;\n"],"names":["_a","children","_b","className","_c","glass","combinedClasses","concat","_jsx"],"mappings":"+DAQa,SAACA,GAAE,IAAAC,EAAQD,EAAAC,SAAEC,EAAAF,EAAAG,UAAAA,OAAS,IAAAD,EAAG,GAAEA,EAAEE,EAAAJ,EAAAK,MAAAA,OAAK,IAAAD,GAAQA,EAyC7CE,EAAkB,GAAAC,OAxCJ,6MAwCkB,KAAAA,OAAIF,EA3BrB,+fAqBA,gFAMwD,KAAAE,OAAIJ,GAEjF,OACIK,EAAAA,WAAKL,UAAWG,EAAeL,SAC1BA,GAGb"}
1
+ {"version":3,"file":"Card.js","sources":["../../../../src/components/Cards/Card.tsx"],"sourcesContent":["import { ReactNode } from \"react\";\n\ntype CardVariant = \"default\" | \"elevated\" | \"outline\" | \"glass\" | \"premium\";\ntype CardPadding = \"none\" | \"sm\" | \"md\" | \"lg\";\n\nexport interface CardProps {\n children: ReactNode;\n className?: string;\n variant?: CardVariant;\n padding?: CardPadding;\n glass?: boolean;\n}\n\nconst Card = ({\n children,\n className = \"\",\n variant = \"default\",\n padding = \"md\",\n glass = false,\n}: CardProps) => {\n const selectedVariant = glass ? \"glass\" : variant;\n\n const baseClasses = `\n w-full\n relative\n rounded-2xl\n transition-all\n duration-200\n ease-out\n z-0\n `;\n\n const paddingClasses: Record<CardPadding, string> = {\n none: \"p-0\",\n sm: \"p-4\",\n md: \"p-6\",\n lg: \"p-8\",\n };\n\n const variantClasses: Record<CardVariant, string> = {\n default: \"border border-gray-200/70 bg-white shadow-sm hover:shadow-md dark:border-gray-800 dark:bg-gray-900\",\n elevated: \"border border-gray-100 bg-white shadow-lg hover:shadow-xl dark:border-gray-800 dark:bg-gray-900\",\n outline: \"border border-gray-200 bg-white shadow-none dark:border-gray-800 dark:bg-gray-900\",\n glass: \"border border-white/30 bg-white/20 shadow-lg backdrop-blur-xl hover:bg-white/30 hover:shadow-xl dark:border-gray-700/30 dark:bg-gray-800/20 dark:hover:bg-gray-800/30 before:pointer-events-none before:absolute before:inset-0 before:rounded-2xl before:bg-gradient-to-br before:from-white/10 before:to-transparent before:dark:from-gray-900/10\",\n premium: \"border border-gray-200/70 bg-white shadow-sm hover:shadow-md dark:border-gray-800 dark:bg-gray-900 before:pointer-events-none before:absolute before:inset-x-6 before:top-0 before:h-px before:bg-gradient-to-r before:from-transparent before:via-primary/50 before:to-transparent\",\n };\n\n const combinedClasses = `${baseClasses} ${paddingClasses[padding]} ${variantClasses[selectedVariant]} ${className}`;\n\n return (\n <div className={combinedClasses}>\n {children}\n </div>\n );\n};\n\nexport default Card;\n"],"names":["_a","children","_b","className","_c","variant","_d","padding","_e","glass","selectedVariant","combinedClasses","concat","none","sm","md","lg","default","elevated","outline","premium","_jsx"],"mappings":"+DAaa,SAACA,GACV,IAAAC,EAAQD,EAAAC,SACRC,EAAAF,EAAAG,UAAAA,OAAS,IAAAD,EAAG,GAAEA,EACdE,EAAAJ,EAAAK,QAAAA,OAAO,IAAAD,EAAG,UAASA,EACnBE,EAAAN,EAAAO,QAAAA,OAAO,IAAAD,EAAG,KAAIA,EACdE,EAAAR,EAAAS,MAEMC,OAFD,IAAAF,GAAQA,EAEmB,QAAUH,EA2BpCM,EAAkB,GAAAC,OAzBJ,6IAyBkB,KAAAA,OAfc,CAChDC,KAAM,MACNC,GAAI,MACJC,GAAI,MACJC,GAAI,OAWiDT,GAAQ,KAAAK,OARb,CAChDK,QAAS,qGACTC,SAAU,kGACVC,QAAS,oFACTV,MAAO,sVACPW,QAAS,uRAGuEV,GAAgB,KAAAE,OAAIT,GAExG,OACIkB,EAAAA,WAAKlB,UAAWQ,EAAeV,SAC1BA,GAGb"}
@@ -1,2 +1,2 @@
1
- "use strict";var e=require("../../../node_modules/tslib/tslib.es6.js"),t=require("react/jsx-runtime"),r=require("react"),n=require("lucide-react"),a=require("./toolbar.js");module.exports=function(s){var i=s.editor,l=s.onImageUpload,o=r.useState(!1),u=o[0],c=o[1],d=r.useState(""),m=d[0],f=d[1],b=r.useState(""),g=b[0],x=b[1],p=r.useState(!1),v=p[0],h=p[1],w=r.useRef(null);r.useEffect((function(){if(u){var e=function(e){w.current&&(w.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 t.jsxs("div",{className:"relative",ref:w,children:[t.jsx(a.ToolbarButton,{onClick:function(){return c((function(e){return!e}))},title:"Insert image",children:t.jsx(n.ImagePlus,{size:16})}),u&&t.jsxs("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.jsx("label",{className:"mb-1 block text-xs font-medium text-gray-600",children:"Image URL"}),t.jsx("input",{className:"mb-2 w-full rounded border border-gray-300 px-2 py-1 text-sm",value:m,onChange:function(e){return f(e.target.value)},placeholder:"https://example.com/image.jpg"}),t.jsx("label",{className:"mb-1 block text-xs font-medium text-gray-600",children:"Alt text"}),t.jsx("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:"Describe the image"}),t.jsx("label",{className:"mb-1 block text-xs font-medium text-gray-600",children:"Upload image"}),t.jsx("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(t){return e.__awaiter(void 0,void 0,void 0,(function(){var r,n,a,s;return e.__generator(this,(function(e){switch(e.label){case 0:if(!(r=null===(s=t.target.files)||void 0===s?void 0:s[0]))return[2];if(!r.type.startsWith("image/"))return t.target.value="",[2];h(!0),e.label=1;case 1:return e.trys.push([1,,6,7]),n="",l?[4,l(r)]:[3,3];case 2:return a=e.sent(),n=a.url,[3,5];case 3:return[4,new Promise((function(e,t){var n=new FileReader;n.onload=function(){"string"==typeof n.result?e(n.result):t(new Error("Invalid file result"))},n.onerror=function(){var e;return t(null!==(e=n.error)&&void 0!==e?e:new Error("Failed to read file"))},n.readAsDataURL(r)}))];case 4:n=e.sent(),e.label=5;case 5:return i.chain().focus().setImage({src:n,alt:g.trim()||r.name}).run(),c(!1),f(""),x(""),[3,7];case 6:return h(!1),t.target.value="",[7];case 7:return[2]}}))}))},disabled:v}),t.jsxs("div",{className:"flex gap-2",children:[t.jsx("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"}),t.jsx("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=m.trim();if(e)try{var t=new URL(e.includes(":")?e:"https://".concat(e));if(!["http:","https:"].includes(t.protocol))return;i.chain().focus().setImage({src:t.toString(),alt:g.trim()||void 0}).run(),c(!1),f(""),x("")}catch(e){return}},disabled:v,children:v?"Uploading...":"Insert"})]})]})]})};
1
+ "use strict";var e=require("../../../node_modules/tslib/tslib.es6.js"),r=require("react/jsx-runtime"),t=require("react"),a=require("lucide-react"),n=require("./toolbar.js");module.exports=function(l){var i=l.editor,o=l.onImageUpload,s=t.useState(!1),d=s[0],u=s[1],c=t.useState(""),g=c[0],b=c[1],m=t.useState(""),f=m[0],y=m[1],x=t.useState(!1),p=x[0],h=x[1],v=t.useRef(null);t.useEffect((function(){if(d){var e=function(e){v.current&&(v.current.contains(e.target)||u(!1))},r=function(e){"Escape"===e.key&&u(!1)};return window.addEventListener("mousedown",e),window.addEventListener("keydown",r),function(){window.removeEventListener("mousedown",e),window.removeEventListener("keydown",r)}}}),[d]);return r.jsxs("div",{className:"relative",ref:v,children:[r.jsx(n.ToolbarButton,{onClick:function(){return u((function(e){return!e}))},title:"Insert image",children:r.jsx(a.ImagePlus,{size:16})}),d&&r.jsxs("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.jsx("label",{className:"mb-1 block text-xs font-medium text-gray-600 dark:text-gray-300",children:"Image URL"}),r.jsx("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:g,onChange:function(e){return b(e.target.value)},placeholder:"https://example.com/image.jpg"}),r.jsx("label",{className:"mb-1 block text-xs font-medium text-gray-600 dark:text-gray-300",children:"Alt text"}),r.jsx("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:f,onChange:function(e){return y(e.target.value)},placeholder:"Describe the image"}),r.jsx("label",{className:"mb-1 block text-xs font-medium text-gray-600 dark:text-gray-300",children:"Upload image"}),r.jsx("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(r){return e.__awaiter(void 0,void 0,void 0,(function(){var t,a,n,l;return e.__generator(this,(function(e){switch(e.label){case 0:if(!(t=null===(l=r.target.files)||void 0===l?void 0:l[0]))return[2];if(!t.type.startsWith("image/"))return r.target.value="",[2];h(!0),e.label=1;case 1:return e.trys.push([1,,6,7]),a="",o?[4,o(t)]:[3,3];case 2:return n=e.sent(),a="string"==typeof n.url?n.url.trim():"",[3,5];case 3:return[4,new Promise((function(e,r){var a=new FileReader;a.onload=function(){"string"==typeof a.result?e(a.result):r(new Error("Invalid file result"))},a.onerror=function(){var e;return r(null!==(e=a.error)&&void 0!==e?e:new Error("Failed to read file"))},a.readAsDataURL(t)}))];case 4:a=e.sent(),e.label=5;case 5:return a?(i.chain().focus().setImage({src:a,alt:f.trim()||t.name}).run(),u(!1),b(""),y(""),[3,7]):[2];case 6:return h(!1),r.target.value="",[7];case 7:return[2]}}))}))},disabled:p}),r.jsxs("div",{className:"flex gap-2",children:[r.jsx("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 u(!1)},children:"Cancel"}),r.jsx("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=g.trim();if(e)try{var r=new URL(e.includes(":")?e:"https://".concat(e));if(!["http:","https:"].includes(r.protocol))return;i.chain().focus().setImage({src:r.toString(),alt:f.trim()||void 0}).run(),u(!1),b(""),y("")}catch(e){return}},disabled:p,children:p?"Uploading...":"Insert"})]})]})]})};
2
2
  //# sourceMappingURL=ImagePopover.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ImagePopover.js","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":["_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.js","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":["_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
- "use strict";var e=require("react/jsx-runtime"),t=require("react"),n=require("lucide-react"),r=require("./toolbar.js");module.exports=function(l){var o=l.editor,a=t.useState(!1),i=a[0],s=a[1],u=t.useRef(null),c=t.useState(""),d=c[0],x=c[1],b=t.useState("_blank"),m=b[0],v=b[1],p=t.useState("noopener"),f=p[0],h=p[1];t.useEffect((function(){if(i){var e=function(e){u.current&&(u.current.contains(e.target)||s(!1))},t=function(e){"Escape"===e.key&&s(!1)};return window.addEventListener("mousedown",e),window.addEventListener("keydown",t),function(){window.removeEventListener("mousedown",e),window.removeEventListener("keydown",t)}}}),[i]);return e.jsxs("div",{className:"relative",ref:u,children:[e.jsx(r.ToolbarButton,{onClick:function(){var e,t,n,r=o.getAttributes("link");x(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"),h(null!==(n=null==r?void 0:r.rel)&&void 0!==n?n:"noopener"),s((function(e){return!e}))},active:o.isActive("link"),title:"Link",ariaPressed:o.isActive("link"),children:e.jsx(n.Link,{size:16})}),i&&e.jsxs("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:[e.jsx("label",{className:"mb-1 block text-xs font-medium text-gray-600",children:"URL"}),e.jsx("input",{className:"mb-2 w-full rounded border border-gray-300 px-2 py-1 text-sm",value:d,onChange:function(e){return x(e.target.value)},placeholder:"https://example.com"}),e.jsx("label",{className:"mb-1 block text-xs font-medium text-gray-600",children:"Target"}),e.jsxs("select",{className:"mb-2 w-full rounded border border-gray-300 px-2 py-1 text-sm",value:m,onChange:function(e){return v(e.target.value)},children:[e.jsx("option",{value:"_blank",children:"New Tab"}),e.jsx("option",{value:"_self",children:"Same Window"})]}),e.jsx("label",{className:"mb-1 block text-xs font-medium text-gray-600",children:"Rel"}),e.jsx("input",{className:"mb-3 w-full rounded border border-gray-300 px-2 py-1 text-sm",value:f,onChange:function(e){return h(e.target.value)},placeholder:"noopener"}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx("button",{type:"button",className:"rounded bg-gray-100 px-3 py-1 text-sm hover:bg-gray-200",onClick:function(){return s(!1)},children:"Cancel"}),o.isActive("link")&&e.jsx("button",{type:"button",className:"rounded bg-red-100 px-3 py-1 text-sm text-red-700 hover:bg-red-200",onClick:function(){o.chain().focus().unsetLink().run(),s(!1)},children:"Unlink"}),e.jsx("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=d.trim();if(e)try{var t=new URL(e.includes(":")?e:"https://".concat(e));if(!["http:","https:","mailto:"].includes(t.protocol))return;o.chain().focus().setLink({href:t.toString(),target:m,rel:f}).run(),s(!1)}catch(e){return}},children:"Apply"})]})]})]})};
1
+ "use strict";var e=require("react/jsx-runtime"),r=require("react"),t=require("lucide-react"),a=require("./toolbar.js"),n="noopener noreferrer";module.exports=function(l){var o=l.editor,d=r.useState(!1),i=d[0],s=d[1],u=r.useRef(null),c=r.useState(""),g=c[0],b=c[1],x=r.useState("_blank"),y=x[0],k=x[1],m=r.useState(n),h=m[0],p=m[1];r.useEffect((function(){if(i){var e=function(e){u.current&&(u.current.contains(e.target)||s(!1))},r=function(e){"Escape"===e.key&&s(!1)};return window.addEventListener("mousedown",e),window.addEventListener("keydown",r),function(){window.removeEventListener("mousedown",e),window.removeEventListener("keydown",r)}}}),[i]);return e.jsxs("div",{className:"relative",ref:u,children:[e.jsx(a.ToolbarButton,{onClick:function(){var e,r=o.getAttributes("link");b("string"==typeof(null==r?void 0:r.href)?r.href:""),k("_blank"===(e=null==r?void 0:r.target)||"_self"===e?r.target:"_blank"),p("string"==typeof(null==r?void 0:r.rel)?r.rel:n),s((function(e){return!e}))},active:o.isActive("link"),title:"Link",ariaPressed:o.isActive("link"),children:e.jsx(t.Link,{size:16})}),i&&e.jsxs("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:[e.jsx("label",{className:"mb-1 block text-xs font-medium text-gray-600 dark:text-gray-300",children:"URL"}),e.jsx("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:g,onChange:function(e){return b(e.target.value)},placeholder:"https://example.com"}),e.jsx("label",{className:"mb-1 block text-xs font-medium text-gray-600 dark:text-gray-300",children:"Target"}),e.jsxs("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:y,onChange:function(e){return k(e.target.value)},children:[e.jsx("option",{value:"_blank",children:"New Tab"}),e.jsx("option",{value:"_self",children:"Same Window"})]}),e.jsx("label",{className:"mb-1 block text-xs font-medium text-gray-600 dark:text-gray-300",children:"Rel"}),e.jsx("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 p(e.target.value)},placeholder:n}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx("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 s(!1)},children:"Cancel"}),o.isActive("link")&&e.jsx("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(){o.chain().focus().unsetLink().run(),s(!1)},children:"Unlink"}),e.jsx("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=g.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;o.chain().focus().setLink({href:t.toString(),target:y,rel:r}).run(),s(!1)}catch(e){return}},children:"Apply"})]})]})]})};
2
2
  //# sourceMappingURL=LinkPopover.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"LinkPopover.js","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":["_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":"sIAYgD,SAACA,GAAE,IAAAC,EAAMD,EAAAC,OAC/CC,EAAsBC,EAAMC,UAAS,GAApCC,EAAMH,EAAA,GAAEI,OACTC,EAAaJ,EAAMK,OAA8B,MACjDC,EAAkBN,EAAMC,SAAS,IAAhCM,EAAID,EAAA,GAAEE,OACPC,EAAsBT,EAAMC,SAAqB,UAAhDS,EAAMD,EAAA,GAAEE,OACTC,EAAgBZ,EAAMC,SAAS,YAA9BY,EAAGD,EAAA,GAAEE,OAEZd,EAAMe,WAAU,WACZ,GAAKb,EAAL,CAIA,IAAMc,EAAgB,SAACC,GACdb,EAAWc,UAIXd,EAAWc,QAAQC,SAASF,EAAMP,SACnCP,GAAU,GAElB,EAEMiB,EAAW,SAACH,GACI,WAAdA,EAAMI,KACNlB,GAAU,EAElB,EAIA,OAFAmB,OAAOC,iBAAiB,YAAaP,GACrCM,OAAOC,iBAAiB,UAAWH,GAC5B,WACHE,OAAOE,oBAAoB,YAAaR,GACxCM,OAAOE,oBAAoB,UAAWJ,EAC1C,CAvBA,CAwBJ,GAAG,CAAClB,IAqBJ,OACIuB,EAAAA,KAAA,MAAA,CAAKC,UAAU,WAAWC,IAAKvB,EAAUwB,SAAA,CACrCC,EAAAA,IAACC,gBAAa,CACVC,QAAS,qBACCC,EAAalC,EAAOmC,cAAc,QACxCzB,EAAwB,QAAhBX,EAAAmC,aAAU,EAAVA,EAAYzB,YAAI,IAAAV,EAAAA,EAAI,IAC5Bc,EAA4B,QAAlBZ,EAAAiC,aAAU,EAAVA,EAAYtB,cAAM,IAAAX,EAAAA,EAAI,UAChCe,EAAsB,QAAfR,EAAA0B,aAAU,EAAVA,EAAYnB,WAAG,IAAAP,EAAAA,EAAI,YAC1BH,GAAU,SAAC+B,GAAS,OAACA,CAAD,GACxB,EACAC,OAAQrC,EAAOsC,SAAS,QACxBC,MAAM,OACNC,YAAaxC,EAAOsC,SAAS,QAAOR,SAEpCC,EAAAA,IAACU,OAAQ,CAACC,KAAM,OAGnBtC,GACGuB,EAAAA,KAAA,MAAA,CAAKC,UAAU,6GAA4GE,SAAA,CACvHC,EAAAA,IAAA,QAAA,CAAOH,UAAU,+CAA8CE,SAAA,QAC/DC,EAAAA,IAAA,QAAA,CAAOH,UAAU,+DAA+De,MAAOlC,EAAMmC,SAAU,SAACC,GAAM,OAAAnC,EAAQmC,EAAEjC,OAAO+B,MAAjB,EAAyBG,YAAY,wBACnJf,EAAAA,IAAA,QAAA,CAAOH,UAAU,+CAA8CE,SAAA,WAC/DH,OAAA,SAAA,CAAQC,UAAU,+DAA+De,MAAO/B,EAAQgC,SAAU,SAACC,GAAM,OAAAhC,EAAUgC,EAAEjC,OAAO+B,MAAnB,EAAuCb,SAAA,CACpJC,EAAAA,IAAA,SAAA,CAAQY,MAAM,SAAQb,SAAA,YACtBC,EAAAA,IAAA,SAAA,CAAQY,MAAM,QAAOb,SAAA,mBAEzBC,EAAAA,IAAA,QAAA,CAAOH,UAAU,+CAA8CE,SAAA,QAC/DC,EAAAA,IAAA,QAAA,CAAOH,UAAU,+DAA+De,MAAO5B,EAAK6B,SAAU,SAACC,GAAM,OAAA7B,EAAO6B,EAAEjC,OAAO+B,MAAhB,EAAwBG,YAAY,aACjJnB,EAAAA,KAAA,MAAA,CAAKC,UAAU,aAAYE,SAAA,CACvBC,EAAAA,IAAA,SAAA,CAAQgB,KAAK,SAASnB,UAAU,0DAA0DK,QAAS,WAAM,OAAA5B,GAAU,EAAV,EAAgByB,SAAA,WACxH9B,EAAOsC,SAAS,SAAWP,EAAAA,cAAQgB,KAAK,SAASnB,UAAU,qEAAqEK,QAAS,WAhD1JjC,EAAOgD,QAAQC,QAAQC,YAAYC,MAgD6I9C,GAAU,EAAQ,EAACyB,SAAA,WACnLC,EAAAA,IAAA,SAAA,CAAQgB,KAAK,SAASnB,UAAU,6EAA6EK,QA9C/G,WACd,IAAMmB,EAAgB3C,EAAK4C,OAC3B,GAAKD,EAEL,IACI,IAAME,EAAY,IAAIC,IAAIH,EAAcI,SAAS,KAAOJ,EAAgB,WAAAK,OAAWL,IACnF,IAAK,CAAC,QAAS,SAAU,WAAWI,SAASF,EAAUI,UAAW,OAElE1D,EAAOgD,QAAQC,QAAQU,QAAQ,CAAElD,KAAM6C,EAAUM,WAAYhD,OAAMA,EAAEG,IAAGA,IAAIoC,MAC5E9C,GAAU,EACd,CAAE,MAAAN,GACE,MACJ,CACJ,EAiCmJ+B,SAAA,kBAMvJ"}
1
+ {"version":3,"file":"LinkPopover.js","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","_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
- "use strict";var e=require("../../../node_modules/tslib/tslib.es6.js"),t=require("react/jsx-runtime"),o=require("react"),i=require("@tiptap/react"),s=require("./ImagePopover.js"),r=require("./LinkPopover.js"),a=require("./ToolbarGroups.js"),l=require("./extensions.js"),n=require("./toolbar.js");module.exports=function(d){var u=d.initialContent,c=void 0===u?"":u,g=d.onUpdate,m=d.features,b=d.stickyToolbar,f=void 0===b||b,x=d.toolbarPreset,v=void 0===x?"standard":x,h=d.onImageUpload,j=d.className,p=void 0===j?"":j,k=d.editorClassName,T=void 0===k?"":k,y=d.contentClassName,w=void 0===y?"":y,C=o.useMemo((function(){return l.withDefaultFeatures(e.__assign(e.__assign({},l.toolbarPresetFeatures[v]),m))}),[m,v]),q=o.useState(!1),L=q[0],N=q[1],D=o.useState(null),E=D[0],H=D[1],U=i.useEditor({extensions:l.createTextEditorExtensions(C),content:c,onUpdate:function(e){var t=e.editor;g(t.getHTML())},editorProps:{attributes:{class:"".concat(l.editorContentClassName," ").concat(w).trim()},handleKeyDown:function(e,t){return!!C.slashCommand&&("/"===t.key?(N(!0),!1):("Escape"===t.key&&N(!1),!1))}},immediatelyRender:!1});o.useEffect((function(){if(U){var e=function(){var e=U.state.selection;if(e.from!==e.to&&U.isFocused){var t=window.getSelection();if(t&&0!==t.rangeCount){var o=t.getRangeAt(0).getBoundingClientRect();H({top:o.top+window.scrollY-48,left:o.left+window.scrollX+o.width/2})}else H(null)}else H(null)},t=function(){return H(null)};return U.on("selectionUpdate",e),U.on("blur",t),function(){U.off("selectionUpdate",e),U.off("blur",t)}}}),[U]);var P=o.useRef(c);o.useEffect((function(){U&&(c!==P.current&&U.getHTML()===P.current&&(U.commands.setContent(c||"",{emitUpdate:!1}),P.current=c))}),[U,c]);var A=C.heading||C.formatting||C.lists||C.code||C.quote||C.link||C.table||C.image||C.taskList||C.alignment;return U?t.jsxs("div",{className:"pd-text-editor w-full rounded-lg border border-gray-200 shadow-sm ".concat(p).trim(),children:[f&&t.jsxs("div",{className:"sticky top-0 z-10 flex flex-wrap items-center gap-1 border-b bg-gray-50 p-3",children:[C.history&&t.jsx(a.HistoryTools,{editor:U}),C.history&&A&&t.jsx(n.ToolbarDivider,{}),C.heading&&t.jsx(n.HeadingSelect,{value:(null==U?void 0:U.isActive("heading",{level:1}))?1:(null==U?void 0:U.isActive("heading",{level:2}))?2:(null==U?void 0:U.isActive("heading",{level:3}))?3:0,onChange:function(e){0===e?U.chain().focus().setParagraph().run():U.chain().focus().toggleHeading({level:e}).run()}}),C.heading&&(C.formatting||C.lists||C.code||C.quote||C.link||C.table||C.image||C.taskList)&&t.jsx(n.ToolbarDivider,{}),C.formatting&&t.jsx(a.FormattingTools,{editor:U}),C.formatting&&(C.alignment||C.lists||C.code||C.quote||C.link||C.table||C.image||C.taskList)&&t.jsx(n.ToolbarDivider,{}),C.alignment&&t.jsx(a.AlignmentTools,{editor:U}),C.alignment&&(C.lists||C.code||C.quote||C.link||C.table||C.image||C.taskList)&&t.jsx(n.ToolbarDivider,{}),C.lists&&t.jsx(a.ListTools,{editor:U}),C.lists&&(C.code||C.quote||C.link||C.table||C.image||C.taskList)&&t.jsx(n.ToolbarDivider,{}),C.code&&t.jsx(a.CodeTools,{editor:U}),C.code&&(C.quote||C.link||C.table||C.image||C.taskList)&&t.jsx(n.ToolbarDivider,{}),C.quote&&t.jsx(a.QuoteTools,{editor:U}),C.quote&&(C.link||C.table||C.image||C.taskList)&&t.jsx(n.ToolbarDivider,{}),C.link&&t.jsx(r,{editor:U}),C.link&&(C.table||C.image||C.taskList)&&t.jsx(n.ToolbarDivider,{}),C.table&&t.jsx(a.TableTools,{editor:U}),C.table&&(C.image||C.taskList)&&t.jsx(n.ToolbarDivider,{}),C.image&&t.jsx(s,{editor:U,onImageUpload:h}),C.image&&C.taskList&&t.jsx(n.ToolbarDivider,{}),C.taskList&&t.jsx(a.InsertTools,{editor:U})]}),!1===f&&E&&t.jsxs("div",{className:"fixed z-20 -translate-x-1/2 rounded-lg border border-gray-200 bg-white p-1 shadow-lg",style:{top:E.top,left:E.left},children:[t.jsx(a.FormattingTools,{editor:U}),C.link&&t.jsx(r,{editor:U})]}),C.slashCommand&&L&&t.jsxs("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.jsx("button",{type:"button",className:"block w-full rounded px-2 py-1 text-left text-sm hover:bg-gray-100",onClick:function(){U.chain().focus().toggleHeading({level:1}).run(),N(!1)},children:"Heading 1"}),t.jsx("button",{type:"button",className:"block w-full rounded px-2 py-1 text-left text-sm hover:bg-gray-100",onClick:function(){U.chain().focus().toggleBulletList().run(),N(!1)},children:"Bullet List"}),t.jsx("button",{type:"button",className:"block w-full rounded px-2 py-1 text-left text-sm hover:bg-gray-100",onClick:function(){U.chain().focus().toggleCodeBlock().run(),N(!1)},children:"Code Block"})]}),t.jsx(i.EditorContent,{editor:U,className:"w-full min-h-[300px] focus-within:bg-white ".concat(T).trim()})]}):t.jsx("div",{className:"rounded-lg border bg-gray-50 h-48 animate-pulse"})};
1
+ "use strict";var e=require("../../../node_modules/tslib/tslib.es6.js"),r=require("react/jsx-runtime"),t=require("react"),n=require("@tiptap/react"),a=require("./ImagePopover.js"),o=require("./LinkPopover.js"),i=require("./ToolbarGroups.js"),s=require("./extensions.js"),d=require("./toolbar.js"),l=function(e){var r=e.trim();return{words:r?r.split(/\s+/).length:0,characters:e.length}},u=function(e,r){return"markdown"===r?e.getMarkdown():e.getHTML()};module.exports=function(c){var g=c.initialContent,f=void 0===g?"":g,b=c.onUpdate,m=c.contentFormat,x=void 0===m?"html":m,h=c.features,y=c.stickyToolbar,k=void 0===y||y,p=c.toolbarPreset,v=void 0===p?"standard":p,w=c.onImageUpload,j=c.placeholder,C=void 0===j?"Start writing...":j,T=c.showCounts,N=void 0===T||T,q=c.status,E=c.className,F=void 0===E?"":E,R=c.editorClassName,L=void 0===R?"":R,U=c.contentClassName,H=void 0===U?"":U,P=t.useMemo((function(){return s.withDefaultFeatures(e.__assign(e.__assign({},s.toolbarPresetFeatures[v]),h))}),[h,v]),S=t.useState(!1),A=S[0],B=S[1],_=t.useState(null),I=_[0],M=_[1],z=t.useState({words:0,characters:0}),D=z[0],G=z[1],K=t.useRef(b),Q=t.useRef(x);K.current=b,Q.current=x;var X=t.useMemo((function(){return s.createTextEditorExtensions(P,{contentFormat:x,placeholder:C})}),[x,P,C]),Y=t.useCallback((function(e){return u(e,x)}),[x]),J=n.useEditor({extensions:X,content:f,contentType:"markdown"===x?"markdown":void 0,onUpdate:function(e){var r=e.editor;K.current(u(r,Q.current))},editorProps:{attributes:{class:"".concat(s.editorContentClassName," ").concat(H).trim()},handleKeyDown:function(e,r){return!!P.slashCommand&&("/"===r.key?(B(!0),!1):("Escape"===r.key&&B(!1),!1))}},immediatelyRender:!1},[H,x,X,P.slashCommand]);t.useEffect((function(){if(J){var e=function(){G(l(J.getText()))};return e(),J.on("update",e),function(){J.off("update",e)}}}),[J]),t.useEffect((function(){if(J){var e=function(){var e=J.state.selection;if(e.from!==e.to&&J.isFocused){var r=window.getSelection();if(r&&0!==r.rangeCount){var t=r.getRangeAt(0).getBoundingClientRect();M({top:t.top+window.scrollY-48,left:t.left+window.scrollX+t.width/2})}else M(null)}else M(null)},r=function(){return M(null)};return J.on("selectionUpdate",e),J.on("blur",r),function(){J.off("selectionUpdate",e),J.off("blur",r)}}}),[J]);var O=t.useRef(f),V=t.useRef(null),W=t.useRef(null);t.useEffect((function(){if(J){if(W.current!==J)return W.current=J,O.current=f,void(V.current=Y(J));if(null===V.current&&(V.current=Y(J)),f!==O.current)Y(J)===V.current&&(J.commands.setContent(f||"",{emitUpdate:!1,contentType:"markdown"===x?"markdown":void 0}),O.current=f,V.current=Y(J),G(l(J.getText())))}}),[x,J,Y,f]);var Z=[{label:"Heading 1",enabled:P.heading,run:function(){return null==J?void 0:J.chain().focus().toggleHeading({level:1}).run()}},{label:"Bullet List",enabled:P.lists,run:function(){return null==J?void 0:J.chain().focus().toggleBulletList().run()}},{label:"Code Block",enabled:P.code,run:function(){return null==J?void 0:J.chain().focus().toggleCodeBlock().run()}}].filter((function(e){return e.enabled}));if(!J)return r.jsx("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 $=[{key:"history",enabled:P.history,render:function(){return r.jsx(i.HistoryTools,{editor:J})}},{key:"heading",enabled:P.heading,render:function(){return r.jsx(d.HeadingSelect,{value:(null==J?void 0:J.isActive("heading",{level:1}))?1:(null==J?void 0:J.isActive("heading",{level:2}))?2:(null==J?void 0:J.isActive("heading",{level:3}))?3:0,onChange:function(e){0===e?J.chain().focus().setParagraph().run():J.chain().focus().toggleHeading({level:e}).run()}})}},{key:"formatting",enabled:P.formatting,render:function(){return r.jsx(i.FormattingTools,{editor:J})}},{key:"alignment",enabled:P.alignment,render:function(){return r.jsx(i.AlignmentTools,{editor:J})}},{key:"lists",enabled:P.lists,render:function(){return r.jsx(i.ListTools,{editor:J})}},{key:"code",enabled:P.code,render:function(){return r.jsx(i.CodeTools,{editor:J})}},{key:"quote",enabled:P.quote,render:function(){return r.jsx(i.QuoteTools,{editor:J})}},{key:"link",enabled:P.link,render:function(){return r.jsx(o,{editor:J})}},{key:"table",enabled:P.table,render:function(){return r.jsx(i.TableTools,{editor:J})}},{key:"image",enabled:P.image,render:function(){return r.jsx(a,{editor:J,onImageUpload:w})}},{key:"taskList",enabled:P.taskList,render:function(){return r.jsx(i.InsertTools,{editor:J})}}].filter((function(e){return e.enabled}));return r.jsxs("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(F).trim(),children:[k&&r.jsx("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:$.map((function(e,n){return r.jsxs(t.Fragment,{children:[n>0&&r.jsx(d.ToolbarDivider,{}),e.render()]},e.key)}))}),!1===k&&I&&r.jsxs("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:I.top,left:I.left},children:[r.jsx(i.FormattingTools,{editor:J}),P.link&&r.jsx(o,{editor:J})]}),P.slashCommand&&A&&Z.length>0&&r.jsx("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:Z.map((function(e){return r.jsx("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(),B(!1)},children:e.label},e.label)}))}),r.jsx(n.EditorContent,{editor:J,className:"min-h-[300px] w-full focus-within:bg-white dark:focus-within:bg-gray-950 ".concat(L).trim()}),(N||q)&&r.jsxs("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:[N?r.jsxs("div",{className:"flex items-center gap-3 font-mono",children:[r.jsxs("span",{children:[D.words," words"]}),r.jsxs("span",{children:[D.characters," chars"]})]}):r.jsx("span",{}),q&&r.jsxs("div",{className:"flex items-center gap-2 text-gray-500 dark:text-gray-400",children:[r.jsx("span",{children:q}),r.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-primary-500","aria-hidden":"true"})]})]})]})};
2
2
  //# sourceMappingURL=TextEditor.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TextEditor.js","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":["_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.js","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","_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
- "use strict";var e=require("react/jsx-runtime"),t=require("react"),i=require("lucide-react"),n=require("./toolbar.js");exports.AlignmentTools=function(t){var r=t.editor;return e.jsxs(e.Fragment,{children:[e.jsx(n.ToolbarButton,{onClick:function(){return r.chain().focus().setTextAlign("left").run()},active:r.isActive({textAlign:"left"}),ariaPressed:r.isActive({textAlign:"left"}),title:"Align left",children:e.jsx(i.AlignLeft,{size:16})}),e.jsx(n.ToolbarButton,{onClick:function(){return r.chain().focus().setTextAlign("center").run()},active:r.isActive({textAlign:"center"}),ariaPressed:r.isActive({textAlign:"center"}),title:"Align center",children:e.jsx(i.AlignCenter,{size:16})}),e.jsx(n.ToolbarButton,{onClick:function(){return r.chain().focus().setTextAlign("right").run()},active:r.isActive({textAlign:"right"}),ariaPressed:r.isActive({textAlign:"right"}),title:"Align right",children:e.jsx(i.AlignRight,{size:16})}),e.jsx(n.ToolbarButton,{onClick:function(){return r.chain().focus().setTextAlign("justify").run()},active:r.isActive({textAlign:"justify"}),ariaPressed:r.isActive({textAlign:"justify"}),title:"Justify",children:e.jsx(i.AlignJustify,{size:16})})]})},exports.CodeTools=function(t){var r=t.editor;return e.jsxs(e.Fragment,{children:[e.jsx(n.ToolbarButton,{onClick:function(){return r.chain().focus().toggleCode().run()},active:r.isActive("code"),ariaPressed:r.isActive("code"),title:"Inline code",children:e.jsx(i.Code,{size:16})}),e.jsx(n.ToolbarButton,{onClick:function(){return r.chain().focus().toggleCodeBlock().run()},active:r.isActive("codeBlock"),ariaPressed:r.isActive("codeBlock"),title:"Code block",children:e.jsx(i.FileCode,{size:16})})]})},exports.FormattingTools=function(t){var r=t.editor;return e.jsxs(e.Fragment,{children:[e.jsx(n.ToolbarButton,{onClick:function(){return r.chain().focus().toggleBold().run()},active:r.isActive("bold"),ariaPressed:r.isActive("bold"),title:"Bold",children:e.jsx(i.Bold,{size:16})}),e.jsx(n.ToolbarButton,{onClick:function(){return r.chain().focus().toggleItalic().run()},active:r.isActive("italic"),ariaPressed:r.isActive("italic"),title:"Italic",children:e.jsx(i.Italic,{size:16})}),e.jsx(n.ToolbarButton,{onClick:function(){return r.chain().focus().toggleUnderline().run()},active:r.isActive("underline"),ariaPressed:r.isActive("underline"),title:"Underline",children:e.jsx(i.Underline,{size:16})}),e.jsx(n.ToolbarButton,{onClick:function(){return r.chain().focus().toggleStrike().run()},active:r.isActive("strike"),ariaPressed:r.isActive("strike"),title:"Strikethrough",children:e.jsx(i.Strikethrough,{size:16})})]})},exports.HistoryTools=function(t){var r=t.editor;return e.jsxs(e.Fragment,{children:[e.jsx(n.ToolbarButton,{onClick:function(){return r.chain().focus().undo().run()},disabled:!r.can().undo(),title:"Undo",children:e.jsx(i.Undo2,{size:16})}),e.jsx(n.ToolbarButton,{onClick:function(){return r.chain().focus().redo().run()},disabled:!r.can().redo(),title:"Redo",children:e.jsx(i.Redo2,{size:16})}),e.jsx(n.ToolbarButton,{onClick:function(){return r.chain().focus().unsetAllMarks().run()},title:"Clear formatting",children:e.jsx(i.Minus,{size:16})})]})},exports.InsertTools=function(t){var r=t.editor;return e.jsx(e.Fragment,{children:e.jsx(n.ToolbarButton,{onClick:function(){return r.chain().focus().toggleTaskList().run()},active:r.isActive("taskList"),ariaPressed:r.isActive("taskList"),title:"Task list",children:e.jsx(i.ListTodo,{size:16})})})},exports.ListTools=function(t){var r=t.editor;return e.jsxs(e.Fragment,{children:[e.jsx(n.ToolbarButton,{onClick:function(){return r.chain().focus().toggleBulletList().run()},active:r.isActive("bulletList"),ariaPressed:r.isActive("bulletList"),title:"Bullet list",children:e.jsx(i.List,{size:16})}),e.jsx(n.ToolbarButton,{onClick:function(){return r.chain().focus().toggleOrderedList().run()},active:r.isActive("orderedList"),ariaPressed:r.isActive("orderedList"),title:"Numbered list",children:e.jsx(i.ListOrdered,{size:16})})]})},exports.QuoteTools=function(t){var r=t.editor;return e.jsx(n.ToolbarButton,{onClick:function(){return r.chain().focus().toggleBlockquote().run()},active:r.isActive("blockquote"),ariaPressed:r.isActive("blockquote"),title:"Quote",children:e.jsx(i.Quote,{size:16})})},exports.TableTools=function(r){var o=r.editor,s=t.useState(!1),l=s[0],c=s[1],u=t.useRef(null),a=o.isActive("table");t.useEffect((function(){if(l){var e=function(e){var t;(null===(t=u.current)||void 0===t?void 0:t.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)}}}),[l]);var d=function(e){e(),c(!1)};return e.jsxs("div",{className:"relative",ref:u,children:[e.jsx(n.ToolbarButton,{onClick:function(){return c((function(e){return!e}))},title:"Table actions",active:a,ariaPressed:l,children:e.jsx(i.Table2,{size:16})}),l&&e.jsxs("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.jsxs("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 d((function(){return o.chain().focus().insertTable({rows:3,cols:3,withHeaderRow:!0}).run()}))},children:[e.jsx(i.Table2,{size:14})," Insert table"]}),e.jsxs("button",{type:"button",disabled:!a,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 d((function(){return o.chain().focus().addRowAfter().run()}))},children:[e.jsx(i.Rows3,{size:14})," Add row"]}),e.jsxs("button",{type:"button",disabled:!a,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 d((function(){return o.chain().focus().deleteRow().run()}))},children:[e.jsx(i.Trash2,{size:14})," Delete row"]}),e.jsxs("button",{type:"button",disabled:!a,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 d((function(){return o.chain().focus().addColumnAfter().run()}))},children:[e.jsx(i.Columns3,{size:14})," Add column"]}),e.jsxs("button",{type:"button",disabled:!a,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 d((function(){return o.chain().focus().deleteColumn().run()}))},children:[e.jsx(i.TableProperties,{size:14})," Delete column"]}),e.jsxs("button",{type:"button",disabled:!a,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 d((function(){return o.chain().focus().mergeOrSplit().run()}))},children:[e.jsx(i.Split,{size:14})," Merge/Split cells"]}),e.jsxs("button",{type:"button",disabled:!a,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 d((function(){return o.chain().focus().deleteTable().run()}))},children:[e.jsx(i.Trash2,{size:14})," Delete table"]})]})]})};
1
+ "use strict";var e=require("react/jsx-runtime"),t=require("react"),r=require("lucide-react"),n=require("./toolbar.js"),i="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",o="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,r,n){t.useEffect((function(){if(e){var t=function(e){var t;(null===(t=r.current)||void 0===t?void 0:t.contains(e.target))||n()},i=function(e){"Escape"===e.key&&n()};return window.addEventListener("mousedown",t),window.addEventListener("keydown",i),function(){window.removeEventListener("mousedown",t),window.removeEventListener("keydown",i)}}}),[n,e,r])},c=[{value:"left",label:"Align left",icon:r.AlignLeft},{value:"center",label:"Align center",icon:r.AlignCenter},{value:"right",label:"Align right",icon:r.AlignRight},{value:"justify",label:"Justify",icon:r.AlignJustify}];exports.AlignmentTools=function(a){var l,u=a.editor,d=t.useState(!1),f=d[0],b=d[1],x=t.useRef(null),g=null!==(l=c.find((function(e){return u.isActive({textAlign:e.value})})))&&void 0!==l?l:c[0],h=g.icon,v=t.useCallback((function(){return b(!1)}),[]);return s(f,x,v),e.jsxs("div",{className:"relative",ref:x,children:[e.jsxs(n.ToolbarButton,{onClick:function(){return b((function(e){return!e}))},active:f,ariaPressed:f,title:g.label,className:"gap-1",children:[e.jsx(h,{size:16}),e.jsx(r.ChevronDown,{size:12})]}),f&&e.jsx("div",{className:"".concat(i," w-44"),children:c.map((function(t){var r=t.icon,n=u.isActive({textAlign:t.value});return e.jsxs("button",{type:"button",className:"".concat(o," ").concat(n?"bg-primary-50 text-primary-700 dark:bg-primary-900/40 dark:text-primary-300":""),onClick:function(){u.chain().focus().setTextAlign(t.value).run(),b(!1)},children:[e.jsx(r,{size:14})," ",t.label]},t.value)}))})]})},exports.CodeTools=function(t){var i=t.editor;return e.jsxs(e.Fragment,{children:[e.jsx(n.ToolbarButton,{onClick:function(){return i.chain().focus().toggleCode().run()},active:i.isActive("code"),ariaPressed:i.isActive("code"),title:"Inline code",children:e.jsx(r.Code,{size:16})}),e.jsx(n.ToolbarButton,{onClick:function(){return i.chain().focus().toggleCodeBlock().run()},active:i.isActive("codeBlock"),ariaPressed:i.isActive("codeBlock"),title:"Code block",children:e.jsx(r.FileCode,{size:16})})]})},exports.FormattingTools=function(t){var i=t.editor;return e.jsxs(e.Fragment,{children:[e.jsx(n.ToolbarButton,{onClick:function(){return i.chain().focus().toggleBold().run()},active:i.isActive("bold"),ariaPressed:i.isActive("bold"),title:"Bold",children:e.jsx(r.Bold,{size:16})}),e.jsx(n.ToolbarButton,{onClick:function(){return i.chain().focus().toggleItalic().run()},active:i.isActive("italic"),ariaPressed:i.isActive("italic"),title:"Italic",children:e.jsx(r.Italic,{size:16})}),e.jsx(n.ToolbarButton,{onClick:function(){return i.chain().focus().toggleUnderline().run()},active:i.isActive("underline"),ariaPressed:i.isActive("underline"),title:"Underline",children:e.jsx(r.Underline,{size:16})}),e.jsx(n.ToolbarButton,{onClick:function(){return i.chain().focus().toggleStrike().run()},active:i.isActive("strike"),ariaPressed:i.isActive("strike"),title:"Strikethrough",children:e.jsx(r.Strikethrough,{size:16})})]})},exports.HistoryTools=function(t){var i=t.editor;return e.jsxs(e.Fragment,{children:[e.jsx(n.ToolbarButton,{onClick:function(){return i.chain().focus().undo().run()},disabled:!i.can().undo(),title:"Undo",children:e.jsx(r.Undo2,{size:16})}),e.jsx(n.ToolbarButton,{onClick:function(){return i.chain().focus().redo().run()},disabled:!i.can().redo(),title:"Redo",children:e.jsx(r.Redo2,{size:16})}),e.jsx(n.ToolbarButton,{onClick:function(){return i.chain().focus().unsetAllMarks().run()},title:"Clear formatting",children:e.jsx(r.Minus,{size:16})})]})},exports.InsertTools=function(t){var i=t.editor;return e.jsx(e.Fragment,{children:e.jsx(n.ToolbarButton,{onClick:function(){return i.chain().focus().toggleTaskList().run()},active:i.isActive("taskList"),ariaPressed:i.isActive("taskList"),title:"Task list",children:e.jsx(r.ListTodo,{size:16})})})},exports.ListTools=function(t){var i=t.editor;return e.jsxs(e.Fragment,{children:[e.jsx(n.ToolbarButton,{onClick:function(){return i.chain().focus().toggleBulletList().run()},active:i.isActive("bulletList"),ariaPressed:i.isActive("bulletList"),title:"Bullet list",children:e.jsx(r.List,{size:16})}),e.jsx(n.ToolbarButton,{onClick:function(){return i.chain().focus().toggleOrderedList().run()},active:i.isActive("orderedList"),ariaPressed:i.isActive("orderedList"),title:"Numbered list",children:e.jsx(r.ListOrdered,{size:16})})]})},exports.QuoteTools=function(t){var i=t.editor;return e.jsx(n.ToolbarButton,{onClick:function(){return i.chain().focus().toggleBlockquote().run()},active:i.isActive("blockquote"),ariaPressed:i.isActive("blockquote"),title:"Quote",children:e.jsx(r.Quote,{size:16})})},exports.TableTools=function(c){var a=c.editor,l=t.useState(!1),u=l[0],d=l[1],f=t.useState({rows:3,cols:3}),b=f[0],x=f[1],g=t.useRef(null),h=a.isActive("table"),v=t.useCallback((function(){return d(!1)}),[]);s(u,g,v);var m=function(e){e(),d(!1)};return e.jsxs("div",{className:"relative",ref:g,children:[e.jsx(n.ToolbarButton,{onClick:function(){return d((function(e){return!e}))},title:"Table actions",active:h,ariaPressed:u,children:e.jsx(r.Table2,{size:16})}),u&&e.jsxs("div",{className:"".concat(i," w-64"),children:[e.jsxs("div",{className:"mb-2 flex items-center justify-between px-1",children:[e.jsx("span",{className:"text-xs font-medium text-gray-500 dark:text-gray-400",children:"Insert table"}),e.jsxs("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:[b.rows," x ",b.cols]})]}),e.jsx("div",{className:"grid grid-cols-6 gap-1 px-1 pb-2",children:Array.from({length:6}).map((function(t,r){return Array.from({length:6}).map((function(t,n){var i=r+1,o=n+1,s=i<=b.rows&&o<=b.cols;return e.jsx("button",{type:"button",className:"h-7 rounded-md border transition-colors ".concat(s?"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(i," x ").concat(o," table"),"aria-label":"Insert ".concat(i," x ").concat(o," table"),onMouseEnter:function(){return x({rows:i,cols:o})},onFocus:function(){return x({rows:i,cols:o})},onClick:function(){return m((function(){return a.chain().focus().insertTable({rows:i,cols:o,withHeaderRow:!0}).run()}))}},"".concat(i,"-").concat(o))}))}))}),e.jsxs("div",{className:"border-t border-gray-100 pt-2 dark:border-gray-800",children:[e.jsxs("button",{type:"button",disabled:!h,className:o,onClick:function(){return m((function(){return a.chain().focus().addRowAfter().run()}))},children:[e.jsx(r.Rows3,{size:14})," Add row"]}),e.jsxs("button",{type:"button",disabled:!h,className:o,onClick:function(){return m((function(){return a.chain().focus().deleteRow().run()}))},children:[e.jsx(r.Trash2,{size:14})," Delete row"]}),e.jsxs("button",{type:"button",disabled:!h,className:o,onClick:function(){return m((function(){return a.chain().focus().addColumnAfter().run()}))},children:[e.jsx(r.Columns3,{size:14})," Add column"]}),e.jsxs("button",{type:"button",disabled:!h,className:o,onClick:function(){return m((function(){return a.chain().focus().deleteColumn().run()}))},children:[e.jsx(r.TableProperties,{size:14})," Delete column"]}),e.jsxs("button",{type:"button",disabled:!h,className:o,onClick:function(){return m((function(){return a.chain().focus().mergeOrSplit().run()}))},children:[e.jsx(r.Split,{size:14})," Merge/Split cells"]}),e.jsxs("button",{type:"button",disabled:!h,className:"".concat(o," text-red-700 hover:bg-red-50 dark:text-red-400 dark:hover:bg-red-950/40"),onClick:function(){return m((function(){return a.chain().focus().deleteTable().run()}))},children:[e.jsx(r.Trash2,{size:14})," Delete table"]})]})]})]})};
2
2
  //# sourceMappingURL=ToolbarGroups.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ToolbarGroups.js","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":["_a","editor","_jsxs","_Fragment","children","_jsx","ToolbarButton","onClick","chain","focus","setTextAlign","run","active","isActive","textAlign","ariaPressed","title","AlignLeft","size","AlignCenter","AlignRight","AlignJustify","toggleCode","CodeIcon","toggleCodeBlock","FileCode","toggleBold","BoldIcon","toggleItalic","ItalicIcon","toggleUnderline","UnderlineIcon","toggleStrike","Strikethrough","undo","disabled","can","Undo2","redo","Redo2","unsetAllMarks","Minus","toggleTaskList","ListTodo","toggleBulletList","List","toggleOrderedList","ListOrdered","toggleBlockquote","Quote","_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"],"mappings":"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"}
1
+ {"version":3,"file":"ToolbarGroups.js","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","alignments","value","label","icon","AlignLeft","AlignCenter","AlignRight","AlignJustify","editor","_c","useState","setOpen","useRef","activeAlignment","_b","find","alignment","isActive","textAlign","ActiveIcon","close","useCallback","_jsxs","className","children","ToolbarButton","onClick","prev","active","ariaPressed","title","_jsx","size","ChevronDown","concat","map","Icon","type","chain","focus","setTextAlign","run","_Fragment","toggleCode","CodeIcon","toggleCodeBlock","FileCode","toggleBold","BoldIcon","toggleItalic","ItalicIcon","toggleUnderline","UnderlineIcon","toggleStrike","Strikethrough","undo","disabled","can","Undo2","redo","Redo2","unsetAllMarks","Minus","toggleTaskList","ListTodo","toggleBulletList","List","toggleOrderedList","ListOrdered","toggleBlockquote","Quote","rows","cols","hoveredSize","setHoveredSize","inTable","action","Table2","Array","from","length","_","rowIndex","__","colIndex","selected","onMouseEnter","onFocus","insertTable","withHeaderRow","addRowAfter","Rows3","deleteRow","Trash2","addColumnAfter","Columns3","deleteColumn","TableProperties","mergeOrSplit","Split","deleteTable"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";var e=require("../../../node_modules/tslib/tslib.es6.js"),t=require("../../../node_modules/@tiptap/extension-bold/dist/index.js"),i=require("../../../node_modules/@tiptap/extension-bullet-list/dist/index.js"),s=require("../../../node_modules/@tiptap/extension-code/dist/index.js"),n=require("../../../node_modules/@tiptap/extension-code-block/dist/index.js"),r=require("../../../node_modules/@tiptap/extension-heading/dist/index.js"),a=require("@tiptap/extension-image"),d=require("../../../node_modules/@tiptap/extension-italic/dist/index.js"),o=require("@tiptap/extension-link"),l=require("../../../node_modules/@tiptap/extension-list-item/dist/index.js"),u=require("../../../node_modules/@tiptap/extension-ordered-list/dist/index.js"),p=require("../../../node_modules/@tiptap/extension-strike/dist/index.js"),x=require("../../../node_modules/@tiptap/extension-table/dist/index.js"),m=require("../../../node_modules/@tiptap/extension-table-cell/dist/index.js"),_=require("../../../node_modules/@tiptap/extension-table-header/dist/index.js"),f=require("../../../node_modules/@tiptap/extension-table-row/dist/index.js"),g=require("../../../node_modules/@tiptap/extension-task-item/dist/index.js"),c=require("../../../node_modules/@tiptap/extension-task-list/dist/index.js"),b=require("../../../node_modules/@tiptap/extension-text-align/dist/index.js"),h=require("@tiptap/extension-underline"),q=require("@tiptap/starter-kit"),j={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},k={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.__assign({},j),full:e.__assign(e.__assign({},j),{slashCommand:!0,table:!0,image:!0,taskList:!0,alignment:!0})},y=function(t){return e.__assign(e.__assign({},j),t)};exports.createTextEditorExtensions=function(j){var k=y(j);return e.__spreadArray(e.__spreadArray(e.__spreadArray(e.__spreadArray(e.__spreadArray(e.__spreadArray(e.__spreadArray(e.__spreadArray(e.__spreadArray([q.configure({heading:!1,bulletList:!1,orderedList:!1,listItem:!1,codeBlock:!1})],k.formatting?[t.default,d.default,h,p.default]:[],!0),k.code?[s.default,n.default.configure({HTMLAttributes:{class:"bg-gray-100 p-3 rounded text-sm font-mono"}})]:[],!0),k.heading?[r.default.configure({levels:[1,2,3]})]:[],!0),k.alignment?[b.default.configure({types:["heading","paragraph"]})]:[],!0),k.lists?[i.default,u.default,l.default]:[],!0),k.link?[o.configure({openOnClick:!1,HTMLAttributes:{class:"text-blue-600 underline"}})]:[],!0),k.taskList?[c.default,g.default.configure({nested:!0})]:[],!0),k.image?[a.configure({inline:!1,allowBase64:!0})]:[],!0),k.table?[x.Table.configure({resizable:!0}),f.default,_.default,m.default]:[],!0)},exports.defaultTextEditorFeatures=j,exports.editorContentClassName="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",exports.toolbarPresetFeatures=k,exports.withDefaultFeatures=y;
1
+ "use strict";var e=require("../../../node_modules/tslib/tslib.es6.js"),t=require("../../../node_modules/@tiptap/extension-bold/dist/index.js"),i=require("../../../node_modules/@tiptap/extension-bullet-list/dist/index.js"),s=require("../../../node_modules/@tiptap/extension-code/dist/index.js"),r=require("../../../node_modules/@tiptap/extension-code-block/dist/index.js"),n=require("../../../node_modules/@tiptap/extension-heading/dist/index.js"),o=require("@tiptap/extension-image"),a=require("../../../node_modules/@tiptap/extension-italic/dist/index.js"),d=require("@tiptap/extension-link"),l=require("../../../node_modules/@tiptap/extension-list-item/dist/index.js"),u=require("../../../node_modules/@tiptap/extension-ordered-list/dist/index.js"),p=require("@tiptap/extension-placeholder"),x=require("../../../node_modules/@tiptap/extension-strike/dist/index.js"),m=require("../../../node_modules/@tiptap/extension-table/dist/index.js"),_=require("../../../node_modules/@tiptap/extension-table-cell/dist/index.js"),c=require("../../../node_modules/@tiptap/extension-table-header/dist/index.js"),g=require("../../../node_modules/@tiptap/extension-table-row/dist/index.js"),f=require("../../../node_modules/@tiptap/extension-task-item/dist/index.js"),b=require("../../../node_modules/@tiptap/extension-task-list/dist/index.js"),h=require("../../../node_modules/@tiptap/extension-text-align/dist/index.js"),q=require("@tiptap/extension-underline"),k=require("@tiptap/markdown"),y=require("@tiptap/starter-kit"),j={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},A={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.__assign({},j),full:e.__assign(e.__assign({},j),{slashCommand:!0,table:!0,image:!0,taskList:!0,alignment:!0})},v=function(t){return e.__assign(e.__assign({},j),t)};exports.createTextEditorExtensions=function(j,A){var w,L,C=v(j),T=null!==(w=null==A?void 0:A.contentFormat)&&void 0!==w?w:"html";return e.__spreadArray(e.__spreadArray(e.__spreadArray(e.__spreadArray(e.__spreadArray(e.__spreadArray(e.__spreadArray(e.__spreadArray(e.__spreadArray(e.__spreadArray(e.__spreadArray([y.configure({heading:!1,bulletList:!1,orderedList:!1,listItem:!1,codeBlock:!1})],C.formatting?[t.default,a.default,q,x.default]:[],!0),C.code?[s.default,r.default.configure({HTMLAttributes:{class:"rounded bg-gray-100 p-3 font-mono text-sm dark:bg-gray-800"}})]:[],!0),C.heading?[n.default.configure({levels:[1,2,3]})]:[],!0),C.alignment?[h.default.configure({types:["heading","paragraph"]})]:[],!0),C.lists?[i.default,u.default,l.default]:[],!0),C.link?[d.configure({openOnClick:!1,HTMLAttributes:{class:"text-blue-600 underline dark:text-blue-400"}})]:[],!0),C.taskList?[b.default,f.default.configure({nested:!0})]:[],!0),C.image?[o.configure({inline:!1,allowBase64:!0})]:[],!0),C.table?[m.Table.configure({resizable:!0}),g.default,c.default,_.default]:[],!0),C.placeholder?[p.configure({placeholder:null!==(L=null==A?void 0:A.placeholder)&&void 0!==L?L:"Start writing..."})]:[],!0),"markdown"===T?[k.Markdown]:[],!0)},exports.defaultTextEditorFeatures=j,exports.editorContentClassName="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",exports.toolbarPresetFeatures=A,exports.withDefaultFeatures=v;
2
2
  //# sourceMappingURL=extensions.js.map