pillardash-ui-react 0.1.137 → 0.1.140
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/components/Alert/Alert.js +1 -1
- package/dist/cjs/components/Alert/Alert.js.map +1 -1
- package/dist/cjs/components/Alert/AlertContext.js +1 -1
- package/dist/cjs/components/Alert/AlertContext.js.map +1 -1
- package/dist/cjs/components/Alert/ConfirmDialog.js +1 -1
- package/dist/cjs/components/Alert/ConfirmDialog.js.map +1 -1
- package/dist/cjs/components/Form/TextEditor/ImagePopover.js +2 -0
- package/dist/cjs/components/Form/TextEditor/ImagePopover.js.map +1 -0
- package/dist/cjs/components/Form/TextEditor/LinkPopover.js +2 -0
- package/dist/cjs/components/Form/TextEditor/LinkPopover.js.map +1 -0
- package/dist/cjs/components/Form/TextEditor/TextEditor.js +1 -1
- package/dist/cjs/components/Form/TextEditor/TextEditor.js.map +1 -1
- package/dist/cjs/components/Form/TextEditor/ToolbarGroups.js +2 -0
- package/dist/cjs/components/Form/TextEditor/ToolbarGroups.js.map +1 -0
- package/dist/cjs/components/Form/TextEditor/extensions.js +2 -0
- package/dist/cjs/components/Form/TextEditor/extensions.js.map +1 -0
- package/dist/cjs/components/Form/TextEditor/toolbar.js +2 -0
- package/dist/cjs/components/Form/TextEditor/toolbar.js.map +1 -0
- package/dist/cjs/node_modules/@tiptap/core/dist/index.js +1 -1
- package/dist/cjs/node_modules/@tiptap/core/dist/index.js.map +1 -1
- package/dist/cjs/node_modules/@tiptap/extension-list/dist/index.js +1 -1
- package/dist/cjs/node_modules/@tiptap/extension-list/dist/index.js.map +1 -1
- package/dist/cjs/node_modules/@tiptap/extension-table/dist/index.js +2 -0
- package/dist/cjs/node_modules/@tiptap/extension-table/dist/index.js.map +1 -0
- package/dist/cjs/node_modules/@tiptap/extension-table-cell/dist/index.js +2 -0
- package/dist/cjs/node_modules/@tiptap/extension-table-cell/dist/index.js.map +1 -0
- package/dist/cjs/node_modules/@tiptap/extension-table-header/dist/index.js +2 -0
- package/dist/cjs/node_modules/@tiptap/extension-table-header/dist/index.js.map +1 -0
- package/dist/cjs/node_modules/@tiptap/extension-table-row/dist/index.js +2 -0
- package/dist/cjs/node_modules/@tiptap/extension-table-row/dist/index.js.map +1 -0
- package/dist/cjs/node_modules/@tiptap/extension-task-item/dist/index.js +2 -0
- package/dist/cjs/node_modules/@tiptap/extension-task-item/dist/index.js.map +1 -0
- package/dist/cjs/node_modules/@tiptap/extension-task-list/dist/index.js +2 -0
- package/dist/cjs/node_modules/@tiptap/extension-task-list/dist/index.js.map +1 -0
- package/dist/cjs/node_modules/@tiptap/extension-text-align/dist/index.js +2 -0
- package/dist/cjs/node_modules/@tiptap/extension-text-align/dist/index.js.map +1 -0
- package/dist/cjs/node_modules/prosemirror-keymap/dist/index.js +2 -0
- package/dist/cjs/node_modules/prosemirror-keymap/dist/index.js.map +1 -0
- package/dist/cjs/node_modules/prosemirror-model/dist/index.js +1 -1
- package/dist/cjs/node_modules/prosemirror-model/dist/index.js.map +1 -1
- package/dist/cjs/node_modules/prosemirror-tables/dist/index.js +2 -0
- package/dist/cjs/node_modules/prosemirror-tables/dist/index.js.map +1 -0
- package/dist/cjs/node_modules/prosemirror-transform/dist/index.js +1 -1
- package/dist/cjs/node_modules/prosemirror-transform/dist/index.js.map +1 -1
- package/dist/cjs/node_modules/prosemirror-view/dist/index.js +2 -0
- package/dist/cjs/node_modules/prosemirror-view/dist/index.js.map +1 -0
- package/dist/cjs/node_modules/w3c-keyname/index.js +2 -0
- package/dist/cjs/node_modules/w3c-keyname/index.js.map +1 -0
- package/dist/esm/components/Alert/Alert.mjs +1 -1
- package/dist/esm/components/Alert/Alert.mjs.map +1 -1
- package/dist/esm/components/Alert/AlertContext.mjs +1 -1
- package/dist/esm/components/Alert/AlertContext.mjs.map +1 -1
- package/dist/esm/components/Alert/ConfirmDialog.mjs +1 -1
- package/dist/esm/components/Alert/ConfirmDialog.mjs.map +1 -1
- package/dist/esm/components/Form/TextEditor/ImagePopover.mjs +2 -0
- package/dist/esm/components/Form/TextEditor/ImagePopover.mjs.map +1 -0
- package/dist/esm/components/Form/TextEditor/LinkPopover.mjs +2 -0
- package/dist/esm/components/Form/TextEditor/LinkPopover.mjs.map +1 -0
- package/dist/esm/components/Form/TextEditor/TextEditor.mjs +1 -1
- package/dist/esm/components/Form/TextEditor/TextEditor.mjs.map +1 -1
- package/dist/esm/components/Form/TextEditor/ToolbarGroups.mjs +2 -0
- package/dist/esm/components/Form/TextEditor/ToolbarGroups.mjs.map +1 -0
- package/dist/esm/components/Form/TextEditor/extensions.mjs +2 -0
- package/dist/esm/components/Form/TextEditor/extensions.mjs.map +1 -0
- package/dist/esm/components/Form/TextEditor/toolbar.mjs +2 -0
- package/dist/esm/components/Form/TextEditor/toolbar.mjs.map +1 -0
- package/dist/esm/node_modules/@tiptap/core/dist/index.mjs +1 -1
- package/dist/esm/node_modules/@tiptap/core/dist/index.mjs.map +1 -1
- package/dist/esm/node_modules/@tiptap/extension-list/dist/index.mjs +1 -1
- package/dist/esm/node_modules/@tiptap/extension-list/dist/index.mjs.map +1 -1
- package/dist/esm/node_modules/@tiptap/extension-table/dist/index.mjs +2 -0
- package/dist/esm/node_modules/@tiptap/extension-table/dist/index.mjs.map +1 -0
- package/dist/esm/node_modules/@tiptap/extension-table-cell/dist/index.mjs +2 -0
- package/dist/esm/node_modules/@tiptap/extension-table-cell/dist/index.mjs.map +1 -0
- package/dist/esm/node_modules/@tiptap/extension-table-header/dist/index.mjs +2 -0
- package/dist/esm/node_modules/@tiptap/extension-table-header/dist/index.mjs.map +1 -0
- package/dist/esm/node_modules/@tiptap/extension-table-row/dist/index.mjs +2 -0
- package/dist/esm/node_modules/@tiptap/extension-table-row/dist/index.mjs.map +1 -0
- package/dist/esm/node_modules/@tiptap/extension-task-item/dist/index.mjs +2 -0
- package/dist/esm/node_modules/@tiptap/extension-task-item/dist/index.mjs.map +1 -0
- package/dist/esm/node_modules/@tiptap/extension-task-list/dist/index.mjs +2 -0
- package/dist/esm/node_modules/@tiptap/extension-task-list/dist/index.mjs.map +1 -0
- package/dist/esm/node_modules/@tiptap/extension-text-align/dist/index.mjs +2 -0
- package/dist/esm/node_modules/@tiptap/extension-text-align/dist/index.mjs.map +1 -0
- package/dist/esm/node_modules/prosemirror-keymap/dist/index.mjs +2 -0
- package/dist/esm/node_modules/prosemirror-keymap/dist/index.mjs.map +1 -0
- package/dist/esm/node_modules/prosemirror-model/dist/index.mjs +1 -1
- package/dist/esm/node_modules/prosemirror-model/dist/index.mjs.map +1 -1
- package/dist/esm/node_modules/prosemirror-tables/dist/index.mjs +2 -0
- package/dist/esm/node_modules/prosemirror-tables/dist/index.mjs.map +1 -0
- package/dist/esm/node_modules/prosemirror-transform/dist/index.mjs +1 -1
- package/dist/esm/node_modules/prosemirror-transform/dist/index.mjs.map +1 -1
- package/dist/esm/node_modules/prosemirror-view/dist/index.mjs +2 -0
- package/dist/esm/node_modules/prosemirror-view/dist/index.mjs.map +1 -0
- package/dist/esm/node_modules/w3c-keyname/index.mjs +2 -0
- package/dist/esm/node_modules/w3c-keyname/index.mjs.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/styles.css +1 -1
- package/package.json +9 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var e=require("react/jsx-runtime"),r=require("react"),o=require("lucide-react")
|
|
1
|
+
"use strict";var e=require("react/jsx-runtime"),r=require("react"),o=require("lucide-react"),t={success:e.jsx(o.CheckCircle,{className:"h-5 w-5"}),error:e.jsx(o.AlertCircle,{className:"h-5 w-5"}),info:e.jsx(o.Info,{className:"h-5 w-5"}),warning:e.jsx(o.AlertTriangle,{className:"h-5 w-5"})},s={success:{bgColor:"bg-green-50",borderColor:"border-green-300",textColor:"text-green-800",iconColor:"text-green-500",progressColor:"bg-green-500"},error:{bgColor:"bg-rose-50",borderColor:"border-rose-300",textColor:"text-rose-800",iconColor:"text-rose-500",progressColor:"bg-rose-500"},info:{bgColor:"bg-blue-50",borderColor:"border-blue-300",textColor:"text-blue-800",iconColor:"text-blue-500",progressColor:"bg-blue-500"},warning:{bgColor:"bg-amber-50",borderColor:"border-amber-300",textColor:"text-amber-800",iconColor:"text-amber-500",progressColor:"bg-amber-500"}};module.exports=function(l){var n=l.message,a=l.description,c=l.type,i=void 0===c?"info":c,u=l.duration,d=void 0===u?5e3:u,m=l.onClose,b=r.useState(!0),x=b[0],g=b[1],C=r.useState(100),f=C[0],h=C[1],v=r.useRef(m);r.useEffect((function(){v.current=m})),r.useEffect((function(){var e=requestAnimationFrame((function(){return h(0)})),r=setTimeout((function(){g(!1),setTimeout((function(){var e;null===(e=v.current)||void 0===e||e.call(v)}),300)}),d);return function(){cancelAnimationFrame(e),clearTimeout(r)}}),[d]);var j=s[i],w=j.bgColor,N=j.borderColor,p=j.textColor,y=j.iconColor,T=j.progressColor;return e.jsx("div",{className:"transform transition-all duration-300 ".concat(x?"translate-x-0 opacity-100":"translate-x-full opacity-0"),children:e.jsxs("div",{className:"flex w-72 rounded-lg border shadow-lg md:w-96 ".concat(N," ").concat(w," p-4"),children:[e.jsx("div",{className:"flex-shrink-0 ".concat(y),children:t[i]}),e.jsxs("div",{className:"ml-3 w-full",children:[e.jsxs("div",{className:"flex items-start justify-between",children:[e.jsx("div",{className:"text-base font-semibold ".concat(p),children:n}),e.jsx("button",{onClick:function(){g(!1),setTimeout((function(){var e;null===(e=v.current)||void 0===e||e.call(v)}),300)},"aria-label":"Close",className:"text-gray-600 hover:text-gray-800 focus:outline-none",children:e.jsx(o.X,{className:"h-4 w-4"})})]}),a&&e.jsx("p",{className:"mt-1 text-sm ".concat(p," opacity-80"),children:a}),e.jsx("div",{className:"mt-2 h-1 w-full rounded-full bg-gray-200",children:e.jsx("div",{className:"".concat(T," h-1 rounded-full"),style:{width:"".concat(f,"%"),transition:"width ".concat(d,"ms linear")}})})]})]})})};
|
|
2
2
|
//# sourceMappingURL=Alert.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Alert.js","sources":["../../../../src/components/Alert/Alert.tsx"],"sourcesContent":["import React, {ReactNode, useEffect, useState} from \"react\";\n\nimport { AlertCircle, AlertTriangle, CheckCircle, Info, X } from \"lucide-react\";\n\nexport type AlertType = \"success\" | \"error\" | \"info\" | \"warning\";\n\nexport interface AlertProps {\n message: ReactNode;\n description?: string;\n type?: AlertType;\n duration?: number;\n onClose?: () => void;\n}\n\nconst
|
|
1
|
+
{"version":3,"file":"Alert.js","sources":["../../../../src/components/Alert/Alert.tsx"],"sourcesContent":["import React, { ReactNode, useEffect, useRef, useState } from \"react\";\n\nimport { AlertCircle, AlertTriangle, CheckCircle, Info, X } from \"lucide-react\";\n\nexport type AlertType = \"success\" | \"error\" | \"info\" | \"warning\";\n\nexport interface AlertProps {\n message: ReactNode;\n description?: string;\n type?: AlertType;\n duration?: number;\n onClose?: () => void;\n}\n\nconst ALERT_ICONS: Record<AlertType, React.ReactElement> = {\n success: <CheckCircle className=\"h-5 w-5\" />,\n error: <AlertCircle className=\"h-5 w-5\" />,\n info: <Info className=\"h-5 w-5\" />,\n warning: <AlertTriangle className=\"h-5 w-5\" />,\n};\n\nconst ALERT_CONFIG: Record<\n AlertType,\n { bgColor: string; borderColor: string; textColor: string; iconColor: string; progressColor: string }\n> = {\n success: {\n bgColor: \"bg-green-50\",\n borderColor: \"border-green-300\",\n textColor: \"text-green-800\",\n iconColor: \"text-green-500\",\n progressColor: \"bg-green-500\",\n },\n error: {\n bgColor: \"bg-rose-50\",\n borderColor: \"border-rose-300\",\n textColor: \"text-rose-800\",\n iconColor: \"text-rose-500\",\n progressColor: \"bg-rose-500\",\n },\n info: {\n bgColor: \"bg-blue-50\",\n borderColor: \"border-blue-300\",\n textColor: \"text-blue-800\",\n iconColor: \"text-blue-500\",\n progressColor: \"bg-blue-500\",\n },\n warning: {\n bgColor: \"bg-amber-50\",\n borderColor: \"border-amber-300\",\n textColor: \"text-amber-800\",\n iconColor: \"text-amber-500\",\n progressColor: \"bg-amber-500\",\n },\n};\n\nconst Alert: React.FC<AlertProps> = ({\n message,\n description,\n type = \"info\",\n duration = 5000,\n onClose,\n}) => {\n const [isVisible, setIsVisible] = useState(true);\n const [progressWidth, setProgressWidth] = useState(100);\n const onCloseRef = useRef(onClose);\n\n // Keep ref current without adding onClose to the timer effect's deps\n useEffect(() => {\n onCloseRef.current = onClose;\n });\n\n useEffect(() => {\n // Single rAF triggers the CSS width transition from 100% → 0\n const frame = requestAnimationFrame(() => setProgressWidth(0));\n\n const timer = setTimeout(() => {\n setIsVisible(false);\n setTimeout(() => {\n onCloseRef.current?.();\n }, 300);\n }, duration);\n\n return () => {\n cancelAnimationFrame(frame);\n clearTimeout(timer);\n };\n }, [duration]);\n\n const handleClose = () => {\n setIsVisible(false);\n setTimeout(() => {\n onCloseRef.current?.();\n }, 300);\n };\n\n const { bgColor, borderColor, textColor, iconColor, progressColor } = ALERT_CONFIG[type];\n\n return (\n <div\n className={`transform transition-all duration-300 ${\n isVisible ? \"translate-x-0 opacity-100\" : \"translate-x-full opacity-0\"\n }`}\n >\n <div\n className={`flex w-72 rounded-lg border shadow-lg md:w-96 ${borderColor} ${bgColor} p-4`}\n >\n <div className={`flex-shrink-0 ${iconColor}`}>{ALERT_ICONS[type]}</div>\n <div className=\"ml-3 w-full\">\n <div className=\"flex items-start justify-between\">\n <div className={`text-base font-semibold ${textColor}`}>{message}</div>\n <button\n onClick={handleClose}\n aria-label=\"Close\"\n className=\"text-gray-600 hover:text-gray-800 focus:outline-none\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n </div>\n {description && (\n <p className={`mt-1 text-sm ${textColor} opacity-80`}>{description}</p>\n )}\n <div className=\"mt-2 h-1 w-full rounded-full bg-gray-200\">\n <div\n className={`${progressColor} h-1 rounded-full`}\n style={{\n width: `${progressWidth}%`,\n transition: `width ${duration}ms linear`,\n }}\n />\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport default Alert;\n"],"names":["ALERT_ICONS","success","_jsx","CheckCircle","className","error","AlertCircle","info","Info","warning","AlertTriangle","ALERT_CONFIG","bgColor","borderColor","textColor","iconColor","progressColor","_a","message","description","_b","type","_c","duration","onClose","_d","useState","isVisible","setIsVisible","_e","progressWidth","setProgressWidth","onCloseRef","useRef","useEffect","current","frame","requestAnimationFrame","timer","setTimeout","call","cancelAnimationFrame","clearTimeout","_f","children","_jsxs","concat","onClick","X","style","width","transition"],"mappings":"6FAcMA,EAAqD,CACvDC,QAASC,EAAAA,IAACC,EAAAA,aAAYC,UAAU,YAChCC,MAAOH,EAAAA,IAACI,EAAAA,aAAYF,UAAU,YAC9BG,KAAML,EAAAA,IAACM,EAAAA,MAAKJ,UAAU,YACtBK,QAASP,EAAAA,IAACQ,EAAAA,eAAcN,UAAU,aAGhCO,EAGF,CACAV,QAAS,CACLW,QAAS,cACTC,YAAa,mBACbC,UAAW,iBACXC,UAAW,iBACXC,cAAe,gBAEnBX,MAAO,CACHO,QAAS,aACTC,YAAa,kBACbC,UAAW,gBACXC,UAAW,gBACXC,cAAe,eAEnBT,KAAM,CACFK,QAAS,aACTC,YAAa,kBACbC,UAAW,gBACXC,UAAW,gBACXC,cAAe,eAEnBP,QAAS,CACLG,QAAS,cACTC,YAAa,mBACbC,UAAW,iBACXC,UAAW,iBACXC,cAAe,gCAIa,SAACC,OACjCC,EAAOD,EAAAC,QACPC,EAAWF,EAAAE,YACXC,EAAAH,EAAAI,KAAAA,OAAI,IAAAD,EAAG,SACPE,EAAAL,EAAAM,SAAAA,OAAQ,IAAAD,EAAG,IAAIA,EACfE,EAAOP,EAAAO,QAEDC,EAA4BC,EAAAA,UAAS,GAApCC,EAASF,EAAA,GAAEG,EAAYH,EAAA,GACxBI,EAAoCH,EAAAA,SAAS,KAA5CI,EAAaD,EAAA,GAAEE,EAAgBF,EAAA,GAChCG,EAAaC,EAAAA,OAAOT,GAG1BU,EAAAA,WAAU,WACNF,EAAWG,QAAUX,CACzB,IAEAU,EAAAA,WAAU,WAEN,IAAME,EAAQC,uBAAsB,WAAM,OAAAN,EAAiB,EAAjB,IAEpCO,EAAQC,YAAW,WACrBX,GAAa,GACbW,YAAW,iBACW,QAAlBtB,EAAAe,EAAWG,eAAO,IAAAlB,GAAAA,EAAAuB,KAAAR,EACtB,GAAG,IACP,GAAGT,GAEH,OAAO,WACHkB,qBAAqBL,GACrBM,aAAaJ,EACjB,CACJ,GAAG,CAACf,IAEJ,IAOMoB,EAAgEhC,EAAaU,GAA3ET,YAASC,gBAAaC,cAAWC,cAAWC,kBAEpD,OACId,aACIE,UAAW,gDACPuB,EAAY,4BAA8B,8BAC5CiB,SAEFC,EAAAA,KAAA,MAAA,CACIzC,UAAW,iDAAA0C,OAAiDjC,EAAW,KAAAiC,OAAIlC,EAAO,QAAMgC,SAAA,CAExF1C,EAAAA,WAAKE,UAAW,iBAAA0C,OAAiB/B,GAAW6B,SAAG5C,EAAYqB,KAC3DwB,EAAAA,KAAA,MAAA,CAAKzC,UAAU,cAAawC,SAAA,CACxBC,EAAAA,KAAA,MAAA,CAAKzC,UAAU,mCAAkCwC,SAAA,CAC7C1C,MAAA,MAAA,CAAKE,UAAW,2BAAA0C,OAA2BhC,GAAW8B,SAAG1B,IACzDhB,EAAAA,IAAA,SAAA,CACI6C,QAvBJ,WAChBnB,GAAa,GACbW,YAAW,iBACW,QAAlBtB,EAAAe,EAAWG,eAAO,IAAAlB,GAAAA,EAAAuB,KAAAR,EACtB,GAAG,IACP,EAkB4C,aACT,QACX5B,UAAU,uDAAsDwC,SAEhE1C,EAAAA,IAAC8C,EAAAA,EAAC,CAAC5C,UAAU,iBAGpBe,GACGjB,EAAAA,IAAA,IAAA,CAAGE,UAAW,gBAAA0C,OAAgBhC,iBAAsB8B,SAAGzB,IAE3DjB,EAAAA,IAAA,MAAA,CAAKE,UAAU,2CAA0CwC,SACrD1C,EAAAA,IAAA,MAAA,CACIE,UAAW,UAAGY,EAAa,qBAC3BiC,MAAO,CACHC,MAAO,GAAAJ,OAAGhB,EAAa,KACvBqB,WAAY,SAAAL,OAASvB,EAAQ,yBAQ7D"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../../node_modules/tslib/tslib.es6.js"),
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../../node_modules/tslib/tslib.es6.js"),n=require("react/jsx-runtime"),r=require("react"),t=require("./Alert.js"),o=require("./ConfirmDialog.js"),i=null,s=r.createContext(void 0),u={success:function(e,n){i?i.success(e,n):console.warn("AlertProvider not mounted yet")},error:function(e,n){i?i.error(e,n):console.warn("AlertProvider not mounted yet")},info:function(e,n){i?i.info(e,n):console.warn("AlertProvider not mounted yet")},warning:function(e,n){i?i.warning(e,n):console.warn("AlertProvider not mounted yet")},show:function(e){i?i.showAlert(e):console.warn("AlertProvider not mounted yet")},confirm:function(n,r){return e.__awaiter(void 0,void 0,void 0,(function(){return e.__generator(this,(function(e){return i?[2,i.confirm(n,r)]:(console.warn("AlertProvider not mounted yet"),[2,!1])}))}))}};exports.AlertContext=s,exports.AlertProvider=function(u){var c=u.children,a=r.useState([]),l=a[0],f=a[1],d=r.useState(null),m=d[0],p=d[1],v=r.useCallback((function(e){f((function(n){return n.filter((function(n){return n.id!==e}))}))}),[]),g=r.useCallback((function(n){var r=Math.random().toString(36).substring(2,9);f((function(t){return e.__spreadArray(e.__spreadArray([],t,!0),[e.__assign(e.__assign({},n),{id:r,onClose:function(){return v(r)}})],!1)}))}),[v]),w=r.useCallback((function(e,n){return g({message:e,description:n,type:"success"})}),[g]),_=r.useCallback((function(e,n){return g({message:e,description:n,type:"error"})}),[g]),x=r.useCallback((function(e,n){return g({message:e,description:n,type:"info"})}),[g]),A=r.useCallback((function(e,n){return g({message:e,description:n,type:"warning"})}),[g]),C=r.useCallback((function(e,n){return void 0===n&&(n={}),new Promise((function(r){p({isOpen:!0,message:e,options:n,resolve:r})}))}),[]),b=r.useCallback((function(e){m&&(m.resolve(e),p(null))}),[m]),y=r.useMemo((function(){return{showAlert:g,success:w,error:_,info:x,warning:A,confirm:C}}),[g,w,_,x,A,C]);return r.useEffect((function(){i=y}),[y]),n.jsxs(s.Provider,{value:y,children:[c,n.jsx("div",{className:"fixed right-4 top-4 z-50 flex w-full max-w-sm flex-col gap-2",children:l.map((function(r){return n.jsx(t,e.__assign({},r),r.id)}))}),m&&n.jsx(o,e.__assign({isOpen:m.isOpen,message:m.message,onConfirm:function(){return b(!0)},onCancel:function(){return b(!1)}},m.options))]})},exports.default=u,exports.useAlert=function(){var e=r.useContext(s);if(void 0===e)throw new Error("useAlert must be used within a AlertProvider");return e};
|
|
2
2
|
//# sourceMappingURL=AlertContext.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AlertContext.js","sources":["../../../../src/components/Alert/AlertContext.tsx"],"sourcesContent":["import React, { createContext, useCallback, useContext, useState } from \"react\";\nimport Alert, { AlertProps, AlertType } from \"./Alert\";\nimport ConfirmDialog from \"./ConfirmDialog\";\n\nexport interface AlertContextProps {\n showAlert: (props: Omit<AlertProps, \"onClose\">) => void;\n success: (message: string, description?: string) => void;\n error: (message: string, description?: string) => void;\n info: (message: string, description?: string) => void;\n warning: (message: string, description?: string) => void;\n confirm: (message: string, options?: ConfirmOptions) => Promise<boolean>;\n}\n\nexport interface ConfirmOptions {\n title?: string;\n description?: string;\n confirmText?: string;\n cancelText?: string;\n type?: AlertType;\n}\n\ninterface ConfirmState {\n isOpen: boolean;\n message: string;\n options: ConfirmOptions;\n resolve: (value: boolean) => void;\n}\n\nlet globalAlertRef: AlertContextProps | null = null;\n\nexport const AlertContext = createContext<AlertContextProps | undefined>(
|
|
1
|
+
{"version":3,"file":"AlertContext.js","sources":["../../../../src/components/Alert/AlertContext.tsx"],"sourcesContent":["import React, { createContext, useCallback, useContext, useEffect, useMemo, useState } from \"react\";\nimport Alert, { AlertProps, AlertType } from \"./Alert\";\nimport ConfirmDialog from \"./ConfirmDialog\";\n\nexport interface AlertContextProps {\n showAlert: (props: Omit<AlertProps, \"onClose\">) => void;\n success: (message: string, description?: string) => void;\n error: (message: string, description?: string) => void;\n info: (message: string, description?: string) => void;\n warning: (message: string, description?: string) => void;\n confirm: (message: string, options?: ConfirmOptions) => Promise<boolean>;\n}\n\nexport interface ConfirmOptions {\n title?: string;\n description?: string;\n confirmText?: string;\n cancelText?: string;\n type?: AlertType;\n}\n\ninterface ConfirmState {\n isOpen: boolean;\n message: string;\n options: ConfirmOptions;\n resolve: (value: boolean) => void;\n}\n\nlet globalAlertRef: AlertContextProps | null = null;\n\nexport const AlertContext = createContext<AlertContextProps | undefined>(undefined);\n\nexport interface AlertItem extends AlertProps {\n id: string;\n}\n\nexport const AlertProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => {\n const [alerts, setAlerts] = useState<AlertItem[]>([]);\n const [confirmState, setConfirmState] = useState<ConfirmState | null>(null);\n\n const removeAlert = useCallback((id: string) => {\n setAlerts((prev) => prev.filter((alert) => alert.id !== id));\n }, []);\n\n const showAlert = useCallback(\n (props: Omit<AlertProps, \"onClose\">) => {\n const id = Math.random().toString(36).substring(2, 9);\n setAlerts((prev) => [...prev, { ...props, id, onClose: () => removeAlert(id) }]);\n },\n [removeAlert],\n );\n\n const success = useCallback(\n (message: string, description?: string) => showAlert({ message, description, type: \"success\" }),\n [showAlert],\n );\n const error = useCallback(\n (message: string, description?: string) => showAlert({ message, description, type: \"error\" }),\n [showAlert],\n );\n const info = useCallback(\n (message: string, description?: string) => showAlert({ message, description, type: \"info\" }),\n [showAlert],\n );\n const warning = useCallback(\n (message: string, description?: string) => showAlert({ message, description, type: \"warning\" }),\n [showAlert],\n );\n\n const confirm = useCallback(\n (message: string, options: ConfirmOptions = {}): Promise<boolean> => {\n return new Promise((resolve) => {\n setConfirmState({ isOpen: true, message, options, resolve });\n });\n },\n [],\n );\n\n const handleConfirmClose = useCallback(\n (result: boolean) => {\n if (confirmState) {\n confirmState.resolve(result);\n setConfirmState(null);\n }\n },\n [confirmState],\n );\n\n const contextValue = useMemo(\n () => ({ showAlert, success, error, info, warning, confirm }),\n [showAlert, success, error, info, warning, confirm],\n );\n\n // Side effect outside of render\n useEffect(() => {\n globalAlertRef = contextValue;\n }, [contextValue]);\n\n return (\n <AlertContext.Provider value={contextValue}>\n {children}\n <div className=\"fixed right-4 top-4 z-50 flex w-full max-w-sm flex-col gap-2\">\n {alerts.map((alert) => (\n <Alert key={alert.id} {...alert} />\n ))}\n </div>\n {confirmState && (\n <ConfirmDialog\n isOpen={confirmState.isOpen}\n message={confirmState.message}\n onConfirm={() => handleConfirmClose(true)}\n onCancel={() => handleConfirmClose(false)}\n {...confirmState.options}\n />\n )}\n </AlertContext.Provider>\n );\n};\n\nexport const useAlert = (): AlertContextProps => {\n const context = useContext(AlertContext);\n if (context === undefined) {\n throw new Error(\"useAlert must be used within a AlertProvider\");\n }\n return context;\n};\n\n// Export a global alert function that can be used anywhere\nconst alert = {\n success: (message: string, description?: string) => {\n if (!globalAlertRef) {\n console.warn(\"AlertProvider not mounted yet\");\n return;\n }\n globalAlertRef.success(message, description);\n },\n error: (message: string, description?: string) => {\n if (!globalAlertRef) {\n console.warn(\"AlertProvider not mounted yet\");\n return;\n }\n globalAlertRef.error(message, description);\n },\n info: (message: string, description?: string) => {\n if (!globalAlertRef) {\n console.warn(\"AlertProvider not mounted yet\");\n return;\n }\n globalAlertRef.info(message, description);\n },\n warning: (message: string, description?: string) => {\n if (!globalAlertRef) {\n console.warn(\"AlertProvider not mounted yet\");\n return;\n }\n globalAlertRef.warning(message, description);\n },\n show: (props: Omit<AlertProps, \"onClose\">) => {\n if (!globalAlertRef) {\n console.warn(\"AlertProvider not mounted yet\");\n return;\n }\n globalAlertRef.showAlert(props);\n },\n confirm: async (message: string, options?: ConfirmOptions): Promise<boolean> => {\n if (!globalAlertRef) {\n console.warn(\"AlertProvider not mounted yet\");\n return false;\n }\n return globalAlertRef.confirm(message, options);\n },\n};\n\nexport default alert;\n"],"names":["globalAlertRef","AlertContext","createContext","undefined","alert","success","message","description","console","warn","error","info","warning","show","props","showAlert","confirm","options","__awaiter","_a","children","_b","useState","alerts","setAlerts","_c","confirmState","setConfirmState","removeAlert","useCallback","id","prev","filter","Math","random","toString","substring","__spreadArray","__assign","onClose","type","Promise","resolve","isOpen","handleConfirmClose","result","contextValue","useMemo","useEffect","_jsxs","Provider","value","_jsx","className","map","Alert","ConfirmDialog","onConfirm","onCancel","context","useContext","Error"],"mappings":"qOA4BIA,EAA2C,KAElCC,EAAeC,EAAAA,mBAA6CC,GAkGnEC,EAAQ,CACZC,QAAS,SAACC,EAAiBC,GACpBP,EAILA,EAAeK,QAAQC,EAASC,GAH9BC,QAAQC,KAAK,gCAIjB,EACAC,MAAO,SAACJ,EAAiBC,GAClBP,EAILA,EAAeU,MAAMJ,EAASC,GAH5BC,QAAQC,KAAK,gCAIjB,EACAE,KAAM,SAACL,EAAiBC,GACjBP,EAILA,EAAeW,KAAKL,EAASC,GAH3BC,QAAQC,KAAK,gCAIjB,EACAG,QAAS,SAACN,EAAiBC,GACpBP,EAILA,EAAeY,QAAQN,EAASC,GAH9BC,QAAQC,KAAK,gCAIjB,EACAI,KAAM,SAACC,GACAd,EAILA,EAAee,UAAUD,GAHvBN,QAAQC,KAAK,gCAIjB,EACAO,QAAS,SAAOV,EAAiBW,GAAwB,OAAAC,EAAAA,eAAA,OAAA,OAAA,GAAA,kDACvD,OAAKlB,EAIL,CAAA,EAAOA,EAAegB,QAAQV,EAASW,KAHrCT,QAAQC,KAAK,iCACb,CAAA,GAAO,MAGV,GAAA,gDAtImE,SAACU,GAAE,IAAAC,EAAQD,EAAAC,SACzEC,EAAsBC,EAAAA,SAAsB,IAA3CC,EAAMF,EAAA,GAAEG,EAASH,EAAA,GAClBI,EAAkCH,EAAAA,SAA8B,MAA/DI,EAAYD,EAAA,GAAEE,EAAeF,EAAA,GAE9BG,EAAcC,eAAY,SAACC,GAC/BN,GAAU,SAACO,GAAS,OAAAA,EAAKC,QAAO,SAAC5B,GAAU,OAAAA,EAAM0B,KAAOA,CAAb,GAAvB,GACtB,GAAG,IAEGf,EAAYc,eAChB,SAACf,GACC,IAAMgB,EAAKG,KAAKC,SAASC,SAAS,IAAIC,UAAU,EAAG,GACnDZ,GAAU,SAACO,GAAS,OAAAM,EAAAA,cAAAA,EAAAA,cAAA,GAAIN,GAAI,GAAA,CAAAO,EAAAA,SAAAA,EAAAA,SAAA,CAAA,EAAOxB,GAAK,CAAEgB,GAAEA,EAAES,QAAS,WAAM,OAAAX,EAAYE,EAAZ,MAAe,EAAxD,GACtB,GACA,CAACF,IAGGvB,EAAUwB,EAAAA,aACd,SAACvB,EAAiBC,GAAyB,OAAAQ,EAAU,CAAET,QAAOA,EAAEC,YAAWA,EAAEiC,KAAM,WAAxC,GAC3C,CAACzB,IAEGL,EAAQmB,EAAAA,aACZ,SAACvB,EAAiBC,GAAyB,OAAAQ,EAAU,CAAET,QAAOA,EAAEC,YAAWA,EAAEiC,KAAM,SAAxC,GAC3C,CAACzB,IAEGJ,EAAOkB,EAAAA,aACX,SAACvB,EAAiBC,GAAyB,OAAAQ,EAAU,CAAET,QAAOA,EAAEC,YAAWA,EAAEiC,KAAM,QAAxC,GAC3C,CAACzB,IAEGH,EAAUiB,EAAAA,aACd,SAACvB,EAAiBC,GAAyB,OAAAQ,EAAU,CAAET,QAAOA,EAAEC,YAAWA,EAAEiC,KAAM,WAAxC,GAC3C,CAACzB,IAGGC,EAAUa,EAAAA,aACd,SAACvB,EAAiBW,GAChB,YADgB,IAAAA,IAAAA,EAAA,CAAA,GACT,IAAIwB,SAAQ,SAACC,GAClBf,EAAgB,CAAEgB,QAAQ,EAAMrC,QAAOA,EAAEW,UAASyB,QAAOA,GAC3D,GACF,GACA,IAGIE,EAAqBf,eACzB,SAACgB,GACKnB,IACFA,EAAagB,QAAQG,GACrBlB,EAAgB,MAEpB,GACA,CAACD,IAGGoB,EAAeC,EAAAA,SACnB,WAAM,MAAA,CAAGhC,UAASA,EAAEV,QAAOA,EAAEK,MAAKA,EAAEC,KAAIA,EAAEC,QAAOA,EAAEI,QAAOA,EAApD,GACN,CAACD,EAAWV,EAASK,EAAOC,EAAMC,EAASI,IAQ7C,OAJAgC,EAAAA,WAAU,WACRhD,EAAiB8C,CACnB,GAAG,CAACA,IAGFG,EAAAA,KAAChD,EAAaiD,SAAQ,CAACC,MAAOL,YAC3B1B,EACDgC,EAAAA,WAAKC,UAAU,+DAA8DjC,SAC1EG,EAAO+B,KAAI,SAAClD,GAAU,OACrBgD,EAAAA,IAACG,EAAKjB,EAAAA,SAAA,CAAA,EAAoBlC,GAAdA,EAAM0B,GADG,MAIxBJ,GACC0B,EAAAA,IAACI,cACCb,OAAQjB,EAAaiB,OACrBrC,QAASoB,EAAapB,QACtBmD,UAAW,WAAM,OAAAb,GAAmB,EAAnB,EACjBc,SAAU,WAAM,OAAAd,GAAmB,EAAnB,GACZlB,EAAaT,YAK3B,qCAEwB,WACtB,IAAM0C,EAAUC,EAAAA,WAAW3D,GAC3B,QAAgBE,IAAZwD,EACF,MAAM,IAAIE,MAAM,gDAElB,OAAOF,CACT"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var e=require("react/jsx-runtime"),o=require("
|
|
1
|
+
"use strict";var e=require("react/jsx-runtime"),o=require("react"),r=require("lucide-react"),n={success:{icon:e.jsx(r.CheckCircle,{className:"h-6 w-6"}),iconColor:"text-green-500",buttonColor:"bg-green-600 hover:bg-green-700"},error:{icon:e.jsx(r.AlertCircle,{className:"h-6 w-6"}),iconColor:"text-rose-500",buttonColor:"bg-rose-600 hover:bg-rose-700"},info:{icon:e.jsx(r.Info,{className:"h-6 w-6"}),iconColor:"text-blue-500",buttonColor:"bg-blue-600 hover:bg-blue-700"},warning:{icon:e.jsx(r.AlertTriangle,{className:"h-6 w-6"}),iconColor:"text-amber-500",buttonColor:"bg-amber-600 hover:bg-amber-700"}};module.exports=function(r){var s=r.isOpen,t=r.message,i=r.title,c=void 0===i?"Confirm Action":i,l=r.description,a=r.confirmText,d=void 0===a?"Confirm":a,m=r.cancelText,u=void 0===m?"Cancel":m,x=r.type,f=void 0===x?"warning":x,g=r.onConfirm,b=r.onCancel;if(o.useEffect((function(){if(s){var e=function(e){"Escape"===e.key&&b()};return document.addEventListener("keydown",e),function(){return document.removeEventListener("keydown",e)}}}),[s,b]),!s)return null;var h=n[f],v=h.icon,j=h.iconColor,C=h.buttonColor;return e.jsxs("div",{className:"fixed inset-0 z-50 flex items-center justify-center",children:[e.jsx("div",{className:"absolute inset-0 bg-black bg-opacity-50 transition-opacity",onClick:b}),e.jsxs("div",{className:"relative bg-white rounded-lg shadow-xl max-w-md w-full mx-4 transform transition-all",children:[e.jsx("div",{className:"p-6",children:e.jsxs("div",{className:"flex items-start",children:[e.jsx("div",{className:"flex-shrink-0 ".concat(j),children:v}),e.jsxs("div",{className:"ml-4 flex-1",children:[e.jsx("h3",{className:"text-lg font-semibold text-gray-900",children:c}),e.jsxs("div",{className:"mt-2 text-sm text-gray-600",children:[e.jsx("p",{children:t}),l&&e.jsx("p",{className:"mt-2",children:l})]})]})]})}),e.jsxs("div",{className:"bg-gray-50 px-6 py-4 flex flex-col-reverse sm:flex-row sm:justify-end gap-3 rounded-b-lg",children:[e.jsx("button",{onClick:b,className:"px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-gray-500 transition-colors",children:u}),e.jsx("button",{onClick:g,autoFocus:!0,className:"px-4 py-2 text-sm font-medium text-white rounded-md focus:outline-none focus:ring-2 focus:ring-offset-2 transition-colors ".concat(C),children:d})]})]})]})};
|
|
2
2
|
//# sourceMappingURL=ConfirmDialog.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConfirmDialog.js","sources":["../../../../src/components/Alert/ConfirmDialog.tsx"],"sourcesContent":["import React from \"react\";\nimport { AlertCircle, AlertTriangle, CheckCircle, Info } from \"lucide-react\";\nimport { AlertType } from \"./Alert\";\n\ninterface ConfirmDialogProps {\n isOpen: boolean;\n message: string;\n title?: string;\n description?: string;\n confirmText?: string;\n cancelText?: string;\n type?: AlertType;\n onConfirm: () => void;\n onCancel: () => void;\n}\n\nconst
|
|
1
|
+
{"version":3,"file":"ConfirmDialog.js","sources":["../../../../src/components/Alert/ConfirmDialog.tsx"],"sourcesContent":["import React, { useEffect } from \"react\";\nimport { AlertCircle, AlertTriangle, CheckCircle, Info } from \"lucide-react\";\nimport { AlertType } from \"./Alert\";\n\ninterface ConfirmDialogProps {\n isOpen: boolean;\n message: string;\n title?: string;\n description?: string;\n confirmText?: string;\n cancelText?: string;\n type?: AlertType;\n onConfirm: () => void;\n onCancel: () => void;\n}\n\nconst CONFIRM_CONFIG: Record<\n AlertType,\n { icon: React.ReactElement; iconColor: string; buttonColor: string }\n> = {\n success: {\n icon: <CheckCircle className=\"h-6 w-6\" />,\n iconColor: \"text-green-500\",\n buttonColor: \"bg-green-600 hover:bg-green-700\",\n },\n error: {\n icon: <AlertCircle className=\"h-6 w-6\" />,\n iconColor: \"text-rose-500\",\n buttonColor: \"bg-rose-600 hover:bg-rose-700\",\n },\n info: {\n icon: <Info className=\"h-6 w-6\" />,\n iconColor: \"text-blue-500\",\n buttonColor: \"bg-blue-600 hover:bg-blue-700\",\n },\n warning: {\n icon: <AlertTriangle className=\"h-6 w-6\" />,\n iconColor: \"text-amber-500\",\n buttonColor: \"bg-amber-600 hover:bg-amber-700\",\n },\n};\n\nconst ConfirmDialog: React.FC<ConfirmDialogProps> = ({\n isOpen,\n message,\n title = \"Confirm Action\",\n description,\n confirmText = \"Confirm\",\n cancelText = \"Cancel\",\n type = \"warning\",\n onConfirm,\n onCancel,\n}) => {\n useEffect(() => {\n if (!isOpen) return;\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onCancel();\n };\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => document.removeEventListener(\"keydown\", handleKeyDown);\n }, [isOpen, onCancel]);\n\n if (!isOpen) return null;\n\n const { icon, iconColor, buttonColor } = CONFIRM_CONFIG[type];\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center\">\n {/* Backdrop */}\n <div\n className=\"absolute inset-0 bg-black bg-opacity-50 transition-opacity\"\n onClick={onCancel}\n />\n\n {/* Dialog */}\n <div className=\"relative bg-white rounded-lg shadow-xl max-w-md w-full mx-4 transform transition-all\">\n <div className=\"p-6\">\n <div className=\"flex items-start\">\n <div className={`flex-shrink-0 ${iconColor}`}>{icon}</div>\n <div className=\"ml-4 flex-1\">\n <h3 className=\"text-lg font-semibold text-gray-900\">{title}</h3>\n <div className=\"mt-2 text-sm text-gray-600\">\n <p>{message}</p>\n {description && <p className=\"mt-2\">{description}</p>}\n </div>\n </div>\n </div>\n </div>\n\n {/* Actions */}\n <div className=\"bg-gray-50 px-6 py-4 flex flex-col-reverse sm:flex-row sm:justify-end gap-3 rounded-b-lg\">\n <button\n onClick={onCancel}\n className=\"px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-gray-500 transition-colors\"\n >\n {cancelText}\n </button>\n <button\n onClick={onConfirm}\n autoFocus\n className={`px-4 py-2 text-sm font-medium text-white rounded-md focus:outline-none focus:ring-2 focus:ring-offset-2 transition-colors ${buttonColor}`}\n >\n {confirmText}\n </button>\n </div>\n </div>\n </div>\n );\n};\n\nexport default ConfirmDialog;\n"],"names":["CONFIRM_CONFIG","success","icon","_jsx","CheckCircle","className","iconColor","buttonColor","error","AlertCircle","info","Info","warning","AlertTriangle","_a","isOpen","message","_b","title","description","_c","confirmText","_d","cancelText","_e","type","onConfirm","onCancel","useEffect","handleKeyDown","e","key","document","addEventListener","removeEventListener","_f","_jsxs","onClick","children","autoFocus","concat"],"mappings":"6FAgBMA,EAGF,CACFC,QAAS,CACPC,KAAMC,EAAAA,IAACC,EAAAA,aAAYC,UAAU,YAC7BC,UAAW,iBACXC,YAAa,mCAEfC,MAAO,CACLN,KAAMC,EAAAA,IAACM,EAAAA,aAAYJ,UAAU,YAC7BC,UAAW,gBACXC,YAAa,iCAEfG,KAAM,CACJR,KAAMC,EAAAA,IAACQ,EAAAA,MAAKN,UAAU,YACtBC,UAAW,gBACXC,YAAa,iCAEfK,QAAS,CACPV,KAAMC,EAAAA,IAACU,EAAAA,eAAcR,UAAU,YAC/BC,UAAW,iBACXC,YAAa,mDAImC,SAACO,GACnD,IAAAC,WACAC,YACAC,EAAAH,EAAAI,MAAAA,OAAK,IAAAD,EAAG,iBAAgBA,EACxBE,EAAWL,EAAAK,YACXC,EAAAN,EAAAO,YAAAA,OAAW,IAAAD,EAAG,UAASA,EACvBE,eAAAC,aAAa,SAAQD,EACrBE,EAAAV,EAAAW,KAAAA,OAAI,IAAAD,EAAG,UAASA,EAChBE,EAASZ,EAAAY,UACTC,EAAQb,EAAAa,SAWR,GATAC,EAAAA,WAAU,WACR,GAAKb,EAAL,CACA,IAAMc,EAAgB,SAACC,GACP,WAAVA,EAAEC,KAAkBJ,GAC1B,EAEA,OADAK,SAASC,iBAAiB,UAAWJ,GAC9B,WAAM,OAAAG,SAASE,oBAAoB,UAAWL,EAAxC,CALA,CAMf,GAAG,CAACd,EAAQY,KAEPZ,EAAQ,OAAO,KAEd,IAAAoB,EAAmCnC,EAAeyB,GAAhDvB,EAAIiC,EAAAjC,KAAEI,EAAS6B,EAAA7B,UAAEC,gBAEzB,OACE6B,EAAAA,KAAA,MAAA,CAAK/B,UAAU,gEAEbF,EAAAA,IAAA,MAAA,CACEE,UAAU,6DACVgC,QAASV,IAIXS,EAAAA,KAAA,MAAA,CAAK/B,UAAU,uFAAsFiC,SAAA,CACnGnC,MAAA,MAAA,CAAKE,UAAU,MAAKiC,SAClBF,EAAAA,KAAA,MAAA,CAAK/B,UAAU,mBAAkBiC,SAAA,CAC/BnC,EAAAA,IAAA,MAAA,CAAKE,UAAW,wBAAiBC,GAAWgC,SAAGpC,IAC/CkC,EAAAA,YAAK/B,UAAU,cAAaiC,SAAA,CAC1BnC,EAAAA,IAAA,KAAA,CAAIE,UAAU,sCAAqCiC,SAAEpB,IACrDkB,EAAAA,KAAA,MAAA,CAAK/B,UAAU,6BAA4BiC,SAAA,CACzCnC,EAAAA,IAAA,IAAA,CAAAmC,SAAItB,IACHG,GAAehB,EAAAA,IAAA,IAAA,CAAGE,UAAU,OAAMiC,SAAEnB,eAO7CiB,EAAAA,KAAA,MAAA,CAAK/B,UAAU,2FAA0FiC,SAAA,CACvGnC,EAAAA,IAAA,SAAA,CACEkC,QAASV,EACTtB,UAAU,oMAAmMiC,SAE5Mf,IAEHpB,EAAAA,IAAA,SAAA,CACEkC,QAASX,EACTa,aACAlC,UAAW,6HAAAmC,OAA6HjC,GAAa+B,SAEpJjB,YAMb"}
|
|
@@ -0,0 +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"})]})]})]})};
|
|
2
|
+
//# sourceMappingURL=ImagePopover.js.map
|
|
@@ -0,0 +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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"}
|
|
@@ -0,0 +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"})]})]})]})};
|
|
2
|
+
//# sourceMappingURL=LinkPopover.js.map
|
|
@@ -0,0 +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":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var e=require("
|
|
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"),l=require("./ToolbarGroups.js"),n=require("./extensions.js"),a=require("./toolbar.js");module.exports=function(d){var u=d.initialContent,c=void 0===u?"":u,g=d.onUpdate,b=d.features,m=d.stickyToolbar,f=void 0===m||m,x=d.toolbarPreset,v=void 0===x?"standard":x,h=d.onImageUpload,j=o.useMemo((function(){return n.withDefaultFeatures(e.__assign(e.__assign({},n.toolbarPresetFeatures[v]),b))}),[b,v]),p=o.useState(!1),k=p[0],T=p[1],y=o.useState(null),w=y[0],q=y[1],L=i.useEditor({extensions:n.createTextEditorExtensions(j),content:c,onUpdate:function(e){var t=e.editor;g(t.getHTML())},editorProps:{attributes:{class:n.editorContentClassName},handleKeyDown:function(e,t){return!!j.slashCommand&&("/"===t.key?(T(!0),!1):("Escape"===t.key&&T(!1),!1))}},immediatelyRender:!1});o.useEffect((function(){if(L){var e=function(){var e=L.state.selection;if(e.from!==e.to&&L.isFocused){var t=window.getSelection();if(t&&0!==t.rangeCount){var o=t.getRangeAt(0).getBoundingClientRect();q({top:o.top+window.scrollY-48,left:o.left+window.scrollX+o.width/2})}else q(null)}else q(null)},t=function(){return q(null)};return L.on("selectionUpdate",e),L.on("blur",t),function(){L.off("selectionUpdate",e),L.off("blur",t)}}}),[L]);var C=o.useRef(c);o.useEffect((function(){L&&(c!==C.current&&L.getHTML()===C.current&&(L.commands.setContent(c||"",{emitUpdate:!1}),C.current=c))}),[L,c]);var D=j.heading||j.formatting||j.lists||j.code||j.quote||j.link||j.table||j.image||j.taskList||j.alignment;return L?t.jsxs("div",{className:"pd-text-editor w-full rounded-lg border border-gray-200 shadow-sm",children:[t.jsxs("div",{className:"flex flex-wrap items-center gap-1 border-b bg-gray-50 p-3 ".concat(f?"sticky top-0 z-10":""),children:[j.history&&t.jsx(l.HistoryTools,{editor:L}),j.history&&D&&t.jsx(a.ToolbarDivider,{}),j.heading&&t.jsx(a.HeadingSelect,{value:(null==L?void 0:L.isActive("heading",{level:1}))?1:(null==L?void 0:L.isActive("heading",{level:2}))?2:(null==L?void 0:L.isActive("heading",{level:3}))?3:0,onChange:function(e){0===e?L.chain().focus().setParagraph().run():L.chain().focus().toggleHeading({level:e}).run()}}),j.heading&&(j.formatting||j.lists||j.code||j.quote||j.link||j.table||j.image||j.taskList)&&t.jsx(a.ToolbarDivider,{}),j.formatting&&t.jsx(l.FormattingTools,{editor:L}),j.formatting&&(j.alignment||j.lists||j.code||j.quote||j.link||j.table||j.image||j.taskList)&&t.jsx(a.ToolbarDivider,{}),j.alignment&&t.jsx(l.AlignmentTools,{editor:L}),j.alignment&&(j.lists||j.code||j.quote||j.link||j.table||j.image||j.taskList)&&t.jsx(a.ToolbarDivider,{}),j.lists&&t.jsx(l.ListTools,{editor:L}),j.lists&&(j.code||j.quote||j.link||j.table||j.image||j.taskList)&&t.jsx(a.ToolbarDivider,{}),j.code&&t.jsx(l.CodeTools,{editor:L}),j.code&&(j.quote||j.link||j.table||j.image||j.taskList)&&t.jsx(a.ToolbarDivider,{}),j.quote&&t.jsx(l.QuoteTools,{editor:L}),j.quote&&(j.link||j.table||j.image||j.taskList)&&t.jsx(a.ToolbarDivider,{}),j.link&&t.jsx(r,{editor:L}),j.link&&(j.table||j.image||j.taskList)&&t.jsx(a.ToolbarDivider,{}),j.table&&t.jsx(l.TableTools,{editor:L}),j.table&&(j.image||j.taskList)&&t.jsx(a.ToolbarDivider,{}),j.image&&t.jsx(s,{editor:L,onImageUpload:h}),j.image&&j.taskList&&t.jsx(a.ToolbarDivider,{}),j.taskList&&t.jsx(l.InsertTools,{editor:L})]}),!1===f&&w&&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:w.top,left:w.left},children:[t.jsx(l.FormattingTools,{editor:L}),j.link&&t.jsx(r,{editor:L})]}),j.slashCommand&&k&&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(){L.chain().focus().toggleHeading({level:1}).run(),T(!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(){L.chain().focus().toggleBulletList().run(),T(!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(){L.chain().focus().toggleCodeBlock().run(),T(!1)},children:"Code Block"})]}),t.jsx(i.EditorContent,{editor:L,className:"w-full min-h-[300px] focus-within:bg-white"})]}):t.jsx("div",{className:"rounded-lg border bg-gray-50 h-48 animate-pulse"})};
|
|
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\";\n\nimport Bold from \"@tiptap/extension-bold\";\nimport BulletList from \"@tiptap/extension-bullet-list\";\nimport Code from \"@tiptap/extension-code\";\nimport CodeBlock from \"@tiptap/extension-code-block\";\nimport Document from \"@tiptap/extension-document\";\nimport Heading from \"@tiptap/extension-heading\";\nimport Italic from \"@tiptap/extension-italic\";\nimport Link from \"@tiptap/extension-link\";\nimport ListItem from \"@tiptap/extension-list-item\";\nimport OrderedList from \"@tiptap/extension-ordered-list\";\nimport Paragraph from \"@tiptap/extension-paragraph\";\nimport Strike from \"@tiptap/extension-strike\";\nimport Text from \"@tiptap/extension-text\";\nimport Underline from \"@tiptap/extension-underline\";\nimport { EditorContent, useEditor } from \"@tiptap/react\";\nimport StarterKit from \"@tiptap/starter-kit\";\nimport {\n Bold as BoldIcon,\n Italic as ItalicIcon,\n Underline as UnderlineIcon,\n List,\n ListOrdered,\n Heading1,\n Heading2,\n Heading3,\n Code as CodeIcon,\n FileCode,\n Link as LinkIcon,\n Strikethrough,\n Quote,\n Minus,\n Undo2,\n Redo2, SeparatorVertical\n} from \"lucide-react\";\n\nexport interface TextEditorProps {\n initialContent?: string;\n onUpdate: (content: string) => void;\n}\n\nconst TextEditor: React.FC<TextEditorProps> = ({ initialContent = \"\", onUpdate }) => {\n const editor = useEditor({\n extensions: [\n StarterKit.configure({\n heading: false,\n codeBlock: false,\n }),\n Document,\n Paragraph,\n Text,\n Bold,\n Italic,\n Underline,\n Strike,\n Code,\n CodeBlock.configure({\n HTMLAttributes: {\n class: 'bg-gray-100 p-3 rounded text-sm font-mono',\n },\n }),\n Heading.configure({\n levels: [1, 2, 3],\n }),\n BulletList,\n OrderedList,\n ListItem,\n Link.configure({\n openOnClick: false,\n HTMLAttributes: {\n class: 'text-blue-600 underline',\n },\n }),\n ],\n content: initialContent,\n onUpdate: ({ editor }) => {\n onUpdate(editor.getHTML());\n },\n editorProps: {\n attributes: {\n class: 'prose prose-sm sm:prose lg:prose-lg xl:prose-2xl mx-auto focus:outline-none min-h-[200px] p-4',\n },\n },\n immediatelyRender: false,\n });\n\n const addLink = () => {\n const url = window.prompt('Enter URL:');\n if (url) {\n editor?.chain().focus().setLink({ href: url }).run();\n }\n };\n\n const removeLink = () => {\n editor?.chain().focus().unsetLink().run();\n };\n\n if (!editor) {\n return <div className=\"rounded-lg border bg-gray-50 h-48 animate-pulse\"></div>;\n }\n\n return (\n <div className='rounded-lg border border-gray-200 shadow-sm'>\n {/* Toolbar */}\n <div className='flex flex-wrap items-center gap-1 border-b bg-gray-50 p-3'>\n {/* Undo/Redo */}\n <button\n onClick={() => editor.chain().focus().undo().run()}\n className={`p-2 rounded hover:bg-gray-200 transition-colors ${!editor.can().undo() ? 'opacity-50 cursor-not-allowed' : ''}`}\n type='button'\n disabled={!editor.can().undo()}\n title=\"Undo\"\n >\n <Undo2 size={16} />\n </button>\n <button\n onClick={() => editor.chain().focus().redo().run()}\n className={`p-2 rounded hover:bg-gray-200 transition-colors ${!editor.can().redo() ? 'opacity-50 cursor-not-allowed' : ''}`}\n type='button'\n disabled={!editor.can().redo()}\n title=\"Redo\"\n >\n <Redo2 size={16} />\n </button>\n\n <div className=\"mx-2 h-6 w-px bg-gray-300\"></div>\n\n {/* Headings */}\n <button\n onClick={() => editor.chain().focus().toggleHeading({ level: 1 }).run()}\n className={`p-2 rounded transition-colors ${\n editor.isActive(\"heading\", { level: 1 })\n ? \"bg-blue-200 text-blue-800\"\n : \"hover:bg-gray-200\"\n }`}\n type='button'\n title=\"Heading 1\"\n >\n <Heading1 size={16} />\n </button>\n <button\n onClick={() => editor.chain().focus().toggleHeading({ level: 2 }).run()}\n className={`p-2 rounded transition-colors ${\n editor.isActive(\"heading\", { level: 2 })\n ? \"bg-blue-200 text-blue-800\"\n : \"hover:bg-gray-200\"\n }`}\n type='button'\n title=\"Heading 2\"\n >\n <Heading2 size={16} />\n </button>\n <button\n onClick={() => editor.chain().focus().toggleHeading({ level: 3 }).run()}\n className={`p-2 rounded transition-colors ${\n editor.isActive(\"heading\", { level: 3 })\n ? \"bg-blue-200 text-blue-800\"\n : \"hover:bg-gray-200\"\n }`}\n type='button'\n title=\"Heading 3\"\n >\n <Heading3 size={16} />\n </button>\n\n <SeparatorVertical className=\"mx-2 h-6 w-px bg-gray-300\" />\n\n {/* Text Formatting */}\n <button\n onClick={() => editor.chain().focus().toggleBold().run()}\n className={`p-2 rounded transition-colors ${\n editor.isActive(\"bold\")\n ? \"bg-blue-200 text-blue-800\"\n : \"hover:bg-gray-200\"\n }`}\n type='button'\n title=\"Bold\"\n >\n <BoldIcon size={16} />\n </button>\n <button\n onClick={() => editor.chain().focus().toggleItalic().run()}\n className={`p-2 rounded transition-colors ${\n editor.isActive(\"italic\")\n ? \"bg-blue-200 text-blue-800\"\n : \"hover:bg-gray-200\"\n }`}\n type='button'\n title=\"Italic\"\n >\n <ItalicIcon size={16} />\n </button>\n <button\n onClick={() => editor.chain().focus().toggleUnderline().run()}\n className={`p-2 rounded transition-colors ${\n editor.isActive(\"underline\")\n ? \"bg-blue-200 text-blue-800\"\n : \"hover:bg-gray-200\"\n }`}\n type='button'\n title=\"Underline\"\n >\n <UnderlineIcon size={16} />\n </button>\n <button\n onClick={() => editor.chain().focus().toggleStrike().run()}\n className={`p-2 rounded transition-colors ${\n editor.isActive(\"strike\")\n ? \"bg-blue-200 text-blue-800\"\n : \"hover:bg-gray-200\"\n }`}\n type='button'\n title=\"Strikethrough\"\n >\n <Strikethrough size={16} />\n </button>\n\n <SeparatorVertical className=\"mx-2 h-6 w-px bg-gray-300\" />\n\n {/* Lists */}\n <button\n onClick={() => editor.chain().focus().toggleBulletList().run()}\n className={`p-2 rounded transition-colors ${\n editor.isActive(\"bulletList\")\n ? \"bg-blue-200 text-blue-800\"\n : \"hover:bg-gray-200\"\n }`}\n type='button'\n title=\"Bullet List\"\n >\n <List size={16} />\n </button>\n <button\n onClick={() => editor.chain().focus().toggleOrderedList().run()}\n className={`p-2 rounded transition-colors ${\n editor.isActive(\"orderedList\")\n ? \"bg-blue-200 text-blue-800\"\n : \"hover:bg-gray-200\"\n }`}\n type='button'\n title=\"Numbered List\"\n >\n <ListOrdered size={16} />\n </button>\n\n <SeparatorVertical className=\"mx-2 h-6 w-px bg-gray-300\" />\n\n {/* Code */}\n <button\n onClick={() => editor.chain().focus().toggleCode().run()}\n className={`p-2 rounded transition-colors ${\n editor.isActive(\"code\")\n ? \"bg-blue-200 text-blue-800\"\n : \"hover:bg-gray-200\"\n }`}\n type='button'\n title=\"Inline Code\"\n >\n <CodeIcon size={16} />\n </button>\n <button\n onClick={() => editor.chain().focus().toggleCodeBlock().run()}\n className={`p-2 rounded transition-colors ${\n editor.isActive(\"codeBlock\")\n ? \"bg-blue-200 text-blue-800\"\n : \"hover:bg-gray-200\"\n }`}\n type='button'\n title=\"Code Block\"\n >\n <FileCode size={16} />\n </button>\n\n <SeparatorVertical className=\"mx-2 h-6 w-px bg-gray-300\" />\n\n {/* Quote */}\n <button\n onClick={() => editor.chain().focus().toggleBlockquote().run()}\n className={`p-2 rounded transition-colors ${\n editor.isActive(\"blockquote\")\n ? \"bg-blue-200 text-blue-800\"\n : \"hover:bg-gray-200\"\n }`}\n type='button'\n title=\"Quote\"\n >\n <Quote size={16} />\n </button>\n\n <SeparatorVertical className=\"mx-2 h-6 w-px bg-gray-300\" />\n\n {/* Link */}\n {editor.isActive('link') ? (\n <button\n onClick={removeLink}\n className=\"p-2 rounded bg-blue-200 text-blue-800 hover:bg-blue-300 transition-colors\"\n type='button'\n title=\"Remove Link\"\n >\n <LinkIcon size={16} />\n </button>\n ) : (\n <button\n onClick={addLink}\n className=\"p-2 rounded hover:bg-gray-200 transition-colors\"\n type='button'\n title=\"Add Link\"\n >\n <LinkIcon size={16} />\n </button>\n )}\n </div>\n\n {/* Editor */}\n <EditorContent\n editor={editor}\n className='min-h-[300px] focus-within:bg-white'\n />\n </div>\n );\n};\n\nexport default TextEditor;"],"names":["_a","_b","initialContent","onUpdate","editor","useEditor","extensions","StarterKit","configure","heading","codeBlock","Document","Paragraph","Text","Bold","Italic","Underline","Strike","Code","CodeBlock","HTMLAttributes","class","Heading","levels","BulletList","OrderedList","ListItem","Link","openOnClick","content","getHTML","editorProps","attributes","immediatelyRender","_jsxs","className","children","_jsx","onClick","chain","focus","undo","run","concat","can","type","disabled","title","Undo2","size","redo","Redo2","toggleHeading","level","isActive","Heading1","Heading2","Heading3","SeparatorVertical","toggleBold","BoldIcon","toggleItalic","ItalicIcon","toggleUnderline","UnderlineIcon","toggleStrike","Strikethrough","toggleBulletList","List","toggleOrderedList","ListOrdered","toggleCode","CodeIcon","toggleCodeBlock","FileCode","toggleBlockquote","Quote","unsetLink","LinkIcon","url","window","prompt","setLink","href","EditorContent"],"mappings":"4mCA0C8C,SAACA,GAAE,IAAAC,EAAAD,EAAAE,eAAAA,OAAc,IAAAD,EAAG,GAAEA,EAAEE,EAAQH,EAAAG,SACpEC,EAASC,EAAAA,UAAU,CACrBC,WAAY,CACRC,EAAWC,UAAU,CACjBC,SAAS,EACTC,WAAW,IAEfC,EAAAA,QACAC,EAAAA,QACAC,EAAAA,QACAC,EAAAA,QACAC,EAAAA,QACAC,EACAC,EAAAA,QACAC,EAAAA,QACAC,EAAAA,QAAUX,UAAU,CAChBY,eAAgB,CACZC,MAAO,+CAGfC,EAAAA,QAAQd,UAAU,CACde,OAAQ,CAAC,EAAG,EAAG,KAEnBC,EAAAA,QACAC,EAAAA,QACAC,EAAAA,QACAC,EAAKnB,UAAU,CACXoB,aAAa,EACbR,eAAgB,CACZC,MAAO,8BAInBQ,QAAS3B,EACTC,SAAU,SAACH,GAAE,IAAAI,EAAMJ,EAAAI,OACfD,EAASC,EAAO0B,UACpB,EACAC,YAAa,CACTC,WAAY,CACRX,MAAO,kGAGfY,mBAAmB,IAcvB,OAAK7B,EAKD8B,EAAAA,YAAKC,UAAU,8CAA6CC,SAAA,CAExDF,EAAAA,KAAA,MAAA,CAAKC,UAAU,sEAEXE,EAAAA,IAAA,SAAA,CACIC,QAAS,WAAM,OAAAlC,EAAOmC,QAAQC,QAAQC,OAAOC,KAA9B,EACfP,UAAW,mDAAAQ,OAAoDvC,EAAOwC,MAAMH,OAA2C,GAAlC,iCACrFI,KAAK,SACLC,UAAW1C,EAAOwC,MAAMH,OACxBM,MAAM,OAAMX,SAEZC,EAAAA,IAACW,EAAAA,MAAK,CAACC,KAAM,OAEjBZ,EAAAA,IAAA,SAAA,CACIC,QAAS,WAAM,OAAAlC,EAAOmC,QAAQC,QAAQU,OAAOR,KAA9B,EACfP,UAAW,mDAAAQ,OAAoDvC,EAAOwC,MAAMM,OAA2C,GAAlC,iCACrFL,KAAK,SACLC,UAAW1C,EAAOwC,MAAMM,OACxBH,MAAM,OAAMX,SAEZC,EAAAA,IAACc,EAAAA,MAAK,CAACF,KAAM,OAGjBZ,EAAAA,IAAA,MAAA,CAAKF,UAAU,8BAGfE,EAAAA,IAAA,SAAA,CACIC,QAAS,WAAM,OAAAlC,EAAOmC,QAAQC,QAAQY,cAAc,CAAEC,MAAO,IAAKX,KAAnD,EACfP,UAAW,iCAAAQ,OACPvC,EAAOkD,SAAS,UAAW,CAAED,MAAO,IAC9B,4BACA,qBAEVR,KAAK,SACLE,MAAM,YAAWX,SAEjBC,EAAAA,IAACkB,EAAAA,SAAQ,CAACN,KAAM,OAEpBZ,EAAAA,IAAA,SAAA,CACIC,QAAS,WAAM,OAAAlC,EAAOmC,QAAQC,QAAQY,cAAc,CAAEC,MAAO,IAAKX,KAAnD,EACfP,UAAW,iCAAAQ,OACPvC,EAAOkD,SAAS,UAAW,CAAED,MAAO,IAC9B,4BACA,qBAEVR,KAAK,SACLE,MAAM,YAAWX,SAEjBC,EAAAA,IAACmB,EAAAA,SAAQ,CAACP,KAAM,OAEpBZ,EAAAA,IAAA,SAAA,CACIC,QAAS,WAAM,OAAAlC,EAAOmC,QAAQC,QAAQY,cAAc,CAAEC,MAAO,IAAKX,KAAnD,EACfP,UAAW,iCAAAQ,OACPvC,EAAOkD,SAAS,UAAW,CAAED,MAAO,IAC9B,4BACA,qBAEVR,KAAK,SACLE,MAAM,YAAWX,SAEjBC,EAAAA,IAACoB,EAAAA,SAAQ,CAACR,KAAM,OAGpBZ,EAAAA,IAACqB,EAAAA,kBAAiB,CAACvB,UAAU,8BAG7BE,EAAAA,cACIC,QAAS,WAAM,OAAAlC,EAAOmC,QAAQC,QAAQmB,aAAajB,KAApC,EACfP,UAAW,iCAAAQ,OACPvC,EAAOkD,SAAS,QACV,4BACA,qBAEVT,KAAK,SACLE,MAAM,gBAENV,EAAAA,IAACuB,EAAAA,KAAQ,CAACX,KAAM,OAEpBZ,EAAAA,IAAA,SAAA,CACIC,QAAS,WAAM,OAAAlC,EAAOmC,QAAQC,QAAQqB,eAAenB,KAAtC,EACfP,UAAW,iCAAAQ,OACPvC,EAAOkD,SAAS,UACV,4BACA,qBAEVT,KAAK,SACLE,MAAM,kBAENV,EAAAA,IAACyB,EAAAA,OAAU,CAACb,KAAM,OAEtBZ,EAAAA,IAAA,SAAA,CACIC,QAAS,WAAM,OAAAlC,EAAOmC,QAAQC,QAAQuB,kBAAkBrB,KAAzC,EACfP,UAAW,iCAAAQ,OACPvC,EAAOkD,SAAS,aACV,4BACA,qBAEVT,KAAK,SACLE,MAAM,qBAENV,EAAAA,IAAC2B,EAAAA,UAAa,CAACf,KAAM,OAEzBZ,EAAAA,IAAA,SAAA,CACIC,QAAS,WAAM,OAAAlC,EAAOmC,QAAQC,QAAQyB,eAAevB,KAAtC,EACfP,UAAW,iCAAAQ,OACPvC,EAAOkD,SAAS,UACV,4BACA,qBAEVT,KAAK,SACLE,MAAM,gBAAeX,SAErBC,EAAAA,IAAC6B,EAAAA,cAAa,CAACjB,KAAM,OAGzBZ,EAAAA,IAACqB,EAAAA,kBAAiB,CAACvB,UAAU,8BAG7BE,EAAAA,cACIC,QAAS,WAAM,OAAAlC,EAAOmC,QAAQC,QAAQ2B,mBAAmBzB,KAA1C,EACfP,UAAW,iCAAAQ,OACPvC,EAAOkD,SAAS,cACV,4BACA,qBAEVT,KAAK,SACLE,MAAM,uBAENV,EAAAA,IAAC+B,EAAAA,KAAI,CAACnB,KAAM,OAEhBZ,EAAAA,IAAA,SAAA,CACIC,QAAS,WAAM,OAAAlC,EAAOmC,QAAQC,QAAQ6B,oBAAoB3B,KAA3C,EACfP,UAAW,iCAAAQ,OACPvC,EAAOkD,SAAS,eACV,4BACA,qBAEVT,KAAK,SACLE,MAAM,gBAAeX,SAErBC,EAAAA,IAACiC,EAAAA,YAAW,CAACrB,KAAM,OAGvBZ,EAAAA,IAACqB,EAAAA,kBAAiB,CAACvB,UAAU,8BAG7BE,EAAAA,cACIC,QAAS,WAAM,OAAAlC,EAAOmC,QAAQC,QAAQ+B,aAAa7B,KAApC,EACfP,UAAW,iCAAAQ,OACPvC,EAAOkD,SAAS,QACV,4BACA,qBAEVT,KAAK,SACLE,MAAM,uBAENV,EAAAA,IAACmC,EAAAA,KAAQ,CAACvB,KAAM,OAEpBZ,EAAAA,IAAA,SAAA,CACIC,QAAS,WAAM,OAAAlC,EAAOmC,QAAQC,QAAQiC,kBAAkB/B,KAAzC,EACfP,UAAW,iCAAAQ,OACPvC,EAAOkD,SAAS,aACV,4BACA,qBAEVT,KAAK,SACLE,MAAM,aAAYX,SAElBC,EAAAA,IAACqC,EAAAA,SAAQ,CAACzB,KAAM,OAGpBZ,EAAAA,IAACqB,EAAAA,kBAAiB,CAACvB,UAAU,8BAG7BE,EAAAA,cACIC,QAAS,WAAM,OAAAlC,EAAOmC,QAAQC,QAAQmC,mBAAmBjC,KAA1C,EACfP,UAAW,iCAAAQ,OACPvC,EAAOkD,SAAS,cACV,4BACA,qBAEVT,KAAK,SACLE,MAAM,QAAOX,SAEbC,EAAAA,IAACuC,EAAAA,MAAK,CAAC3B,KAAM,OAGjBZ,EAAAA,IAACqB,EAAAA,kBAAiB,CAACvB,UAAU,8BAG5B/B,EAAOkD,SAAS,QACbjB,EAAAA,IAAA,SAAA,CACIC,QAzMD,WACflC,SAAAA,EAAQmC,QAAQC,QAAQqC,YAAYnC,KACxC,EAwMoBP,UAAU,4EACVU,KAAK,SACLE,MAAM,uBAENV,EAAAA,IAACyC,EAAAA,KAAQ,CAAC7B,KAAM,OAGpBZ,EAAAA,cACIC,QAzNJ,WACZ,IAAMyC,EAAMC,OAAOC,OAAO,cACtBF,IACA3E,SAAAA,EAAQmC,QAAQC,QAAQ0C,QAAQ,CAAEC,KAAMJ,IAAOrC,MAEvD,EAqNoBP,UAAU,kDACVU,KAAK,SACLE,MAAM,WAAUX,SAEhBC,EAAAA,IAACyC,EAAAA,KAAQ,CAAC7B,KAAM,UAM5BZ,EAAAA,IAAC+C,EAAAA,cAAa,CACVhF,OAAQA,EACR+B,UAAU,2CA1NXE,EAAAA,IAAA,MAAA,CAAKF,UAAU,mDA8N9B"}
|
|
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 { AlignmentTools, CodeTools, FormattingTools, HistoryTools, InsertTools, ListTools, QuoteTools, TableTools } from \"./ToolbarGroups\";\nimport { createTextEditorExtensions, editorContentClassName, type TextEditorFeatures, type ToolbarPreset, toolbarPresetFeatures, withDefaultFeatures } 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}\n\nconst TextEditor: React.FC<TextEditorProps> = ({ initialContent = \"\", onUpdate, features, stickyToolbar = true, toolbarPreset = \"standard\", onImageUpload }) => {\n const enabledFeatures = React.useMemo(() => withDefaultFeatures({ ...toolbarPresetFeatures[toolbarPreset], ...features }), [features, toolbarPreset]);\n const [slashOpen, setSlashOpen] = React.useState(false);\n const [bubblePos, setBubblePos] = React.useState<{ top: number; left: number } | 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,\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({ top: rect.top + window.scrollY - 48, left: rect.left + window.scrollX + rect.width / 2 });\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 = 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 <div className=\"rounded-lg border bg-gray-50 h-48 animate-pulse\"></div>;\n }\n\n return (\n <div className='pd-text-editor w-full rounded-lg border border-gray-200 shadow-sm'>\n {/* Toolbar */}\n <div className={`flex flex-wrap items-center gap-1 border-b bg-gray-50 p-3 ${stickyToolbar ? \"sticky top-0 z-10\" : \"\"}`}>\n {/* Undo/Redo */}\n {enabledFeatures.history && <HistoryTools editor={editor} />}\n\n {enabledFeatures.history && hasAnyMainTools && <ToolbarDivider />}\n\n {/* Headings */}\n {enabledFeatures.heading && <HeadingSelect value={getActiveHeadingLevel()} onChange={(level) => {\n if (level === 0) editor.chain().focus().setParagraph().run();\n else editor.chain().focus().toggleHeading({ level }).run();\n }} />}\n\n {enabledFeatures.heading && (enabledFeatures.formatting || enabledFeatures.lists || enabledFeatures.code || enabledFeatures.quote || enabledFeatures.link || enabledFeatures.table || enabledFeatures.image || enabledFeatures.taskList) && <ToolbarDivider />}\n\n {enabledFeatures.formatting && <FormattingTools editor={editor} />}\n\n {enabledFeatures.formatting && (enabledFeatures.alignment || enabledFeatures.lists || enabledFeatures.code || enabledFeatures.quote || enabledFeatures.link || enabledFeatures.table || enabledFeatures.image || enabledFeatures.taskList) && <ToolbarDivider />}\n\n {enabledFeatures.alignment && <AlignmentTools editor={editor} />}\n\n {enabledFeatures.alignment && (enabledFeatures.lists || enabledFeatures.code || enabledFeatures.quote || enabledFeatures.link || enabledFeatures.table || enabledFeatures.image || enabledFeatures.taskList) && <ToolbarDivider />}\n\n {enabledFeatures.lists && <ListTools editor={editor} />}\n\n {enabledFeatures.lists && (enabledFeatures.code || enabledFeatures.quote || enabledFeatures.link || enabledFeatures.table || enabledFeatures.image || enabledFeatures.taskList) && <ToolbarDivider />}\n\n {enabledFeatures.code && <CodeTools editor={editor} />}\n\n {enabledFeatures.code && (enabledFeatures.quote || enabledFeatures.link || enabledFeatures.table || enabledFeatures.image || enabledFeatures.taskList) && <ToolbarDivider />}\n\n {enabledFeatures.quote && <QuoteTools editor={editor} />}\n\n {enabledFeatures.quote && (enabledFeatures.link || enabledFeatures.table || enabledFeatures.image || enabledFeatures.taskList) && <ToolbarDivider />}\n\n {/* Link */}\n {enabledFeatures.link && <LinkPopover editor={editor} />}\n\n {enabledFeatures.link && (enabledFeatures.table || enabledFeatures.image || enabledFeatures.taskList) && <ToolbarDivider />}\n\n {enabledFeatures.table && <TableTools editor={editor} />}\n\n {enabledFeatures.table && (enabledFeatures.image || enabledFeatures.taskList) && <ToolbarDivider />}\n\n {enabledFeatures.image && <ImagePopover editor={editor} onImageUpload={onImageUpload} />}\n\n {enabledFeatures.image && enabledFeatures.taskList && <ToolbarDivider />}\n\n {enabledFeatures.taskList && <InsertTools editor={editor} />}\n </div>\n\n {stickyToolbar === false && bubblePos && (\n <div className=\"fixed z-20 -translate-x-1/2 rounded-lg border border-gray-200 bg-white p-1 shadow-lg\" style={{ top: bubblePos.top, left: bubblePos.left }}>\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 type=\"button\" className=\"block w-full rounded px-2 py-1 text-left text-sm hover:bg-gray-100\" onClick={() => { editor.chain().focus().toggleHeading({ level: 1 }).run(); setSlashOpen(false); }}>Heading 1</button>\n <button type=\"button\" className=\"block w-full rounded px-2 py-1 text-left text-sm hover:bg-gray-100\" onClick={() => { editor.chain().focus().toggleBulletList().run(); setSlashOpen(false); }}>Bullet List</button>\n <button type=\"button\" className=\"block w-full rounded px-2 py-1 text-left text-sm hover:bg-gray-100\" onClick={() => { editor.chain().focus().toggleCodeBlock().run(); setSlashOpen(false); }}>Code Block</button>\n </div>\n )}\n\n {/* Editor */}\n <EditorContent\n editor={editor}\n className='w-full min-h-[300px] focus-within:bg-white'\n />\n </div>\n );\n};\n\nexport default TextEditor;\n"],"names":["_a","_b","initialContent","onUpdate","features","_c","stickyToolbar","_d","toolbarPreset","onImageUpload","enabledFeatures","React","useMemo","withDefaultFeatures","__assign","toolbarPresetFeatures","_e","useState","slashOpen","setSlashOpen","_f","bubblePos","setBubblePos","editor","useEditor","extensions","createTextEditorExtensions","content","getHTML","editorProps","attributes","class","editorContentClassName","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","className","children","concat","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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"}
|
|
@@ -0,0 +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"]})]})]})};
|
|
2
|
+
//# sourceMappingURL=ToolbarGroups.js.map
|
|
@@ -0,0 +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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"}
|
|
@@ -0,0 +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:!1,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;
|
|
2
|
+
//# sourceMappingURL=extensions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extensions.js","sources":["../../../../../src/components/Form/TextEditor/extensions.ts"],"sourcesContent":["import Bold from \"@tiptap/extension-bold\";\nimport BulletList from \"@tiptap/extension-bullet-list\";\nimport Code from \"@tiptap/extension-code\";\nimport CodeBlock from \"@tiptap/extension-code-block\";\nimport Heading from \"@tiptap/extension-heading\";\nimport Image from \"@tiptap/extension-image\";\nimport Italic from \"@tiptap/extension-italic\";\nimport Link from \"@tiptap/extension-link\";\nimport ListItem from \"@tiptap/extension-list-item\";\nimport OrderedList from \"@tiptap/extension-ordered-list\";\nimport Strike from \"@tiptap/extension-strike\";\nimport { Table } from \"@tiptap/extension-table\";\nimport TableCell from \"@tiptap/extension-table-cell\";\nimport TableHeader from \"@tiptap/extension-table-header\";\nimport TableRow from \"@tiptap/extension-table-row\";\nimport TaskItem from \"@tiptap/extension-task-item\";\nimport TaskList from \"@tiptap/extension-task-list\";\nimport TextAlign from \"@tiptap/extension-text-align\";\nimport Underline from \"@tiptap/extension-underline\";\nimport StarterKit from \"@tiptap/starter-kit\";\n\nexport interface TextEditorFeatures {\n heading?: boolean;\n formatting?: boolean;\n lists?: boolean;\n code?: boolean;\n quote?: boolean;\n link?: boolean;\n history?: boolean;\n placeholder?: boolean;\n slashCommand?: boolean;\n table?: boolean;\n image?: boolean;\n taskList?: boolean;\n alignment?: boolean;\n}\n\nexport type ToolbarPreset = \"minimal\" | \"standard\" | \"full\";\n\nexport const defaultTextEditorFeatures: Required<TextEditorFeatures> = {\n heading: true,\n formatting: true,\n lists: true,\n code: true,\n quote: true,\n link: true,\n history: true,\n placeholder: true,\n slashCommand: false,\n table: false,\n image: false,\n taskList: false,\n alignment: true,\n};\n\nexport const toolbarPresetFeatures: Record<ToolbarPreset, Required<TextEditorFeatures>> = {\n minimal: {\n heading: false,\n formatting: true,\n lists: false,\n code: false,\n quote: false,\n link: true,\n history: true,\n placeholder: true,\n slashCommand: false,\n table: false,\n image: false,\n taskList: false,\n alignment: false,\n },\n standard: {\n ...defaultTextEditorFeatures,\n },\n full: {\n ...defaultTextEditorFeatures,\n slashCommand: true,\n table: true,\n image: true,\n taskList: true,\n alignment: true,\n },\n};\n\nexport const withDefaultFeatures = (features?: TextEditorFeatures): Required<TextEditorFeatures> => ({\n ...defaultTextEditorFeatures,\n ...features,\n});\n\nexport const createTextEditorExtensions = (features?: TextEditorFeatures) => {\n const f = withDefaultFeatures(features);\n\n return [\n StarterKit.configure({\n heading: false,\n bulletList: false,\n orderedList: false,\n listItem: false,\n codeBlock: false,\n }),\n ...(f.formatting ? [Bold, Italic, Underline, Strike] : []),\n ...(f.code\n ? [\n Code,\n CodeBlock.configure({\n HTMLAttributes: {\n class: \"bg-gray-100 p-3 rounded text-sm font-mono\",\n },\n }),\n ]\n : []),\n ...(f.heading ? [Heading.configure({ levels: [1, 2, 3] })] : []),\n ...(f.alignment ? [TextAlign.configure({ types: [\"heading\", \"paragraph\"] })] : []),\n ...(f.lists ? [BulletList, OrderedList, ListItem] : []),\n ...(f.link\n ? [\n Link.configure({\n openOnClick: false,\n HTMLAttributes: {\n class: \"text-blue-600 underline\",\n },\n }),\n ]\n : []),\n ...(f.taskList ? [TaskList, TaskItem.configure({ nested: true })] : []),\n ...(f.image ? [Image.configure({ inline: false, allowBase64: true })] : []),\n ...(f.table\n ? [\n Table.configure({ resizable: true }),\n TableRow,\n TableHeader,\n TableCell,\n ]\n : []),\n ];\n};\n\nexport const editorContentClassName =\n \"prose prose-sm max-w-none prose-h1:text-3xl prose-h1:font-bold prose-h2:text-2xl prose-h2:font-semibold prose-h3:text-xl prose-h3:font-semibold mx-auto focus:outline-none min-h-[200px] p-4\";\n"],"names":["defaultTextEditorFeatures","heading","formatting","lists","code","quote","link","history","placeholder","slashCommand","table","image","taskList","alignment","toolbarPresetFeatures","minimal","standard","__assign","full","withDefaultFeatures","features","f","__spreadArray","StarterKit","configure","bulletList","orderedList","listItem","codeBlock","Bold","Italic","Underline","Strike","Code","CodeBlock","HTMLAttributes","class","Heading","levels","TextAlign","types","BulletList","OrderedList","ListItem","Link","openOnClick","TaskList","TaskItem","nested","Image","inline","allowBase64","Table","resizable","TableRow","TableHeader","TableCell"],"mappings":"+5CAuCaA,EAA0D,CACnEC,SAAS,EACTC,YAAY,EACZC,OAAO,EACPC,MAAM,EACNC,OAAO,EACPC,MAAM,EACNC,SAAS,EACTC,aAAa,EACbC,cAAc,EACdC,OAAO,EACPC,OAAO,EACPC,UAAU,EACVC,WAAW,GAGFC,EAA6E,CACtFC,QAAS,CACLd,SAAS,EACTC,YAAY,EACZC,OAAO,EACPC,MAAM,EACNC,OAAO,EACPC,MAAM,EACNC,SAAS,EACTC,aAAa,EACbC,cAAc,EACdC,OAAO,EACPC,OAAO,EACPC,UAAU,EACVC,WAAW,GAEfG,SAAQC,EAAAA,SAAA,CAAA,EACDjB,GAEPkB,KAAID,EAAAA,SAAAA,WAAA,CAAA,EACGjB,GAAyB,CAC5BS,cAAc,EACdC,OAAO,EACPC,OAAO,EACPC,UAAU,EACVC,WAAW,KAINM,EAAsB,SAACC,GAAgE,OAAAH,EAAAA,SAAAA,WAAA,CAAA,EAC7FjB,GACAoB,EAF6F,qCAK1D,SAACA,GACvC,IAAMC,EAAIF,EAAoBC,GAE9B,OAAAE,EAAAA,cAAAA,gBAAAA,EAAAA,cAAAA,EAAAA,cAAAA,EAAAA,cAAAA,gBAAAA,EAAAA,cAAAA,EAAAA,cAAAA,gBAAA,CACIC,EAAWC,UAAU,CACjBvB,SAAS,EACTwB,YAAY,EACZC,aAAa,EACbC,UAAU,EACVC,WAAW,KAEXP,EAAEnB,WAAa,CAAC2B,EAAAA,QAAMC,EAAAA,QAAQC,EAAWC,EAAAA,SAAU,IAAG,GACtDX,EAAEjB,KACA,CACI6B,EAAAA,QACAC,EAAAA,QAAUV,UAAU,CAChBW,eAAgB,CACZC,MAAO,gDAInB,OACFf,EAAEpB,QAAU,CAACoC,UAAQb,UAAU,CAAEc,OAAQ,CAAC,EAAG,EAAG,MAAS,OACzDjB,EAAER,UAAY,CAAC0B,EAAAA,QAAUf,UAAU,CAAEgB,MAAO,CAAC,UAAW,gBAAmB,OAC3EnB,EAAElB,MAAQ,CAACsC,EAAAA,QAAYC,EAAAA,QAAaC,EAAAA,SAAY,OAChDtB,EAAEf,KACA,CACIsC,EAAKpB,UAAU,CACXqB,aAAa,EACbV,eAAgB,CACZC,MAAO,8BAInB,IAAG,GACLf,EAAET,SAAW,CAACkC,EAAAA,QAAUC,EAAAA,QAASvB,UAAU,CAAEwB,QAAQ,KAAW,IAAG,GACnE3B,EAAEV,MAAQ,CAACsC,EAAMzB,UAAU,CAAE0B,QAAQ,EAAOC,aAAa,KAAW,IAAG,GACvE9B,EAAEX,MACA,CACI0C,EAAAA,MAAM5B,UAAU,CAAE6B,WAAW,IAC7BC,EAAAA,QACAC,EAAAA,QACAC,EAAAA,SAEJ,IAAG,EAEjB,qEAGI"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var e=require("react/jsx-runtime"),a=require("lucide-react");exports.HeadingSelect=function(a){var r=a.value,t=a.onChange;return e.jsx("div",{className:"flex items-center gap-2",children:e.jsxs("select",{className:"rounded border border-gray-300 bg-white px-2 py-1 text-sm","aria-label":"Heading level",value:r,onChange:function(e){return t(Number(e.target.value))},children:[e.jsx("option",{value:0,children:"Normal"}),e.jsx("option",{value:1,className:"text-2xl",children:"Heading 1"}),e.jsx("option",{value:2,className:"text-xl",children:"Heading 2"}),e.jsx("option",{value:3,className:"text-lg",children:"Heading 3"})]})})},exports.ToolbarButton=function(a){var r=a.onClick,t=a.active,l=void 0!==t&&t,i=a.disabled,n=void 0!==i&&i,o=a.title,s=a.children,c=a.ariaPressed;return e.jsx("button",{onClick:r,className:"p-2 rounded transition-colors ".concat(l?"bg-blue-200 text-blue-800":"hover:bg-gray-200"," ").concat(n?"opacity-50 cursor-not-allowed":""),type:"button",disabled:n,title:o,"aria-label":o,"aria-pressed":c,children:s})},exports.ToolbarDivider=function(){return e.jsx(a.SeparatorVertical,{className:"mx-2 h-6 w-px bg-gray-300"})};
|
|
2
|
+
//# sourceMappingURL=toolbar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toolbar.js","sources":["../../../../../src/components/Form/TextEditor/toolbar.tsx"],"sourcesContent":["import React from \"react\";\nimport { Heading1, Heading2, Heading3, SeparatorVertical } from \"lucide-react\";\n\nexport type HeadingLevel = 0 | 1 | 2 | 3;\n\nexport const ToolbarButton: React.FC<{\n onClick: () => void;\n active?: boolean;\n disabled?: boolean;\n title: string;\n children: React.ReactNode;\n ariaPressed?: boolean;\n}> = ({\n onClick,\n active = false,\n disabled = false,\n title,\n children,\n ariaPressed,\n}) => (\n <button\n onClick={onClick}\n className={`p-2 rounded transition-colors ${active ? \"bg-blue-200 text-blue-800\" : \"hover:bg-gray-200\"} ${disabled ? \"opacity-50 cursor-not-allowed\" : \"\"}`}\n type=\"button\"\n disabled={disabled}\n title={title}\n aria-label={title}\n aria-pressed={ariaPressed}\n >\n {children}\n </button>\n);\n\nexport const ToolbarDivider = () => (\n <SeparatorVertical className=\"mx-2 h-6 w-px bg-gray-300\" />\n);\n\nexport const HeadingSelect: React.FC<{\n value: HeadingLevel;\n onChange: (value: HeadingLevel) => void;\n}> = ({ value, onChange }) => (\n <div className=\"flex items-center gap-2\">\n <select\n className=\"rounded border border-gray-300 bg-white px-2 py-1 text-sm\"\n aria-label=\"Heading level\"\n value={value}\n onChange={(e) => onChange(Number(e.target.value) as HeadingLevel)}\n >\n <option value={0}>Normal</option>\n <option value={1} className=\"text-2xl\">\n Heading 1\n </option>\n <option value={2} className=\"text-xl\">\n Heading 2\n </option>\n <option value={3} className=\"text-lg\">\n Heading 3\n </option>\n </select>\n {/*<Heading1 size={14} className=\"text-gray-500\" />\n <Heading2 size={14} className=\"text-gray-500\" />\n <Heading3 size={14} className=\"text-gray-500\" />*/}\n </div>\n);\n"],"names":["_a","value","onChange","_jsx","className","children","_jsxs","e","Number","target","onClick","_b","active","_c","disabled","title","ariaPressed","concat","type","SeparatorVertical"],"mappings":"gGAwCK,SAACA,OAAEC,EAAKD,EAAAC,MAAEC,EAAQF,EAAAE,SAAO,OAC5BC,EAAAA,IAAA,MAAA,CAAKC,UAAU,0BAAyBC,SACtCC,EAAAA,KAAA,SAAA,CACEF,UAAU,4DAA2D,aAC1D,gBACXH,MAAOA,EACPC,SAAU,SAACK,GAAM,OAAAL,EAASM,OAAOD,EAAEE,OAAOR,OAAzB,EAAgDI,SAAA,CAEjEF,EAAAA,IAAA,SAAA,CAAQF,MAAO,EAACI,SAAA,WAChBF,EAAAA,cAAQF,MAAO,EAAGG,UAAU,WAAUC,SAAA,cAGtCF,EAAAA,cAAQF,MAAO,EAAGG,UAAU,UAASC,SAAA,cAGrCF,EAAAA,cAAQF,MAAO,EAAGG,UAAU,UAASC,SAAA,kBAfb,wBA5BzB,SAACL,OACJU,EAAOV,EAAAU,QACPC,EAAAX,EAAAY,OAAAA,OAAM,IAAAD,GAAQA,EACdE,EAAAb,EAAAc,SAAAA,OAAQ,IAAAD,GAAQA,EAChBE,EAAKf,EAAAe,MACLV,EAAQL,EAAAK,SACRW,EAAWhB,EAAAgB,YACP,OACJb,EAAAA,cACEO,QAASA,EACTN,UAAW,iCAAAa,OAAiCL,EAAS,4BAA8B,oBAAmB,KAAAK,OAAIH,EAAW,gCAAkC,IACvJI,KAAK,SACLJ,SAAUA,EACVC,MAAOA,EAAK,aACAA,iBACEC,EAAWX,SAExBA,GAVC,yBAcwB,WAAM,OAClCF,MAACgB,EAAAA,kBAAiB,CAACf,UAAU,6BADK"}
|