@erpsquad/common 1.9.97 → 1.9.99
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/chunks/{actionCreator-DmP63jZz.esm.js → actionCreator-C-u8gtV-.esm.js} +2 -2
- package/dist/chunks/{actionCreator-DmP63jZz.esm.js.map → actionCreator-C-u8gtV-.esm.js.map} +1 -1
- package/dist/chunks/{actionCreator-DwRQnQNP.js → actionCreator-DSrKE0hh.js} +2 -2
- package/dist/chunks/{actionCreator-DwRQnQNP.js.map → actionCreator-DSrKE0hh.js.map} +1 -1
- package/dist/chunks/{android-12-switch-D3fU6Qtm.esm.js → android-12-switch-DSBIf4t0.esm.js} +46 -38
- package/dist/chunks/android-12-switch-DSBIf4t0.esm.js.map +1 -0
- package/dist/chunks/{android-12-switch-B5UmJZxg.js → android-12-switch-DvCF0gyx.js} +46 -38
- package/dist/chunks/android-12-switch-DvCF0gyx.js.map +1 -0
- package/dist/chunks/{apiHelper-BrzRrxpx.js → apiHelper-5tNsUtSY.js} +18 -10
- package/dist/chunks/apiHelper-5tNsUtSY.js.map +1 -0
- package/dist/chunks/{apiHelper-BvnhN2uo.esm.js → apiHelper-Cv_qWaYo.esm.js} +18 -10
- package/dist/chunks/apiHelper-Cv_qWaYo.esm.js.map +1 -0
- package/dist/chunks/{appbar-Dn00gF0A.esm.js → appbar-DM2iBqb4.esm.js} +5 -5
- package/dist/chunks/{appbar-Dn00gF0A.esm.js.map → appbar-DM2iBqb4.esm.js.map} +1 -1
- package/dist/chunks/{appbar-dBRF2bDa.js → appbar-rfkAYQdQ.js} +5 -5
- package/dist/chunks/{appbar-dBRF2bDa.js.map → appbar-rfkAYQdQ.js.map} +1 -1
- package/dist/chunks/{common-QvMCr1xx.js → common-6VUrYJDq.js} +10 -1
- package/dist/chunks/{common-QvMCr1xx.js.map → common-6VUrYJDq.js.map} +1 -1
- package/dist/chunks/{common-B-nmtH5r.esm.js → common-B6euWODJ.esm.js} +10 -1
- package/dist/chunks/{common-B-nmtH5r.esm.js.map → common-B6euWODJ.esm.js.map} +1 -1
- package/dist/chunks/{custom-editor-BvMlZ1Oc.js → custom-editor-DIQqk_yI.js} +2 -2
- package/dist/chunks/{custom-editor-BvMlZ1Oc.js.map → custom-editor-DIQqk_yI.js.map} +1 -1
- package/dist/chunks/{custom-editor-OrxKsIQY.esm.js → custom-editor-DnfTs5-j.esm.js} +2 -2
- package/dist/chunks/{custom-editor-OrxKsIQY.esm.js.map → custom-editor-DnfTs5-j.esm.js.map} +1 -1
- package/dist/chunks/{default-data-otyfdCNu.esm.js → default-data-BV_r59U9.esm.js} +14 -14
- package/dist/chunks/{default-data-otyfdCNu.esm.js.map → default-data-BV_r59U9.esm.js.map} +1 -1
- package/dist/chunks/{default-data-BCroqbYg.js → default-data-DQ7VPUoj.js} +14 -14
- package/dist/chunks/{default-data-BCroqbYg.js.map → default-data-DQ7VPUoj.js.map} +1 -1
- package/dist/chunks/{form-builder-conversion-Var45CEx.esm.js → form-builder-conversion-BdWASNEo.esm.js} +2 -2
- package/dist/chunks/{form-builder-conversion-Var45CEx.esm.js.map → form-builder-conversion-BdWASNEo.esm.js.map} +1 -1
- package/dist/chunks/{form-builder-conversion-nTpiw7Q2.js → form-builder-conversion-D69EGO5g.js} +2 -2
- package/dist/chunks/{form-builder-conversion-nTpiw7Q2.js.map → form-builder-conversion-D69EGO5g.js.map} +1 -1
- package/dist/chunks/{form-builder-deconversion-BjiEAt-i.esm.js → form-builder-deconversion-CUwBfP4C.esm.js} +3 -3
- package/dist/chunks/{form-builder-deconversion-BjiEAt-i.esm.js.map → form-builder-deconversion-CUwBfP4C.esm.js.map} +1 -1
- package/dist/chunks/{form-builder-deconversion-CFTqjOTb.js → form-builder-deconversion-v5GvXDZ9.js} +3 -3
- package/dist/chunks/{form-builder-deconversion-CFTqjOTb.js.map → form-builder-deconversion-v5GvXDZ9.js.map} +1 -1
- package/dist/chunks/{fullScreen-BdyRsEBm.esm.js → fullScreen-BO0UA3Zr.esm.js} +2 -2
- package/dist/chunks/{fullScreen-BdyRsEBm.esm.js.map → fullScreen-BO0UA3Zr.esm.js.map} +1 -1
- package/dist/chunks/{fullScreen-BHrQ0vTa.js → fullScreen-Bfrr-bT2.js} +2 -2
- package/dist/chunks/{fullScreen-BHrQ0vTa.js.map → fullScreen-Bfrr-bT2.js.map} +1 -1
- package/dist/chunks/{languageContext-s_EUKz_A.js → languageContext-BP7EvzMv.js} +3 -3
- package/dist/chunks/{languageContext-s_EUKz_A.js.map → languageContext-BP7EvzMv.js.map} +1 -1
- package/dist/chunks/{languageContext-CbCRCTbP.esm.js → languageContext-DM_LTp53.esm.js} +3 -3
- package/dist/chunks/{languageContext-CbCRCTbP.esm.js.map → languageContext-DM_LTp53.esm.js.map} +1 -1
- package/dist/chunks/{migration-utils-Bn35YUJM.esm.js → migration-utils-D9TSOBR0.esm.js} +2 -2
- package/dist/chunks/{migration-utils-Bn35YUJM.esm.js.map → migration-utils-D9TSOBR0.esm.js.map} +1 -1
- package/dist/chunks/{migration-utils-CmzV1tw3.js → migration-utils-DwLXzWtr.js} +2 -2
- package/dist/chunks/{migration-utils-CmzV1tw3.js.map → migration-utils-DwLXzWtr.js.map} +1 -1
- package/dist/chunks/module-routes-config-B8IucBuj.js +19 -0
- package/dist/chunks/module-routes-config-B8IucBuj.js.map +1 -0
- package/dist/chunks/module-routes-config-CCkZEtfg.esm.js +20 -0
- package/dist/chunks/module-routes-config-CCkZEtfg.esm.js.map +1 -0
- package/dist/chunks/{modules-BDHGBfwa.js → modules-C3T2Pnwc.js} +10 -5
- package/dist/chunks/modules-C3T2Pnwc.js.map +1 -0
- package/dist/chunks/{modules-UIv-lDBW.esm.js → modules-D5_hDIg9.esm.js} +10 -5
- package/dist/chunks/modules-D5_hDIg9.esm.js.map +1 -0
- package/dist/chunks/{page-context-DLUB4Qx9.esm.js → page-context-B_wK6kLR.esm.js} +4 -4
- package/dist/chunks/{page-context-DLUB4Qx9.esm.js.map → page-context-B_wK6kLR.esm.js.map} +1 -1
- package/dist/chunks/{page-context-DRbgpYFO.js → page-context-h7LEMAG0.js} +4 -4
- package/dist/chunks/{page-context-DRbgpYFO.js.map → page-context-h7LEMAG0.js.map} +1 -1
- package/dist/chunks/pathname.hrms-2_BEXO_r.js +262 -0
- package/dist/chunks/pathname.hrms-2_BEXO_r.js.map +1 -0
- package/dist/chunks/pathname.hrms-C5ojsho0.esm.js +263 -0
- package/dist/chunks/pathname.hrms-C5ojsho0.esm.js.map +1 -0
- package/dist/chunks/{reducer-Gajha1Kz.esm.js → reducer-Bpuo5eq1.esm.js} +2 -2
- package/dist/chunks/{reducer-Gajha1Kz.esm.js.map → reducer-Bpuo5eq1.esm.js.map} +1 -1
- package/dist/chunks/{reducer-DGvVphqy.js → reducer-t-U331ho.js} +2 -2
- package/dist/chunks/{reducer-DGvVphqy.js.map → reducer-t-U331ho.js.map} +1 -1
- package/dist/chunks/{route-page-map-DPlRjCJm.esm.js → route-page-map-C4wM0M4A.esm.js} +2 -2
- package/dist/chunks/{route-page-map-DPlRjCJm.esm.js.map → route-page-map-C4wM0M4A.esm.js.map} +1 -1
- package/dist/chunks/{route-page-map-Btth_lp5.js → route-page-map-CJLyl6P1.js} +2 -2
- package/dist/chunks/{route-page-map-Btth_lp5.js.map → route-page-map-CJLyl6P1.js.map} +1 -1
- package/dist/chunks/{shareSlice-Cn2PGA6m.js → shareSlice-Br9IsR9k.js} +2 -2
- package/dist/chunks/{shareSlice-Cn2PGA6m.js.map → shareSlice-Br9IsR9k.js.map} +1 -1
- package/dist/chunks/{shareSlice-DGme6jBu.esm.js → shareSlice-CbG_VJcW.esm.js} +2 -2
- package/dist/chunks/{shareSlice-DGme6jBu.esm.js.map → shareSlice-CbG_VJcW.esm.js.map} +1 -1
- package/dist/chunks/{sidebar-Dcw_6aQ7.js → sidebar-C2zkLZyA.js} +4 -4
- package/dist/chunks/{sidebar-Dcw_6aQ7.js.map → sidebar-C2zkLZyA.js.map} +1 -1
- package/dist/chunks/{sidebar-PZqii53B.esm.js → sidebar-l49eLo8p.esm.js} +4 -4
- package/dist/chunks/{sidebar-PZqii53B.esm.js.map → sidebar-l49eLo8p.esm.js.map} +1 -1
- package/dist/chunks/{sidebarScreen-DY4Uklrh.esm.js → sidebarScreen-BQN2N8jx.esm.js} +5 -5
- package/dist/chunks/{sidebarScreen-DY4Uklrh.esm.js.map → sidebarScreen-BQN2N8jx.esm.js.map} +1 -1
- package/dist/chunks/{sidebarScreen-FH1CEH8k.js → sidebarScreen-PoYXto7E.js} +5 -5
- package/dist/chunks/{sidebarScreen-FH1CEH8k.js.map → sidebarScreen-PoYXto7E.js.map} +1 -1
- package/dist/chunks/{store-DEoLcgbp.js → store-BdrUnJ3G.js} +3 -3
- package/dist/chunks/{store-DEoLcgbp.js.map → store-BdrUnJ3G.js.map} +1 -1
- package/dist/chunks/{store-zDGOGRDm.esm.js → store-ksRZPIIc.esm.js} +3 -3
- package/dist/chunks/{store-zDGOGRDm.esm.js.map → store-ksRZPIIc.esm.js.map} +1 -1
- package/dist/chunks/{translations-BVvsrCTo.js → translations-1vp9srMj.js} +2 -2
- package/dist/chunks/{translations-BVvsrCTo.js.map → translations-1vp9srMj.js.map} +1 -1
- package/dist/chunks/{translations-DJFxXzIm.esm.js → translations-B5t-KZNN.esm.js} +2 -2
- package/dist/chunks/{translations-DJFxXzIm.esm.js.map → translations-B5t-KZNN.esm.js.map} +1 -1
- package/dist/chunks/{uom-field-wrapper-CeeTt3Ph.esm.js → uom-field-wrapper-Ckop1JTE.esm.js} +15 -15
- package/dist/chunks/{uom-field-wrapper-CeeTt3Ph.esm.js.map → uom-field-wrapper-Ckop1JTE.esm.js.map} +1 -1
- package/dist/chunks/{uom-field-wrapper-UBPKubPh.js → uom-field-wrapper-l8HA79k1.js} +15 -15
- package/dist/chunks/{uom-field-wrapper-UBPKubPh.js.map → uom-field-wrapper-l8HA79k1.js.map} +1 -1
- package/dist/chunks/{useAccountSetting-BcPg1o6H.esm.js → useAccountSetting-D6Hhq1Pz.esm.js} +3 -3
- package/dist/chunks/{useAccountSetting-BcPg1o6H.esm.js.map → useAccountSetting-D6Hhq1Pz.esm.js.map} +1 -1
- package/dist/chunks/{useAccountSetting-B5qXSiGa.js → useAccountSetting-ngzko7sX.js} +3 -3
- package/dist/chunks/{useAccountSetting-B5qXSiGa.js.map → useAccountSetting-ngzko7sX.js.map} +1 -1
- package/dist/chunks/{useAuth-BhsPEB2T.js → useAuth-HvZ6U960.js} +2 -2
- package/dist/chunks/{useAuth-BhsPEB2T.js.map → useAuth-HvZ6U960.js.map} +1 -1
- package/dist/chunks/{useAuth-C4WcddEE.esm.js → useAuth-Tfx2guEJ.esm.js} +2 -2
- package/dist/chunks/{useAuth-C4WcddEE.esm.js.map → useAuth-Tfx2guEJ.esm.js.map} +1 -1
- package/dist/chunks/{useLangauge-Bie5anLS.esm.js → useLangauge-BU_fP3ZM.esm.js} +2 -2
- package/dist/chunks/{useLangauge-Bie5anLS.esm.js.map → useLangauge-BU_fP3ZM.esm.js.map} +1 -1
- package/dist/chunks/{useLangauge-BtG3kyRv.js → useLangauge-DwsR1jcv.js} +2 -2
- package/dist/chunks/{useLangauge-BtG3kyRv.js.map → useLangauge-DwsR1jcv.js.map} +1 -1
- package/dist/chunks/{useReduxIntegration-DvUNoDIr.js → useReduxIntegration-JMVTp0lq.js} +4 -4
- package/dist/chunks/{useReduxIntegration-DvUNoDIr.js.map → useReduxIntegration-JMVTp0lq.js.map} +1 -1
- package/dist/chunks/{useReduxIntegration-CPPcf1p7.esm.js → useReduxIntegration-VgWJGErE.esm.js} +4 -4
- package/dist/chunks/{useReduxIntegration-CPPcf1p7.esm.js.map → useReduxIntegration-VgWJGErE.esm.js.map} +1 -1
- package/dist/components/index.esm.js +9 -9
- package/dist/components/index.js +9 -9
- package/dist/components/providers/ERPUIProvider.d.ts +1 -0
- package/dist/constants/index.esm.js +3 -3
- package/dist/constants/index.js +3 -3
- package/dist/constants/pathnames/pathname.hrms.d.ts +61 -3
- package/dist/contexts/index.esm.js +3 -3
- package/dist/contexts/index.js +3 -3
- package/dist/hooks/index.esm.js +5 -5
- package/dist/hooks/index.js +5 -5
- package/dist/index.esm.js +55 -50
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +32 -27
- package/dist/index.js.map +1 -1
- package/dist/layout/index.esm.js +2 -2
- package/dist/layout/index.js +2 -2
- package/dist/redux/index.esm.js +4 -4
- package/dist/redux/index.js +4 -4
- package/dist/src/components/providers/ERPUIProvider.d.ts +1 -0
- package/dist/src/constants/pathnames/pathname.hrms.d.ts +61 -3
- package/dist/src/utils/api.d.ts +10 -0
- package/dist/src/utils/index.d.ts +1 -0
- package/dist/src/utils/module-routes-config.d.ts +34 -0
- package/dist/src/views/form-builder/utils/common.d.ts +1 -1
- package/dist/utils/api.d.ts +10 -0
- package/dist/utils/index.esm.js +12 -7
- package/dist/utils/index.esm.js.map +1 -1
- package/dist/utils/index.js +11 -6
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/module-routes-config.d.ts +34 -0
- package/dist/views/form-builder/utils/common.d.ts +1 -1
- package/dist/views/index.esm.js +10 -10
- package/dist/views/index.js +9 -9
- package/package.json +1 -1
- package/dist/chunks/android-12-switch-B5UmJZxg.js.map +0 -1
- package/dist/chunks/android-12-switch-D3fU6Qtm.esm.js.map +0 -1
- package/dist/chunks/apiHelper-BrzRrxpx.js.map +0 -1
- package/dist/chunks/apiHelper-BvnhN2uo.esm.js.map +0 -1
- package/dist/chunks/modules-BDHGBfwa.js.map +0 -1
- package/dist/chunks/modules-UIv-lDBW.esm.js.map +0 -1
- package/dist/chunks/pathname.hrms-BVwbtB1M.js +0 -109
- package/dist/chunks/pathname.hrms-BVwbtB1M.js.map +0 -1
- package/dist/chunks/pathname.hrms-BiL7sQv0.esm.js +0 -110
- package/dist/chunks/pathname.hrms-BiL7sQv0.esm.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"custom-editor-OrxKsIQY.esm.js","sources":["../../src/components/editor/utils/handlebars-protection.ts","../../src/components/editor/custom-editor.tsx"],"sourcesContent":["/**\n * Handlebars Template Protection Utilities\n * \n * Protects Handlebars syntax ({{...}}, {{#each}}, {{/each}}, etc.) from being\n * corrupted by contentEditable browser normalization during visual editing.\n * \n * Strategy: \n * - Block helpers ({{#each}}, {{/each}}, {{#if}}, etc.) are converted to HTML comments\n * - Regular variables ({{variable}}) are replaced with placeholder spans\n */\n\nconst HANDLEBARS_PLACEHOLDER_PREFIX = 'hbs-placeholder-';\nlet placeholderCounter = 0;\n\ninterface PlaceholderMap {\n [key: string]: string;\n}\n\n// Regex patterns for Handlebars block helpers\nconst BLOCK_HELPER_OPEN_PATTERN = /\\{\\{#(each|if|unless|with|let|inline|block|contentFor|extend|embed|log|lookup)\\s+[^}]*\\}\\}/g;\nconst BLOCK_HELPER_CLOSE_PATTERN = /\\{\\{\\/(each|if|unless|with|let|inline|block|contentFor|extend|embed|log|lookup)\\}\\}/g;\nconst BLOCK_HELPER_ELSE_PATTERN = /\\{\\{else\\}\\}/g;\n\n/**\n * Convert Handlebars syntax to protected format\n * - Block helpers ({{#each}}, {{/each}}, etc.) → HTML comments\n * - Regular variables ({{variable}}) → placeholder spans\n * @param html - Raw HTML with Handlebars syntax\n * @returns HTML with protected syntax + mapping object\n */\nexport function protectHandlebars(html: string): { html: string; map: PlaceholderMap } {\n const map: PlaceholderMap = {};\n placeholderCounter = 0;\n\n let protectedHtml = html;\n\n // Step 1: Convert block helper opening tags to HTML comments (only if not already commented)\n // e.g., {{#each items}} → <!--{{#each items}}-->\n // Skip if already in comment: <!--{{#each items}}--> stays as is\n protectedHtml = protectedHtml.replace(BLOCK_HELPER_OPEN_PATTERN, (match, p1, offset, string) => {\n // Check if this match is already inside an HTML comment\n const beforeMatch = string.substring(0, offset);\n const lastCommentStart = beforeMatch.lastIndexOf('<!--');\n const lastCommentEnd = beforeMatch.lastIndexOf('-->');\n \n // If we're inside a comment (comment start is more recent than comment end), don't re-comment\n if (lastCommentStart > lastCommentEnd) {\n return match;\n }\n \n return `<!--${match}-->`;\n });\n\n // Step 2: Convert block helper closing tags to HTML comments (only if not already commented)\n // e.g., {{/each}} → <!--{{/each}}-->\n protectedHtml = protectedHtml.replace(BLOCK_HELPER_CLOSE_PATTERN, (match, p1, offset, string) => {\n // Check if this match is already inside an HTML comment\n const beforeMatch = string.substring(0, offset);\n const lastCommentStart = beforeMatch.lastIndexOf('<!--');\n const lastCommentEnd = beforeMatch.lastIndexOf('-->');\n \n // If we're inside a comment, don't re-comment\n if (lastCommentStart > lastCommentEnd) {\n return match;\n }\n \n return `<!--${match}-->`;\n });\n\n // Step 3: Convert {{else}} to HTML comments (only if not already commented)\n // e.g., {{else}} → <!--{{else}}-->\n protectedHtml = protectedHtml.replace(BLOCK_HELPER_ELSE_PATTERN, (match, offset, string) => {\n // Check if this match is already inside an HTML comment\n const beforeMatch = string.substring(0, offset);\n const lastCommentStart = beforeMatch.lastIndexOf('<!--');\n const lastCommentEnd = beforeMatch.lastIndexOf('-->');\n \n // If we're inside a comment, don't re-comment\n if (lastCommentStart > lastCommentEnd) {\n return match;\n }\n \n return `<!--${match}-->`;\n });\n\n // Step 4: Protect remaining Handlebars expressions (regular variables) with placeholder spans\n // This will NOT match block helpers since they're already converted to comments\n // Also skip if already inside a placeholder span or inside an HTML tag attribute\n protectedHtml = protectedHtml.replace(/(\\{\\{[^}]*\\}\\})/g, (match, _p1, offset, string) => {\n // Check if already inside an HTML comment\n const beforeMatch = string.substring(0, offset);\n const lastCommentStart = beforeMatch.lastIndexOf('<!--');\n const lastCommentEnd = beforeMatch.lastIndexOf('-->');\n \n if (lastCommentStart > lastCommentEnd) {\n return match;\n }\n \n // Check if already inside a placeholder span\n const lastSpanStart = beforeMatch.lastIndexOf('<span class=\"hbs-placeholder\"');\n const lastSpanEnd = beforeMatch.lastIndexOf('</span>');\n \n if (lastSpanStart > lastSpanEnd) {\n return match;\n }\n\n // Check if inside an HTML tag attribute (between < and >)\n // e.g. src=\"{{qr_code}}\" — we must NOT wrap this in a span\n const lastTagOpen = beforeMatch.lastIndexOf('<');\n const lastTagClose = beforeMatch.lastIndexOf('>');\n if (lastTagOpen > lastTagClose) {\n // We're inside a tag — leave the handlebars expression untouched\n return match;\n }\n \n const id = `${HANDLEBARS_PLACEHOLDER_PREFIX}${placeholderCounter++}`;\n map[id] = match;\n \n // Use a span with data attribute to store the placeholder\n // contentEditable won't break this structure\n return `<span class=\"hbs-placeholder\" data-hbs-id=\"${id}\" contenteditable=\"false\" >${match}</span>`;\n });\n\n return { html: protectedHtml, map };\n}\n\n/**\n * Restore Handlebars syntax from protected format\n * - HTML comments → Block helpers\n * - Placeholder spans → Regular variables\n * @param html - HTML with protected syntax\n * @param map - Mapping of placeholder IDs to original Handlebars syntax\n * @returns Original HTML with Handlebars syntax restored\n */\nexport function restoreHandlebars(html: string, map?: PlaceholderMap): string {\n let restoredHtml = html;\n\n // Step 1: Restore block helpers from HTML comments\n // e.g., <!--{{#each items}}--> → {{#each items}}\n restoredHtml = restoredHtml.replace(/<!--(\\{\\{#(?:each|if|unless|with|let|inline|block|contentFor|extend|embed|log|lookup)\\s+[^}]*\\}\\})-->/g, (match, captured) => {\n return captured;\n });\n\n // Step 2: Restore closing block helpers from HTML comments\n // e.g., <!--{{/each}}--> → {{/each}}\n restoredHtml = restoredHtml.replace(/<!--(\\{\\{\\/(?:each|if|unless|with|let|inline|block|contentFor|extend|embed|log|lookup)\\}\\})-->/g, (match, captured) => {\n return captured;\n });\n\n // Step 3: Restore {{else}} from HTML comments\n // e.g., <!--{{else}}--> → {{else}}\n restoredHtml = restoredHtml.replace(/<!--(\\{\\{else\\}\\})-->/g, (match, captured) => {\n return captured;\n });\n\n // Step 4: Restore regular variables from placeholder spans\n // If no map provided, extract from data attributes\n if (!map) {\n map = {};\n const regex = /<span[^>]*data-hbs-id=\"([^\"]+)\"[^>]*>([^<]+)<\\/span>/g;\n let match;\n while ((match = regex.exec(restoredHtml)) !== null) {\n map[match[1]] = match[2];\n }\n }\n\n // Replace placeholder spans with original Handlebars syntax\n restoredHtml = restoredHtml.replace(\n /<span[^>]*class=\"hbs-placeholder\"[^>]*data-hbs-id=\"([^\"]+)\"[^>]*>.*?<\\/span>/g,\n (match, id) => {\n return map![id] || match;\n }\n );\n\n return restoredHtml;\n}\n\n/**\n * Check if HTML contains Handlebars syntax\n * @param html - HTML string to check\n * @returns true if Handlebars syntax is found\n */\nexport function containsHandlebars(html: string): boolean {\n return /\\{\\{[^}]*\\}\\}/.test(html);\n}\n\n/**\n * Auto-protect Handlebars in contentEditable on load\n * Call this when loading HTML into the editor\n */\nexport function prepareForEditing(html: string): { html: string; map: PlaceholderMap } {\n if (containsHandlebars(html)) {\n return protectHandlebars(html);\n }\n return { html, map: {} };\n}\n\n/**\n * Auto-restore Handlebars when getting HTML from editor\n * Call this when saving/exporting HTML from the editor\n */\nexport function prepareForSaving(html: string, map?: PlaceholderMap): string {\n return restoreHandlebars(html, map);\n}\n","/**\n * Custom Rich Text Editor (CKEditor-like)\n * \n * Features:\n * - CKEditor-style menu bar and toolbar\n * - Full formatting toolbar (bold, italic, underline, etc.)\n * - Font family, size, color, background color\n * - Alignment, lists, links\n * - Image upload with resize handles\n * - Table insertion and editing\n * - Selection handles for images and elements\n * - Preserves exact HTML structure (no normalization)\n * - Maintains all attributes, styles, and scoped CSS\n * \n * Fix: Source View no longer clears content on toggle.\n * Root cause was sourceCodeRef being shared between visual-mode (handleInput)\n * and source-mode (textarea). Introduced sourceViewContentRef to exclusively\n * own source-mode textarea content so handleInput never corrupts it.\n */\nimport React, { useState, useEffect, useRef, useImperativeHandle, forwardRef, useCallback } from 'react';\nimport { \n\tFormatBold, \n\tFormatItalic, \n\tFormatUnderlined, \n\tFormatStrikethrough,\n\tFormatAlignLeft,\n\tFormatAlignCenter,\n\tFormatAlignRight,\n\tFormatAlignJustify,\n\tFormatListBulleted,\n\tFormatListNumbered,\n\tLink as LinkIcon,\n\tImage as ImageIcon,\n\tTableChart,\n\tCode,\n\tUndo,\n\tRedo,\n\tSubscript,\n\tSuperscript,\n\tClose,\n\tSwapHoriz,\n\tAddCircleOutline,\n\tRemoveCircleOutline,\n} from '@mui/icons-material';\nimport { IconButton, Divider, Select, MenuItem, Tooltip, Box, Button, Popover } from '@mui/material';\nimport { uploadFiles } from '../../utils/common';\nimport { getToken } from '../../utils/common';\nimport { postV1Drive } from '../../api-client/api.drive/api';\nimport { getApiConfig } from '../../utils/api-config';\nimport { CellProperties } from './table/types';\nimport { prepareForEditing, prepareForSaving } from './utils/handlebars-protection';\nimport './custom-editor.css';\n\nexport interface CustomEditorProps {\n\teditorRef?: React.RefObject<any>;\n\tdata: string;\n\thandleEditorReady: (editor: any) => void;\n\tonError?: (error: Error) => void;\n\tconfig?: any;\n\t[key: string]: any;\n}\n\nconst FONT_FAMILIES = [\n\t'Arial', 'Courier New', 'Georgia', 'Times New Roman', 'Trebuchet MS', 'Verdana'\n];\n\nconst FONT_SIZES = ['10px', '12px', '14px', '16px', '18px', '20px', '24px', '28px', '32px'];\n\nconst HEADING_FORMATS = [\n\t{ value: 'p', label: 'Paragraph' },\n\t{ value: 'h1', label: 'Heading 1' },\n\t{ value: 'h2', label: 'Heading 2' },\n\t{ value: 'h3', label: 'Heading 3' },\n\t{ value: 'h4', label: 'Heading 4' },\n\t{ value: 'h5', label: 'Heading 5' },\n\t{ value: 'h6', label: 'Heading 6' }\n];\n\nconst PRESET_COLORS = [\n\t'#000000', '#434343', '#666666', '#999999', '#b7b7b7', '#cccccc', '#d9d9d9', '#ffffff',\n\t'#ff0000', '#ff9900', '#ffff00', '#00ff00', '#00ffff', '#4a86e8', '#9900ff', '#ff00ff',\n\t'#ea9999', '#f9cb9c', '#ffe599', '#b6d7a8', '#a2c4c9', '#9fc5e8', '#b4a7d6', '#d5a6bd',\n\t'#e06666', '#f6b26b', '#ffd966', '#93c47d', '#76a5af', '#6fa8dc', '#8e7cc3', '#c27ba0',\n\t'#cc0000', '#e69138', '#f1c232', '#6aa84f', '#45818e', '#3d85c8', '#674ea7', '#85200c',\n];\n\nexport const CustomEditor = forwardRef<any, CustomEditorProps>((props, ref) => {\n\tconst {\n\t\teditorRef: editorRefProp,\n\t\tdata = '',\n\t\thandleEditorReady,\n\t\tonError,\n\t\tconfig = {},\n\t\t...rest\n\t} = props;\n\n\tconst [error, setError] = useState<Error | null>(null);\n\tconst [fontFamily, setFontFamily] = useState('Arial');\n\tconst [fontSize, setFontSize] = useState('14px');\n\tconst [headingFormat, setHeadingFormat] = useState('p');\n\tconst [showSourceMode, setShowSourceMode] = useState(false);\n\tconst [sourceCode, setSourceCode] = useState(data);\n\tconst [history, setHistory] = useState<string[]>([data]);\n\tconst [historyIndex, setHistoryIndex] = useState(0);\n\tconst [selectedElement, setSelectedElement] = useState<HTMLElement | null>(null);\n\tconst [resizeHandles, setResizeHandles] = useState<{ x: number; y: number; width: number; height: number } | null>(null);\n\tconst [showTablePicker, setShowTablePicker] = useState(false);\n\tconst [tablePickerAnchor, setTablePickerAnchor] = useState<HTMLElement | null>(null);\n\tconst [textSelectionAnchor, setTextSelectionAnchor] = useState<{ x: number; y: number } | null>(null);\n\tconst [showTextToolbar, setShowTextToolbar] = useState(false);\n\tconst [colorPickerState, setColorPickerState] = useState<{ anchor: HTMLElement; type: 'text' | 'bg' } | null>(null);\n\t\n\t// Table editing state\n\tconst [selectedCell, setSelectedCell] = useState<HTMLTableCellElement | null>(null);\n\tconst [showTableToolbar, setShowTableToolbar] = useState(false);\n\tconst [tableToolbarPosition, setTableToolbarPosition] = useState<{ x: number; y: number } | null>(null);\n\tconst [cellProperties, setCellProperties] = useState<CellProperties>({\n\t\tborderStyle: 'solid',\n\t\tborderColor: '#ddd',\n\t\tborderWidth: '1px',\n\t\tbackgroundColor: 'transparent',\n\t\twidth: 'auto',\n\t\theight: 'auto',\n\t\tpadding: '8px',\n\t\ttextAlign: 'left',\n\t\tverticalAlign: 'middle'\n\t});\n\t\n\tconst contentEditableRef = useRef<HTMLDivElement>(null);\n\tconst sourceCodeRef = useRef<string>(data);\n\tconst onEditorChangeRef = useRef(props.onEditorChange);\n\tconst handleEditorReadyRef = useRef(handleEditorReady);\n\tuseEffect(() => { onEditorChangeRef.current = props.onEditorChange; });\n\tuseEffect(() => { handleEditorReadyRef.current = handleEditorReady; });\n\n\t// FIX: Dedicated ref for source-mode textarea content.\n\t// sourceCodeRef is shared with visual-mode (handleInput overwrites it on every\n\t// keystroke). sourceViewContentRef is ONLY written by source-mode handlers\n\t// (handleSourceCodeChange, handleHtmlFileUpload, handleToggleSource entering\n\t// source mode) so it is never corrupted by visual-mode activity.\n\tconst sourceViewContentRef = useRef<string>(data);\n\n\tconst fileInputRef = useRef<HTMLInputElement>(null);\n\tconst htmlFileInputRef = useRef<HTMLInputElement>(null);\n\tconst replaceImageInputRef = useRef<HTMLInputElement>(null);\n\tconst resizeStartRef = useRef<{ x: number; y: number; width: number; height: number; handle: string } | null>(null);\n\tconst handlebarsMapRef = useRef<{ [key: string]: string }>({});\n\tconst apiConfig = getApiConfig();\n\n\t// Update source code when data prop changes\n\tuseEffect(() => {\n\t\tif(!data)return\n\t\tconst { html: protectedHtml, map } = prepareForEditing(data);\n\t\thandlebarsMapRef.current = map;\n\t\tsourceCodeRef.current = data; // Store original with Handlebars\n\t\t\n\t\tif (contentEditableRef.current && contentEditableRef.current.innerHTML !== protectedHtml) {\n\t\t\tcontentEditableRef.current.innerHTML = protectedHtml;\n\t\t}\n\t}, [data]);\n\n\t// Initialize editor\n\tuseEffect(() => {\n\t\tconsole.log(\"contentEditableRef.current...........\",contentEditableRef.current)\n\t\tif (contentEditableRef.current) {\n\t\t\ttry {\n\t\t\t\tconst { html: protectedHtml, map } = prepareForEditing(data || '');\n\t\t\t\thandlebarsMapRef.current = map;\n\t\t\t\tcontentEditableRef.current.innerHTML = protectedHtml;\n\t\t\t\tconst adapter = {\n\t\t\t\t\tgetData: () => {\n\t\t\t\t\t\t// Restore Handlebars syntax before returning\n\t\t\t\t\t\treturn prepareForSaving(sourceCodeRef.current, handlebarsMapRef.current);\n\t\t\t\t\t},\n\t\t\t\t\tsetData: (newData: string) => {\n\t\t\t\t\t\tconst { html: protectedHtml, map } = prepareForEditing(newData);\n\t\t\t\t\t\thandlebarsMapRef.current = map;\n\t\t\t\t\t\tsourceCodeRef.current = newData;\n\t\t\t\t\t\tif (contentEditableRef.current) {\n\t\t\t\t\t\t\tcontentEditableRef.current.innerHTML = protectedHtml;\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tmodel: {\n\t\t\t\t\t\tinsertContent: (fragment: string) => {\n\t\t\t\t\t\t\texecCommand('insertHTML', fragment);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tprocessor: {\n\t\t\t\t\t\t\ttoView: (html: string) => html\n\t\t\t\t\t\t},\n\t\t\t\t\t\ttoModel: (html: string) => html\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\thandleEditorReadyRef.current?.(adapter);\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error('[CustomEditor] init effect error:', e);\n\t\t\t}\n\t\t}\n\t}, []);\n\n\t// Execute formatting command\n\tconst execCommand = useCallback((command: string, value?: string) => {\n\t\tdocument.execCommand(command, false, value);\n\t\tif (contentEditableRef.current) {\n\t\t\tsourceCodeRef.current = contentEditableRef.current.innerHTML;\n\t\t\tsaveToHistory();\n\t\t}\n\t}, []);\n\n\t// Save to history for undo/redo\n\tconst saveToHistory = useCallback(() => {\n\t\tif (contentEditableRef.current) {\n\t\t\tconst newHistory = history.slice(0, historyIndex + 1);\n\t\t\tnewHistory.push(contentEditableRef.current.innerHTML);\n\t\t\tsetHistory(newHistory.slice(-50)); // Keep last 50 states\n\t\t\tsetHistoryIndex(newHistory.length - 1);\n\t\t}\n\t}, [history, historyIndex]);\n\n\t// Undo\n\tconst handleUndo = useCallback(() => {\n\t\tif (historyIndex > 0) {\n\t\t\tconst newIndex = historyIndex - 1;\n\t\t\tsetHistoryIndex(newIndex);\n\t\t\tif (contentEditableRef.current) {\n\t\t\t\tcontentEditableRef.current.innerHTML = history[newIndex];\n\t\t\t\tsourceCodeRef.current = history[newIndex];\n\t\t\t}\n\t\t}\n\t}, [history, historyIndex]);\n\n\t// Redo\n\tconst handleRedo = useCallback(() => {\n\t\tif (historyIndex < history.length - 1) {\n\t\t\tconst newIndex = historyIndex + 1;\n\t\t\tsetHistoryIndex(newIndex);\n\t\t\tif (contentEditableRef.current) {\n\t\t\t\tcontentEditableRef.current.innerHTML = history[newIndex];\n\t\t\t\tsourceCodeRef.current = history[newIndex];\n\t\t\t}\n\t\t}\n\t}, [history, historyIndex]);\n\n\t// Handle content changes in visual mode.\n\t// IMPORTANT: only updates sourceCodeRef (visual-mode ref).\n\t// Must NOT touch sourceViewContentRef — that ref belongs exclusively to source mode.\n\tconst handleInput = useCallback(() => {\n\t\tif (contentEditableRef.current) {\n\t\t\tconst visualHtml = contentEditableRef.current.innerHTML;\n\t\t\t// Restore Handlebars before saving to sourceCodeRef\n\t\t\tsourceCodeRef.current = prepareForSaving(visualHtml, handlebarsMapRef.current);\n\t\t\tonEditorChangeRef.current?.(sourceCodeRef.current);\n\t\t}\n\t}, []);\n\n\t// Strip external formatting from pasted HTML.\n\tconst sanitizePastedHtml = useCallback((html: string): string => {\n\t\tconst doc = new DOMParser().parseFromString(html, 'text/html');\n\n\t\t// Unwrap <span> elements — they carry font/color styles from external sources\n\t\tdoc.querySelectorAll('span').forEach(span => {\n\t\t\tconst frag = document.createDocumentFragment();\n\t\t\twhile (span.firstChild) frag.appendChild(span.firstChild);\n\t\t\tspan.parentNode?.replaceChild(frag, span);\n\t\t});\n\n\t\t// Convert <a> links to plain text\n\t\tdoc.querySelectorAll('a').forEach(a => {\n\t\t\tconst text = document.createTextNode(a.textContent || '');\n\t\t\ta.parentNode?.replaceChild(text, a);\n\t\t});\n\n\t\t// Strip style and class from every remaining element\n\t\tdoc.querySelectorAll('[style], [class], [color], [bgcolor], [face]').forEach(el => {\n\t\t\tel.removeAttribute('style');\n\t\t\tel.removeAttribute('class');\n\t\t\tel.removeAttribute('color');\n\t\t\tel.removeAttribute('bgcolor');\n\t\t\tel.removeAttribute('face');\n\t\t});\n\n\t\treturn doc.body.innerHTML;\n\t}, []);\n\n\t// Handle paste — sanitize external HTML before inserting\n\tconst handlePaste = useCallback((e: React.ClipboardEvent) => {\n\t\te.preventDefault();\n\t\tconst html = e.clipboardData.getData('text/html');\n\t\tconst text = e.clipboardData.getData('text/plain');\n\n\t\tif (html) {\n\t\t\texecCommand('insertHTML', sanitizePastedHtml(html));\n\t\t} else {\n\t\t\texecCommand('insertText', text);\n\t\t}\n\t}, [execCommand, sanitizePastedHtml]);\n\n\t// Handle image upload\n\tconst handleImageUpload = useCallback(async (file: File) => {\n\t\ttry {\n\t\t\tconst uFiles = await uploadFiles([file], 'document');\n\t\t\tconst token = getToken();\n\t\t\tconst payload = {\n\t\t\t\t...token,\n\t\t\t\t'x-timezone': token['x-timezone']?.toString() || '',\n\t\t\t\ttitle: file?.name.split('.')[0],\n\t\t\t\tpath: '/',\n\t\t\t\tis_private: true,\n\t\t\t\tis_directory: false,\n\t\t\t\tfile_size: file.size,\n\t\t\t\tis_child: false,\n\t\t\t\tfile_extension: file?.name.split('.')[1],\n\t\t\t\ttype: 'image',\n\t\t\t\tmime_type: file.type,\n\t\t\t\turl: `${apiConfig?.s3BucketUrl}${uFiles[0]}`\n\t\t\t};\n\t\t\t\n\t\t\tawait postV1Drive(payload);\n\t\t\texecCommand('insertHTML', `<img src=\"${payload.url}\" alt=\"${file.name}\" style=\"max-width: 100%;\" />`);\n\t\t} catch (error) {\n\t\t\tconsole.error('Image upload failed:', error);\n\t\t\tonError?.(error as Error);\n\t\t}\n\t}, [apiConfig, execCommand, onError]);\n\n\t// Handle file input change\n\tconst handleFileChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n\t\tconst file = e.target.files?.[0];\n\t\tif (file) {\n\t\t\thandleImageUpload(file);\n\t\t}\n\t}, [handleImageUpload]);\n\n\t// Insert link\n\tconst handleInsertLink = useCallback(() => {\n\t\tconst url = prompt('Enter URL:');\n\t\tif (url) {\n\t\t\texecCommand('createLink', url);\n\t\t}\n\t}, [execCommand]);\n\n\t// Insert table\n\tconst handleInsertTable = useCallback(() => {\n\t\tconst rows = prompt('Number of rows:', '3');\n\t\tconst cols = prompt('Number of columns:', '3');\n\t\t\n\t\tif (rows && cols) {\n\t\t\tlet tableHTML = '<table border=\"1\" style=\"border-collapse: collapse; width: 100%;\">';\n\t\t\ttableHTML += '<thead><tr>';\n\t\t\tfor (let i = 0; i < parseInt(cols); i++) {\n\t\t\t\ttableHTML += '<th style=\"border: 1px solid #ddd; padding: 8px;\">Header</th>';\n\t\t\t}\n\t\t\ttableHTML += '</tr></thead><tbody>';\n\t\t\tfor (let i = 0; i < parseInt(rows); i++) {\n\t\t\t\ttableHTML += '<tr>';\n\t\t\t\tfor (let j = 0; j < parseInt(cols); j++) {\n\t\t\t\t\ttableHTML += '<td style=\"border: 1px solid #ddd; padding: 8px;\"></td>';\n\t\t\t\t}\n\t\t\t\ttableHTML += '</tr>';\n\t\t\t}\n\t\t\ttableHTML += '</tbody></table>';\n\t\t\t\n\t\t\texecCommand('insertHTML', tableHTML);\n\t\t}\n\t}, [execCommand]);\n\n\t// Table picker component\n\tconst TablePicker = () => {\n\t\tconst [hoverCell, setHoverCell] = useState<{ row: number; col: number } | null>(null);\n\t\tconst maxRows = 10;\n\t\tconst maxCols = 10;\n\t\t\n\t\t// Calculate position relative to button\n\t\tconst buttonRect = tablePickerAnchor?.getBoundingClientRect();\n\t\tconst editorContainer = document.querySelector('.custom-editor-container');\n\t\tconst containerRect = editorContainer?.getBoundingClientRect();\n\t\t\n\t\tlet top = 0;\n\t\tlet left = 0;\n\t\t\n\t\tif (buttonRect && containerRect) {\n\t\t\ttop = buttonRect.bottom - containerRect.top + 5;\n\t\t\tleft = buttonRect.left - containerRect.left;\n\t\t}\n\t\t\n\t\treturn (\n\t\t\t<Box\n\t\t\t\tsx={{\n\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\ttop: `${top}px`,\n\t\t\t\t\tleft: `${left}px`,\n\t\t\t\t\tbgcolor: 'white',\n\t\t\t\t\tborder: '1px solid #ddd',\n\t\t\t\t\tborderRadius: 1,\n\t\t\t\t\tp: 2,\n\t\t\t\t\tboxShadow: 3,\n\t\t\t\t\tzIndex: 9999\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<Box sx={{ display: 'grid', gridTemplateColumns: `repeat(${maxCols}, 20px)`, gap: '2px', mb: 1 }}>\n\t\t\t\t\t{Array.from({ length: maxRows }).map((_, rowIndex) =>\n\t\t\t\t\t\tArray.from({ length: maxCols }).map((_, colIndex) => (\n\t\t\t\t\t\t\t<Box\n\t\t\t\t\t\t\t\tkey={`${rowIndex}-${colIndex}`}\n\t\t\t\t\t\t\t\tonMouseEnter={() => setHoverCell({ row: rowIndex + 1, col: colIndex + 1 })}\n\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\thandleInsertTableFromPicker(rowIndex + 1, colIndex + 1);\n\t\t\t\t\t\t\t\t\tsetHoverCell(null);\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tsx={{\n\t\t\t\t\t\t\t\t\twidth: 20,\n\t\t\t\t\t\t\t\t\theight: 20,\n\t\t\t\t\t\t\t\t\tborder: '1px solid #ddd',\n\t\t\t\t\t\t\t\t\tbgcolor: hoverCell && rowIndex < hoverCell.row && colIndex < hoverCell.col ? '#1976d2' : 'white',\n\t\t\t\t\t\t\t\t\tcursor: 'pointer',\n\t\t\t\t\t\t\t\t\t'&:hover': {\n\t\t\t\t\t\t\t\t\t\tbgcolor: '#1976d2'\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t))\n\t\t\t\t\t)}\n\t\t\t\t</Box>\n\t\t\t\t<Box sx={{ textAlign: 'center', fontSize: '12px', color: '#666' }}>\n\t\t\t\t\t{hoverCell ? `${hoverCell.row} × ${hoverCell.col}` : '1 × 1'}\n\t\t\t\t</Box>\n\t\t\t</Box>\n\t\t);\n\t};\n\n\t// Font family change\n\tconst handleFontFamilyChange = useCallback((e: any) => {\n\t\tconst family = e.target.value;\n\t\tsetFontFamily(family);\n\t\texecCommand('fontName', family);\n\t}, [execCommand]);\n\n\t// Font size change\n\tconst handleFontSizeChange = useCallback((e: any) => {\n\t\tconst size = e.target.value;\n\t\tsetFontSize(size);\n\t\tdocument.execCommand('fontSize', false, '7');\n\t\tif (contentEditableRef.current) {\n\t\t\tconst fontTags = Array.from(\n\t\t\t\tcontentEditableRef.current.querySelectorAll('font[size=\"7\"]')\n\t\t\t);\n\t\t\tfontTags.forEach(tag => {\n\t\t\t\tconst span = document.createElement('span');\n\t\t\t\tspan.style.fontSize = size;\n\t\t\t\twhile (tag.firstChild) span.appendChild(tag.firstChild);\n\t\t\t\ttag.parentNode?.replaceChild(span, tag);\n\t\t\t});\n\t\t\tsourceCodeRef.current = contentEditableRef.current.innerHTML;\n\t\t\tsaveToHistory();\n\t\t\tonEditorChangeRef.current?.(sourceCodeRef.current);\n\t\t}\n\t}, [saveToHistory]);\n\n\t// Heading format change\n\tconst handleHeadingFormatChange = useCallback((e: any) => {\n\t\tconst format = e.target.value;\n\t\tsetHeadingFormat(format);\n\t\texecCommand('formatBlock', `<${format}>`);\n\t}, [execCommand]);\n\n\t// Toggle source mode\n\t// FIX: Use sourceViewContentRef (not sourceCodeRef) as the single source of\n\t// truth for the textarea. This prevents handleInput (visual mode) from ever\n\t// overwriting content the user typed/pasted into the source textarea.\n\tconst handleToggleSource = useCallback(() => {\n\t\tif (!showSourceMode) {\n\t\t\t// Entering source mode: MUST capture content BEFORE state change\n\t\t\t// because contentEditableRef.current becomes null after re-render\n\t\t\tconst visualHtml = contentEditableRef.current?.innerHTML || sourceCodeRef.current || data;\n\t\t\tconst restoredHtml = prepareForSaving(visualHtml, handlebarsMapRef.current);\n\t\t\t\n\t\t\t// Update all refs and state\n\t\t\tsetSourceCode(restoredHtml);\n\t\t\tsourceViewContentRef.current = restoredHtml;\n\t\t\tsourceCodeRef.current = restoredHtml;\n\t\t\t\n\t\t\t// Now switch mode (this will unmount contentEditable and mount textarea)\n\t\t\tsetShowSourceMode(true);\n\t\t} else {\n\t\t\t// Leaving source mode: read from sourceViewContentRef\n\t\t\t// State change will mount contentEditable, then we update it in useEffect\n\t\t\tconst currentSource = sourceViewContentRef.current.trim();\n\t\t\t\n\t\t\tif (!currentSource) {\n\t\t\t\t// Empty source — use default\n\t\t\t\tconst defaultHtml = '<p><br></p>';\n\t\t\t\tsourceCodeRef.current = defaultHtml;\n\t\t\t\tsourceViewContentRef.current = defaultHtml;\n\t\t\t\tsetSourceCode(defaultHtml);\n\t\t\t} else {\n\t\t\t\tsourceCodeRef.current = currentSource;\n\t\t\t}\n\t\t\t\n\t\t\t// Switch mode first\n\t\t\tsetShowSourceMode(false);\n\t\t}\n\t}, [showSourceMode, data]);\n\n\t// Effect to update contentEditable when switching from source to visual mode\n\t// Use a ref to track if we've already processed this mode switch\n\tconst hasProcessedModeSwitch = useRef(false);\n\t\n\tuseEffect(() => {\n\t\t// Only run when switching TO visual mode (showSourceMode becomes false)\n\t\t// and we haven't already processed this switch\n\t\tif (!showSourceMode && contentEditableRef.current && !hasProcessedModeSwitch.current) {\n\t\t\thasProcessedModeSwitch.current = true;\n\t\t\t\n\t\t\ttry {\n\t\t\t\tconst currentSource = sourceCodeRef.current.trim();\n\t\t\t\t\n\t\t\t\tif (!currentSource) {\n\t\t\t\t\tconst defaultHtml = '<p><br></p>';\n\t\t\t\t\tconst { html: protectedHtml, map } = prepareForEditing(defaultHtml);\n\t\t\t\t\thandlebarsMapRef.current = map;\n\t\t\t\t\tcontentEditableRef.current.innerHTML = protectedHtml;\n\t\t\t\t} else {\n\t\t\t\t\tconst { html: protectedHtml, map } = prepareForEditing(currentSource);\n\t\t\t\t\thandlebarsMapRef.current = map;\n\n\t\t\t\t\tif (!protectedHtml || protectedHtml.trim() === '') {\n\t\t\t\t\t\tconsole.warn('Protected HTML is empty, using original source');\n\t\t\t\t\t\tcontentEditableRef.current.innerHTML = currentSource;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcontentEditableRef.current.innerHTML = protectedHtml;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// Save to history without triggering re-render loop\n\t\t\t\tconst newHistory = history.slice(0, historyIndex + 1);\n\t\t\t\tnewHistory.push(contentEditableRef.current.innerHTML);\n\t\t\t\tsetHistory(newHistory.slice(-50));\n\t\t\t\tsetHistoryIndex(newHistory.length - 1);\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error('Error updating visual mode:', error);\n\t\t\t\t// Fallback: use raw HTML\n\t\t\t\tif (contentEditableRef.current && sourceCodeRef.current) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tcontentEditableRef.current.innerHTML = sourceCodeRef.current;\n\t\t\t\t\t} catch (innerError) {\n\t\t\t\t\t\tconsole.error('Failed to render HTML:', innerError);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\t// Reset the flag when entering source mode\n\t\tif (showSourceMode) {\n\t\t\thasProcessedModeSwitch.current = false;\n\t\t}\n\t}, [showSourceMode, history, historyIndex]);\n\n\t// Handle HTML file upload\n\t// FIX: also write to sourceViewContentRef so the uploaded content is not\n\t// lost when the user toggles to visual mode.\n\tconst handleHtmlFileUpload = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n\t\tconst file = e.target.files?.[0];\n\t\tif (!file) return;\n\n\t\tconst reader = new FileReader();\n\t\t\n\t\treader.onload = (event) => {\n\t\t\tconst htmlContent = event.target?.result as string;\n\t\t\tif (htmlContent) {\n\t\t\t\t// Update both textarea state and the dedicated source-mode ref\n\t\t\t\tsetSourceCode(htmlContent);\n\t\t\t\tsourceViewContentRef.current = htmlContent; // FIX: was sourceCodeRef.current\n\t\t\t\tsourceCodeRef.current = htmlContent;\n\t\t\t\t\n\t\t\t\t// If in visual mode, update the visual editor immediately\n\t\t\t\tif (!showSourceMode && contentEditableRef.current) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst { html: protectedHtml, map } = prepareForEditing(htmlContent);\n\t\t\t\t\t\thandlebarsMapRef.current = map;\n\t\t\t\t\t\tcontentEditableRef.current.innerHTML = protectedHtml;\n\t\t\t\t\t\tsaveToHistory();\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tconsole.error('Error processing uploaded HTML:', error);\n\t\t\t\t\t\talert('There was an error processing the HTML file. Please check the file and try again.');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\treader.onerror = () => {\n\t\t\talert('Failed to read HTML file. Please try again.');\n\t\t};\n\n\t\treader.readAsText(file);\n\t\t\n\t\t// Reset input so the same file can be uploaded again\n\t\te.target.value = '';\n\t}, [showSourceMode, saveToHistory]);\n\n\t// Handle source code textarea change.\n\t// FIX: write to sourceViewContentRef (not sourceCodeRef) so visual-mode\n\t// handleInput can never overwrite what the user is typing in the textarea.\n\tconst handleSourceCodeChange = useCallback((e: React.ChangeEvent<HTMLTextAreaElement>) => {\n\t\tconst newCode = e.target.value;\n\t\tsetSourceCode(newCode);\n\t\tsourceViewContentRef.current = newCode; // FIX: was sourceCodeRef.current\n\t}, []);\n\n\t// Handle click on images/elements for selection\n\tconst handleContentClick = useCallback((e: React.MouseEvent) => {\n\t\tconst target = e.target as HTMLElement;\n\t\t\n\t\t// Check if clicked on image or table\n\t\tlet elementToSelect: HTMLElement | null = null;\n\t\t\n\t\tif (target.tagName === 'IMG') {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\telementToSelect = target;\n\t\t} else if (target.tagName === 'TABLE') {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\telementToSelect = target;\n\t\t} else if (target.tagName === 'TD' || target.tagName === 'TH' || target.tagName === 'TR' || target.tagName === 'TBODY' || target.tagName === 'THEAD') {\n\t\t\t// If clicked inside table, find the parent table\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\telementToSelect = target.closest('table');\n\t\t}\n\t\t\n\t\tif (elementToSelect) {\n\t\t\tsetSelectedElement(elementToSelect);\n\t\t\t\n\t\t\tconst rect = elementToSelect.getBoundingClientRect();\n\t\t\tconst containerRect = contentEditableRef.current?.getBoundingClientRect();\n\t\t\t\n\t\t\tif (containerRect) {\n\t\t\t\tsetResizeHandles({\n\t\t\t\t\tx: rect.left - containerRect.left,\n\t\t\t\t\ty: rect.top - containerRect.top,\n\t\t\t\t\twidth: rect.width,\n\t\t\t\t\theight: rect.height\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tsetSelectedElement(null);\n\t\t\tsetResizeHandles(null);\n\t\t}\n\t}, []);\n\n\t// Delete selected element\n\tconst handleDeleteSelected = useCallback(() => {\n\t\tif (selectedElement) {\n\t\t\tselectedElement.remove();\n\t\t\tsetSelectedElement(null);\n\t\t\tsetResizeHandles(null);\n\t\t\tif (contentEditableRef.current) {\n\t\t\t\tsourceCodeRef.current = contentEditableRef.current.innerHTML;\n\t\t\t\tsaveToHistory();\n\t\t\t}\n\t\t}\n\t}, [selectedElement, saveToHistory]);\n\n\t// Replace image\n\tconst handleReplaceImage = useCallback(async (file: File) => {\n\t\tif (!selectedElement || selectedElement.tagName !== 'IMG') return;\n\t\t\n\t\ttry {\n\t\t\tconst uFiles = await uploadFiles([file], 'document');\n\t\t\tconst token = getToken();\n\t\t\tconst payload = {\n\t\t\t\t...token,\n\t\t\t\t'x-timezone': token['x-timezone']?.toString() || '',\n\t\t\t\ttitle: file?.name.split('.')[0],\n\t\t\t\tpath: '/',\n\t\t\t\tis_private: true,\n\t\t\t\tis_directory: false,\n\t\t\t\tfile_size: file.size,\n\t\t\t\tis_child: false,\n\t\t\t\tfile_extension: file?.name.split('.')[1],\n\t\t\t\ttype: 'image',\n\t\t\t\tmime_type: file.type,\n\t\t\t\turl: `${apiConfig?.s3BucketUrl}${uFiles[0]}`\n\t\t\t};\n\t\t\t\n\t\t\tawait postV1Drive(payload);\n\t\t\t(selectedElement as HTMLImageElement).src = payload.url;\n\t\t\t\n\t\t\tif (contentEditableRef.current) {\n\t\t\t\tsourceCodeRef.current = contentEditableRef.current.innerHTML;\n\t\t\t\tsaveToHistory();\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error('Image upload failed:', error);\n\t\t\tonError?.(error as Error);\n\t\t}\n\t}, [selectedElement, apiConfig, onError, saveToHistory]);\n\n\t// Handle replace image file input\n\tconst handleReplaceImageChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n\t\tconst file = e.target.files?.[0];\n\t\tif (file) {\n\t\t\thandleReplaceImage(file);\n\t\t}\n\t}, [handleReplaceImage]);\n\n\t// Handle text selection\n\tconst handleTextSelection = useCallback(() => {\n\t\tconst selection = window.getSelection();\n\t\tif (selection && !selection.isCollapsed && selection.rangeCount > 0) {\n\t\t\tconst range = selection.getRangeAt(0);\n\t\t\tconst rect = range.getBoundingClientRect();\n\t\t\tconst containerRect = contentEditableRef.current?.getBoundingClientRect();\n\t\t\t\n\t\t\tif (containerRect && rect.width > 0) {\n\t\t\t\tsetTextSelectionAnchor({\n\t\t\t\t\tx: rect.left + rect.width / 2,\n\t\t\t\t\ty: rect.top - 10\n\t\t\t\t});\n\t\t\t\tsetShowTextToolbar(true);\n\t\t\t}\n\n\t\t\t// Sync font size dropdown to the selected text's actual font size.\n\t\t\t// Walk up from the anchor node looking for an explicit inline font-size.\n\t\t\tlet node: Node | null = selection.anchorNode;\n\t\t\tif (node?.nodeType === Node.TEXT_NODE) node = node.parentElement;\n\t\t\tlet detectedSize: string | null = null;\n\t\t\tlet current = node instanceof HTMLElement ? node : null;\n\t\t\twhile (current && current !== contentEditableRef.current) {\n\t\t\t\tif (current.style.fontSize) {\n\t\t\t\t\tdetectedSize = current.style.fontSize;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcurrent = current.parentElement;\n\t\t\t}\n\t\t\tsetFontSize(detectedSize ?? '14px');\n\t\t} else {\n\t\t\tsetShowTextToolbar(false);\n\t\t\tsetTextSelectionAnchor(null);\n\t\t}\n\t}, []);\n\n\t// Handle resize start\n\tconst handleResizeStart = useCallback((e: React.MouseEvent, handle: string) => {\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\t\t\n\t\tif (selectedElement && resizeHandles) {\n\t\t\tresizeStartRef.current = {\n\t\t\t\tx: e.clientX,\n\t\t\t\ty: e.clientY,\n\t\t\t\twidth: resizeHandles.width,\n\t\t\t\theight: resizeHandles.height,\n\t\t\t\thandle\n\t\t\t};\n\t\t\t\n\t\t\t// Add event listeners\n\t\t\tdocument.addEventListener('mousemove', handleResizeMove as any);\n\t\t\tdocument.addEventListener('mouseup', handleResizeEnd);\n\t\t}\n\t}, [selectedElement, resizeHandles]);\n\n\t// Handle resize move\n\tconst handleResizeMove = useCallback((e: MouseEvent) => {\n\t\tif (!resizeStartRef.current || !selectedElement || !resizeHandles) return;\n\t\t\n\t\tconst { x, y, width, height, handle } = resizeStartRef.current;\n\t\tconst deltaX = e.clientX - x;\n\t\tconst deltaY = e.clientY - y;\n\t\t\n\t\tlet newWidth = width;\n\t\tlet newHeight = height;\n\t\t\n\t\tif (handle.includes('e')) {\n\t\t\tnewWidth = Math.max(50, width + deltaX);\n\t\t}\n\t\tif (handle.includes('w')) {\n\t\t\t// West handle: shrink/grow from the left — invert delta\n\t\t\tnewWidth = Math.max(50, width - deltaX);\n\t\t}\n\t\tif (handle.includes('s')) {\n\t\t\tnewHeight = Math.max(50, height + deltaY);\n\t\t}\n\t\tif (handle.includes('n')) {\n\t\t\tnewHeight = Math.max(50, height - deltaY);\n\t\t}\n\t\t\n\t\t// Maintain aspect ratio for corner handles on images\n\t\tif (handle.length === 2 && selectedElement.tagName === 'IMG') {\n\t\t\tconst aspectRatio = width / height;\n\t\t\tnewHeight = newWidth / aspectRatio;\n\t\t}\n\t\t\n\t\tselectedElement.style.width = `${newWidth}px`;\n\t\tif (selectedElement.tagName === 'IMG' || selectedElement.tagName === 'TABLE') {\n\t\t\tselectedElement.style.height = `${newHeight}px`;\n\t\t}\n\t\t\n\t\t// Update resize handles position\n\t\tconst rect = selectedElement.getBoundingClientRect();\n\t\tconst containerRect = contentEditableRef.current?.getBoundingClientRect();\n\t\t\n\t\tif (containerRect) {\n\t\t\tsetResizeHandles({\n\t\t\t\tx: rect.left - containerRect.left,\n\t\t\t\ty: rect.top - containerRect.top,\n\t\t\t\twidth: rect.width,\n\t\t\t\theight: rect.height\n\t\t\t});\n\t\t}\n\t}, [selectedElement, resizeHandles]);\n\n\t// Handle resize end\n\tconst handleResizeEnd = useCallback(() => {\n\t\tdocument.removeEventListener('mousemove', handleResizeMove as any);\n\t\tdocument.removeEventListener('mouseup', handleResizeEnd);\n\t\t\n\t\tresizeStartRef.current = null;\n\t\tif (contentEditableRef.current) {\n\t\t\tsourceCodeRef.current = contentEditableRef.current.innerHTML;\n\t\t\tsaveToHistory();\n\t\t}\n\t}, [handleResizeMove, saveToHistory]);\n\n\t// Show table picker\n\tconst handleShowTablePicker = useCallback((e: React.MouseEvent<HTMLButtonElement>) => {\n\t\tsetTablePickerAnchor(e.currentTarget);\n\t\tsetShowTablePicker(true);\n\t}, []);\n\n\t// Insert table with visual picker\n\tconst handleInsertTableFromPicker = useCallback((rows: number, cols: number) => {\n\t\t// Focus the editor first\n\t\tif (contentEditableRef.current) {\n\t\t\tcontentEditableRef.current.focus();\n\t\t}\n\t\t\n\t\t// Create table HTML\n\t\tlet tableHTML = '<table border=\"1\" style=\"border-collapse: collapse; width: 100%; margin: 10px 0;\">';\n\t\ttableHTML += '<tbody>';\n\t\tfor (let i = 0; i < rows; i++) {\n\t\t\ttableHTML += '<tr>';\n\t\t\tfor (let j = 0; j < cols; j++) {\n\t\t\t\ttableHTML += '<td style=\"border: 1px solid #ddd; padding: 8px; min-width: 50px;\"></td>';\n\t\t\t}\n\t\t\ttableHTML += '</tr>';\n\t\t}\n\t\ttableHTML += '</tbody></table><p><br></p>';\n\t\t\n\t\t// Insert using execCommand\n\t\tdocument.execCommand('insertHTML', false, tableHTML);\n\t\t\n\t\t// Update refs and history\n\t\tif (contentEditableRef.current) {\n\t\t\tsourceCodeRef.current = contentEditableRef.current.innerHTML;\n\t\t\tsaveToHistory();\n\t\t}\n\t\t\n\t\t// Close picker\n\t\tsetShowTablePicker(false);\n\t\tsetTablePickerAnchor(null);\n\t}, [saveToHistory]);\n\n\t// Create adapter object for ref\n\tconst adapter = {\n\t\tgetData: () => {\n\t\t\t// Always restore Handlebars syntax when getting data\n\t\t\treturn prepareForSaving(sourceCodeRef.current, handlebarsMapRef.current);\n\t\t},\n\t\tsetData: (newData: string) => {\n\t\t\tconst { html: protectedHtml, map } = prepareForEditing(newData);\n\t\t\thandlebarsMapRef.current = map;\n\t\t\tsourceCodeRef.current = newData;\n\t\t\tif (contentEditableRef.current) {\n\t\t\t\tcontentEditableRef.current.innerHTML = protectedHtml;\n\t\t\t}\n\t\t},\n\t\tmodel: {\n\t\t\tinsertContent: (fragment: string) => {\n\t\t\t\texecCommand('insertHTML', fragment);\n\t\t\t}\n\t\t},\n\t\tdata: {\n\t\t\tprocessor: {\n\t\t\t\ttoView: (html: string) => html\n\t\t\t},\n\t\t\ttoModel: (html: string) => html\n\t\t}\n\t};\n\n\tuseImperativeHandle(ref, () => adapter, []);\n\t\n\tuseEffect(() => {\n\t\tif (editorRefProp) {\n\t\t\t(editorRefProp as any).current = adapter;\n\t\t}\n\t}, [editorRefProp]);\n\n\t// Prevents focus loss when toolbar buttons are pressed, keeping the editor\n\tconst toolbarCmd = (command: string, value?: string) => (e: React.MouseEvent) => {\n\t\te.preventDefault();\n\t\texecCommand(command, value);\n\t};\n\n\tif (error) {\n\t\treturn (\n\t\t\t<div className=\"editor-error-container\">\n\t\t\t\t<div className=\"editor-error-message\">Editor Error: {error.message}</div>\n\t\t\t\t<button onClick={() => setError(null)} className=\"editor-retry-button\">\n\t\t\t\t\tRetry\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className='custom-editor-container'>\n\t\t\t{/* Menu Bar */}\n\t\t\t<Box sx={{ \n\t\t\t\tdisplay: 'flex', \n\t\t\t\talignItems: 'center',\n\t\t\t\tgap: 2,\n\t\t\t\tpx: 2,\n\t\t\t\tpy: 0.5,\n\t\t\t\tborderBottom: '1px solid #ddd',\n\t\t\t\tbgcolor: '#f8f9fa',\n\t\t\t\tfontSize: '13px'\n\t\t\t}}>\n\t\t\t\t<span style={{ cursor: 'pointer', color: '#333' }}>Edit</span>\n\t\t\t\t<span style={{ cursor: 'pointer', color: '#333' }}>View</span>\n\t\t\t\t<span style={{ cursor: 'pointer', color: '#333' }}>Insert</span>\n\t\t\t\t<span style={{ cursor: 'pointer', color: '#333' }}>Format</span>\n\t\t\t\t<span style={{ cursor: 'pointer', color: '#333' }}>Help</span>\n\t\t\t</Box>\n\n\t\t\t{/* Toolbar */}\n\t\t\t<Box sx={{ \n\t\t\t\tdisplay: 'flex', \n\t\t\t\tflexWrap: 'wrap', \n\t\t\t\tgap: 0.5, \n\t\t\t\tp: 1, \n\t\t\t\tborderBottom: '1px solid #ddd',\n\t\t\t\tbgcolor: '#f5f5f5',\n\t\t\t\talignItems: 'center'\n\t\t\t}}>\n\t\t\t\t{/* Source Button - icon + label style matching the design */}\n\t\t\t\t<Tooltip title={showSourceMode ? 'Switch to Visual' : 'Switch to Source'}>\n\t\t\t\t\t<Box\n\t\t\t\t\t\tonClick={handleToggleSource}\n\t\t\t\t\t\tsx={{\n\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\talignItems: 'center',\n\t\t\t\t\t\t\tgap: 0.5,\n\t\t\t\t\t\t\tpx: 1,\n\t\t\t\t\t\t\tpy: 0.5,\n\t\t\t\t\t\t\tcursor: 'pointer',\n\t\t\t\t\t\t\tborderRadius: 1,\n\t\t\t\t\t\t\tborder: '1px solid',\n\t\t\t\t\t\t\tborderColor: showSourceMode ? 'primary.main' : 'transparent',\n\t\t\t\t\t\t\tbgcolor: showSourceMode ? 'primary.50' : 'transparent',\n\t\t\t\t\t\t\tcolor: showSourceMode ? 'primary.main' : 'text.secondary',\n\t\t\t\t\t\t\t'&:hover': {\n\t\t\t\t\t\t\t\tbgcolor: showSourceMode ? 'primary.100' : 'grey.200',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\ttransition: 'all 0.15s ease',\n\t\t\t\t\t\t\tuserSelect: 'none',\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{/* Code-file-with-edit icon, matching the screenshot */}\n\t\t\t\t\t\t<svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n\t\t\t\t\t\t\t<path d=\"M14 2H6C4.9 2 4 2.9 4 4V20C4 21.1 4.9 22 6 22H18C19.1 22 20 21.1 20 20V8L14 2Z\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" fill=\"none\"/>\n\t\t\t\t\t\t\t<polyline points=\"14,2 14,8 20,8\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" fill=\"none\"/>\n\t\t\t\t\t\t\t<path d=\"M9 13L7 15L9 17\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n\t\t\t\t\t\t\t<path d=\"M15 13L17 15L15 17\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n\t\t\t\t\t\t\t<line x1=\"13\" y1=\"12\" x2=\"11\" y2=\"18\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\"/>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t<span style={{ fontSize: '13px', fontWeight: 500 }}>Source</span>\n\t\t\t\t\t</Box>\n\t\t\t\t</Tooltip>\n\n\t\t\t\t<Divider orientation=\"vertical\" flexItem sx={{ mx: 0.5 }} />\n\t\t\t\t\n\t\t\t\t{/* Undo/Redo */}\n\t\t\t\t<Tooltip title=\"Undo\">\n\t\t\t\t\t<IconButton size=\"small\" onClick={handleUndo} disabled={historyIndex === 0}>\n\t\t\t\t\t\t<Undo fontSize=\"small\" />\n\t\t\t\t\t</IconButton>\n\t\t\t\t</Tooltip>\n\t\t\t\t<Tooltip title=\"Redo\">\n\t\t\t\t\t<IconButton size=\"small\" onClick={handleRedo} disabled={historyIndex === history.length - 1}>\n\t\t\t\t\t\t<Redo fontSize=\"small\" />\n\t\t\t\t\t</IconButton>\n\t\t\t\t</Tooltip>\n\t\t\t\t\n\t\t\t\t<Divider orientation=\"vertical\" flexItem sx={{ mx: 0.5 }} />\n\t\t\t\t\n\t\t\t\t{/* Heading Format */}\n\t\t\t\t<Select\n\t\t\t\t\tvalue={headingFormat}\n\t\t\t\t\tonChange={handleHeadingFormatChange}\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\tsx={{ minWidth: 100, height: 28, fontSize: '12px' }}\n\t\t\t\t>\n\t\t\t\t\t{HEADING_FORMATS.map(format => (\n\t\t\t\t\t\t<MenuItem key={format.value} value={format.value}>\n\t\t\t\t\t\t\t{format.label}\n\t\t\t\t\t\t</MenuItem>\n\t\t\t\t\t))}\n\t\t\t\t</Select>\n\t\t\t\t\n\t\t\t\t{/* Font Family */}\n\t\t\t\t<Select\n\t\t\t\t\tvalue={fontFamily}\n\t\t\t\t\tonChange={handleFontFamilyChange}\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\tsx={{ minWidth: 120, height: 28, fontSize: '12px' }}\n\t\t\t\t>\n\t\t\t\t\t{FONT_FAMILIES.map(font => (\n\t\t\t\t\t\t<MenuItem key={font} value={font} style={{ fontFamily: font }}>\n\t\t\t\t\t\t\t{font}\n\t\t\t\t\t\t</MenuItem>\n\t\t\t\t\t))}\n\t\t\t\t</Select>\n\t\t\t\t\n\t\t\t\t{/* Font Size */}\n\t\t\t\t<Select\n\t\t\t\t\tvalue={fontSize}\n\t\t\t\t\tonChange={handleFontSizeChange}\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\tsx={{ minWidth: 70, height: 28, fontSize: '12px' }}\n\t\t\t\t>\n\t\t\t\t\t{FONT_SIZES.map(size => (\n\t\t\t\t\t\t<MenuItem key={size} value={size}>{size}</MenuItem>\n\t\t\t\t\t))}\n\t\t\t\t</Select>\n\t\t\t\t\n\t\t\t\t<Divider orientation=\"vertical\" flexItem sx={{ mx: 0.5 }} />\n\t\t\t\t\n\t\t\t\t{/* Text Formatting */}\n\t\t\t\t<Tooltip title=\"Bold\">\n\t\t\t\t\t<IconButton size=\"small\" onMouseDown={toolbarCmd('bold')}>\n\t\t\t\t\t\t<FormatBold fontSize=\"small\" />\n\t\t\t\t\t</IconButton>\n\t\t\t\t</Tooltip>\n\t\t\t\t<Tooltip title=\"Italic\">\n\t\t\t\t\t<IconButton size=\"small\" onMouseDown={toolbarCmd('italic')}>\n\t\t\t\t\t\t<FormatItalic fontSize=\"small\" />\n\t\t\t\t\t</IconButton>\n\t\t\t\t</Tooltip>\n\t\t\t\t<Tooltip title=\"Underline\">\n\t\t\t\t\t<IconButton size=\"small\" onMouseDown={toolbarCmd('underline')}>\n\t\t\t\t\t\t<FormatUnderlined fontSize=\"small\" />\n\t\t\t\t\t</IconButton>\n\t\t\t\t</Tooltip>\n\t\t\t\t<Tooltip title=\"Strikethrough\">\n\t\t\t\t\t<IconButton size=\"small\" onMouseDown={toolbarCmd('strikeThrough')}>\n\t\t\t\t\t\t<FormatStrikethrough fontSize=\"small\" />\n\t\t\t\t\t</IconButton>\n\t\t\t\t</Tooltip>\n\t\t\t\t<Tooltip title=\"Subscript\">\n\t\t\t\t\t<IconButton size=\"small\" onMouseDown={toolbarCmd('subscript')}>\n\t\t\t\t\t\t<Subscript fontSize=\"small\" />\n\t\t\t\t\t</IconButton>\n\t\t\t\t</Tooltip>\n\t\t\t\t<Tooltip title=\"Superscript\">\n\t\t\t\t\t<IconButton size=\"small\" onMouseDown={toolbarCmd('superscript')}>\n\t\t\t\t\t\t<Superscript fontSize=\"small\" />\n\t\t\t\t\t</IconButton>\n\t\t\t\t</Tooltip>\n\t\t\t\t\n\t\t\t\t<Divider orientation=\"vertical\" flexItem sx={{ mx: 0.5 }} />\n\t\t\t\t\n\t\t\t\t{/* Colors */}\n\t\t\t\t<Tooltip title=\"Text Color\">\n\t\t\t\t\t<IconButton\n\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\tonMouseDown={(e) => {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\tsetColorPickerState({ anchor: e.currentTarget, type: 'text' });\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tstyle={{ width: 32, height: 28, border: '1px solid #ddd', borderRadius: '4px', backgroundColor: 'white' }}\n\t\t\t\t\t>\n\t\t\t\t\t\t<span style={{ fontSize: '16px', fontWeight: 'bold', color: '#000' }}>A</span>\n\t\t\t\t\t</IconButton>\n\t\t\t\t</Tooltip>\n\t\t\t\t<Tooltip title=\"Background Color\">\n\t\t\t\t\t<IconButton\n\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\tonMouseDown={(e) => {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\tsetColorPickerState({ anchor: e.currentTarget, type: 'bg' });\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tstyle={{ width: 32, height: 28, border: '1px solid #ddd', borderRadius: '4px', backgroundColor: '#fffde7' }}\n\t\t\t\t\t>\n\t\t\t\t\t\t<span style={{ fontSize: '16px', fontWeight: 'bold', color: '#000' }}>A</span>\n\t\t\t\t\t</IconButton>\n\t\t\t\t</Tooltip>\n\t\t\t\t\n\t\t\t\t<Divider orientation=\"vertical\" flexItem sx={{ mx: 0.5 }} />\n\t\t\t\t\n\t\t\t\t{/* Alignment */}\n\t\t\t\t<Tooltip title=\"Align Left\">\n\t\t\t\t\t<IconButton size=\"small\" onMouseDown={toolbarCmd('justifyLeft')}>\n\t\t\t\t\t\t<FormatAlignLeft fontSize=\"small\" />\n\t\t\t\t\t</IconButton>\n\t\t\t\t</Tooltip>\n\t\t\t\t<Tooltip title=\"Align Center\">\n\t\t\t\t\t<IconButton size=\"small\" onMouseDown={toolbarCmd('justifyCenter')}>\n\t\t\t\t\t\t<FormatAlignCenter fontSize=\"small\" />\n\t\t\t\t\t</IconButton>\n\t\t\t\t</Tooltip>\n\t\t\t\t<Tooltip title=\"Align Right\">\n\t\t\t\t\t<IconButton size=\"small\" onMouseDown={toolbarCmd('justifyRight')}>\n\t\t\t\t\t\t<FormatAlignRight fontSize=\"small\" />\n\t\t\t\t\t</IconButton>\n\t\t\t\t</Tooltip>\n\t\t\t\t<Tooltip title=\"Justify\">\n\t\t\t\t\t<IconButton size=\"small\" onMouseDown={toolbarCmd('justifyFull')}>\n\t\t\t\t\t\t<FormatAlignJustify fontSize=\"small\" />\n\t\t\t\t\t</IconButton>\n\t\t\t\t</Tooltip>\n\t\t\t\t\n\t\t\t\t<Divider orientation=\"vertical\" flexItem sx={{ mx: 0.5 }} />\n\t\t\t\t\n\t\t\t\t{/* Lists */}\n\t\t\t\t<Tooltip title=\"Bullet List\">\n\t\t\t\t\t<IconButton size=\"small\" onMouseDown={toolbarCmd('insertUnorderedList')}>\n\t\t\t\t\t\t<FormatListBulleted fontSize=\"small\" />\n\t\t\t\t\t</IconButton>\n\t\t\t\t</Tooltip>\n\t\t\t\t<Tooltip title=\"Numbered List\">\n\t\t\t\t\t<IconButton size=\"small\" onMouseDown={toolbarCmd('insertOrderedList')}>\n\t\t\t\t\t\t<FormatListNumbered fontSize=\"small\" />\n\t\t\t\t\t</IconButton>\n\t\t\t\t</Tooltip>\n\t\t\t\t\n\t\t\t\t<Divider orientation=\"vertical\" flexItem sx={{ mx: 0.5 }} />\n\t\t\t\t\n\t\t\t\t{/* Insert */}\n\t\t\t\t<Tooltip title=\"Insert Link\">\n\t\t\t\t\t<IconButton size=\"small\" onClick={handleInsertLink}>\n\t\t\t\t\t\t<LinkIcon fontSize=\"small\" />\n\t\t\t\t\t</IconButton>\n\t\t\t\t</Tooltip>\n\t\t\t\t<Tooltip title=\"Insert Image\">\n\t\t\t\t\t<IconButton size=\"small\" onClick={() => fileInputRef.current?.click()}>\n\t\t\t\t\t\t<ImageIcon fontSize=\"small\" />\n\t\t\t\t\t</IconButton>\n\t\t\t\t</Tooltip>\n\t\t\t\t<Tooltip title=\"Insert Table\">\n\t\t\t\t\t<IconButton size=\"small\" onClick={handleShowTablePicker}>\n\t\t\t\t\t\t<TableChart fontSize=\"small\" />\n\t\t\t\t\t</IconButton>\n\t\t\t\t</Tooltip>\n\t\t\t\t<Tooltip title=\"Code\">\n\t\t\t\t\t<IconButton size=\"small\" onMouseDown={toolbarCmd('formatBlock', '<pre>')}>\n\t\t\t\t\t\t<Code fontSize=\"small\" />\n\t\t\t\t\t</IconButton>\n\t\t\t\t</Tooltip>\n\t\t\t</Box>\n\t\t\t\n\t\t\t{/* Hidden file input */}\n\t\t\t<input\n\t\t\t\tref={fileInputRef}\n\t\t\t\ttype=\"file\"\n\t\t\t\taccept=\"image/*\"\n\t\t\t\tstyle={{ display: 'none' }}\n\t\t\t\tonChange={handleFileChange}\n\t\t\t/>\n\t\t\t\n\t\t\t{/* Hidden HTML file input */}\n\t\t\t<input\n\t\t\t\tref={htmlFileInputRef}\n\t\t\t\ttype=\"file\"\n\t\t\t\taccept=\".html,.htm,text/html\"\n\t\t\t\tstyle={{ display: 'none' }}\n\t\t\t\tonChange={handleHtmlFileUpload}\n\t\t\t/>\n\t\t\t\n\t\t\t{/* Hidden file input for replace image */}\n\t\t\t<input\n\t\t\t\tref={replaceImageInputRef}\n\t\t\t\ttype=\"file\"\n\t\t\t\taccept=\"image/*\"\n\t\t\t\tstyle={{ display: 'none' }}\n\t\t\t\tonChange={handleReplaceImageChange}\n\t\t\t/>\n\t\t\t\n\t\t\t{/* Content Area */}\n\t\t\t{showSourceMode ? (\n\t\t\t\t<textarea\n\t\t\t\t\tvalue={sourceCode}\n\t\t\t\t\tonChange={handleSourceCodeChange}\n\t\t\t\t\tclassName=\"custom-editor-source\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\twidth: '100%',\n\t\t\t\t\t\tminHeight: '300px',\n\t\t\t\t\t\tpadding: '16px',\n\t\t\t\t\t\tborder: 'none',\n\t\t\t\t\t\toutline: 'none',\n\t\t\t\t\t\tfontFamily: 'Courier New, monospace',\n\t\t\t\t\t\tfontSize: '13px',\n\t\t\t\t\t\tlineHeight: '1.5',\n\t\t\t\t\t\tresize: 'vertical'\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t<div style={{ position: 'relative' }}>\n\t\t\t\t\t<div\n\t\t\t\t\t\tref={contentEditableRef}\n\t\t\t\t\t\tcontentEditable\n\t\t\t\t\t\tclassName=\"editor-content\"\n\t\t\t\t\t\tonInput={handleInput}\n\t\t\t\t\t\tonPaste={handlePaste}\n\t\t\t\t\t\tonClick={handleContentClick}\n\t\t\t\t\t\tonMouseUp={handleTextSelection}\n\t\t\t\t\t\tonKeyUp={handleTextSelection}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tminHeight: '300px',\n\t\t\t\t\t\t\tpadding: '16px',\n\t\t\t\t\t\t\tborder: '1px solid #ddd',\n\t\t\t\t\t\t\tborderTop: 'none',\n\t\t\t\t\t\t\toutline: 'none',\n\t\t\t\t\t\t\tfontFamily: 'inherit',\n\t\t\t\t\t\t\tfontSize: 'inherit',\n\t\t\t\t\t\t\tlineHeight: '1.6',\n\t\t\t\t\t\t\tbackgroundColor: 'white'\n\t\t\t\t\t\t}}\n\t\t\t\t\t\t{...rest}\n\t\t\t\t\t/>\n\t\t\t\t\t\n\t\t\t\t\t{/* Resize Handles */}\n\t\t\t\t\t{selectedElement && resizeHandles && (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\t\t\t\tleft: resizeHandles.x,\n\t\t\t\t\t\t\t\ttop: resizeHandles.y,\n\t\t\t\t\t\t\t\twidth: resizeHandles.width,\n\t\t\t\t\t\t\t\theight: resizeHandles.height,\n\t\t\t\t\t\t\t\tborder: '2px solid #1976d2',\n\t\t\t\t\t\t\t\tpointerEvents: 'none',\n\t\t\t\t\t\t\t\tzIndex: 1000\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{/* Toolbar for selected element */}\n\t\t\t\t\t\t\t<Box\n\t\t\t\t\t\t\t\tsx={{\n\t\t\t\t\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\t\t\t\t\ttop: -36,\n\t\t\t\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\t\t\tgap: 0.5,\n\t\t\t\t\t\t\t\t\tbgcolor: 'white',\n\t\t\t\t\t\t\t\t\tborder: '1px solid #ddd',\n\t\t\t\t\t\t\t\t\tborderRadius: 1,\n\t\t\t\t\t\t\t\t\tp: 0.25,\n\t\t\t\t\t\t\t\t\tboxShadow: 2,\n\t\t\t\t\t\t\t\t\tpointerEvents: 'auto'\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{selectedElement.tagName === 'IMG' && (\n\t\t\t\t\t\t\t\t\t<Tooltip title=\"Replace Image\">\n\t\t\t\t\t\t\t\t\t\t<IconButton\n\t\t\t\t\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => replaceImageInputRef.current?.click()}\n\t\t\t\t\t\t\t\t\t\t\tsx={{ width: 22, height: 22 }}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<SwapHoriz sx={{ fontSize: 14 }} />\n\t\t\t\t\t\t\t\t\t\t</IconButton>\n\t\t\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{selectedElement.tagName === 'TABLE' && (\n\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t<Tooltip title=\"Add Row\">\n\t\t\t\t\t\t\t\t\t\t\t<IconButton\n\t\t\t\t\t\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tconst tbody = selectedElement.querySelector('tbody');\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (tbody) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst colCount = selectedElement.querySelectorAll('tr:first-child td, tr:first-child th').length || 1;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst tr = document.createElement('tr');\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tfor (let i = 0; i < colCount; i++) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst td = document.createElement('td');\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttd.style.cssText = 'border: 1px solid #ddd; padding: 8px; min-width: 50px;';\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttr.appendChild(td);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttbody.appendChild(tr);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (contentEditableRef.current) sourceCodeRef.current = contentEditableRef.current.innerHTML;\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\tsx={{ width: 22, height: 22 }}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<AddCircleOutline sx={{ fontSize: 14 }} />\n\t\t\t\t\t\t\t\t\t\t\t</IconButton>\n\t\t\t\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t\t\t\t\t<Tooltip title=\"Delete Row\">\n\t\t\t\t\t\t\t\t\t\t\t<IconButton\n\t\t\t\t\t\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tconst rows = selectedElement.querySelectorAll('tbody tr');\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (rows.length > 1) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\trows[rows.length - 1].remove();\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (contentEditableRef.current) sourceCodeRef.current = contentEditableRef.current.innerHTML;\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\tsx={{ width: 22, height: 22 }}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<RemoveCircleOutline sx={{ fontSize: 14 }} />\n\t\t\t\t\t\t\t\t\t\t\t</IconButton>\n\t\t\t\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t\t\t\t\t<Tooltip title=\"Add Column\">\n\t\t\t\t\t\t\t\t\t\t\t<IconButton\n\t\t\t\t\t\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tselectedElement.querySelectorAll('tr').forEach(tr => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst isHeader = tr.closest('thead') !== null;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst cell = document.createElement(isHeader ? 'th' : 'td');\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tcell.style.cssText = 'border: 1px solid #ddd; padding: 8px; min-width: 50px;';\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttr.appendChild(cell);\n\t\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (contentEditableRef.current) sourceCodeRef.current = contentEditableRef.current.innerHTML;\n\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\tsx={{ width: 22, height: 22 }}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<AddCircleOutline sx={{ fontSize: 14, transform: 'rotate(90deg)' }} />\n\t\t\t\t\t\t\t\t\t\t\t</IconButton>\n\t\t\t\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t\t\t\t\t<Tooltip title=\"Delete Column\">\n\t\t\t\t\t\t\t\t\t\t\t<IconButton\n\t\t\t\t\t\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tconst allRows = selectedElement.querySelectorAll('tr');\n\t\t\t\t\t\t\t\t\t\t\t\t\tconst colCount = allRows[0]?.children.length || 0;\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (colCount > 1) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tallRows.forEach(tr => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (tr.lastElementChild) tr.removeChild(tr.lastElementChild);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (contentEditableRef.current) sourceCodeRef.current = contentEditableRef.current.innerHTML;\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\tsx={{ width: 22, height: 22 }}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<RemoveCircleOutline sx={{ fontSize: 14, transform: 'rotate(90deg)' }} />\n\t\t\t\t\t\t\t\t\t\t\t</IconButton>\n\t\t\t\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t<Tooltip title=\"Delete\">\n\t\t\t\t\t\t\t\t\t<IconButton\n\t\t\t\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\t\t\t\tonClick={handleDeleteSelected}\n\t\t\t\t\t\t\t\t\t\tsx={{\n\t\t\t\t\t\t\t\t\t\t\twidth: 22,\n\t\t\t\t\t\t\t\t\t\t\theight: 22,\n\t\t\t\t\t\t\t\t\t\t\tcolor: '#f44336',\n\t\t\t\t\t\t\t\t\t\t\t'&:hover': { bgcolor: '#ffebee' }\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<Close sx={{ fontSize: 14 }} />\n\t\t\t\t\t\t\t\t\t</IconButton>\n\t\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t\t</Box>\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t{/* Corner and edge handles */}\n\t\t\t\t\t\t\t{['nw', 'n', 'ne', 'e', 'se', 's', 'sw', 'w'].map(handle => (\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tkey={handle}\n\t\t\t\t\t\t\t\t\tonMouseDown={(e) => handleResizeStart(e, handle)}\n\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\t\t\t\t\t\twidth: 8,\n\t\t\t\t\t\t\t\t\t\theight: 8,\n\t\t\t\t\t\t\t\t\t\tbackgroundColor: '#1976d2',\n\t\t\t\t\t\t\t\t\t\tborder: '1px solid white',\n\t\t\t\t\t\t\t\t\t\tpointerEvents: 'auto',\n\t\t\t\t\t\t\t\t\t\tcursor: `${handle}-resize`,\n\t\t\t\t\t\t\t\t\t\t...(handle === 'nw' && { top: -4, left: -4 }),\n\t\t\t\t\t\t\t\t\t\t...(handle === 'n' && { top: -4, left: '50%', transform: 'translateX(-50%)' }),\n\t\t\t\t\t\t\t\t\t\t...(handle === 'ne' && { top: -4, right: -4 }),\n\t\t\t\t\t\t\t\t\t\t...(handle === 'e' && { top: '50%', right: -4, transform: 'translateY(-50%)' }),\n\t\t\t\t\t\t\t\t\t\t...(handle === 'se' && { bottom: -4, right: -4 }),\n\t\t\t\t\t\t\t\t\t\t...(handle === 's' && { bottom: -4, left: '50%', transform: 'translateX(-50%)' }),\n\t\t\t\t\t\t\t\t\t\t...(handle === 'sw' && { bottom: -4, left: -4 }),\n\t\t\t\t\t\t\t\t\t\t...(handle === 'w' && { top: '50%', left: -4, transform: 'translateY(-50%)' })\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t\t\n\t\t\t\t\t{/* Text Selection Toolbar */}\n\t\t\t\t\t{showTextToolbar && textSelectionAnchor && (\n\t\t\t\t\t\t<Box\n\t\t\t\t\t\t\tsx={{\n\t\t\t\t\t\t\t\tposition: 'fixed',\n\t\t\t\t\t\t\t\tleft: textSelectionAnchor.x,\n\t\t\t\t\t\t\t\ttop: textSelectionAnchor.y,\n\t\t\t\t\t\t\t\ttransform: 'translate(-50%, -100%)',\n\t\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\t\tgap: 0.5,\n\t\t\t\t\t\t\t\tbgcolor: '#333',\n\t\t\t\t\t\t\t\tcolor: 'white',\n\t\t\t\t\t\t\t\tborderRadius: 1,\n\t\t\t\t\t\t\t\tp: 0.5,\n\t\t\t\t\t\t\t\tboxShadow: 3,\n\t\t\t\t\t\t\t\tzIndex: 10000\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Tooltip title=\"Bold\">\n\t\t\t\t\t\t\t\t<IconButton\n\t\t\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\t\t\tonMouseDown={toolbarCmd('bold')}\n\t\t\t\t\t\t\t\t\tsx={{ color: 'white', width: 28, height: 28 }}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<FormatBold fontSize=\"small\" />\n\t\t\t\t\t\t\t\t</IconButton>\n\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t\t<Tooltip title=\"Italic\">\n\t\t\t\t\t\t\t\t<IconButton\n\t\t\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\t\t\tonMouseDown={toolbarCmd('italic')}\n\t\t\t\t\t\t\t\t\tsx={{ color: 'white', width: 28, height: 28 }}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<FormatItalic fontSize=\"small\" />\n\t\t\t\t\t\t\t\t</IconButton>\n\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t\t<Tooltip title=\"Underline\">\n\t\t\t\t\t\t\t\t<IconButton\n\t\t\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\t\t\tonMouseDown={toolbarCmd('underline')}\n\t\t\t\t\t\t\t\t\tsx={{ color: 'white', width: 28, height: 28 }}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<FormatUnderlined fontSize=\"small\" />\n\t\t\t\t\t\t\t\t</IconButton>\n\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t\t<Divider orientation=\"vertical\" flexItem sx={{ bgcolor: 'rgba(255,255,255,0.2)', mx: 0.5 }} />\n\t\t\t\t\t\t\t<Tooltip title=\"Text Color\">\n\t\t\t\t\t\t\t\t<IconButton\n\t\t\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\t\t\tsx={{ color: 'white', width: 28, height: 28 }}\n\t\t\t\t\t\t\t\t\tonMouseDown={(e) => {\n\t\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t\t\tsetColorPickerState({ anchor: e.currentTarget, type: 'text' });\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<span style={{ fontSize: '14px', fontWeight: 'bold' }}>A</span>\n\t\t\t\t\t\t\t\t</IconButton>\n\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t\t<Tooltip title=\"Font Size\">\n\t\t\t\t\t\t\t\t<Select\n\t\t\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\t\t\tdefaultValue=\"14px\"\n\t\t\t\t\t\t\t\t\tonChange={handleFontSizeChange}\n\t\t\t\t\t\t\t\t\tsx={{ \n\t\t\t\t\t\t\t\t\t\tcolor: 'white',\n\t\t\t\t\t\t\t\t\t\theight: 28,\n\t\t\t\t\t\t\t\t\t\tminWidth: 70,\n\t\t\t\t\t\t\t\t\t\t'& .MuiOutlinedInput-notchedOutline': { border: 'none' },\n\t\t\t\t\t\t\t\t\t\t'& .MuiSvgIcon-root': { color: 'white' }\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{FONT_SIZES.map(size => (\n\t\t\t\t\t\t\t\t\t\t<MenuItem key={size} value={size}>{size}</MenuItem>\n\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t</Select>\n\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t</Box>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t\n\t\t\t{/* Color Picker Popover */}\n\t\t\t{colorPickerState && (\n\t\t\t\t<Popover\n\t\t\t\t\topen\n\t\t\t\t\tanchorEl={colorPickerState.anchor}\n\t\t\t\t\tonClose={() => setColorPickerState(null)}\n\t\t\t\t\tdisableAutoFocus\n\t\t\t\t\tdisableEnforceFocus\n\t\t\t\t\tanchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}\n\t\t\t\t\ttransformOrigin={{ vertical: 'top', horizontal: 'left' }}\n\t\t\t\t>\n\t\t\t\t\t<Box sx={{ p: 1 }}>\n\t\t\t\t\t\t<Box sx={{ display: 'grid', gridTemplateColumns: 'repeat(8, 20px)', gap: '3px' }}>\n\t\t\t\t\t\t\t{PRESET_COLORS.map((color) => (\n\t\t\t\t\t\t\t\t<Box\n\t\t\t\t\t\t\t\t\tkey={color}\n\t\t\t\t\t\t\t\t\tonMouseDown={(e) => {\n\t\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t\t\tif (colorPickerState.type === 'text') {\n\t\t\t\t\t\t\t\t\t\t\texecCommand('foreColor', color);\n\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\texecCommand('hiliteColor', color);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tsetColorPickerState(null);\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tsx={{\n\t\t\t\t\t\t\t\t\t\twidth: 20,\n\t\t\t\t\t\t\t\t\t\theight: 20,\n\t\t\t\t\t\t\t\t\t\tbgcolor: color,\n\t\t\t\t\t\t\t\t\t\tcursor: 'pointer',\n\t\t\t\t\t\t\t\t\t\tborder: '1px solid rgba(0,0,0,0.15)',\n\t\t\t\t\t\t\t\t\t\tborderRadius: '2px',\n\t\t\t\t\t\t\t\t\t\t'&:hover': { transform: 'scale(1.3)', zIndex: 1, position: 'relative' },\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</Box>\n\t\t\t\t\t</Box>\n\t\t\t\t</Popover>\n\t\t\t)}\n\n\t\t\t{/* Table Picker Popover */}\n\t\t\t{showTablePicker && tablePickerAnchor && (\n\t\t\t\t<>\n\t\t\t\t\t<Box\n\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\tsetShowTablePicker(false);\n\t\t\t\t\t\t\tsetTablePickerAnchor(null);\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tsx={{\n\t\t\t\t\t\t\tposition: 'fixed',\n\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\t\tright: 0,\n\t\t\t\t\t\t\tbottom: 0,\n\t\t\t\t\t\t\tzIndex: 9998\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t\t<TablePicker />\n\t\t\t\t</>\n\t\t\t)}\n\t\t</div>\n\t);\n});\n\nCustomEditor.displayName = 'CustomEditor';\nexport default CustomEditor;"],"names":["adapter","protectedHtml","map","error","jsxs","jsx","_","_a","LinkIcon","ImageIcon","Fragment"],"mappings":";;;;;;;;AAWA,MAAM,gCAAgC;AACtC,IAAI,qBAAqB;AAOzB,MAAM,4BAA4B;AAClC,MAAM,6BAA6B;AACnC,MAAM,4BAA4B;AAS3B,SAAS,kBAAkB,MAAqD;AACrF,QAAM,MAAsB,CAAA;AAC5B,uBAAqB;AAErB,MAAI,gBAAgB;AAKpB,kBAAgB,cAAc,QAAQ,2BAA2B,CAAC,OAAO,IAAI,QAAQ,WAAW;AAE9F,UAAM,cAAc,OAAO,UAAU,GAAG,MAAM;AAC9C,UAAM,mBAAmB,YAAY,YAAY,MAAM;AACvD,UAAM,iBAAiB,YAAY,YAAY,KAAK;AAGpD,QAAI,mBAAmB,gBAAgB;AACrC,aAAO;AAAA,IACT;AAEA,WAAO,OAAO,KAAK;AAAA,EACrB,CAAC;AAID,kBAAgB,cAAc,QAAQ,4BAA4B,CAAC,OAAO,IAAI,QAAQ,WAAW;AAE/F,UAAM,cAAc,OAAO,UAAU,GAAG,MAAM;AAC9C,UAAM,mBAAmB,YAAY,YAAY,MAAM;AACvD,UAAM,iBAAiB,YAAY,YAAY,KAAK;AAGpD,QAAI,mBAAmB,gBAAgB;AACrC,aAAO;AAAA,IACT;AAEA,WAAO,OAAO,KAAK;AAAA,EACrB,CAAC;AAID,kBAAgB,cAAc,QAAQ,2BAA2B,CAAC,OAAO,QAAQ,WAAW;AAE1F,UAAM,cAAc,OAAO,UAAU,GAAG,MAAM;AAC9C,UAAM,mBAAmB,YAAY,YAAY,MAAM;AACvD,UAAM,iBAAiB,YAAY,YAAY,KAAK;AAGpD,QAAI,mBAAmB,gBAAgB;AACrC,aAAO;AAAA,IACT;AAEA,WAAO,OAAO,KAAK;AAAA,EACrB,CAAC;AAKD,kBAAgB,cAAc,QAAQ,oBAAoB,CAAC,OAAO,KAAK,QAAQ,WAAW;AAExF,UAAM,cAAc,OAAO,UAAU,GAAG,MAAM;AAC9C,UAAM,mBAAmB,YAAY,YAAY,MAAM;AACvD,UAAM,iBAAiB,YAAY,YAAY,KAAK;AAEpD,QAAI,mBAAmB,gBAAgB;AACrC,aAAO;AAAA,IACT;AAGA,UAAM,gBAAgB,YAAY,YAAY,+BAA+B;AAC7E,UAAM,cAAc,YAAY,YAAY,SAAS;AAErD,QAAI,gBAAgB,aAAa;AAC/B,aAAO;AAAA,IACT;AAIA,UAAM,cAAc,YAAY,YAAY,GAAG;AAC/C,UAAM,eAAe,YAAY,YAAY,GAAG;AAChD,QAAI,cAAc,cAAc;AAE9B,aAAO;AAAA,IACT;AAEA,UAAM,KAAK,GAAG,6BAA6B,GAAG,oBAAoB;AAClE,QAAI,EAAE,IAAI;AAIV,WAAO,8CAA8C,EAAE,8BAA8B,KAAK;AAAA,EAC5F,CAAC;AAED,SAAO,EAAE,MAAM,eAAe,IAAA;AAChC;AAUO,SAAS,kBAAkB,MAAc,KAA8B;AAC5E,MAAI,eAAe;AAInB,iBAAe,aAAa,QAAQ,0GAA0G,CAAC,OAAO,aAAa;AACjK,WAAO;AAAA,EACT,CAAC;AAID,iBAAe,aAAa,QAAQ,mGAAmG,CAAC,OAAO,aAAa;AAC1J,WAAO;AAAA,EACT,CAAC;AAID,iBAAe,aAAa,QAAQ,0BAA0B,CAAC,OAAO,aAAa;AACjF,WAAO;AAAA,EACT,CAAC;AAID,MAAI,CAAC,KAAK;AACR,UAAM,CAAA;AACN,UAAM,QAAQ;AACd,QAAI;AACJ,YAAQ,QAAQ,MAAM,KAAK,YAAY,OAAO,MAAM;AAClD,UAAI,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC;AAAA,IACzB;AAAA,EACF;AAGA,iBAAe,aAAa;AAAA,IAC1B;AAAA,IACA,CAAC,OAAO,OAAO;AACb,aAAO,IAAK,EAAE,KAAK;AAAA,IACrB;AAAA,EAAA;AAGF,SAAO;AACT;AAOO,SAAS,mBAAmB,MAAuB;AACxD,SAAO,gBAAgB,KAAK,IAAI;AAClC;AAMO,SAAS,kBAAkB,MAAqD;AACrF,MAAI,mBAAmB,IAAI,GAAG;AAC5B,WAAO,kBAAkB,IAAI;AAAA,EAC/B;AACA,SAAO,EAAE,MAAM,KAAK,GAAC;AACvB;AAMO,SAAS,iBAAiB,MAAc,KAA8B;AAC3E,SAAO,kBAAkB,MAAM,GAAG;AACpC;AC7IA,MAAM,gBAAgB;AAAA,EACrB;AAAA,EAAS;AAAA,EAAe;AAAA,EAAW;AAAA,EAAmB;AAAA,EAAgB;AACvE;AAEA,MAAM,aAAa,CAAC,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,MAAM;AAE1F,MAAM,kBAAkB;AAAA,EACvB,EAAE,OAAO,KAAK,OAAO,YAAA;AAAA,EACrB,EAAE,OAAO,MAAM,OAAO,YAAA;AAAA,EACtB,EAAE,OAAO,MAAM,OAAO,YAAA;AAAA,EACtB,EAAE,OAAO,MAAM,OAAO,YAAA;AAAA,EACtB,EAAE,OAAO,MAAM,OAAO,YAAA;AAAA,EACtB,EAAE,OAAO,MAAM,OAAO,YAAA;AAAA,EACtB,EAAE,OAAO,MAAM,OAAO,YAAA;AACvB;AAEA,MAAM,gBAAgB;AAAA,EACrB;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAC9E;AAEO,MAAM,eAAe,WAAmC,CAAC,OAAO,QAAQ;AAC9E,QAAM;AAAA,IACL,WAAW;AAAA,IACX,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA,SAAS,CAAA;AAAA,IACT,GAAG;AAAA,EAAA,IACA;AAEJ,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAuB,IAAI;AACrD,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,OAAO;AACpD,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,MAAM;AAC/C,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAAS,GAAG;AACtD,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,SAAS,KAAK;AAC1D,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,IAAI;AACjD,QAAM,CAAC,SAAS,UAAU,IAAI,SAAmB,CAAC,IAAI,CAAC;AACvD,QAAM,CAAC,cAAc,eAAe,IAAI,SAAS,CAAC;AAClD,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,SAA6B,IAAI;AAC/E,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAAyE,IAAI;AACvH,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,SAAS,KAAK;AAC5D,QAAM,CAAC,mBAAmB,oBAAoB,IAAI,SAA6B,IAAI;AACnF,QAAM,CAAC,qBAAqB,sBAAsB,IAAI,SAA0C,IAAI;AACpG,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,SAAS,KAAK;AAC5D,QAAM,CAAC,kBAAkB,mBAAmB,IAAI,SAA8D,IAAI;AAGlH,QAAM,CAAC,cAAc,eAAe,IAAI,SAAsC,IAAI;AAClF,QAAM,CAAC,kBAAkB,mBAAmB,IAAI,SAAS,KAAK;AAC9D,QAAM,CAAC,sBAAsB,uBAAuB,IAAI,SAA0C,IAAI;AACtG,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,SAAyB;AAAA,IACpE,aAAa;AAAA,IACb,aAAa;AAAA,IACb,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,WAAW;AAAA,IACX,eAAe;AAAA,EAAA,CACf;AAED,QAAM,qBAAqB,OAAuB,IAAI;AACtD,QAAM,gBAAgB,OAAe,IAAI;AACzC,QAAM,oBAAoB,OAAO,MAAM,cAAc;AACrD,QAAM,uBAAuB,OAAO,iBAAiB;AACrD,YAAU,MAAM;AAAE,sBAAkB,UAAU,MAAM;AAAA,EAAgB,CAAC;AACrE,YAAU,MAAM;AAAE,yBAAqB,UAAU;AAAA,EAAmB,CAAC;AAOrE,QAAM,uBAAuB,OAAe,IAAI;AAEhD,QAAM,eAAe,OAAyB,IAAI;AAClD,QAAM,mBAAmB,OAAyB,IAAI;AACtD,QAAM,uBAAuB,OAAyB,IAAI;AAC1D,QAAM,iBAAiB,OAAuF,IAAI;AAClH,QAAM,mBAAmB,OAAkC,EAAE;AAC7D,QAAM,YAAY,aAAA;AAGlB,YAAU,MAAM;AACf,QAAG,CAAC,KAAK;AACT,UAAM,EAAE,MAAM,eAAe,IAAA,IAAQ,kBAAkB,IAAI;AAC3D,qBAAiB,UAAU;AAC3B,kBAAc,UAAU;AAExB,QAAI,mBAAmB,WAAW,mBAAmB,QAAQ,cAAc,eAAe;AACzF,yBAAmB,QAAQ,YAAY;AAAA,IACxC;AAAA,EACD,GAAG,CAAC,IAAI,CAAC;AAGT,YAAU,MAAM;;AACf,YAAQ,IAAI,yCAAwC,mBAAmB,OAAO;AAC9E,QAAI,mBAAmB,SAAS;AAC/B,UAAI;AACH,cAAM,EAAE,MAAM,eAAe,QAAQ,kBAAkB,QAAQ,EAAE;AACjE,yBAAiB,UAAU;AAC3B,2BAAmB,QAAQ,YAAY;AACvC,cAAMA,WAAU;AAAA,UACf,SAAS,MAAM;AAEd,mBAAO,iBAAiB,cAAc,SAAS,iBAAiB,OAAO;AAAA,UACxE;AAAA,UACA,SAAS,CAAC,YAAoB;AAC7B,kBAAM,EAAE,MAAMC,gBAAe,KAAAC,KAAAA,IAAQ,kBAAkB,OAAO;AAC9D,6BAAiB,UAAUA;AAC3B,0BAAc,UAAU;AACxB,gBAAI,mBAAmB,SAAS;AAC/B,iCAAmB,QAAQ,YAAYD;AAAAA,YACxC;AAAA,UACD;AAAA,UACA,OAAO;AAAA,YACN,eAAe,CAAC,aAAqB;AACpC,0BAAY,cAAc,QAAQ;AAAA,YACnC;AAAA,UAAA;AAAA,UAED,MAAM;AAAA,YACL,WAAW;AAAA,cACV,QAAQ,CAAC,SAAiB;AAAA,YAAA;AAAA,YAE3B,SAAS,CAAC,SAAiB;AAAA,UAAA;AAAA,QAC5B;AAGD,mCAAqB,YAArB,8CAA+BD;AAAAA,MAChC,SAAS,GAAG;AACX,gBAAQ,MAAM,qCAAqC,CAAC;AAAA,MACrD;AAAA,IACD;AAAA,EACD,GAAG,CAAA,CAAE;AAGL,QAAM,cAAc,YAAY,CAAC,SAAiB,UAAmB;AACpE,aAAS,YAAY,SAAS,OAAO,KAAK;AAC1C,QAAI,mBAAmB,SAAS;AAC/B,oBAAc,UAAU,mBAAmB,QAAQ;AACnD,oBAAA;AAAA,IACD;AAAA,EACD,GAAG,CAAA,CAAE;AAGL,QAAM,gBAAgB,YAAY,MAAM;AACvC,QAAI,mBAAmB,SAAS;AAC/B,YAAM,aAAa,QAAQ,MAAM,GAAG,eAAe,CAAC;AACpD,iBAAW,KAAK,mBAAmB,QAAQ,SAAS;AACpD,iBAAW,WAAW,MAAM,GAAG,CAAC;AAChC,sBAAgB,WAAW,SAAS,CAAC;AAAA,IACtC;AAAA,EACD,GAAG,CAAC,SAAS,YAAY,CAAC;AAG1B,QAAM,aAAa,YAAY,MAAM;AACpC,QAAI,eAAe,GAAG;AACrB,YAAM,WAAW,eAAe;AAChC,sBAAgB,QAAQ;AACxB,UAAI,mBAAmB,SAAS;AAC/B,2BAAmB,QAAQ,YAAY,QAAQ,QAAQ;AACvD,sBAAc,UAAU,QAAQ,QAAQ;AAAA,MACzC;AAAA,IACD;AAAA,EACD,GAAG,CAAC,SAAS,YAAY,CAAC;AAG1B,QAAM,aAAa,YAAY,MAAM;AACpC,QAAI,eAAe,QAAQ,SAAS,GAAG;AACtC,YAAM,WAAW,eAAe;AAChC,sBAAgB,QAAQ;AACxB,UAAI,mBAAmB,SAAS;AAC/B,2BAAmB,QAAQ,YAAY,QAAQ,QAAQ;AACvD,sBAAc,UAAU,QAAQ,QAAQ;AAAA,MACzC;AAAA,IACD;AAAA,EACD,GAAG,CAAC,SAAS,YAAY,CAAC;AAK1B,QAAM,cAAc,YAAY,MAAM;;AACrC,QAAI,mBAAmB,SAAS;AAC/B,YAAM,aAAa,mBAAmB,QAAQ;AAE9C,oBAAc,UAAU,iBAAiB,YAAY,iBAAiB,OAAO;AAC7E,8BAAkB,YAAlB,2CAA4B,cAAc;AAAA,IAC3C;AAAA,EACD,GAAG,CAAA,CAAE;AAGL,QAAM,qBAAqB,YAAY,CAAC,SAAyB;AAChE,UAAM,MAAM,IAAI,UAAA,EAAY,gBAAgB,MAAM,WAAW;AAG7D,QAAI,iBAAiB,MAAM,EAAE,QAAQ,CAAA,SAAQ;;AAC5C,YAAM,OAAO,SAAS,uBAAA;AACtB,aAAO,KAAK,WAAY,MAAK,YAAY,KAAK,UAAU;AACxD,iBAAK,eAAL,mBAAiB,aAAa,MAAM;AAAA,IACrC,CAAC;AAGD,QAAI,iBAAiB,GAAG,EAAE,QAAQ,CAAA,MAAK;;AACtC,YAAM,OAAO,SAAS,eAAe,EAAE,eAAe,EAAE;AACxD,cAAE,eAAF,mBAAc,aAAa,MAAM;AAAA,IAClC,CAAC;AAGD,QAAI,iBAAiB,8CAA8C,EAAE,QAAQ,CAAA,OAAM;AAClF,SAAG,gBAAgB,OAAO;AAC1B,SAAG,gBAAgB,OAAO;AAC1B,SAAG,gBAAgB,OAAO;AAC1B,SAAG,gBAAgB,SAAS;AAC5B,SAAG,gBAAgB,MAAM;AAAA,IAC1B,CAAC;AAED,WAAO,IAAI,KAAK;AAAA,EACjB,GAAG,CAAA,CAAE;AAGL,QAAM,cAAc,YAAY,CAAC,MAA4B;AAC5D,MAAE,eAAA;AACF,UAAM,OAAO,EAAE,cAAc,QAAQ,WAAW;AAChD,UAAM,OAAO,EAAE,cAAc,QAAQ,YAAY;AAEjD,QAAI,MAAM;AACT,kBAAY,cAAc,mBAAmB,IAAI,CAAC;AAAA,IACnD,OAAO;AACN,kBAAY,cAAc,IAAI;AAAA,IAC/B;AAAA,EACD,GAAG,CAAC,aAAa,kBAAkB,CAAC;AAGpC,QAAM,oBAAoB,YAAY,OAAO,SAAe;;AAC3D,QAAI;AACH,YAAM,SAAS,MAAM,YAAY,CAAC,IAAI,GAAG,UAAU;AACnD,YAAM,QAAQ,SAAA;AACd,YAAM,UAAU;AAAA,QACf,GAAG;AAAA,QACH,gBAAc,WAAM,YAAY,MAAlB,mBAAqB,eAAc;AAAA,QACjD,OAAO,6BAAM,KAAK,MAAM,KAAK;AAAA,QAC7B,MAAM;AAAA,QACN,YAAY;AAAA,QACZ,cAAc;AAAA,QACd,WAAW,KAAK;AAAA,QAChB,UAAU;AAAA,QACV,gBAAgB,6BAAM,KAAK,MAAM,KAAK;AAAA,QACtC,MAAM;AAAA,QACN,WAAW,KAAK;AAAA,QAChB,KAAK,GAAG,uCAAW,WAAW,GAAG,OAAO,CAAC,CAAC;AAAA,MAAA;AAG3C,YAAM,YAAY,OAAO;AACzB,kBAAY,cAAc,aAAa,QAAQ,GAAG,UAAU,KAAK,IAAI,+BAA+B;AAAA,IACrG,SAASG,QAAO;AACf,cAAQ,MAAM,wBAAwBA,MAAK;AAC3C,yCAAUA;AAAAA,IACX;AAAA,EACD,GAAG,CAAC,WAAW,aAAa,OAAO,CAAC;AAGpC,QAAM,mBAAmB,YAAY,CAAC,MAA2C;;AAChF,UAAM,QAAO,OAAE,OAAO,UAAT,mBAAiB;AAC9B,QAAI,MAAM;AACT,wBAAkB,IAAI;AAAA,IACvB;AAAA,EACD,GAAG,CAAC,iBAAiB,CAAC;AAGtB,QAAM,mBAAmB,YAAY,MAAM;AAC1C,UAAM,MAAM,OAAO,YAAY;AAC/B,QAAI,KAAK;AACR,kBAAY,cAAc,GAAG;AAAA,IAC9B;AAAA,EACD,GAAG,CAAC,WAAW,CAAC;AAGU,cAAY,MAAM;AAC3C,UAAM,OAAO,OAAO,mBAAmB,GAAG;AAC1C,UAAM,OAAO,OAAO,sBAAsB,GAAG;AAE7C,QAAI,QAAQ,MAAM;AACjB,UAAI,YAAY;AAChB,mBAAa;AACb,eAAS,IAAI,GAAG,IAAI,SAAS,IAAI,GAAG,KAAK;AACxC,qBAAa;AAAA,MACd;AACA,mBAAa;AACb,eAAS,IAAI,GAAG,IAAI,SAAS,IAAI,GAAG,KAAK;AACxC,qBAAa;AACb,iBAAS,IAAI,GAAG,IAAI,SAAS,IAAI,GAAG,KAAK;AACxC,uBAAa;AAAA,QACd;AACA,qBAAa;AAAA,MACd;AACA,mBAAa;AAEb,kBAAY,cAAc,SAAS;AAAA,IACpC;AAAA,EACD,GAAG,CAAC,WAAW,CAAC;AAGhB,QAAM,cAAc,MAAM;AACzB,UAAM,CAAC,WAAW,YAAY,IAAI,SAA8C,IAAI;AACpF,UAAM,UAAU;AAChB,UAAM,UAAU;AAGhB,UAAM,aAAa,uDAAmB;AACtC,UAAM,kBAAkB,SAAS,cAAc,0BAA0B;AACzE,UAAM,gBAAgB,mDAAiB;AAEvC,QAAI,MAAM;AACV,QAAI,OAAO;AAEX,QAAI,cAAc,eAAe;AAChC,YAAM,WAAW,SAAS,cAAc,MAAM;AAC9C,aAAO,WAAW,OAAO,cAAc;AAAA,IACxC;AAEA,WACCC,kCAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACA,IAAI;AAAA,UACH,UAAU;AAAA,UACV,KAAK,GAAG,GAAG;AAAA,UACX,MAAM,GAAG,IAAI;AAAA,UACb,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,GAAG;AAAA,UACH,WAAW;AAAA,UACX,QAAQ;AAAA,QAAA;AAAA,QAGT,UAAA;AAAA,UAAAC,kCAAAA,IAAC,KAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,qBAAqB,UAAU,OAAO,WAAW,KAAK,OAAO,IAAI,EAAA,GAC3F,UAAA,MAAM,KAAK,EAAE,QAAQ,QAAA,CAAS,EAAE;AAAA,YAAI,CAAC,GAAG,aACxC,MAAM,KAAK,EAAE,QAAQ,QAAA,CAAS,EAAE,IAAI,CAACC,IAAG,aACvCD,kCAAAA;AAAAA,cAAC;AAAA,cAAA;AAAA,gBAEA,cAAc,MAAM,aAAa,EAAE,KAAK,WAAW,GAAG,KAAK,WAAW,GAAG;AAAA,gBACzE,SAAS,MAAM;AACd,8CAA4B,WAAW,GAAG,WAAW,CAAC;AACtD,+BAAa,IAAI;AAAA,gBAClB;AAAA,gBACA,IAAI;AAAA,kBACH,OAAO;AAAA,kBACP,QAAQ;AAAA,kBACR,QAAQ;AAAA,kBACR,SAAS,aAAa,WAAW,UAAU,OAAO,WAAW,UAAU,MAAM,YAAY;AAAA,kBACzF,QAAQ;AAAA,kBACR,WAAW;AAAA,oBACV,SAAS;AAAA,kBAAA;AAAA,gBACV;AAAA,cACD;AAAA,cAfK,GAAG,QAAQ,IAAI,QAAQ;AAAA,YAAA,CAiB7B;AAAA,UAAA,GAEH;AAAA,gDACC,KAAA,EAAI,IAAI,EAAE,WAAW,UAAU,UAAU,QAAQ,OAAO,UACvD,UAAA,YAAY,GAAG,UAAU,GAAG,MAAM,UAAU,GAAG,KAAK,QAAA,CACtD;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAGH;AAGA,QAAM,yBAAyB,YAAY,CAAC,MAAW;AACtD,UAAM,SAAS,EAAE,OAAO;AACxB,kBAAc,MAAM;AACpB,gBAAY,YAAY,MAAM;AAAA,EAC/B,GAAG,CAAC,WAAW,CAAC;AAGhB,QAAM,uBAAuB,YAAY,CAAC,MAAW;;AACpD,UAAM,OAAO,EAAE,OAAO;AACtB,gBAAY,IAAI;AAChB,aAAS,YAAY,YAAY,OAAO,GAAG;AAC3C,QAAI,mBAAmB,SAAS;AAC/B,YAAM,WAAW,MAAM;AAAA,QACtB,mBAAmB,QAAQ,iBAAiB,gBAAgB;AAAA,MAAA;AAE7D,eAAS,QAAQ,CAAA,QAAO;;AACvB,cAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,aAAK,MAAM,WAAW;AACtB,eAAO,IAAI,WAAY,MAAK,YAAY,IAAI,UAAU;AACtD,SAAAE,MAAA,IAAI,eAAJ,gBAAAA,IAAgB,aAAa,MAAM;AAAA,MACpC,CAAC;AACD,oBAAc,UAAU,mBAAmB,QAAQ;AACnD,oBAAA;AACA,8BAAkB,YAAlB,2CAA4B,cAAc;AAAA,IAC3C;AAAA,EACD,GAAG,CAAC,aAAa,CAAC;AAGlB,QAAM,4BAA4B,YAAY,CAAC,MAAW;AACzD,UAAM,SAAS,EAAE,OAAO;AACxB,qBAAiB,MAAM;AACvB,gBAAY,eAAe,IAAI,MAAM,GAAG;AAAA,EACzC,GAAG,CAAC,WAAW,CAAC;AAMhB,QAAM,qBAAqB,YAAY,MAAM;;AAC5C,QAAI,CAAC,gBAAgB;AAGpB,YAAM,eAAa,wBAAmB,YAAnB,mBAA4B,cAAa,cAAc,WAAW;AACrF,YAAM,eAAe,iBAAiB,YAAY,iBAAiB,OAAO;AAG1E,oBAAc,YAAY;AAC1B,2BAAqB,UAAU;AAC/B,oBAAc,UAAU;AAGxB,wBAAkB,IAAI;AAAA,IACvB,OAAO;AAGN,YAAM,gBAAgB,qBAAqB,QAAQ,KAAA;AAEnD,UAAI,CAAC,eAAe;AAEnB,cAAM,cAAc;AACpB,sBAAc,UAAU;AACxB,6BAAqB,UAAU;AAC/B,sBAAc,WAAW;AAAA,MAC1B,OAAO;AACN,sBAAc,UAAU;AAAA,MACzB;AAGA,wBAAkB,KAAK;AAAA,IACxB;AAAA,EACD,GAAG,CAAC,gBAAgB,IAAI,CAAC;AAIzB,QAAM,yBAAyB,OAAO,KAAK;AAE3C,YAAU,MAAM;AAGf,QAAI,CAAC,kBAAkB,mBAAmB,WAAW,CAAC,uBAAuB,SAAS;AACrF,6BAAuB,UAAU;AAEjC,UAAI;AACH,cAAM,gBAAgB,cAAc,QAAQ,KAAA;AAE5C,YAAI,CAAC,eAAe;AACnB,gBAAM,cAAc;AACpB,gBAAM,EAAE,MAAM,eAAe,IAAA,IAAQ,kBAAkB,WAAW;AAClE,2BAAiB,UAAU;AAC3B,6BAAmB,QAAQ,YAAY;AAAA,QACxC,OAAO;AACN,gBAAM,EAAE,MAAM,eAAe,IAAA,IAAQ,kBAAkB,aAAa;AACpE,2BAAiB,UAAU;AAE3B,cAAI,CAAC,iBAAiB,cAAc,KAAA,MAAW,IAAI;AAClD,oBAAQ,KAAK,gDAAgD;AAC7D,+BAAmB,QAAQ,YAAY;AAAA,UACxC,OAAO;AACN,+BAAmB,QAAQ,YAAY;AAAA,UACxC;AAAA,QACD;AAGA,cAAM,aAAa,QAAQ,MAAM,GAAG,eAAe,CAAC;AACpD,mBAAW,KAAK,mBAAmB,QAAQ,SAAS;AACpD,mBAAW,WAAW,MAAM,GAAG,CAAC;AAChC,wBAAgB,WAAW,SAAS,CAAC;AAAA,MACtC,SAASJ,QAAO;AACf,gBAAQ,MAAM,+BAA+BA,MAAK;AAElD,YAAI,mBAAmB,WAAW,cAAc,SAAS;AACxD,cAAI;AACH,+BAAmB,QAAQ,YAAY,cAAc;AAAA,UACtD,SAAS,YAAY;AACpB,oBAAQ,MAAM,0BAA0B,UAAU;AAAA,UACnD;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAGA,QAAI,gBAAgB;AACnB,6BAAuB,UAAU;AAAA,IAClC;AAAA,EACD,GAAG,CAAC,gBAAgB,SAAS,YAAY,CAAC;AAK1C,QAAM,uBAAuB,YAAY,CAAC,MAA2C;;AACpF,UAAM,QAAO,OAAE,OAAO,UAAT,mBAAiB;AAC9B,QAAI,CAAC,KAAM;AAEX,UAAM,SAAS,IAAI,WAAA;AAEnB,WAAO,SAAS,CAAC,UAAU;;AAC1B,YAAM,eAAcI,MAAA,MAAM,WAAN,gBAAAA,IAAc;AAClC,UAAI,aAAa;AAEhB,sBAAc,WAAW;AACzB,6BAAqB,UAAU;AAC/B,sBAAc,UAAU;AAGxB,YAAI,CAAC,kBAAkB,mBAAmB,SAAS;AAClD,cAAI;AACH,kBAAM,EAAE,MAAM,eAAe,IAAA,IAAQ,kBAAkB,WAAW;AAClE,6BAAiB,UAAU;AAC3B,+BAAmB,QAAQ,YAAY;AACvC,0BAAA;AAAA,UACD,SAASJ,QAAO;AACf,oBAAQ,MAAM,mCAAmCA,MAAK;AACtD,kBAAM,mFAAmF;AAAA,UAC1F;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAEA,WAAO,UAAU,MAAM;AACtB,YAAM,6CAA6C;AAAA,IACpD;AAEA,WAAO,WAAW,IAAI;AAGtB,MAAE,OAAO,QAAQ;AAAA,EAClB,GAAG,CAAC,gBAAgB,aAAa,CAAC;AAKlC,QAAM,yBAAyB,YAAY,CAAC,MAA8C;AACzF,UAAM,UAAU,EAAE,OAAO;AACzB,kBAAc,OAAO;AACrB,yBAAqB,UAAU;AAAA,EAChC,GAAG,CAAA,CAAE;AAGL,QAAM,qBAAqB,YAAY,CAAC,MAAwB;;AAC/D,UAAM,SAAS,EAAE;AAGjB,QAAI,kBAAsC;AAE1C,QAAI,OAAO,YAAY,OAAO;AAC7B,QAAE,eAAA;AACF,QAAE,gBAAA;AACF,wBAAkB;AAAA,IACnB,WAAW,OAAO,YAAY,SAAS;AACtC,QAAE,eAAA;AACF,QAAE,gBAAA;AACF,wBAAkB;AAAA,IACnB,WAAW,OAAO,YAAY,QAAQ,OAAO,YAAY,QAAQ,OAAO,YAAY,QAAQ,OAAO,YAAY,WAAW,OAAO,YAAY,SAAS;AAErJ,QAAE,eAAA;AACF,QAAE,gBAAA;AACF,wBAAkB,OAAO,QAAQ,OAAO;AAAA,IACzC;AAEA,QAAI,iBAAiB;AACpB,yBAAmB,eAAe;AAElC,YAAM,OAAO,gBAAgB,sBAAA;AAC7B,YAAM,iBAAgB,wBAAmB,YAAnB,mBAA4B;AAElD,UAAI,eAAe;AAClB,yBAAiB;AAAA,UAChB,GAAG,KAAK,OAAO,cAAc;AAAA,UAC7B,GAAG,KAAK,MAAM,cAAc;AAAA,UAC5B,OAAO,KAAK;AAAA,UACZ,QAAQ,KAAK;AAAA,QAAA,CACb;AAAA,MACF;AAAA,IACD,OAAO;AACN,yBAAmB,IAAI;AACvB,uBAAiB,IAAI;AAAA,IACtB;AAAA,EACD,GAAG,CAAA,CAAE;AAGL,QAAM,uBAAuB,YAAY,MAAM;AAC9C,QAAI,iBAAiB;AACpB,sBAAgB,OAAA;AAChB,yBAAmB,IAAI;AACvB,uBAAiB,IAAI;AACrB,UAAI,mBAAmB,SAAS;AAC/B,sBAAc,UAAU,mBAAmB,QAAQ;AACnD,sBAAA;AAAA,MACD;AAAA,IACD;AAAA,EACD,GAAG,CAAC,iBAAiB,aAAa,CAAC;AAGnC,QAAM,qBAAqB,YAAY,OAAO,SAAe;;AAC5D,QAAI,CAAC,mBAAmB,gBAAgB,YAAY,MAAO;AAE3D,QAAI;AACH,YAAM,SAAS,MAAM,YAAY,CAAC,IAAI,GAAG,UAAU;AACnD,YAAM,QAAQ,SAAA;AACd,YAAM,UAAU;AAAA,QACf,GAAG;AAAA,QACH,gBAAc,WAAM,YAAY,MAAlB,mBAAqB,eAAc;AAAA,QACjD,OAAO,6BAAM,KAAK,MAAM,KAAK;AAAA,QAC7B,MAAM;AAAA,QACN,YAAY;AAAA,QACZ,cAAc;AAAA,QACd,WAAW,KAAK;AAAA,QAChB,UAAU;AAAA,QACV,gBAAgB,6BAAM,KAAK,MAAM,KAAK;AAAA,QACtC,MAAM;AAAA,QACN,WAAW,KAAK;AAAA,QAChB,KAAK,GAAG,uCAAW,WAAW,GAAG,OAAO,CAAC,CAAC;AAAA,MAAA;AAG3C,YAAM,YAAY,OAAO;AACxB,sBAAqC,MAAM,QAAQ;AAEpD,UAAI,mBAAmB,SAAS;AAC/B,sBAAc,UAAU,mBAAmB,QAAQ;AACnD,sBAAA;AAAA,MACD;AAAA,IACD,SAASA,QAAO;AACf,cAAQ,MAAM,wBAAwBA,MAAK;AAC3C,yCAAUA;AAAAA,IACX;AAAA,EACD,GAAG,CAAC,iBAAiB,WAAW,SAAS,aAAa,CAAC;AAGvD,QAAM,2BAA2B,YAAY,CAAC,MAA2C;;AACxF,UAAM,QAAO,OAAE,OAAO,UAAT,mBAAiB;AAC9B,QAAI,MAAM;AACT,yBAAmB,IAAI;AAAA,IACxB;AAAA,EACD,GAAG,CAAC,kBAAkB,CAAC;AAGvB,QAAM,sBAAsB,YAAY,MAAM;;AAC7C,UAAM,YAAY,OAAO,aAAA;AACzB,QAAI,aAAa,CAAC,UAAU,eAAe,UAAU,aAAa,GAAG;AACpE,YAAM,QAAQ,UAAU,WAAW,CAAC;AACpC,YAAM,OAAO,MAAM,sBAAA;AACnB,YAAM,iBAAgB,wBAAmB,YAAnB,mBAA4B;AAElD,UAAI,iBAAiB,KAAK,QAAQ,GAAG;AACpC,+BAAuB;AAAA,UACtB,GAAG,KAAK,OAAO,KAAK,QAAQ;AAAA,UAC5B,GAAG,KAAK,MAAM;AAAA,QAAA,CACd;AACD,2BAAmB,IAAI;AAAA,MACxB;AAIA,UAAI,OAAoB,UAAU;AAClC,WAAI,6BAAM,cAAa,KAAK,kBAAkB,KAAK;AACnD,UAAI,eAA8B;AAClC,UAAI,UAAU,gBAAgB,cAAc,OAAO;AACnD,aAAO,WAAW,YAAY,mBAAmB,SAAS;AACzD,YAAI,QAAQ,MAAM,UAAU;AAC3B,yBAAe,QAAQ,MAAM;AAC7B;AAAA,QACD;AACA,kBAAU,QAAQ;AAAA,MACnB;AACA,kBAAY,gBAAgB,MAAM;AAAA,IACnC,OAAO;AACN,yBAAmB,KAAK;AACxB,6BAAuB,IAAI;AAAA,IAC5B;AAAA,EACD,GAAG,CAAA,CAAE;AAGL,QAAM,oBAAoB,YAAY,CAAC,GAAqB,WAAmB;AAC9E,MAAE,eAAA;AACF,MAAE,gBAAA;AAEF,QAAI,mBAAmB,eAAe;AACrC,qBAAe,UAAU;AAAA,QACxB,GAAG,EAAE;AAAA,QACL,GAAG,EAAE;AAAA,QACL,OAAO,cAAc;AAAA,QACrB,QAAQ,cAAc;AAAA,QACtB;AAAA,MAAA;AAID,eAAS,iBAAiB,aAAa,gBAAuB;AAC9D,eAAS,iBAAiB,WAAW,eAAe;AAAA,IACrD;AAAA,EACD,GAAG,CAAC,iBAAiB,aAAa,CAAC;AAGnC,QAAM,mBAAmB,YAAY,CAAC,MAAkB;;AACvD,QAAI,CAAC,eAAe,WAAW,CAAC,mBAAmB,CAAC,cAAe;AAEnE,UAAM,EAAE,GAAG,GAAG,OAAO,QAAQ,OAAA,IAAW,eAAe;AACvD,UAAM,SAAS,EAAE,UAAU;AAC3B,UAAM,SAAS,EAAE,UAAU;AAE3B,QAAI,WAAW;AACf,QAAI,YAAY;AAEhB,QAAI,OAAO,SAAS,GAAG,GAAG;AACzB,iBAAW,KAAK,IAAI,IAAI,QAAQ,MAAM;AAAA,IACvC;AACA,QAAI,OAAO,SAAS,GAAG,GAAG;AAEzB,iBAAW,KAAK,IAAI,IAAI,QAAQ,MAAM;AAAA,IACvC;AACA,QAAI,OAAO,SAAS,GAAG,GAAG;AACzB,kBAAY,KAAK,IAAI,IAAI,SAAS,MAAM;AAAA,IACzC;AACA,QAAI,OAAO,SAAS,GAAG,GAAG;AACzB,kBAAY,KAAK,IAAI,IAAI,SAAS,MAAM;AAAA,IACzC;AAGA,QAAI,OAAO,WAAW,KAAK,gBAAgB,YAAY,OAAO;AAC7D,YAAM,cAAc,QAAQ;AAC5B,kBAAY,WAAW;AAAA,IACxB;AAEA,oBAAgB,MAAM,QAAQ,GAAG,QAAQ;AACzC,QAAI,gBAAgB,YAAY,SAAS,gBAAgB,YAAY,SAAS;AAC7E,sBAAgB,MAAM,SAAS,GAAG,SAAS;AAAA,IAC5C;AAGA,UAAM,OAAO,gBAAgB,sBAAA;AAC7B,UAAM,iBAAgB,wBAAmB,YAAnB,mBAA4B;AAElD,QAAI,eAAe;AAClB,uBAAiB;AAAA,QAChB,GAAG,KAAK,OAAO,cAAc;AAAA,QAC7B,GAAG,KAAK,MAAM,cAAc;AAAA,QAC5B,OAAO,KAAK;AAAA,QACZ,QAAQ,KAAK;AAAA,MAAA,CACb;AAAA,IACF;AAAA,EACD,GAAG,CAAC,iBAAiB,aAAa,CAAC;AAGnC,QAAM,kBAAkB,YAAY,MAAM;AACzC,aAAS,oBAAoB,aAAa,gBAAuB;AACjE,aAAS,oBAAoB,WAAW,eAAe;AAEvD,mBAAe,UAAU;AACzB,QAAI,mBAAmB,SAAS;AAC/B,oBAAc,UAAU,mBAAmB,QAAQ;AACnD,oBAAA;AAAA,IACD;AAAA,EACD,GAAG,CAAC,kBAAkB,aAAa,CAAC;AAGpC,QAAM,wBAAwB,YAAY,CAAC,MAA2C;AACrF,yBAAqB,EAAE,aAAa;AACpC,uBAAmB,IAAI;AAAA,EACxB,GAAG,CAAA,CAAE;AAGL,QAAM,8BAA8B,YAAY,CAAC,MAAc,SAAiB;AAE/E,QAAI,mBAAmB,SAAS;AAC/B,yBAAmB,QAAQ,MAAA;AAAA,IAC5B;AAGA,QAAI,YAAY;AAChB,iBAAa;AACb,aAAS,IAAI,GAAG,IAAI,MAAM,KAAK;AAC9B,mBAAa;AACb,eAAS,IAAI,GAAG,IAAI,MAAM,KAAK;AAC9B,qBAAa;AAAA,MACd;AACA,mBAAa;AAAA,IACd;AACA,iBAAa;AAGb,aAAS,YAAY,cAAc,OAAO,SAAS;AAGnD,QAAI,mBAAmB,SAAS;AAC/B,oBAAc,UAAU,mBAAmB,QAAQ;AACnD,oBAAA;AAAA,IACD;AAGA,uBAAmB,KAAK;AACxB,yBAAqB,IAAI;AAAA,EAC1B,GAAG,CAAC,aAAa,CAAC;AAGlB,QAAM,UAAU;AAAA,IACf,SAAS,MAAM;AAEd,aAAO,iBAAiB,cAAc,SAAS,iBAAiB,OAAO;AAAA,IACxE;AAAA,IACA,SAAS,CAAC,YAAoB;AAC7B,YAAM,EAAE,MAAM,eAAe,IAAA,IAAQ,kBAAkB,OAAO;AAC9D,uBAAiB,UAAU;AAC3B,oBAAc,UAAU;AACxB,UAAI,mBAAmB,SAAS;AAC/B,2BAAmB,QAAQ,YAAY;AAAA,MACxC;AAAA,IACD;AAAA,IACA,OAAO;AAAA,MACN,eAAe,CAAC,aAAqB;AACpC,oBAAY,cAAc,QAAQ;AAAA,MACnC;AAAA,IAAA;AAAA,IAED,MAAM;AAAA,MACL,WAAW;AAAA,QACV,QAAQ,CAAC,SAAiB;AAAA,MAAA;AAAA,MAE3B,SAAS,CAAC,SAAiB;AAAA,IAAA;AAAA,EAC5B;AAGD,sBAAoB,KAAK,MAAM,SAAS,EAAE;AAE1C,YAAU,MAAM;AACf,QAAI,eAAe;AACjB,oBAAsB,UAAU;AAAA,IAClC;AAAA,EACD,GAAG,CAAC,aAAa,CAAC;AAGlB,QAAM,aAAa,CAAC,SAAiB,UAAmB,CAAC,MAAwB;AAChF,MAAE,eAAA;AACF,gBAAY,SAAS,KAAK;AAAA,EAC3B;AAEA,MAAI,OAAO;AACV,WACCC,kCAAAA,KAAC,OAAA,EAAI,WAAU,0BACd,UAAA;AAAA,MAAAA,kCAAAA,KAAC,OAAA,EAAI,WAAU,wBAAuB,UAAA;AAAA,QAAA;AAAA,QAAe,MAAM;AAAA,MAAA,GAAQ;AAAA,MACnEC,kCAAAA,IAAC,YAAO,SAAS,MAAM,SAAS,IAAI,GAAG,WAAU,uBAAsB,UAAA,QAAA,CAEvE;AAAA,IAAA,GACD;AAAA,EAEF;AAEA,SACCD,kCAAAA,KAAC,OAAA,EAAI,WAAU,2BAEd,UAAA;AAAA,IAAAA,uCAAC,OAAI,IAAI;AAAA,MACR,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,KAAK;AAAA,MACL,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,cAAc;AAAA,MACd,SAAS;AAAA,MACT,UAAU;AAAA,IAAA,GAEV,UAAA;AAAA,MAAAC,kCAAAA,IAAC,QAAA,EAAK,OAAO,EAAE,QAAQ,WAAW,OAAO,OAAA,GAAU,UAAA,OAAA,CAAI;AAAA,MACvDA,kCAAAA,IAAC,UAAK,OAAO,EAAE,QAAQ,WAAW,OAAO,OAAA,GAAU,UAAA,OAAA,CAAI;AAAA,MACvDA,kCAAAA,IAAC,UAAK,OAAO,EAAE,QAAQ,WAAW,OAAO,OAAA,GAAU,UAAA,SAAA,CAAM;AAAA,MACzDA,kCAAAA,IAAC,UAAK,OAAO,EAAE,QAAQ,WAAW,OAAO,OAAA,GAAU,UAAA,SAAA,CAAM;AAAA,MACzDA,kCAAAA,IAAC,UAAK,OAAO,EAAE,QAAQ,WAAW,OAAO,OAAA,GAAU,UAAA,OAAA,CAAI;AAAA,IAAA,GACxD;AAAA,IAGAD,uCAAC,OAAI,IAAI;AAAA,MACR,SAAS;AAAA,MACT,UAAU;AAAA,MACV,KAAK;AAAA,MACL,GAAG;AAAA,MACH,cAAc;AAAA,MACd,SAAS;AAAA,MACT,YAAY;AAAA,IAAA,GAGZ,UAAA;AAAA,MAAAC,kCAAAA,IAAC,SAAA,EAAQ,OAAO,iBAAiB,qBAAqB,oBACrD,UAAAD,kCAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACA,SAAS;AAAA,UACT,IAAI;AAAA,YACH,SAAS;AAAA,YACT,YAAY;AAAA,YACZ,KAAK;AAAA,YACL,IAAI;AAAA,YACJ,IAAI;AAAA,YACJ,QAAQ;AAAA,YACR,cAAc;AAAA,YACd,QAAQ;AAAA,YACR,aAAa,iBAAiB,iBAAiB;AAAA,YAC/C,SAAS,iBAAiB,eAAe;AAAA,YACzC,OAAO,iBAAiB,iBAAiB;AAAA,YACzC,WAAW;AAAA,cACV,SAAS,iBAAiB,gBAAgB;AAAA,YAAA;AAAA,YAE3C,YAAY;AAAA,YACZ,YAAY;AAAA,UAAA;AAAA,UAIb,UAAA;AAAA,YAAAA,kCAAAA,KAAC,OAAA,EAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,OAAM,8BACjE,UAAA;AAAA,cAAAC,kCAAAA,IAAC,QAAA,EAAK,GAAE,kFAAiF,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ,gBAAe,SAAQ,MAAK,QAAM;AAAA,cACzLA,kCAAAA,IAAC,YAAA,EAAS,QAAO,kBAAiB,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ,gBAAe,SAAQ,MAAK,QAAM;AAAA,cAClIA,kCAAAA,IAAC,QAAA,EAAK,GAAE,mBAAkB,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ,gBAAe,QAAA,CAAO;AAAA,cAC9GA,kCAAAA,IAAC,QAAA,EAAK,GAAE,sBAAqB,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ,gBAAe,QAAA,CAAO;AAAA,cACjHA,kCAAAA,IAAC,QAAA,EAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,QAAO,gBAAe,aAAY,OAAM,eAAc,QAAA,CAAO;AAAA,YAAA,GACpG;AAAA,YACAA,kCAAAA,IAAC,UAAK,OAAO,EAAE,UAAU,QAAQ,YAAY,IAAA,GAAO,UAAA,SAAA,CAAM;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA,GAE5D;AAAA,MAEAA,kCAAAA,IAAC,SAAA,EAAQ,aAAY,YAAW,UAAQ,MAAC,IAAI,EAAE,IAAI,IAAA,EAAI,CAAG;AAAA,4CAGzD,SAAA,EAAQ,OAAM,QACd,UAAAA,kCAAAA,IAAC,YAAA,EAAW,MAAK,SAAQ,SAAS,YAAY,UAAU,iBAAiB,GACxE,UAAAA,kCAAAA,IAAC,QAAK,UAAS,SAAQ,GACxB,EAAA,CACD;AAAA,MACAA,kCAAAA,IAAC,WAAQ,OAAM,QACd,gDAAC,YAAA,EAAW,MAAK,SAAQ,SAAS,YAAY,UAAU,iBAAiB,QAAQ,SAAS,GACzF,UAAAA,kCAAAA,IAAC,QAAK,UAAS,SAAQ,GACxB,EAAA,CACD;AAAA,MAEAA,kCAAAA,IAAC,SAAA,EAAQ,aAAY,YAAW,UAAQ,MAAC,IAAI,EAAE,IAAI,IAAA,EAAI,CAAG;AAAA,MAG1DA,kCAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACA,OAAO;AAAA,UACP,UAAU;AAAA,UACV,MAAK;AAAA,UACL,IAAI,EAAE,UAAU,KAAK,QAAQ,IAAI,UAAU,OAAA;AAAA,UAE1C,UAAA,gBAAgB,IAAI,CAAA,WACpBA,kCAAAA,IAAC,UAAA,EAA4B,OAAO,OAAO,OACzC,UAAA,OAAO,MAAA,GADM,OAAO,KAEtB,CACA;AAAA,QAAA;AAAA,MAAA;AAAA,MAIFA,kCAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACA,OAAO;AAAA,UACP,UAAU;AAAA,UACV,MAAK;AAAA,UACL,IAAI,EAAE,UAAU,KAAK,QAAQ,IAAI,UAAU,OAAA;AAAA,UAE1C,UAAA,cAAc,IAAI,CAAA,SAClBA,kCAAAA,IAAC,YAAoB,OAAO,MAAM,OAAO,EAAE,YAAY,KAAA,GACrD,UAAA,KAAA,GADa,IAEf,CACA;AAAA,QAAA;AAAA,MAAA;AAAA,MAIFA,kCAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACA,OAAO;AAAA,UACP,UAAU;AAAA,UACV,MAAK;AAAA,UACL,IAAI,EAAE,UAAU,IAAI,QAAQ,IAAI,UAAU,OAAA;AAAA,UAEzC,UAAA,WAAW,IAAI,CAAA,SACfA,kCAAAA,IAAC,YAAoB,OAAO,MAAO,UAAA,KAAA,GAApB,IAAyB,CACxC;AAAA,QAAA;AAAA,MAAA;AAAA,MAGFA,kCAAAA,IAAC,SAAA,EAAQ,aAAY,YAAW,UAAQ,MAAC,IAAI,EAAE,IAAI,IAAA,EAAI,CAAG;AAAA,4CAGzD,SAAA,EAAQ,OAAM,QACd,UAAAA,kCAAAA,IAAC,cAAW,MAAK,SAAQ,aAAa,WAAW,MAAM,GACtD,UAAAA,sCAAC,cAAW,UAAS,QAAA,CAAQ,GAC9B,GACD;AAAA,4CACC,SAAA,EAAQ,OAAM,UACd,UAAAA,kCAAAA,IAAC,cAAW,MAAK,SAAQ,aAAa,WAAW,QAAQ,GACxD,UAAAA,sCAAC,gBAAa,UAAS,QAAA,CAAQ,GAChC,GACD;AAAA,4CACC,SAAA,EAAQ,OAAM,aACd,UAAAA,kCAAAA,IAAC,cAAW,MAAK,SAAQ,aAAa,WAAW,WAAW,GAC3D,UAAAA,sCAAC,oBAAiB,UAAS,QAAA,CAAQ,GACpC,GACD;AAAA,4CACC,SAAA,EAAQ,OAAM,iBACd,UAAAA,kCAAAA,IAAC,cAAW,MAAK,SAAQ,aAAa,WAAW,eAAe,GAC/D,UAAAA,sCAAC,uBAAoB,UAAS,QAAA,CAAQ,GACvC,GACD;AAAA,4CACC,SAAA,EAAQ,OAAM,aACd,UAAAA,kCAAAA,IAAC,cAAW,MAAK,SAAQ,aAAa,WAAW,WAAW,GAC3D,UAAAA,sCAAC,aAAU,UAAS,QAAA,CAAQ,GAC7B,GACD;AAAA,4CACC,SAAA,EAAQ,OAAM,eACd,UAAAA,kCAAAA,IAAC,cAAW,MAAK,SAAQ,aAAa,WAAW,aAAa,GAC7D,UAAAA,sCAAC,eAAY,UAAS,QAAA,CAAQ,GAC/B,GACD;AAAA,MAEAA,kCAAAA,IAAC,SAAA,EAAQ,aAAY,YAAW,UAAQ,MAAC,IAAI,EAAE,IAAI,IAAA,EAAI,CAAG;AAAA,MAG1DA,kCAAAA,IAAC,SAAA,EAAQ,OAAM,cACd,UAAAA,kCAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACA,MAAK;AAAA,UACL,aAAa,CAAC,MAAM;AACnB,cAAE,eAAA;AACF,gCAAoB,EAAE,QAAQ,EAAE,eAAe,MAAM,QAAQ;AAAA,UAC9D;AAAA,UACA,OAAO,EAAE,OAAO,IAAI,QAAQ,IAAI,QAAQ,kBAAkB,cAAc,OAAO,iBAAiB,QAAA;AAAA,UAEhG,UAAAA,kCAAAA,IAAC,QAAA,EAAK,OAAO,EAAE,UAAU,QAAQ,YAAY,QAAQ,OAAO,OAAA,GAAU,UAAA,IAAA,CAAC;AAAA,QAAA;AAAA,MAAA,GAEzE;AAAA,MACAA,kCAAAA,IAAC,SAAA,EAAQ,OAAM,oBACd,UAAAA,kCAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACA,MAAK;AAAA,UACL,aAAa,CAAC,MAAM;AACnB,cAAE,eAAA;AACF,gCAAoB,EAAE,QAAQ,EAAE,eAAe,MAAM,MAAM;AAAA,UAC5D;AAAA,UACA,OAAO,EAAE,OAAO,IAAI,QAAQ,IAAI,QAAQ,kBAAkB,cAAc,OAAO,iBAAiB,UAAA;AAAA,UAEhG,UAAAA,kCAAAA,IAAC,QAAA,EAAK,OAAO,EAAE,UAAU,QAAQ,YAAY,QAAQ,OAAO,OAAA,GAAU,UAAA,IAAA,CAAC;AAAA,QAAA;AAAA,MAAA,GAEzE;AAAA,MAEAA,kCAAAA,IAAC,SAAA,EAAQ,aAAY,YAAW,UAAQ,MAAC,IAAI,EAAE,IAAI,IAAA,EAAI,CAAG;AAAA,4CAGzD,SAAA,EAAQ,OAAM,cACd,UAAAA,kCAAAA,IAAC,cAAW,MAAK,SAAQ,aAAa,WAAW,aAAa,GAC7D,UAAAA,sCAAC,mBAAgB,UAAS,QAAA,CAAQ,GACnC,GACD;AAAA,4CACC,SAAA,EAAQ,OAAM,gBACd,UAAAA,kCAAAA,IAAC,cAAW,MAAK,SAAQ,aAAa,WAAW,eAAe,GAC/D,UAAAA,sCAAC,qBAAkB,UAAS,QAAA,CAAQ,GACrC,GACD;AAAA,4CACC,SAAA,EAAQ,OAAM,eACd,UAAAA,kCAAAA,IAAC,cAAW,MAAK,SAAQ,aAAa,WAAW,cAAc,GAC9D,UAAAA,sCAAC,oBAAiB,UAAS,QAAA,CAAQ,GACpC,GACD;AAAA,4CACC,SAAA,EAAQ,OAAM,WACd,UAAAA,kCAAAA,IAAC,cAAW,MAAK,SAAQ,aAAa,WAAW,aAAa,GAC7D,UAAAA,sCAAC,sBAAmB,UAAS,QAAA,CAAQ,GACtC,GACD;AAAA,MAEAA,kCAAAA,IAAC,SAAA,EAAQ,aAAY,YAAW,UAAQ,MAAC,IAAI,EAAE,IAAI,IAAA,EAAI,CAAG;AAAA,4CAGzD,SAAA,EAAQ,OAAM,eACd,UAAAA,kCAAAA,IAAC,cAAW,MAAK,SAAQ,aAAa,WAAW,qBAAqB,GACrE,UAAAA,sCAAC,sBAAmB,UAAS,QAAA,CAAQ,GACtC,GACD;AAAA,4CACC,SAAA,EAAQ,OAAM,iBACd,UAAAA,kCAAAA,IAAC,cAAW,MAAK,SAAQ,aAAa,WAAW,mBAAmB,GACnE,UAAAA,sCAAC,sBAAmB,UAAS,QAAA,CAAQ,GACtC,GACD;AAAA,MAEAA,kCAAAA,IAAC,SAAA,EAAQ,aAAY,YAAW,UAAQ,MAAC,IAAI,EAAE,IAAI,IAAA,EAAI,CAAG;AAAA,MAG1DA,sCAAC,SAAA,EAAQ,OAAM,eACd,gDAAC,YAAA,EAAW,MAAK,SAAQ,SAAS,kBACjC,UAAAA,kCAAAA,IAACG,MAAA,EAAS,UAAS,QAAA,CAAQ,GAC5B,GACD;AAAA,4CACC,SAAA,EAAQ,OAAM,gBACd,UAAAH,kCAAAA,IAAC,YAAA,EAAW,MAAK,SAAQ,SAAS;;AAAM,kCAAa,YAAb,mBAAsB;AAAA,SAC7D,UAAAA,kCAAAA,IAACI,SAAU,UAAS,SAAQ,GAC7B,EAAA,CACD;AAAA,MACAJ,sCAAC,SAAA,EAAQ,OAAM,gBACd,gDAAC,YAAA,EAAW,MAAK,SAAQ,SAAS,uBACjC,UAAAA,kCAAAA,IAAC,YAAA,EAAW,UAAS,QAAA,CAAQ,GAC9B,GACD;AAAA,4CACC,SAAA,EAAQ,OAAM,QACd,UAAAA,kCAAAA,IAAC,YAAA,EAAW,MAAK,SAAQ,aAAa,WAAW,eAAe,OAAO,GACtE,UAAAA,kCAAAA,IAAC,QAAK,UAAS,SAAQ,GACxB,EAAA,CACD;AAAA,IAAA,GACD;AAAA,IAGAA,kCAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACA,KAAK;AAAA,QACL,MAAK;AAAA,QACL,QAAO;AAAA,QACP,OAAO,EAAE,SAAS,OAAA;AAAA,QAClB,UAAU;AAAA,MAAA;AAAA,IAAA;AAAA,IAIXA,kCAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACA,KAAK;AAAA,QACL,MAAK;AAAA,QACL,QAAO;AAAA,QACP,OAAO,EAAE,SAAS,OAAA;AAAA,QAClB,UAAU;AAAA,MAAA;AAAA,IAAA;AAAA,IAIXA,kCAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACA,KAAK;AAAA,QACL,MAAK;AAAA,QACL,QAAO;AAAA,QACP,OAAO,EAAE,SAAS,OAAA;AAAA,QAClB,UAAU;AAAA,MAAA;AAAA,IAAA;AAAA,IAIV,iBACAA,kCAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACA,OAAO;AAAA,QACP,UAAU;AAAA,QACV,WAAU;AAAA,QACV,OAAO;AAAA,UACN,OAAO;AAAA,UACP,WAAW;AAAA,UACX,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,YAAY;AAAA,UACZ,QAAQ;AAAA,QAAA;AAAA,MACT;AAAA,IAAA,IAGDD,kCAAAA,KAAC,OAAA,EAAI,OAAO,EAAE,UAAU,cACvB,UAAA;AAAA,MAAAC,kCAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACA,KAAK;AAAA,UACL,iBAAe;AAAA,UACf,WAAU;AAAA,UACV,SAAS;AAAA,UACT,SAAS;AAAA,UACT,SAAS;AAAA,UACT,WAAW;AAAA,UACX,SAAS;AAAA,UACT,OAAO;AAAA,YACN,WAAW;AAAA,YACX,SAAS;AAAA,YACT,QAAQ;AAAA,YACR,WAAW;AAAA,YACX,SAAS;AAAA,YACT,YAAY;AAAA,YACZ,UAAU;AAAA,YACV,YAAY;AAAA,YACZ,iBAAiB;AAAA,UAAA;AAAA,UAEjB,GAAG;AAAA,QAAA;AAAA,MAAA;AAAA,MAIJ,mBAAmB,iBACnBD,kCAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACA,OAAO;AAAA,YACN,UAAU;AAAA,YACV,MAAM,cAAc;AAAA,YACpB,KAAK,cAAc;AAAA,YACnB,OAAO,cAAc;AAAA,YACrB,QAAQ,cAAc;AAAA,YACtB,QAAQ;AAAA,YACR,eAAe;AAAA,YACf,QAAQ;AAAA,UAAA;AAAA,UAIT,UAAA;AAAA,YAAAA,kCAAAA;AAAAA,cAAC;AAAA,cAAA;AAAA,gBACA,IAAI;AAAA,kBACH,UAAU;AAAA,kBACV,KAAK;AAAA,kBACL,MAAM;AAAA,kBACN,SAAS;AAAA,kBACT,KAAK;AAAA,kBACL,SAAS;AAAA,kBACT,QAAQ;AAAA,kBACR,cAAc;AAAA,kBACd,GAAG;AAAA,kBACH,WAAW;AAAA,kBACX,eAAe;AAAA,gBAAA;AAAA,gBAGf,UAAA;AAAA,kBAAA,gBAAgB,YAAY,SAC5BC,kCAAAA,IAAC,SAAA,EAAQ,OAAM,iBACd,UAAAA,kCAAAA;AAAAA,oBAAC;AAAA,oBAAA;AAAA,sBACA,MAAK;AAAA,sBACL,SAAS,MAAA;;AAAM,0DAAqB,YAArB,mBAA8B;AAAA;AAAA,sBAC7C,IAAI,EAAE,OAAO,IAAI,QAAQ,GAAA;AAAA,sBAEzB,gDAAC,WAAA,EAAU,IAAI,EAAE,UAAU,KAAG,CAAG;AAAA,oBAAA;AAAA,kBAAA,GAEnC;AAAA,kBAEA,gBAAgB,YAAY,WAC5BD,kCAAAA,KAAAM,kBAAAA,UAAA,EACC,UAAA;AAAA,oBAAAL,kCAAAA,IAAC,SAAA,EAAQ,OAAM,WACd,UAAAA,kCAAAA;AAAAA,sBAAC;AAAA,sBAAA;AAAA,wBACA,MAAK;AAAA,wBACL,SAAS,MAAM;AACd,gCAAM,QAAQ,gBAAgB,cAAc,OAAO;AACnD,8BAAI,OAAO;AACV,kCAAM,WAAW,gBAAgB,iBAAiB,sCAAsC,EAAE,UAAU;AACpG,kCAAM,KAAK,SAAS,cAAc,IAAI;AACtC,qCAAS,IAAI,GAAG,IAAI,UAAU,KAAK;AAClC,oCAAM,KAAK,SAAS,cAAc,IAAI;AACtC,iCAAG,MAAM,UAAU;AACnB,iCAAG,YAAY,EAAE;AAAA,4BAClB;AACA,kCAAM,YAAY,EAAE;AACpB,gCAAI,mBAAmB,QAAS,eAAc,UAAU,mBAAmB,QAAQ;AAAA,0BACpF;AAAA,wBACD;AAAA,wBACA,IAAI,EAAE,OAAO,IAAI,QAAQ,GAAA;AAAA,wBAEzB,gDAAC,kBAAA,EAAiB,IAAI,EAAE,UAAU,KAAG,CAAG;AAAA,sBAAA;AAAA,oBAAA,GAE1C;AAAA,oBACAA,kCAAAA,IAAC,SAAA,EAAQ,OAAM,cACd,UAAAA,kCAAAA;AAAAA,sBAAC;AAAA,sBAAA;AAAA,wBACA,MAAK;AAAA,wBACL,SAAS,MAAM;AACd,gCAAM,OAAO,gBAAgB,iBAAiB,UAAU;AACxD,8BAAI,KAAK,SAAS,GAAG;AACpB,iCAAK,KAAK,SAAS,CAAC,EAAE,OAAA;AACtB,gCAAI,mBAAmB,QAAS,eAAc,UAAU,mBAAmB,QAAQ;AAAA,0BACpF;AAAA,wBACD;AAAA,wBACA,IAAI,EAAE,OAAO,IAAI,QAAQ,GAAA;AAAA,wBAEzB,gDAAC,qBAAA,EAAoB,IAAI,EAAE,UAAU,KAAG,CAAG;AAAA,sBAAA;AAAA,oBAAA,GAE7C;AAAA,oBACAA,kCAAAA,IAAC,SAAA,EAAQ,OAAM,cACd,UAAAA,kCAAAA;AAAAA,sBAAC;AAAA,sBAAA;AAAA,wBACA,MAAK;AAAA,wBACL,SAAS,MAAM;AACd,0CAAgB,iBAAiB,IAAI,EAAE,QAAQ,CAAA,OAAM;AACpD,kCAAM,WAAW,GAAG,QAAQ,OAAO,MAAM;AACzC,kCAAM,OAAO,SAAS,cAAc,WAAW,OAAO,IAAI;AAC1D,iCAAK,MAAM,UAAU;AACrB,+BAAG,YAAY,IAAI;AAAA,0BACpB,CAAC;AACD,8BAAI,mBAAmB,QAAS,eAAc,UAAU,mBAAmB,QAAQ;AAAA,wBACpF;AAAA,wBACA,IAAI,EAAE,OAAO,IAAI,QAAQ,GAAA;AAAA,wBAEzB,UAAAA,kCAAAA,IAAC,oBAAiB,IAAI,EAAE,UAAU,IAAI,WAAW,kBAAgB,CAAG;AAAA,sBAAA;AAAA,oBAAA,GAEtE;AAAA,oBACAA,kCAAAA,IAAC,SAAA,EAAQ,OAAM,iBACd,UAAAA,kCAAAA;AAAAA,sBAAC;AAAA,sBAAA;AAAA,wBACA,MAAK;AAAA,wBACL,SAAS,MAAM;;AACd,gCAAM,UAAU,gBAAgB,iBAAiB,IAAI;AACrD,gCAAM,aAAW,aAAQ,CAAC,MAAT,mBAAY,SAAS,WAAU;AAChD,8BAAI,WAAW,GAAG;AACjB,oCAAQ,QAAQ,CAAA,OAAM;AACrB,kCAAI,GAAG,iBAAkB,IAAG,YAAY,GAAG,gBAAgB;AAAA,4BAC5D,CAAC;AACD,gCAAI,mBAAmB,QAAS,eAAc,UAAU,mBAAmB,QAAQ;AAAA,0BACpF;AAAA,wBACD;AAAA,wBACA,IAAI,EAAE,OAAO,IAAI,QAAQ,GAAA;AAAA,wBAEzB,UAAAA,kCAAAA,IAAC,uBAAoB,IAAI,EAAE,UAAU,IAAI,WAAW,kBAAgB,CAAG;AAAA,sBAAA;AAAA,oBAAA,EACxE,CACD;AAAA,kBAAA,GACD;AAAA,kBAEDA,kCAAAA,IAAC,SAAA,EAAQ,OAAM,UACd,UAAAA,kCAAAA;AAAAA,oBAAC;AAAA,oBAAA;AAAA,sBACA,MAAK;AAAA,sBACL,SAAS;AAAA,sBACT,IAAI;AAAA,wBACH,OAAO;AAAA,wBACP,QAAQ;AAAA,wBACR,OAAO;AAAA,wBACP,WAAW,EAAE,SAAS,UAAA;AAAA,sBAAU;AAAA,sBAGjC,gDAAC,OAAA,EAAM,IAAI,EAAE,UAAU,KAAG,CAAG;AAAA,oBAAA;AAAA,kBAAA,EAC9B,CACD;AAAA,gBAAA;AAAA,cAAA;AAAA,YAAA;AAAA,YAIA,CAAC,MAAM,KAAK,MAAM,KAAK,MAAM,KAAK,MAAM,GAAG,EAAE,IAAI,CAAA,WACjDA,kCAAAA;AAAAA,cAAC;AAAA,cAAA;AAAA,gBAEA,aAAa,CAAC,MAAM,kBAAkB,GAAG,MAAM;AAAA,gBAC/C,OAAO;AAAA,kBACN,UAAU;AAAA,kBACV,OAAO;AAAA,kBACP,QAAQ;AAAA,kBACR,iBAAiB;AAAA,kBACjB,QAAQ;AAAA,kBACR,eAAe;AAAA,kBACf,QAAQ,GAAG,MAAM;AAAA,kBACjB,GAAI,WAAW,QAAQ,EAAE,KAAK,IAAI,MAAM,GAAA;AAAA,kBACxC,GAAI,WAAW,OAAO,EAAE,KAAK,IAAI,MAAM,OAAO,WAAW,mBAAA;AAAA,kBACzD,GAAI,WAAW,QAAQ,EAAE,KAAK,IAAI,OAAO,GAAA;AAAA,kBACzC,GAAI,WAAW,OAAO,EAAE,KAAK,OAAO,OAAO,IAAI,WAAW,mBAAA;AAAA,kBAC1D,GAAI,WAAW,QAAQ,EAAE,QAAQ,IAAI,OAAO,GAAA;AAAA,kBAC5C,GAAI,WAAW,OAAO,EAAE,QAAQ,IAAI,MAAM,OAAO,WAAW,mBAAA;AAAA,kBAC5D,GAAI,WAAW,QAAQ,EAAE,QAAQ,IAAI,MAAM,GAAA;AAAA,kBAC3C,GAAI,WAAW,OAAO,EAAE,KAAK,OAAO,MAAM,IAAI,WAAW,mBAAA;AAAA,gBAAmB;AAAA,cAC7E;AAAA,cAlBK;AAAA,YAAA,CAoBN;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAKF,mBAAmB,uBACnBD,kCAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACA,IAAI;AAAA,YACH,UAAU;AAAA,YACV,MAAM,oBAAoB;AAAA,YAC1B,KAAK,oBAAoB;AAAA,YACzB,WAAW;AAAA,YACX,SAAS;AAAA,YACT,KAAK;AAAA,YACL,SAAS;AAAA,YACT,OAAO;AAAA,YACP,cAAc;AAAA,YACd,GAAG;AAAA,YACH,WAAW;AAAA,YACX,QAAQ;AAAA,UAAA;AAAA,UAGT,UAAA;AAAA,YAAAC,kCAAAA,IAAC,SAAA,EAAQ,OAAM,QACd,UAAAA,kCAAAA;AAAAA,cAAC;AAAA,cAAA;AAAA,gBACA,MAAK;AAAA,gBACL,aAAa,WAAW,MAAM;AAAA,gBAC9B,IAAI,EAAE,OAAO,SAAS,OAAO,IAAI,QAAQ,GAAA;AAAA,gBAEzC,UAAAA,kCAAAA,IAAC,YAAA,EAAW,UAAS,QAAA,CAAQ;AAAA,cAAA;AAAA,YAAA,GAE/B;AAAA,YACAA,kCAAAA,IAAC,SAAA,EAAQ,OAAM,UACd,UAAAA,kCAAAA;AAAAA,cAAC;AAAA,cAAA;AAAA,gBACA,MAAK;AAAA,gBACL,aAAa,WAAW,QAAQ;AAAA,gBAChC,IAAI,EAAE,OAAO,SAAS,OAAO,IAAI,QAAQ,GAAA;AAAA,gBAEzC,UAAAA,kCAAAA,IAAC,cAAA,EAAa,UAAS,QAAA,CAAQ;AAAA,cAAA;AAAA,YAAA,GAEjC;AAAA,YACAA,kCAAAA,IAAC,SAAA,EAAQ,OAAM,aACd,UAAAA,kCAAAA;AAAAA,cAAC;AAAA,cAAA;AAAA,gBACA,MAAK;AAAA,gBACL,aAAa,WAAW,WAAW;AAAA,gBACnC,IAAI,EAAE,OAAO,SAAS,OAAO,IAAI,QAAQ,GAAA;AAAA,gBAEzC,UAAAA,kCAAAA,IAAC,kBAAA,EAAiB,UAAS,QAAA,CAAQ;AAAA,cAAA;AAAA,YAAA,GAErC;AAAA,YACAA,kCAAAA,IAAC,SAAA,EAAQ,aAAY,YAAW,UAAQ,MAAC,IAAI,EAAE,SAAS,yBAAyB,IAAI,IAAA,EAAI,CAAG;AAAA,YAC5FA,kCAAAA,IAAC,SAAA,EAAQ,OAAM,cACd,UAAAA,kCAAAA;AAAAA,cAAC;AAAA,cAAA;AAAA,gBACA,MAAK;AAAA,gBACL,IAAI,EAAE,OAAO,SAAS,OAAO,IAAI,QAAQ,GAAA;AAAA,gBACzC,aAAa,CAAC,MAAM;AACnB,oBAAE,eAAA;AACF,sCAAoB,EAAE,QAAQ,EAAE,eAAe,MAAM,QAAQ;AAAA,gBAC9D;AAAA,gBAEA,UAAAA,kCAAAA,IAAC,UAAK,OAAO,EAAE,UAAU,QAAQ,YAAY,UAAU,UAAA,IAAA,CAAC;AAAA,cAAA;AAAA,YAAA,GAE1D;AAAA,YACAA,kCAAAA,IAAC,SAAA,EAAQ,OAAM,aACd,UAAAA,kCAAAA;AAAAA,cAAC;AAAA,cAAA;AAAA,gBACA,MAAK;AAAA,gBACL,cAAa;AAAA,gBACb,UAAU;AAAA,gBACV,IAAI;AAAA,kBACH,OAAO;AAAA,kBACP,QAAQ;AAAA,kBACR,UAAU;AAAA,kBACV,sCAAsC,EAAE,QAAQ,OAAA;AAAA,kBAChD,sBAAsB,EAAE,OAAO,QAAA;AAAA,gBAAQ;AAAA,gBAGvC,UAAA,WAAW,IAAI,CAAA,SACfA,kCAAAA,IAAC,YAAoB,OAAO,MAAO,UAAA,KAAA,GAApB,IAAyB,CACxC;AAAA,cAAA;AAAA,YAAA,EACF,CACD;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IACD,GAEF;AAAA,IAIA,oBACAA,kCAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACA,MAAI;AAAA,QACJ,UAAU,iBAAiB;AAAA,QAC3B,SAAS,MAAM,oBAAoB,IAAI;AAAA,QACvC,kBAAgB;AAAA,QAChB,qBAAmB;AAAA,QACnB,cAAc,EAAE,UAAU,UAAU,YAAY,OAAA;AAAA,QAChD,iBAAiB,EAAE,UAAU,OAAO,YAAY,OAAA;AAAA,QAEhD,UAAAA,kCAAAA,IAAC,OAAI,IAAI,EAAE,GAAG,KACb,gDAAC,KAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,qBAAqB,mBAAmB,KAAK,SACvE,UAAA,cAAc,IAAI,CAAC,UACnBA,kCAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YAEA,aAAa,CAAC,MAAM;AACnB,gBAAE,eAAA;AACF,kBAAI,iBAAiB,SAAS,QAAQ;AACrC,4BAAY,aAAa,KAAK;AAAA,cAC/B,OAAO;AACN,4BAAY,eAAe,KAAK;AAAA,cACjC;AACA,kCAAoB,IAAI;AAAA,YACzB;AAAA,YACA,IAAI;AAAA,cACH,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,SAAS;AAAA,cACT,QAAQ;AAAA,cACR,QAAQ;AAAA,cACR,cAAc;AAAA,cACd,WAAW,EAAE,WAAW,cAAc,QAAQ,GAAG,UAAU,WAAA;AAAA,YAAW;AAAA,UACvE;AAAA,UAlBK;AAAA,QAAA,CAoBN,GACF,EAAA,CACD;AAAA,MAAA;AAAA,IAAA;AAAA,IAKD,mBAAmB,qBACnBD,kCAAAA,KAAAM,kBAAAA,UAAA,EACC,UAAA;AAAA,MAAAL,kCAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACA,SAAS,MAAM;AACd,+BAAmB,KAAK;AACxB,iCAAqB,IAAI;AAAA,UAC1B;AAAA,UACA,IAAI;AAAA,YACH,UAAU;AAAA,YACV,KAAK;AAAA,YACL,MAAM;AAAA,YACN,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,QAAQ;AAAA,UAAA;AAAA,QACT;AAAA,MAAA;AAAA,4CAEA,aAAA,CAAA,CAAY;AAAA,IAAA,EAAA,CACd;AAAA,EAAA,GAEF;AAEF,CAAC;AAED,aAAa,cAAc;"}
|
|
1
|
+
{"version":3,"file":"custom-editor-DnfTs5-j.esm.js","sources":["../../src/components/editor/utils/handlebars-protection.ts","../../src/components/editor/custom-editor.tsx"],"sourcesContent":["/**\n * Handlebars Template Protection Utilities\n * \n * Protects Handlebars syntax ({{...}}, {{#each}}, {{/each}}, etc.) from being\n * corrupted by contentEditable browser normalization during visual editing.\n * \n * Strategy: \n * - Block helpers ({{#each}}, {{/each}}, {{#if}}, etc.) are converted to HTML comments\n * - Regular variables ({{variable}}) are replaced with placeholder spans\n */\n\nconst HANDLEBARS_PLACEHOLDER_PREFIX = 'hbs-placeholder-';\nlet placeholderCounter = 0;\n\ninterface PlaceholderMap {\n [key: string]: string;\n}\n\n// Regex patterns for Handlebars block helpers\nconst BLOCK_HELPER_OPEN_PATTERN = /\\{\\{#(each|if|unless|with|let|inline|block|contentFor|extend|embed|log|lookup)\\s+[^}]*\\}\\}/g;\nconst BLOCK_HELPER_CLOSE_PATTERN = /\\{\\{\\/(each|if|unless|with|let|inline|block|contentFor|extend|embed|log|lookup)\\}\\}/g;\nconst BLOCK_HELPER_ELSE_PATTERN = /\\{\\{else\\}\\}/g;\n\n/**\n * Convert Handlebars syntax to protected format\n * - Block helpers ({{#each}}, {{/each}}, etc.) → HTML comments\n * - Regular variables ({{variable}}) → placeholder spans\n * @param html - Raw HTML with Handlebars syntax\n * @returns HTML with protected syntax + mapping object\n */\nexport function protectHandlebars(html: string): { html: string; map: PlaceholderMap } {\n const map: PlaceholderMap = {};\n placeholderCounter = 0;\n\n let protectedHtml = html;\n\n // Step 1: Convert block helper opening tags to HTML comments (only if not already commented)\n // e.g., {{#each items}} → <!--{{#each items}}-->\n // Skip if already in comment: <!--{{#each items}}--> stays as is\n protectedHtml = protectedHtml.replace(BLOCK_HELPER_OPEN_PATTERN, (match, p1, offset, string) => {\n // Check if this match is already inside an HTML comment\n const beforeMatch = string.substring(0, offset);\n const lastCommentStart = beforeMatch.lastIndexOf('<!--');\n const lastCommentEnd = beforeMatch.lastIndexOf('-->');\n \n // If we're inside a comment (comment start is more recent than comment end), don't re-comment\n if (lastCommentStart > lastCommentEnd) {\n return match;\n }\n \n return `<!--${match}-->`;\n });\n\n // Step 2: Convert block helper closing tags to HTML comments (only if not already commented)\n // e.g., {{/each}} → <!--{{/each}}-->\n protectedHtml = protectedHtml.replace(BLOCK_HELPER_CLOSE_PATTERN, (match, p1, offset, string) => {\n // Check if this match is already inside an HTML comment\n const beforeMatch = string.substring(0, offset);\n const lastCommentStart = beforeMatch.lastIndexOf('<!--');\n const lastCommentEnd = beforeMatch.lastIndexOf('-->');\n \n // If we're inside a comment, don't re-comment\n if (lastCommentStart > lastCommentEnd) {\n return match;\n }\n \n return `<!--${match}-->`;\n });\n\n // Step 3: Convert {{else}} to HTML comments (only if not already commented)\n // e.g., {{else}} → <!--{{else}}-->\n protectedHtml = protectedHtml.replace(BLOCK_HELPER_ELSE_PATTERN, (match, offset, string) => {\n // Check if this match is already inside an HTML comment\n const beforeMatch = string.substring(0, offset);\n const lastCommentStart = beforeMatch.lastIndexOf('<!--');\n const lastCommentEnd = beforeMatch.lastIndexOf('-->');\n \n // If we're inside a comment, don't re-comment\n if (lastCommentStart > lastCommentEnd) {\n return match;\n }\n \n return `<!--${match}-->`;\n });\n\n // Step 4: Protect remaining Handlebars expressions (regular variables) with placeholder spans\n // This will NOT match block helpers since they're already converted to comments\n // Also skip if already inside a placeholder span or inside an HTML tag attribute\n protectedHtml = protectedHtml.replace(/(\\{\\{[^}]*\\}\\})/g, (match, _p1, offset, string) => {\n // Check if already inside an HTML comment\n const beforeMatch = string.substring(0, offset);\n const lastCommentStart = beforeMatch.lastIndexOf('<!--');\n const lastCommentEnd = beforeMatch.lastIndexOf('-->');\n \n if (lastCommentStart > lastCommentEnd) {\n return match;\n }\n \n // Check if already inside a placeholder span\n const lastSpanStart = beforeMatch.lastIndexOf('<span class=\"hbs-placeholder\"');\n const lastSpanEnd = beforeMatch.lastIndexOf('</span>');\n \n if (lastSpanStart > lastSpanEnd) {\n return match;\n }\n\n // Check if inside an HTML tag attribute (between < and >)\n // e.g. src=\"{{qr_code}}\" — we must NOT wrap this in a span\n const lastTagOpen = beforeMatch.lastIndexOf('<');\n const lastTagClose = beforeMatch.lastIndexOf('>');\n if (lastTagOpen > lastTagClose) {\n // We're inside a tag — leave the handlebars expression untouched\n return match;\n }\n \n const id = `${HANDLEBARS_PLACEHOLDER_PREFIX}${placeholderCounter++}`;\n map[id] = match;\n \n // Use a span with data attribute to store the placeholder\n // contentEditable won't break this structure\n return `<span class=\"hbs-placeholder\" data-hbs-id=\"${id}\" contenteditable=\"false\" >${match}</span>`;\n });\n\n return { html: protectedHtml, map };\n}\n\n/**\n * Restore Handlebars syntax from protected format\n * - HTML comments → Block helpers\n * - Placeholder spans → Regular variables\n * @param html - HTML with protected syntax\n * @param map - Mapping of placeholder IDs to original Handlebars syntax\n * @returns Original HTML with Handlebars syntax restored\n */\nexport function restoreHandlebars(html: string, map?: PlaceholderMap): string {\n let restoredHtml = html;\n\n // Step 1: Restore block helpers from HTML comments\n // e.g., <!--{{#each items}}--> → {{#each items}}\n restoredHtml = restoredHtml.replace(/<!--(\\{\\{#(?:each|if|unless|with|let|inline|block|contentFor|extend|embed|log|lookup)\\s+[^}]*\\}\\})-->/g, (match, captured) => {\n return captured;\n });\n\n // Step 2: Restore closing block helpers from HTML comments\n // e.g., <!--{{/each}}--> → {{/each}}\n restoredHtml = restoredHtml.replace(/<!--(\\{\\{\\/(?:each|if|unless|with|let|inline|block|contentFor|extend|embed|log|lookup)\\}\\})-->/g, (match, captured) => {\n return captured;\n });\n\n // Step 3: Restore {{else}} from HTML comments\n // e.g., <!--{{else}}--> → {{else}}\n restoredHtml = restoredHtml.replace(/<!--(\\{\\{else\\}\\})-->/g, (match, captured) => {\n return captured;\n });\n\n // Step 4: Restore regular variables from placeholder spans\n // If no map provided, extract from data attributes\n if (!map) {\n map = {};\n const regex = /<span[^>]*data-hbs-id=\"([^\"]+)\"[^>]*>([^<]+)<\\/span>/g;\n let match;\n while ((match = regex.exec(restoredHtml)) !== null) {\n map[match[1]] = match[2];\n }\n }\n\n // Replace placeholder spans with original Handlebars syntax\n restoredHtml = restoredHtml.replace(\n /<span[^>]*class=\"hbs-placeholder\"[^>]*data-hbs-id=\"([^\"]+)\"[^>]*>.*?<\\/span>/g,\n (match, id) => {\n return map![id] || match;\n }\n );\n\n return restoredHtml;\n}\n\n/**\n * Check if HTML contains Handlebars syntax\n * @param html - HTML string to check\n * @returns true if Handlebars syntax is found\n */\nexport function containsHandlebars(html: string): boolean {\n return /\\{\\{[^}]*\\}\\}/.test(html);\n}\n\n/**\n * Auto-protect Handlebars in contentEditable on load\n * Call this when loading HTML into the editor\n */\nexport function prepareForEditing(html: string): { html: string; map: PlaceholderMap } {\n if (containsHandlebars(html)) {\n return protectHandlebars(html);\n }\n return { html, map: {} };\n}\n\n/**\n * Auto-restore Handlebars when getting HTML from editor\n * Call this when saving/exporting HTML from the editor\n */\nexport function prepareForSaving(html: string, map?: PlaceholderMap): string {\n return restoreHandlebars(html, map);\n}\n","/**\n * Custom Rich Text Editor (CKEditor-like)\n * \n * Features:\n * - CKEditor-style menu bar and toolbar\n * - Full formatting toolbar (bold, italic, underline, etc.)\n * - Font family, size, color, background color\n * - Alignment, lists, links\n * - Image upload with resize handles\n * - Table insertion and editing\n * - Selection handles for images and elements\n * - Preserves exact HTML structure (no normalization)\n * - Maintains all attributes, styles, and scoped CSS\n * \n * Fix: Source View no longer clears content on toggle.\n * Root cause was sourceCodeRef being shared between visual-mode (handleInput)\n * and source-mode (textarea). Introduced sourceViewContentRef to exclusively\n * own source-mode textarea content so handleInput never corrupts it.\n */\nimport React, { useState, useEffect, useRef, useImperativeHandle, forwardRef, useCallback } from 'react';\nimport { \n\tFormatBold, \n\tFormatItalic, \n\tFormatUnderlined, \n\tFormatStrikethrough,\n\tFormatAlignLeft,\n\tFormatAlignCenter,\n\tFormatAlignRight,\n\tFormatAlignJustify,\n\tFormatListBulleted,\n\tFormatListNumbered,\n\tLink as LinkIcon,\n\tImage as ImageIcon,\n\tTableChart,\n\tCode,\n\tUndo,\n\tRedo,\n\tSubscript,\n\tSuperscript,\n\tClose,\n\tSwapHoriz,\n\tAddCircleOutline,\n\tRemoveCircleOutline,\n} from '@mui/icons-material';\nimport { IconButton, Divider, Select, MenuItem, Tooltip, Box, Button, Popover } from '@mui/material';\nimport { uploadFiles } from '../../utils/common';\nimport { getToken } from '../../utils/common';\nimport { postV1Drive } from '../../api-client/api.drive/api';\nimport { getApiConfig } from '../../utils/api-config';\nimport { CellProperties } from './table/types';\nimport { prepareForEditing, prepareForSaving } from './utils/handlebars-protection';\nimport './custom-editor.css';\n\nexport interface CustomEditorProps {\n\teditorRef?: React.RefObject<any>;\n\tdata: string;\n\thandleEditorReady: (editor: any) => void;\n\tonError?: (error: Error) => void;\n\tconfig?: any;\n\t[key: string]: any;\n}\n\nconst FONT_FAMILIES = [\n\t'Arial', 'Courier New', 'Georgia', 'Times New Roman', 'Trebuchet MS', 'Verdana'\n];\n\nconst FONT_SIZES = ['10px', '12px', '14px', '16px', '18px', '20px', '24px', '28px', '32px'];\n\nconst HEADING_FORMATS = [\n\t{ value: 'p', label: 'Paragraph' },\n\t{ value: 'h1', label: 'Heading 1' },\n\t{ value: 'h2', label: 'Heading 2' },\n\t{ value: 'h3', label: 'Heading 3' },\n\t{ value: 'h4', label: 'Heading 4' },\n\t{ value: 'h5', label: 'Heading 5' },\n\t{ value: 'h6', label: 'Heading 6' }\n];\n\nconst PRESET_COLORS = [\n\t'#000000', '#434343', '#666666', '#999999', '#b7b7b7', '#cccccc', '#d9d9d9', '#ffffff',\n\t'#ff0000', '#ff9900', '#ffff00', '#00ff00', '#00ffff', '#4a86e8', '#9900ff', '#ff00ff',\n\t'#ea9999', '#f9cb9c', '#ffe599', '#b6d7a8', '#a2c4c9', '#9fc5e8', '#b4a7d6', '#d5a6bd',\n\t'#e06666', '#f6b26b', '#ffd966', '#93c47d', '#76a5af', '#6fa8dc', '#8e7cc3', '#c27ba0',\n\t'#cc0000', '#e69138', '#f1c232', '#6aa84f', '#45818e', '#3d85c8', '#674ea7', '#85200c',\n];\n\nexport const CustomEditor = forwardRef<any, CustomEditorProps>((props, ref) => {\n\tconst {\n\t\teditorRef: editorRefProp,\n\t\tdata = '',\n\t\thandleEditorReady,\n\t\tonError,\n\t\tconfig = {},\n\t\t...rest\n\t} = props;\n\n\tconst [error, setError] = useState<Error | null>(null);\n\tconst [fontFamily, setFontFamily] = useState('Arial');\n\tconst [fontSize, setFontSize] = useState('14px');\n\tconst [headingFormat, setHeadingFormat] = useState('p');\n\tconst [showSourceMode, setShowSourceMode] = useState(false);\n\tconst [sourceCode, setSourceCode] = useState(data);\n\tconst [history, setHistory] = useState<string[]>([data]);\n\tconst [historyIndex, setHistoryIndex] = useState(0);\n\tconst [selectedElement, setSelectedElement] = useState<HTMLElement | null>(null);\n\tconst [resizeHandles, setResizeHandles] = useState<{ x: number; y: number; width: number; height: number } | null>(null);\n\tconst [showTablePicker, setShowTablePicker] = useState(false);\n\tconst [tablePickerAnchor, setTablePickerAnchor] = useState<HTMLElement | null>(null);\n\tconst [textSelectionAnchor, setTextSelectionAnchor] = useState<{ x: number; y: number } | null>(null);\n\tconst [showTextToolbar, setShowTextToolbar] = useState(false);\n\tconst [colorPickerState, setColorPickerState] = useState<{ anchor: HTMLElement; type: 'text' | 'bg' } | null>(null);\n\t\n\t// Table editing state\n\tconst [selectedCell, setSelectedCell] = useState<HTMLTableCellElement | null>(null);\n\tconst [showTableToolbar, setShowTableToolbar] = useState(false);\n\tconst [tableToolbarPosition, setTableToolbarPosition] = useState<{ x: number; y: number } | null>(null);\n\tconst [cellProperties, setCellProperties] = useState<CellProperties>({\n\t\tborderStyle: 'solid',\n\t\tborderColor: '#ddd',\n\t\tborderWidth: '1px',\n\t\tbackgroundColor: 'transparent',\n\t\twidth: 'auto',\n\t\theight: 'auto',\n\t\tpadding: '8px',\n\t\ttextAlign: 'left',\n\t\tverticalAlign: 'middle'\n\t});\n\t\n\tconst contentEditableRef = useRef<HTMLDivElement>(null);\n\tconst sourceCodeRef = useRef<string>(data);\n\tconst onEditorChangeRef = useRef(props.onEditorChange);\n\tconst handleEditorReadyRef = useRef(handleEditorReady);\n\tuseEffect(() => { onEditorChangeRef.current = props.onEditorChange; });\n\tuseEffect(() => { handleEditorReadyRef.current = handleEditorReady; });\n\n\t// FIX: Dedicated ref for source-mode textarea content.\n\t// sourceCodeRef is shared with visual-mode (handleInput overwrites it on every\n\t// keystroke). sourceViewContentRef is ONLY written by source-mode handlers\n\t// (handleSourceCodeChange, handleHtmlFileUpload, handleToggleSource entering\n\t// source mode) so it is never corrupted by visual-mode activity.\n\tconst sourceViewContentRef = useRef<string>(data);\n\n\tconst fileInputRef = useRef<HTMLInputElement>(null);\n\tconst htmlFileInputRef = useRef<HTMLInputElement>(null);\n\tconst replaceImageInputRef = useRef<HTMLInputElement>(null);\n\tconst resizeStartRef = useRef<{ x: number; y: number; width: number; height: number; handle: string } | null>(null);\n\tconst handlebarsMapRef = useRef<{ [key: string]: string }>({});\n\tconst apiConfig = getApiConfig();\n\n\t// Update source code when data prop changes\n\tuseEffect(() => {\n\t\tif(!data)return\n\t\tconst { html: protectedHtml, map } = prepareForEditing(data);\n\t\thandlebarsMapRef.current = map;\n\t\tsourceCodeRef.current = data; // Store original with Handlebars\n\t\t\n\t\tif (contentEditableRef.current && contentEditableRef.current.innerHTML !== protectedHtml) {\n\t\t\tcontentEditableRef.current.innerHTML = protectedHtml;\n\t\t}\n\t}, [data]);\n\n\t// Initialize editor\n\tuseEffect(() => {\n\t\tconsole.log(\"contentEditableRef.current...........\",contentEditableRef.current)\n\t\tif (contentEditableRef.current) {\n\t\t\ttry {\n\t\t\t\tconst { html: protectedHtml, map } = prepareForEditing(data || '');\n\t\t\t\thandlebarsMapRef.current = map;\n\t\t\t\tcontentEditableRef.current.innerHTML = protectedHtml;\n\t\t\t\tconst adapter = {\n\t\t\t\t\tgetData: () => {\n\t\t\t\t\t\t// Restore Handlebars syntax before returning\n\t\t\t\t\t\treturn prepareForSaving(sourceCodeRef.current, handlebarsMapRef.current);\n\t\t\t\t\t},\n\t\t\t\t\tsetData: (newData: string) => {\n\t\t\t\t\t\tconst { html: protectedHtml, map } = prepareForEditing(newData);\n\t\t\t\t\t\thandlebarsMapRef.current = map;\n\t\t\t\t\t\tsourceCodeRef.current = newData;\n\t\t\t\t\t\tif (contentEditableRef.current) {\n\t\t\t\t\t\t\tcontentEditableRef.current.innerHTML = protectedHtml;\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tmodel: {\n\t\t\t\t\t\tinsertContent: (fragment: string) => {\n\t\t\t\t\t\t\texecCommand('insertHTML', fragment);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tprocessor: {\n\t\t\t\t\t\t\ttoView: (html: string) => html\n\t\t\t\t\t\t},\n\t\t\t\t\t\ttoModel: (html: string) => html\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\thandleEditorReadyRef.current?.(adapter);\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error('[CustomEditor] init effect error:', e);\n\t\t\t}\n\t\t}\n\t}, []);\n\n\t// Execute formatting command\n\tconst execCommand = useCallback((command: string, value?: string) => {\n\t\tdocument.execCommand(command, false, value);\n\t\tif (contentEditableRef.current) {\n\t\t\tsourceCodeRef.current = contentEditableRef.current.innerHTML;\n\t\t\tsaveToHistory();\n\t\t}\n\t}, []);\n\n\t// Save to history for undo/redo\n\tconst saveToHistory = useCallback(() => {\n\t\tif (contentEditableRef.current) {\n\t\t\tconst newHistory = history.slice(0, historyIndex + 1);\n\t\t\tnewHistory.push(contentEditableRef.current.innerHTML);\n\t\t\tsetHistory(newHistory.slice(-50)); // Keep last 50 states\n\t\t\tsetHistoryIndex(newHistory.length - 1);\n\t\t}\n\t}, [history, historyIndex]);\n\n\t// Undo\n\tconst handleUndo = useCallback(() => {\n\t\tif (historyIndex > 0) {\n\t\t\tconst newIndex = historyIndex - 1;\n\t\t\tsetHistoryIndex(newIndex);\n\t\t\tif (contentEditableRef.current) {\n\t\t\t\tcontentEditableRef.current.innerHTML = history[newIndex];\n\t\t\t\tsourceCodeRef.current = history[newIndex];\n\t\t\t}\n\t\t}\n\t}, [history, historyIndex]);\n\n\t// Redo\n\tconst handleRedo = useCallback(() => {\n\t\tif (historyIndex < history.length - 1) {\n\t\t\tconst newIndex = historyIndex + 1;\n\t\t\tsetHistoryIndex(newIndex);\n\t\t\tif (contentEditableRef.current) {\n\t\t\t\tcontentEditableRef.current.innerHTML = history[newIndex];\n\t\t\t\tsourceCodeRef.current = history[newIndex];\n\t\t\t}\n\t\t}\n\t}, [history, historyIndex]);\n\n\t// Handle content changes in visual mode.\n\t// IMPORTANT: only updates sourceCodeRef (visual-mode ref).\n\t// Must NOT touch sourceViewContentRef — that ref belongs exclusively to source mode.\n\tconst handleInput = useCallback(() => {\n\t\tif (contentEditableRef.current) {\n\t\t\tconst visualHtml = contentEditableRef.current.innerHTML;\n\t\t\t// Restore Handlebars before saving to sourceCodeRef\n\t\t\tsourceCodeRef.current = prepareForSaving(visualHtml, handlebarsMapRef.current);\n\t\t\tonEditorChangeRef.current?.(sourceCodeRef.current);\n\t\t}\n\t}, []);\n\n\t// Strip external formatting from pasted HTML.\n\tconst sanitizePastedHtml = useCallback((html: string): string => {\n\t\tconst doc = new DOMParser().parseFromString(html, 'text/html');\n\n\t\t// Unwrap <span> elements — they carry font/color styles from external sources\n\t\tdoc.querySelectorAll('span').forEach(span => {\n\t\t\tconst frag = document.createDocumentFragment();\n\t\t\twhile (span.firstChild) frag.appendChild(span.firstChild);\n\t\t\tspan.parentNode?.replaceChild(frag, span);\n\t\t});\n\n\t\t// Convert <a> links to plain text\n\t\tdoc.querySelectorAll('a').forEach(a => {\n\t\t\tconst text = document.createTextNode(a.textContent || '');\n\t\t\ta.parentNode?.replaceChild(text, a);\n\t\t});\n\n\t\t// Strip style and class from every remaining element\n\t\tdoc.querySelectorAll('[style], [class], [color], [bgcolor], [face]').forEach(el => {\n\t\t\tel.removeAttribute('style');\n\t\t\tel.removeAttribute('class');\n\t\t\tel.removeAttribute('color');\n\t\t\tel.removeAttribute('bgcolor');\n\t\t\tel.removeAttribute('face');\n\t\t});\n\n\t\treturn doc.body.innerHTML;\n\t}, []);\n\n\t// Handle paste — sanitize external HTML before inserting\n\tconst handlePaste = useCallback((e: React.ClipboardEvent) => {\n\t\te.preventDefault();\n\t\tconst html = e.clipboardData.getData('text/html');\n\t\tconst text = e.clipboardData.getData('text/plain');\n\n\t\tif (html) {\n\t\t\texecCommand('insertHTML', sanitizePastedHtml(html));\n\t\t} else {\n\t\t\texecCommand('insertText', text);\n\t\t}\n\t}, [execCommand, sanitizePastedHtml]);\n\n\t// Handle image upload\n\tconst handleImageUpload = useCallback(async (file: File) => {\n\t\ttry {\n\t\t\tconst uFiles = await uploadFiles([file], 'document');\n\t\t\tconst token = getToken();\n\t\t\tconst payload = {\n\t\t\t\t...token,\n\t\t\t\t'x-timezone': token['x-timezone']?.toString() || '',\n\t\t\t\ttitle: file?.name.split('.')[0],\n\t\t\t\tpath: '/',\n\t\t\t\tis_private: true,\n\t\t\t\tis_directory: false,\n\t\t\t\tfile_size: file.size,\n\t\t\t\tis_child: false,\n\t\t\t\tfile_extension: file?.name.split('.')[1],\n\t\t\t\ttype: 'image',\n\t\t\t\tmime_type: file.type,\n\t\t\t\turl: `${apiConfig?.s3BucketUrl}${uFiles[0]}`\n\t\t\t};\n\t\t\t\n\t\t\tawait postV1Drive(payload);\n\t\t\texecCommand('insertHTML', `<img src=\"${payload.url}\" alt=\"${file.name}\" style=\"max-width: 100%;\" />`);\n\t\t} catch (error) {\n\t\t\tconsole.error('Image upload failed:', error);\n\t\t\tonError?.(error as Error);\n\t\t}\n\t}, [apiConfig, execCommand, onError]);\n\n\t// Handle file input change\n\tconst handleFileChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n\t\tconst file = e.target.files?.[0];\n\t\tif (file) {\n\t\t\thandleImageUpload(file);\n\t\t}\n\t}, [handleImageUpload]);\n\n\t// Insert link\n\tconst handleInsertLink = useCallback(() => {\n\t\tconst url = prompt('Enter URL:');\n\t\tif (url) {\n\t\t\texecCommand('createLink', url);\n\t\t}\n\t}, [execCommand]);\n\n\t// Insert table\n\tconst handleInsertTable = useCallback(() => {\n\t\tconst rows = prompt('Number of rows:', '3');\n\t\tconst cols = prompt('Number of columns:', '3');\n\t\t\n\t\tif (rows && cols) {\n\t\t\tlet tableHTML = '<table border=\"1\" style=\"border-collapse: collapse; width: 100%;\">';\n\t\t\ttableHTML += '<thead><tr>';\n\t\t\tfor (let i = 0; i < parseInt(cols); i++) {\n\t\t\t\ttableHTML += '<th style=\"border: 1px solid #ddd; padding: 8px;\">Header</th>';\n\t\t\t}\n\t\t\ttableHTML += '</tr></thead><tbody>';\n\t\t\tfor (let i = 0; i < parseInt(rows); i++) {\n\t\t\t\ttableHTML += '<tr>';\n\t\t\t\tfor (let j = 0; j < parseInt(cols); j++) {\n\t\t\t\t\ttableHTML += '<td style=\"border: 1px solid #ddd; padding: 8px;\"></td>';\n\t\t\t\t}\n\t\t\t\ttableHTML += '</tr>';\n\t\t\t}\n\t\t\ttableHTML += '</tbody></table>';\n\t\t\t\n\t\t\texecCommand('insertHTML', tableHTML);\n\t\t}\n\t}, [execCommand]);\n\n\t// Table picker component\n\tconst TablePicker = () => {\n\t\tconst [hoverCell, setHoverCell] = useState<{ row: number; col: number } | null>(null);\n\t\tconst maxRows = 10;\n\t\tconst maxCols = 10;\n\t\t\n\t\t// Calculate position relative to button\n\t\tconst buttonRect = tablePickerAnchor?.getBoundingClientRect();\n\t\tconst editorContainer = document.querySelector('.custom-editor-container');\n\t\tconst containerRect = editorContainer?.getBoundingClientRect();\n\t\t\n\t\tlet top = 0;\n\t\tlet left = 0;\n\t\t\n\t\tif (buttonRect && containerRect) {\n\t\t\ttop = buttonRect.bottom - containerRect.top + 5;\n\t\t\tleft = buttonRect.left - containerRect.left;\n\t\t}\n\t\t\n\t\treturn (\n\t\t\t<Box\n\t\t\t\tsx={{\n\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\ttop: `${top}px`,\n\t\t\t\t\tleft: `${left}px`,\n\t\t\t\t\tbgcolor: 'white',\n\t\t\t\t\tborder: '1px solid #ddd',\n\t\t\t\t\tborderRadius: 1,\n\t\t\t\t\tp: 2,\n\t\t\t\t\tboxShadow: 3,\n\t\t\t\t\tzIndex: 9999\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<Box sx={{ display: 'grid', gridTemplateColumns: `repeat(${maxCols}, 20px)`, gap: '2px', mb: 1 }}>\n\t\t\t\t\t{Array.from({ length: maxRows }).map((_, rowIndex) =>\n\t\t\t\t\t\tArray.from({ length: maxCols }).map((_, colIndex) => (\n\t\t\t\t\t\t\t<Box\n\t\t\t\t\t\t\t\tkey={`${rowIndex}-${colIndex}`}\n\t\t\t\t\t\t\t\tonMouseEnter={() => setHoverCell({ row: rowIndex + 1, col: colIndex + 1 })}\n\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\thandleInsertTableFromPicker(rowIndex + 1, colIndex + 1);\n\t\t\t\t\t\t\t\t\tsetHoverCell(null);\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tsx={{\n\t\t\t\t\t\t\t\t\twidth: 20,\n\t\t\t\t\t\t\t\t\theight: 20,\n\t\t\t\t\t\t\t\t\tborder: '1px solid #ddd',\n\t\t\t\t\t\t\t\t\tbgcolor: hoverCell && rowIndex < hoverCell.row && colIndex < hoverCell.col ? '#1976d2' : 'white',\n\t\t\t\t\t\t\t\t\tcursor: 'pointer',\n\t\t\t\t\t\t\t\t\t'&:hover': {\n\t\t\t\t\t\t\t\t\t\tbgcolor: '#1976d2'\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t))\n\t\t\t\t\t)}\n\t\t\t\t</Box>\n\t\t\t\t<Box sx={{ textAlign: 'center', fontSize: '12px', color: '#666' }}>\n\t\t\t\t\t{hoverCell ? `${hoverCell.row} × ${hoverCell.col}` : '1 × 1'}\n\t\t\t\t</Box>\n\t\t\t</Box>\n\t\t);\n\t};\n\n\t// Font family change\n\tconst handleFontFamilyChange = useCallback((e: any) => {\n\t\tconst family = e.target.value;\n\t\tsetFontFamily(family);\n\t\texecCommand('fontName', family);\n\t}, [execCommand]);\n\n\t// Font size change\n\tconst handleFontSizeChange = useCallback((e: any) => {\n\t\tconst size = e.target.value;\n\t\tsetFontSize(size);\n\t\tdocument.execCommand('fontSize', false, '7');\n\t\tif (contentEditableRef.current) {\n\t\t\tconst fontTags = Array.from(\n\t\t\t\tcontentEditableRef.current.querySelectorAll('font[size=\"7\"]')\n\t\t\t);\n\t\t\tfontTags.forEach(tag => {\n\t\t\t\tconst span = document.createElement('span');\n\t\t\t\tspan.style.fontSize = size;\n\t\t\t\twhile (tag.firstChild) span.appendChild(tag.firstChild);\n\t\t\t\ttag.parentNode?.replaceChild(span, tag);\n\t\t\t});\n\t\t\tsourceCodeRef.current = contentEditableRef.current.innerHTML;\n\t\t\tsaveToHistory();\n\t\t\tonEditorChangeRef.current?.(sourceCodeRef.current);\n\t\t}\n\t}, [saveToHistory]);\n\n\t// Heading format change\n\tconst handleHeadingFormatChange = useCallback((e: any) => {\n\t\tconst format = e.target.value;\n\t\tsetHeadingFormat(format);\n\t\texecCommand('formatBlock', `<${format}>`);\n\t}, [execCommand]);\n\n\t// Toggle source mode\n\t// FIX: Use sourceViewContentRef (not sourceCodeRef) as the single source of\n\t// truth for the textarea. This prevents handleInput (visual mode) from ever\n\t// overwriting content the user typed/pasted into the source textarea.\n\tconst handleToggleSource = useCallback(() => {\n\t\tif (!showSourceMode) {\n\t\t\t// Entering source mode: MUST capture content BEFORE state change\n\t\t\t// because contentEditableRef.current becomes null after re-render\n\t\t\tconst visualHtml = contentEditableRef.current?.innerHTML || sourceCodeRef.current || data;\n\t\t\tconst restoredHtml = prepareForSaving(visualHtml, handlebarsMapRef.current);\n\t\t\t\n\t\t\t// Update all refs and state\n\t\t\tsetSourceCode(restoredHtml);\n\t\t\tsourceViewContentRef.current = restoredHtml;\n\t\t\tsourceCodeRef.current = restoredHtml;\n\t\t\t\n\t\t\t// Now switch mode (this will unmount contentEditable and mount textarea)\n\t\t\tsetShowSourceMode(true);\n\t\t} else {\n\t\t\t// Leaving source mode: read from sourceViewContentRef\n\t\t\t// State change will mount contentEditable, then we update it in useEffect\n\t\t\tconst currentSource = sourceViewContentRef.current.trim();\n\t\t\t\n\t\t\tif (!currentSource) {\n\t\t\t\t// Empty source — use default\n\t\t\t\tconst defaultHtml = '<p><br></p>';\n\t\t\t\tsourceCodeRef.current = defaultHtml;\n\t\t\t\tsourceViewContentRef.current = defaultHtml;\n\t\t\t\tsetSourceCode(defaultHtml);\n\t\t\t} else {\n\t\t\t\tsourceCodeRef.current = currentSource;\n\t\t\t}\n\t\t\t\n\t\t\t// Switch mode first\n\t\t\tsetShowSourceMode(false);\n\t\t}\n\t}, [showSourceMode, data]);\n\n\t// Effect to update contentEditable when switching from source to visual mode\n\t// Use a ref to track if we've already processed this mode switch\n\tconst hasProcessedModeSwitch = useRef(false);\n\t\n\tuseEffect(() => {\n\t\t// Only run when switching TO visual mode (showSourceMode becomes false)\n\t\t// and we haven't already processed this switch\n\t\tif (!showSourceMode && contentEditableRef.current && !hasProcessedModeSwitch.current) {\n\t\t\thasProcessedModeSwitch.current = true;\n\t\t\t\n\t\t\ttry {\n\t\t\t\tconst currentSource = sourceCodeRef.current.trim();\n\t\t\t\t\n\t\t\t\tif (!currentSource) {\n\t\t\t\t\tconst defaultHtml = '<p><br></p>';\n\t\t\t\t\tconst { html: protectedHtml, map } = prepareForEditing(defaultHtml);\n\t\t\t\t\thandlebarsMapRef.current = map;\n\t\t\t\t\tcontentEditableRef.current.innerHTML = protectedHtml;\n\t\t\t\t} else {\n\t\t\t\t\tconst { html: protectedHtml, map } = prepareForEditing(currentSource);\n\t\t\t\t\thandlebarsMapRef.current = map;\n\n\t\t\t\t\tif (!protectedHtml || protectedHtml.trim() === '') {\n\t\t\t\t\t\tconsole.warn('Protected HTML is empty, using original source');\n\t\t\t\t\t\tcontentEditableRef.current.innerHTML = currentSource;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcontentEditableRef.current.innerHTML = protectedHtml;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// Save to history without triggering re-render loop\n\t\t\t\tconst newHistory = history.slice(0, historyIndex + 1);\n\t\t\t\tnewHistory.push(contentEditableRef.current.innerHTML);\n\t\t\t\tsetHistory(newHistory.slice(-50));\n\t\t\t\tsetHistoryIndex(newHistory.length - 1);\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error('Error updating visual mode:', error);\n\t\t\t\t// Fallback: use raw HTML\n\t\t\t\tif (contentEditableRef.current && sourceCodeRef.current) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tcontentEditableRef.current.innerHTML = sourceCodeRef.current;\n\t\t\t\t\t} catch (innerError) {\n\t\t\t\t\t\tconsole.error('Failed to render HTML:', innerError);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\t// Reset the flag when entering source mode\n\t\tif (showSourceMode) {\n\t\t\thasProcessedModeSwitch.current = false;\n\t\t}\n\t}, [showSourceMode, history, historyIndex]);\n\n\t// Handle HTML file upload\n\t// FIX: also write to sourceViewContentRef so the uploaded content is not\n\t// lost when the user toggles to visual mode.\n\tconst handleHtmlFileUpload = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n\t\tconst file = e.target.files?.[0];\n\t\tif (!file) return;\n\n\t\tconst reader = new FileReader();\n\t\t\n\t\treader.onload = (event) => {\n\t\t\tconst htmlContent = event.target?.result as string;\n\t\t\tif (htmlContent) {\n\t\t\t\t// Update both textarea state and the dedicated source-mode ref\n\t\t\t\tsetSourceCode(htmlContent);\n\t\t\t\tsourceViewContentRef.current = htmlContent; // FIX: was sourceCodeRef.current\n\t\t\t\tsourceCodeRef.current = htmlContent;\n\t\t\t\t\n\t\t\t\t// If in visual mode, update the visual editor immediately\n\t\t\t\tif (!showSourceMode && contentEditableRef.current) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst { html: protectedHtml, map } = prepareForEditing(htmlContent);\n\t\t\t\t\t\thandlebarsMapRef.current = map;\n\t\t\t\t\t\tcontentEditableRef.current.innerHTML = protectedHtml;\n\t\t\t\t\t\tsaveToHistory();\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tconsole.error('Error processing uploaded HTML:', error);\n\t\t\t\t\t\talert('There was an error processing the HTML file. Please check the file and try again.');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\treader.onerror = () => {\n\t\t\talert('Failed to read HTML file. Please try again.');\n\t\t};\n\n\t\treader.readAsText(file);\n\t\t\n\t\t// Reset input so the same file can be uploaded again\n\t\te.target.value = '';\n\t}, [showSourceMode, saveToHistory]);\n\n\t// Handle source code textarea change.\n\t// FIX: write to sourceViewContentRef (not sourceCodeRef) so visual-mode\n\t// handleInput can never overwrite what the user is typing in the textarea.\n\tconst handleSourceCodeChange = useCallback((e: React.ChangeEvent<HTMLTextAreaElement>) => {\n\t\tconst newCode = e.target.value;\n\t\tsetSourceCode(newCode);\n\t\tsourceViewContentRef.current = newCode; // FIX: was sourceCodeRef.current\n\t}, []);\n\n\t// Handle click on images/elements for selection\n\tconst handleContentClick = useCallback((e: React.MouseEvent) => {\n\t\tconst target = e.target as HTMLElement;\n\t\t\n\t\t// Check if clicked on image or table\n\t\tlet elementToSelect: HTMLElement | null = null;\n\t\t\n\t\tif (target.tagName === 'IMG') {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\telementToSelect = target;\n\t\t} else if (target.tagName === 'TABLE') {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\telementToSelect = target;\n\t\t} else if (target.tagName === 'TD' || target.tagName === 'TH' || target.tagName === 'TR' || target.tagName === 'TBODY' || target.tagName === 'THEAD') {\n\t\t\t// If clicked inside table, find the parent table\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\telementToSelect = target.closest('table');\n\t\t}\n\t\t\n\t\tif (elementToSelect) {\n\t\t\tsetSelectedElement(elementToSelect);\n\t\t\t\n\t\t\tconst rect = elementToSelect.getBoundingClientRect();\n\t\t\tconst containerRect = contentEditableRef.current?.getBoundingClientRect();\n\t\t\t\n\t\t\tif (containerRect) {\n\t\t\t\tsetResizeHandles({\n\t\t\t\t\tx: rect.left - containerRect.left,\n\t\t\t\t\ty: rect.top - containerRect.top,\n\t\t\t\t\twidth: rect.width,\n\t\t\t\t\theight: rect.height\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tsetSelectedElement(null);\n\t\t\tsetResizeHandles(null);\n\t\t}\n\t}, []);\n\n\t// Delete selected element\n\tconst handleDeleteSelected = useCallback(() => {\n\t\tif (selectedElement) {\n\t\t\tselectedElement.remove();\n\t\t\tsetSelectedElement(null);\n\t\t\tsetResizeHandles(null);\n\t\t\tif (contentEditableRef.current) {\n\t\t\t\tsourceCodeRef.current = contentEditableRef.current.innerHTML;\n\t\t\t\tsaveToHistory();\n\t\t\t}\n\t\t}\n\t}, [selectedElement, saveToHistory]);\n\n\t// Replace image\n\tconst handleReplaceImage = useCallback(async (file: File) => {\n\t\tif (!selectedElement || selectedElement.tagName !== 'IMG') return;\n\t\t\n\t\ttry {\n\t\t\tconst uFiles = await uploadFiles([file], 'document');\n\t\t\tconst token = getToken();\n\t\t\tconst payload = {\n\t\t\t\t...token,\n\t\t\t\t'x-timezone': token['x-timezone']?.toString() || '',\n\t\t\t\ttitle: file?.name.split('.')[0],\n\t\t\t\tpath: '/',\n\t\t\t\tis_private: true,\n\t\t\t\tis_directory: false,\n\t\t\t\tfile_size: file.size,\n\t\t\t\tis_child: false,\n\t\t\t\tfile_extension: file?.name.split('.')[1],\n\t\t\t\ttype: 'image',\n\t\t\t\tmime_type: file.type,\n\t\t\t\turl: `${apiConfig?.s3BucketUrl}${uFiles[0]}`\n\t\t\t};\n\t\t\t\n\t\t\tawait postV1Drive(payload);\n\t\t\t(selectedElement as HTMLImageElement).src = payload.url;\n\t\t\t\n\t\t\tif (contentEditableRef.current) {\n\t\t\t\tsourceCodeRef.current = contentEditableRef.current.innerHTML;\n\t\t\t\tsaveToHistory();\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error('Image upload failed:', error);\n\t\t\tonError?.(error as Error);\n\t\t}\n\t}, [selectedElement, apiConfig, onError, saveToHistory]);\n\n\t// Handle replace image file input\n\tconst handleReplaceImageChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n\t\tconst file = e.target.files?.[0];\n\t\tif (file) {\n\t\t\thandleReplaceImage(file);\n\t\t}\n\t}, [handleReplaceImage]);\n\n\t// Handle text selection\n\tconst handleTextSelection = useCallback(() => {\n\t\tconst selection = window.getSelection();\n\t\tif (selection && !selection.isCollapsed && selection.rangeCount > 0) {\n\t\t\tconst range = selection.getRangeAt(0);\n\t\t\tconst rect = range.getBoundingClientRect();\n\t\t\tconst containerRect = contentEditableRef.current?.getBoundingClientRect();\n\t\t\t\n\t\t\tif (containerRect && rect.width > 0) {\n\t\t\t\tsetTextSelectionAnchor({\n\t\t\t\t\tx: rect.left + rect.width / 2,\n\t\t\t\t\ty: rect.top - 10\n\t\t\t\t});\n\t\t\t\tsetShowTextToolbar(true);\n\t\t\t}\n\n\t\t\t// Sync font size dropdown to the selected text's actual font size.\n\t\t\t// Walk up from the anchor node looking for an explicit inline font-size.\n\t\t\tlet node: Node | null = selection.anchorNode;\n\t\t\tif (node?.nodeType === Node.TEXT_NODE) node = node.parentElement;\n\t\t\tlet detectedSize: string | null = null;\n\t\t\tlet current = node instanceof HTMLElement ? node : null;\n\t\t\twhile (current && current !== contentEditableRef.current) {\n\t\t\t\tif (current.style.fontSize) {\n\t\t\t\t\tdetectedSize = current.style.fontSize;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcurrent = current.parentElement;\n\t\t\t}\n\t\t\tsetFontSize(detectedSize ?? '14px');\n\t\t} else {\n\t\t\tsetShowTextToolbar(false);\n\t\t\tsetTextSelectionAnchor(null);\n\t\t}\n\t}, []);\n\n\t// Handle resize start\n\tconst handleResizeStart = useCallback((e: React.MouseEvent, handle: string) => {\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\t\t\n\t\tif (selectedElement && resizeHandles) {\n\t\t\tresizeStartRef.current = {\n\t\t\t\tx: e.clientX,\n\t\t\t\ty: e.clientY,\n\t\t\t\twidth: resizeHandles.width,\n\t\t\t\theight: resizeHandles.height,\n\t\t\t\thandle\n\t\t\t};\n\t\t\t\n\t\t\t// Add event listeners\n\t\t\tdocument.addEventListener('mousemove', handleResizeMove as any);\n\t\t\tdocument.addEventListener('mouseup', handleResizeEnd);\n\t\t}\n\t}, [selectedElement, resizeHandles]);\n\n\t// Handle resize move\n\tconst handleResizeMove = useCallback((e: MouseEvent) => {\n\t\tif (!resizeStartRef.current || !selectedElement || !resizeHandles) return;\n\t\t\n\t\tconst { x, y, width, height, handle } = resizeStartRef.current;\n\t\tconst deltaX = e.clientX - x;\n\t\tconst deltaY = e.clientY - y;\n\t\t\n\t\tlet newWidth = width;\n\t\tlet newHeight = height;\n\t\t\n\t\tif (handle.includes('e')) {\n\t\t\tnewWidth = Math.max(50, width + deltaX);\n\t\t}\n\t\tif (handle.includes('w')) {\n\t\t\t// West handle: shrink/grow from the left — invert delta\n\t\t\tnewWidth = Math.max(50, width - deltaX);\n\t\t}\n\t\tif (handle.includes('s')) {\n\t\t\tnewHeight = Math.max(50, height + deltaY);\n\t\t}\n\t\tif (handle.includes('n')) {\n\t\t\tnewHeight = Math.max(50, height - deltaY);\n\t\t}\n\t\t\n\t\t// Maintain aspect ratio for corner handles on images\n\t\tif (handle.length === 2 && selectedElement.tagName === 'IMG') {\n\t\t\tconst aspectRatio = width / height;\n\t\t\tnewHeight = newWidth / aspectRatio;\n\t\t}\n\t\t\n\t\tselectedElement.style.width = `${newWidth}px`;\n\t\tif (selectedElement.tagName === 'IMG' || selectedElement.tagName === 'TABLE') {\n\t\t\tselectedElement.style.height = `${newHeight}px`;\n\t\t}\n\t\t\n\t\t// Update resize handles position\n\t\tconst rect = selectedElement.getBoundingClientRect();\n\t\tconst containerRect = contentEditableRef.current?.getBoundingClientRect();\n\t\t\n\t\tif (containerRect) {\n\t\t\tsetResizeHandles({\n\t\t\t\tx: rect.left - containerRect.left,\n\t\t\t\ty: rect.top - containerRect.top,\n\t\t\t\twidth: rect.width,\n\t\t\t\theight: rect.height\n\t\t\t});\n\t\t}\n\t}, [selectedElement, resizeHandles]);\n\n\t// Handle resize end\n\tconst handleResizeEnd = useCallback(() => {\n\t\tdocument.removeEventListener('mousemove', handleResizeMove as any);\n\t\tdocument.removeEventListener('mouseup', handleResizeEnd);\n\t\t\n\t\tresizeStartRef.current = null;\n\t\tif (contentEditableRef.current) {\n\t\t\tsourceCodeRef.current = contentEditableRef.current.innerHTML;\n\t\t\tsaveToHistory();\n\t\t}\n\t}, [handleResizeMove, saveToHistory]);\n\n\t// Show table picker\n\tconst handleShowTablePicker = useCallback((e: React.MouseEvent<HTMLButtonElement>) => {\n\t\tsetTablePickerAnchor(e.currentTarget);\n\t\tsetShowTablePicker(true);\n\t}, []);\n\n\t// Insert table with visual picker\n\tconst handleInsertTableFromPicker = useCallback((rows: number, cols: number) => {\n\t\t// Focus the editor first\n\t\tif (contentEditableRef.current) {\n\t\t\tcontentEditableRef.current.focus();\n\t\t}\n\t\t\n\t\t// Create table HTML\n\t\tlet tableHTML = '<table border=\"1\" style=\"border-collapse: collapse; width: 100%; margin: 10px 0;\">';\n\t\ttableHTML += '<tbody>';\n\t\tfor (let i = 0; i < rows; i++) {\n\t\t\ttableHTML += '<tr>';\n\t\t\tfor (let j = 0; j < cols; j++) {\n\t\t\t\ttableHTML += '<td style=\"border: 1px solid #ddd; padding: 8px; min-width: 50px;\"></td>';\n\t\t\t}\n\t\t\ttableHTML += '</tr>';\n\t\t}\n\t\ttableHTML += '</tbody></table><p><br></p>';\n\t\t\n\t\t// Insert using execCommand\n\t\tdocument.execCommand('insertHTML', false, tableHTML);\n\t\t\n\t\t// Update refs and history\n\t\tif (contentEditableRef.current) {\n\t\t\tsourceCodeRef.current = contentEditableRef.current.innerHTML;\n\t\t\tsaveToHistory();\n\t\t}\n\t\t\n\t\t// Close picker\n\t\tsetShowTablePicker(false);\n\t\tsetTablePickerAnchor(null);\n\t}, [saveToHistory]);\n\n\t// Create adapter object for ref\n\tconst adapter = {\n\t\tgetData: () => {\n\t\t\t// Always restore Handlebars syntax when getting data\n\t\t\treturn prepareForSaving(sourceCodeRef.current, handlebarsMapRef.current);\n\t\t},\n\t\tsetData: (newData: string) => {\n\t\t\tconst { html: protectedHtml, map } = prepareForEditing(newData);\n\t\t\thandlebarsMapRef.current = map;\n\t\t\tsourceCodeRef.current = newData;\n\t\t\tif (contentEditableRef.current) {\n\t\t\t\tcontentEditableRef.current.innerHTML = protectedHtml;\n\t\t\t}\n\t\t},\n\t\tmodel: {\n\t\t\tinsertContent: (fragment: string) => {\n\t\t\t\texecCommand('insertHTML', fragment);\n\t\t\t}\n\t\t},\n\t\tdata: {\n\t\t\tprocessor: {\n\t\t\t\ttoView: (html: string) => html\n\t\t\t},\n\t\t\ttoModel: (html: string) => html\n\t\t}\n\t};\n\n\tuseImperativeHandle(ref, () => adapter, []);\n\t\n\tuseEffect(() => {\n\t\tif (editorRefProp) {\n\t\t\t(editorRefProp as any).current = adapter;\n\t\t}\n\t}, [editorRefProp]);\n\n\t// Prevents focus loss when toolbar buttons are pressed, keeping the editor\n\tconst toolbarCmd = (command: string, value?: string) => (e: React.MouseEvent) => {\n\t\te.preventDefault();\n\t\texecCommand(command, value);\n\t};\n\n\tif (error) {\n\t\treturn (\n\t\t\t<div className=\"editor-error-container\">\n\t\t\t\t<div className=\"editor-error-message\">Editor Error: {error.message}</div>\n\t\t\t\t<button onClick={() => setError(null)} className=\"editor-retry-button\">\n\t\t\t\t\tRetry\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className='custom-editor-container'>\n\t\t\t{/* Menu Bar */}\n\t\t\t<Box sx={{ \n\t\t\t\tdisplay: 'flex', \n\t\t\t\talignItems: 'center',\n\t\t\t\tgap: 2,\n\t\t\t\tpx: 2,\n\t\t\t\tpy: 0.5,\n\t\t\t\tborderBottom: '1px solid #ddd',\n\t\t\t\tbgcolor: '#f8f9fa',\n\t\t\t\tfontSize: '13px'\n\t\t\t}}>\n\t\t\t\t<span style={{ cursor: 'pointer', color: '#333' }}>Edit</span>\n\t\t\t\t<span style={{ cursor: 'pointer', color: '#333' }}>View</span>\n\t\t\t\t<span style={{ cursor: 'pointer', color: '#333' }}>Insert</span>\n\t\t\t\t<span style={{ cursor: 'pointer', color: '#333' }}>Format</span>\n\t\t\t\t<span style={{ cursor: 'pointer', color: '#333' }}>Help</span>\n\t\t\t</Box>\n\n\t\t\t{/* Toolbar */}\n\t\t\t<Box sx={{ \n\t\t\t\tdisplay: 'flex', \n\t\t\t\tflexWrap: 'wrap', \n\t\t\t\tgap: 0.5, \n\t\t\t\tp: 1, \n\t\t\t\tborderBottom: '1px solid #ddd',\n\t\t\t\tbgcolor: '#f5f5f5',\n\t\t\t\talignItems: 'center'\n\t\t\t}}>\n\t\t\t\t{/* Source Button - icon + label style matching the design */}\n\t\t\t\t<Tooltip title={showSourceMode ? 'Switch to Visual' : 'Switch to Source'}>\n\t\t\t\t\t<Box\n\t\t\t\t\t\tonClick={handleToggleSource}\n\t\t\t\t\t\tsx={{\n\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\talignItems: 'center',\n\t\t\t\t\t\t\tgap: 0.5,\n\t\t\t\t\t\t\tpx: 1,\n\t\t\t\t\t\t\tpy: 0.5,\n\t\t\t\t\t\t\tcursor: 'pointer',\n\t\t\t\t\t\t\tborderRadius: 1,\n\t\t\t\t\t\t\tborder: '1px solid',\n\t\t\t\t\t\t\tborderColor: showSourceMode ? 'primary.main' : 'transparent',\n\t\t\t\t\t\t\tbgcolor: showSourceMode ? 'primary.50' : 'transparent',\n\t\t\t\t\t\t\tcolor: showSourceMode ? 'primary.main' : 'text.secondary',\n\t\t\t\t\t\t\t'&:hover': {\n\t\t\t\t\t\t\t\tbgcolor: showSourceMode ? 'primary.100' : 'grey.200',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\ttransition: 'all 0.15s ease',\n\t\t\t\t\t\t\tuserSelect: 'none',\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{/* Code-file-with-edit icon, matching the screenshot */}\n\t\t\t\t\t\t<svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n\t\t\t\t\t\t\t<path d=\"M14 2H6C4.9 2 4 2.9 4 4V20C4 21.1 4.9 22 6 22H18C19.1 22 20 21.1 20 20V8L14 2Z\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" fill=\"none\"/>\n\t\t\t\t\t\t\t<polyline points=\"14,2 14,8 20,8\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" fill=\"none\"/>\n\t\t\t\t\t\t\t<path d=\"M9 13L7 15L9 17\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n\t\t\t\t\t\t\t<path d=\"M15 13L17 15L15 17\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n\t\t\t\t\t\t\t<line x1=\"13\" y1=\"12\" x2=\"11\" y2=\"18\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\"/>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t<span style={{ fontSize: '13px', fontWeight: 500 }}>Source</span>\n\t\t\t\t\t</Box>\n\t\t\t\t</Tooltip>\n\n\t\t\t\t<Divider orientation=\"vertical\" flexItem sx={{ mx: 0.5 }} />\n\t\t\t\t\n\t\t\t\t{/* Undo/Redo */}\n\t\t\t\t<Tooltip title=\"Undo\">\n\t\t\t\t\t<IconButton size=\"small\" onClick={handleUndo} disabled={historyIndex === 0}>\n\t\t\t\t\t\t<Undo fontSize=\"small\" />\n\t\t\t\t\t</IconButton>\n\t\t\t\t</Tooltip>\n\t\t\t\t<Tooltip title=\"Redo\">\n\t\t\t\t\t<IconButton size=\"small\" onClick={handleRedo} disabled={historyIndex === history.length - 1}>\n\t\t\t\t\t\t<Redo fontSize=\"small\" />\n\t\t\t\t\t</IconButton>\n\t\t\t\t</Tooltip>\n\t\t\t\t\n\t\t\t\t<Divider orientation=\"vertical\" flexItem sx={{ mx: 0.5 }} />\n\t\t\t\t\n\t\t\t\t{/* Heading Format */}\n\t\t\t\t<Select\n\t\t\t\t\tvalue={headingFormat}\n\t\t\t\t\tonChange={handleHeadingFormatChange}\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\tsx={{ minWidth: 100, height: 28, fontSize: '12px' }}\n\t\t\t\t>\n\t\t\t\t\t{HEADING_FORMATS.map(format => (\n\t\t\t\t\t\t<MenuItem key={format.value} value={format.value}>\n\t\t\t\t\t\t\t{format.label}\n\t\t\t\t\t\t</MenuItem>\n\t\t\t\t\t))}\n\t\t\t\t</Select>\n\t\t\t\t\n\t\t\t\t{/* Font Family */}\n\t\t\t\t<Select\n\t\t\t\t\tvalue={fontFamily}\n\t\t\t\t\tonChange={handleFontFamilyChange}\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\tsx={{ minWidth: 120, height: 28, fontSize: '12px' }}\n\t\t\t\t>\n\t\t\t\t\t{FONT_FAMILIES.map(font => (\n\t\t\t\t\t\t<MenuItem key={font} value={font} style={{ fontFamily: font }}>\n\t\t\t\t\t\t\t{font}\n\t\t\t\t\t\t</MenuItem>\n\t\t\t\t\t))}\n\t\t\t\t</Select>\n\t\t\t\t\n\t\t\t\t{/* Font Size */}\n\t\t\t\t<Select\n\t\t\t\t\tvalue={fontSize}\n\t\t\t\t\tonChange={handleFontSizeChange}\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\tsx={{ minWidth: 70, height: 28, fontSize: '12px' }}\n\t\t\t\t>\n\t\t\t\t\t{FONT_SIZES.map(size => (\n\t\t\t\t\t\t<MenuItem key={size} value={size}>{size}</MenuItem>\n\t\t\t\t\t))}\n\t\t\t\t</Select>\n\t\t\t\t\n\t\t\t\t<Divider orientation=\"vertical\" flexItem sx={{ mx: 0.5 }} />\n\t\t\t\t\n\t\t\t\t{/* Text Formatting */}\n\t\t\t\t<Tooltip title=\"Bold\">\n\t\t\t\t\t<IconButton size=\"small\" onMouseDown={toolbarCmd('bold')}>\n\t\t\t\t\t\t<FormatBold fontSize=\"small\" />\n\t\t\t\t\t</IconButton>\n\t\t\t\t</Tooltip>\n\t\t\t\t<Tooltip title=\"Italic\">\n\t\t\t\t\t<IconButton size=\"small\" onMouseDown={toolbarCmd('italic')}>\n\t\t\t\t\t\t<FormatItalic fontSize=\"small\" />\n\t\t\t\t\t</IconButton>\n\t\t\t\t</Tooltip>\n\t\t\t\t<Tooltip title=\"Underline\">\n\t\t\t\t\t<IconButton size=\"small\" onMouseDown={toolbarCmd('underline')}>\n\t\t\t\t\t\t<FormatUnderlined fontSize=\"small\" />\n\t\t\t\t\t</IconButton>\n\t\t\t\t</Tooltip>\n\t\t\t\t<Tooltip title=\"Strikethrough\">\n\t\t\t\t\t<IconButton size=\"small\" onMouseDown={toolbarCmd('strikeThrough')}>\n\t\t\t\t\t\t<FormatStrikethrough fontSize=\"small\" />\n\t\t\t\t\t</IconButton>\n\t\t\t\t</Tooltip>\n\t\t\t\t<Tooltip title=\"Subscript\">\n\t\t\t\t\t<IconButton size=\"small\" onMouseDown={toolbarCmd('subscript')}>\n\t\t\t\t\t\t<Subscript fontSize=\"small\" />\n\t\t\t\t\t</IconButton>\n\t\t\t\t</Tooltip>\n\t\t\t\t<Tooltip title=\"Superscript\">\n\t\t\t\t\t<IconButton size=\"small\" onMouseDown={toolbarCmd('superscript')}>\n\t\t\t\t\t\t<Superscript fontSize=\"small\" />\n\t\t\t\t\t</IconButton>\n\t\t\t\t</Tooltip>\n\t\t\t\t\n\t\t\t\t<Divider orientation=\"vertical\" flexItem sx={{ mx: 0.5 }} />\n\t\t\t\t\n\t\t\t\t{/* Colors */}\n\t\t\t\t<Tooltip title=\"Text Color\">\n\t\t\t\t\t<IconButton\n\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\tonMouseDown={(e) => {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\tsetColorPickerState({ anchor: e.currentTarget, type: 'text' });\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tstyle={{ width: 32, height: 28, border: '1px solid #ddd', borderRadius: '4px', backgroundColor: 'white' }}\n\t\t\t\t\t>\n\t\t\t\t\t\t<span style={{ fontSize: '16px', fontWeight: 'bold', color: '#000' }}>A</span>\n\t\t\t\t\t</IconButton>\n\t\t\t\t</Tooltip>\n\t\t\t\t<Tooltip title=\"Background Color\">\n\t\t\t\t\t<IconButton\n\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\tonMouseDown={(e) => {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\tsetColorPickerState({ anchor: e.currentTarget, type: 'bg' });\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tstyle={{ width: 32, height: 28, border: '1px solid #ddd', borderRadius: '4px', backgroundColor: '#fffde7' }}\n\t\t\t\t\t>\n\t\t\t\t\t\t<span style={{ fontSize: '16px', fontWeight: 'bold', color: '#000' }}>A</span>\n\t\t\t\t\t</IconButton>\n\t\t\t\t</Tooltip>\n\t\t\t\t\n\t\t\t\t<Divider orientation=\"vertical\" flexItem sx={{ mx: 0.5 }} />\n\t\t\t\t\n\t\t\t\t{/* Alignment */}\n\t\t\t\t<Tooltip title=\"Align Left\">\n\t\t\t\t\t<IconButton size=\"small\" onMouseDown={toolbarCmd('justifyLeft')}>\n\t\t\t\t\t\t<FormatAlignLeft fontSize=\"small\" />\n\t\t\t\t\t</IconButton>\n\t\t\t\t</Tooltip>\n\t\t\t\t<Tooltip title=\"Align Center\">\n\t\t\t\t\t<IconButton size=\"small\" onMouseDown={toolbarCmd('justifyCenter')}>\n\t\t\t\t\t\t<FormatAlignCenter fontSize=\"small\" />\n\t\t\t\t\t</IconButton>\n\t\t\t\t</Tooltip>\n\t\t\t\t<Tooltip title=\"Align Right\">\n\t\t\t\t\t<IconButton size=\"small\" onMouseDown={toolbarCmd('justifyRight')}>\n\t\t\t\t\t\t<FormatAlignRight fontSize=\"small\" />\n\t\t\t\t\t</IconButton>\n\t\t\t\t</Tooltip>\n\t\t\t\t<Tooltip title=\"Justify\">\n\t\t\t\t\t<IconButton size=\"small\" onMouseDown={toolbarCmd('justifyFull')}>\n\t\t\t\t\t\t<FormatAlignJustify fontSize=\"small\" />\n\t\t\t\t\t</IconButton>\n\t\t\t\t</Tooltip>\n\t\t\t\t\n\t\t\t\t<Divider orientation=\"vertical\" flexItem sx={{ mx: 0.5 }} />\n\t\t\t\t\n\t\t\t\t{/* Lists */}\n\t\t\t\t<Tooltip title=\"Bullet List\">\n\t\t\t\t\t<IconButton size=\"small\" onMouseDown={toolbarCmd('insertUnorderedList')}>\n\t\t\t\t\t\t<FormatListBulleted fontSize=\"small\" />\n\t\t\t\t\t</IconButton>\n\t\t\t\t</Tooltip>\n\t\t\t\t<Tooltip title=\"Numbered List\">\n\t\t\t\t\t<IconButton size=\"small\" onMouseDown={toolbarCmd('insertOrderedList')}>\n\t\t\t\t\t\t<FormatListNumbered fontSize=\"small\" />\n\t\t\t\t\t</IconButton>\n\t\t\t\t</Tooltip>\n\t\t\t\t\n\t\t\t\t<Divider orientation=\"vertical\" flexItem sx={{ mx: 0.5 }} />\n\t\t\t\t\n\t\t\t\t{/* Insert */}\n\t\t\t\t<Tooltip title=\"Insert Link\">\n\t\t\t\t\t<IconButton size=\"small\" onClick={handleInsertLink}>\n\t\t\t\t\t\t<LinkIcon fontSize=\"small\" />\n\t\t\t\t\t</IconButton>\n\t\t\t\t</Tooltip>\n\t\t\t\t<Tooltip title=\"Insert Image\">\n\t\t\t\t\t<IconButton size=\"small\" onClick={() => fileInputRef.current?.click()}>\n\t\t\t\t\t\t<ImageIcon fontSize=\"small\" />\n\t\t\t\t\t</IconButton>\n\t\t\t\t</Tooltip>\n\t\t\t\t<Tooltip title=\"Insert Table\">\n\t\t\t\t\t<IconButton size=\"small\" onClick={handleShowTablePicker}>\n\t\t\t\t\t\t<TableChart fontSize=\"small\" />\n\t\t\t\t\t</IconButton>\n\t\t\t\t</Tooltip>\n\t\t\t\t<Tooltip title=\"Code\">\n\t\t\t\t\t<IconButton size=\"small\" onMouseDown={toolbarCmd('formatBlock', '<pre>')}>\n\t\t\t\t\t\t<Code fontSize=\"small\" />\n\t\t\t\t\t</IconButton>\n\t\t\t\t</Tooltip>\n\t\t\t</Box>\n\t\t\t\n\t\t\t{/* Hidden file input */}\n\t\t\t<input\n\t\t\t\tref={fileInputRef}\n\t\t\t\ttype=\"file\"\n\t\t\t\taccept=\"image/*\"\n\t\t\t\tstyle={{ display: 'none' }}\n\t\t\t\tonChange={handleFileChange}\n\t\t\t/>\n\t\t\t\n\t\t\t{/* Hidden HTML file input */}\n\t\t\t<input\n\t\t\t\tref={htmlFileInputRef}\n\t\t\t\ttype=\"file\"\n\t\t\t\taccept=\".html,.htm,text/html\"\n\t\t\t\tstyle={{ display: 'none' }}\n\t\t\t\tonChange={handleHtmlFileUpload}\n\t\t\t/>\n\t\t\t\n\t\t\t{/* Hidden file input for replace image */}\n\t\t\t<input\n\t\t\t\tref={replaceImageInputRef}\n\t\t\t\ttype=\"file\"\n\t\t\t\taccept=\"image/*\"\n\t\t\t\tstyle={{ display: 'none' }}\n\t\t\t\tonChange={handleReplaceImageChange}\n\t\t\t/>\n\t\t\t\n\t\t\t{/* Content Area */}\n\t\t\t{showSourceMode ? (\n\t\t\t\t<textarea\n\t\t\t\t\tvalue={sourceCode}\n\t\t\t\t\tonChange={handleSourceCodeChange}\n\t\t\t\t\tclassName=\"custom-editor-source\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\twidth: '100%',\n\t\t\t\t\t\tminHeight: '300px',\n\t\t\t\t\t\tpadding: '16px',\n\t\t\t\t\t\tborder: 'none',\n\t\t\t\t\t\toutline: 'none',\n\t\t\t\t\t\tfontFamily: 'Courier New, monospace',\n\t\t\t\t\t\tfontSize: '13px',\n\t\t\t\t\t\tlineHeight: '1.5',\n\t\t\t\t\t\tresize: 'vertical'\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t<div style={{ position: 'relative' }}>\n\t\t\t\t\t<div\n\t\t\t\t\t\tref={contentEditableRef}\n\t\t\t\t\t\tcontentEditable\n\t\t\t\t\t\tclassName=\"editor-content\"\n\t\t\t\t\t\tonInput={handleInput}\n\t\t\t\t\t\tonPaste={handlePaste}\n\t\t\t\t\t\tonClick={handleContentClick}\n\t\t\t\t\t\tonMouseUp={handleTextSelection}\n\t\t\t\t\t\tonKeyUp={handleTextSelection}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tminHeight: '300px',\n\t\t\t\t\t\t\tpadding: '16px',\n\t\t\t\t\t\t\tborder: '1px solid #ddd',\n\t\t\t\t\t\t\tborderTop: 'none',\n\t\t\t\t\t\t\toutline: 'none',\n\t\t\t\t\t\t\tfontFamily: 'inherit',\n\t\t\t\t\t\t\tfontSize: 'inherit',\n\t\t\t\t\t\t\tlineHeight: '1.6',\n\t\t\t\t\t\t\tbackgroundColor: 'white'\n\t\t\t\t\t\t}}\n\t\t\t\t\t\t{...rest}\n\t\t\t\t\t/>\n\t\t\t\t\t\n\t\t\t\t\t{/* Resize Handles */}\n\t\t\t\t\t{selectedElement && resizeHandles && (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\t\t\t\tleft: resizeHandles.x,\n\t\t\t\t\t\t\t\ttop: resizeHandles.y,\n\t\t\t\t\t\t\t\twidth: resizeHandles.width,\n\t\t\t\t\t\t\t\theight: resizeHandles.height,\n\t\t\t\t\t\t\t\tborder: '2px solid #1976d2',\n\t\t\t\t\t\t\t\tpointerEvents: 'none',\n\t\t\t\t\t\t\t\tzIndex: 1000\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{/* Toolbar for selected element */}\n\t\t\t\t\t\t\t<Box\n\t\t\t\t\t\t\t\tsx={{\n\t\t\t\t\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\t\t\t\t\ttop: -36,\n\t\t\t\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\t\t\tgap: 0.5,\n\t\t\t\t\t\t\t\t\tbgcolor: 'white',\n\t\t\t\t\t\t\t\t\tborder: '1px solid #ddd',\n\t\t\t\t\t\t\t\t\tborderRadius: 1,\n\t\t\t\t\t\t\t\t\tp: 0.25,\n\t\t\t\t\t\t\t\t\tboxShadow: 2,\n\t\t\t\t\t\t\t\t\tpointerEvents: 'auto'\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{selectedElement.tagName === 'IMG' && (\n\t\t\t\t\t\t\t\t\t<Tooltip title=\"Replace Image\">\n\t\t\t\t\t\t\t\t\t\t<IconButton\n\t\t\t\t\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => replaceImageInputRef.current?.click()}\n\t\t\t\t\t\t\t\t\t\t\tsx={{ width: 22, height: 22 }}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<SwapHoriz sx={{ fontSize: 14 }} />\n\t\t\t\t\t\t\t\t\t\t</IconButton>\n\t\t\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{selectedElement.tagName === 'TABLE' && (\n\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t<Tooltip title=\"Add Row\">\n\t\t\t\t\t\t\t\t\t\t\t<IconButton\n\t\t\t\t\t\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tconst tbody = selectedElement.querySelector('tbody');\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (tbody) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst colCount = selectedElement.querySelectorAll('tr:first-child td, tr:first-child th').length || 1;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst tr = document.createElement('tr');\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tfor (let i = 0; i < colCount; i++) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst td = document.createElement('td');\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttd.style.cssText = 'border: 1px solid #ddd; padding: 8px; min-width: 50px;';\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttr.appendChild(td);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttbody.appendChild(tr);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (contentEditableRef.current) sourceCodeRef.current = contentEditableRef.current.innerHTML;\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\tsx={{ width: 22, height: 22 }}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<AddCircleOutline sx={{ fontSize: 14 }} />\n\t\t\t\t\t\t\t\t\t\t\t</IconButton>\n\t\t\t\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t\t\t\t\t<Tooltip title=\"Delete Row\">\n\t\t\t\t\t\t\t\t\t\t\t<IconButton\n\t\t\t\t\t\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tconst rows = selectedElement.querySelectorAll('tbody tr');\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (rows.length > 1) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\trows[rows.length - 1].remove();\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (contentEditableRef.current) sourceCodeRef.current = contentEditableRef.current.innerHTML;\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\tsx={{ width: 22, height: 22 }}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<RemoveCircleOutline sx={{ fontSize: 14 }} />\n\t\t\t\t\t\t\t\t\t\t\t</IconButton>\n\t\t\t\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t\t\t\t\t<Tooltip title=\"Add Column\">\n\t\t\t\t\t\t\t\t\t\t\t<IconButton\n\t\t\t\t\t\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tselectedElement.querySelectorAll('tr').forEach(tr => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst isHeader = tr.closest('thead') !== null;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst cell = document.createElement(isHeader ? 'th' : 'td');\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tcell.style.cssText = 'border: 1px solid #ddd; padding: 8px; min-width: 50px;';\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttr.appendChild(cell);\n\t\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (contentEditableRef.current) sourceCodeRef.current = contentEditableRef.current.innerHTML;\n\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\tsx={{ width: 22, height: 22 }}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<AddCircleOutline sx={{ fontSize: 14, transform: 'rotate(90deg)' }} />\n\t\t\t\t\t\t\t\t\t\t\t</IconButton>\n\t\t\t\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t\t\t\t\t<Tooltip title=\"Delete Column\">\n\t\t\t\t\t\t\t\t\t\t\t<IconButton\n\t\t\t\t\t\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tconst allRows = selectedElement.querySelectorAll('tr');\n\t\t\t\t\t\t\t\t\t\t\t\t\tconst colCount = allRows[0]?.children.length || 0;\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (colCount > 1) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tallRows.forEach(tr => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (tr.lastElementChild) tr.removeChild(tr.lastElementChild);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (contentEditableRef.current) sourceCodeRef.current = contentEditableRef.current.innerHTML;\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\tsx={{ width: 22, height: 22 }}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<RemoveCircleOutline sx={{ fontSize: 14, transform: 'rotate(90deg)' }} />\n\t\t\t\t\t\t\t\t\t\t\t</IconButton>\n\t\t\t\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t<Tooltip title=\"Delete\">\n\t\t\t\t\t\t\t\t\t<IconButton\n\t\t\t\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\t\t\t\tonClick={handleDeleteSelected}\n\t\t\t\t\t\t\t\t\t\tsx={{\n\t\t\t\t\t\t\t\t\t\t\twidth: 22,\n\t\t\t\t\t\t\t\t\t\t\theight: 22,\n\t\t\t\t\t\t\t\t\t\t\tcolor: '#f44336',\n\t\t\t\t\t\t\t\t\t\t\t'&:hover': { bgcolor: '#ffebee' }\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<Close sx={{ fontSize: 14 }} />\n\t\t\t\t\t\t\t\t\t</IconButton>\n\t\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t\t</Box>\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t{/* Corner and edge handles */}\n\t\t\t\t\t\t\t{['nw', 'n', 'ne', 'e', 'se', 's', 'sw', 'w'].map(handle => (\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tkey={handle}\n\t\t\t\t\t\t\t\t\tonMouseDown={(e) => handleResizeStart(e, handle)}\n\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\t\t\t\t\t\twidth: 8,\n\t\t\t\t\t\t\t\t\t\theight: 8,\n\t\t\t\t\t\t\t\t\t\tbackgroundColor: '#1976d2',\n\t\t\t\t\t\t\t\t\t\tborder: '1px solid white',\n\t\t\t\t\t\t\t\t\t\tpointerEvents: 'auto',\n\t\t\t\t\t\t\t\t\t\tcursor: `${handle}-resize`,\n\t\t\t\t\t\t\t\t\t\t...(handle === 'nw' && { top: -4, left: -4 }),\n\t\t\t\t\t\t\t\t\t\t...(handle === 'n' && { top: -4, left: '50%', transform: 'translateX(-50%)' }),\n\t\t\t\t\t\t\t\t\t\t...(handle === 'ne' && { top: -4, right: -4 }),\n\t\t\t\t\t\t\t\t\t\t...(handle === 'e' && { top: '50%', right: -4, transform: 'translateY(-50%)' }),\n\t\t\t\t\t\t\t\t\t\t...(handle === 'se' && { bottom: -4, right: -4 }),\n\t\t\t\t\t\t\t\t\t\t...(handle === 's' && { bottom: -4, left: '50%', transform: 'translateX(-50%)' }),\n\t\t\t\t\t\t\t\t\t\t...(handle === 'sw' && { bottom: -4, left: -4 }),\n\t\t\t\t\t\t\t\t\t\t...(handle === 'w' && { top: '50%', left: -4, transform: 'translateY(-50%)' })\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t\t\n\t\t\t\t\t{/* Text Selection Toolbar */}\n\t\t\t\t\t{showTextToolbar && textSelectionAnchor && (\n\t\t\t\t\t\t<Box\n\t\t\t\t\t\t\tsx={{\n\t\t\t\t\t\t\t\tposition: 'fixed',\n\t\t\t\t\t\t\t\tleft: textSelectionAnchor.x,\n\t\t\t\t\t\t\t\ttop: textSelectionAnchor.y,\n\t\t\t\t\t\t\t\ttransform: 'translate(-50%, -100%)',\n\t\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\t\tgap: 0.5,\n\t\t\t\t\t\t\t\tbgcolor: '#333',\n\t\t\t\t\t\t\t\tcolor: 'white',\n\t\t\t\t\t\t\t\tborderRadius: 1,\n\t\t\t\t\t\t\t\tp: 0.5,\n\t\t\t\t\t\t\t\tboxShadow: 3,\n\t\t\t\t\t\t\t\tzIndex: 10000\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Tooltip title=\"Bold\">\n\t\t\t\t\t\t\t\t<IconButton\n\t\t\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\t\t\tonMouseDown={toolbarCmd('bold')}\n\t\t\t\t\t\t\t\t\tsx={{ color: 'white', width: 28, height: 28 }}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<FormatBold fontSize=\"small\" />\n\t\t\t\t\t\t\t\t</IconButton>\n\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t\t<Tooltip title=\"Italic\">\n\t\t\t\t\t\t\t\t<IconButton\n\t\t\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\t\t\tonMouseDown={toolbarCmd('italic')}\n\t\t\t\t\t\t\t\t\tsx={{ color: 'white', width: 28, height: 28 }}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<FormatItalic fontSize=\"small\" />\n\t\t\t\t\t\t\t\t</IconButton>\n\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t\t<Tooltip title=\"Underline\">\n\t\t\t\t\t\t\t\t<IconButton\n\t\t\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\t\t\tonMouseDown={toolbarCmd('underline')}\n\t\t\t\t\t\t\t\t\tsx={{ color: 'white', width: 28, height: 28 }}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<FormatUnderlined fontSize=\"small\" />\n\t\t\t\t\t\t\t\t</IconButton>\n\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t\t<Divider orientation=\"vertical\" flexItem sx={{ bgcolor: 'rgba(255,255,255,0.2)', mx: 0.5 }} />\n\t\t\t\t\t\t\t<Tooltip title=\"Text Color\">\n\t\t\t\t\t\t\t\t<IconButton\n\t\t\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\t\t\tsx={{ color: 'white', width: 28, height: 28 }}\n\t\t\t\t\t\t\t\t\tonMouseDown={(e) => {\n\t\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t\t\tsetColorPickerState({ anchor: e.currentTarget, type: 'text' });\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<span style={{ fontSize: '14px', fontWeight: 'bold' }}>A</span>\n\t\t\t\t\t\t\t\t</IconButton>\n\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t\t<Tooltip title=\"Font Size\">\n\t\t\t\t\t\t\t\t<Select\n\t\t\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\t\t\tdefaultValue=\"14px\"\n\t\t\t\t\t\t\t\t\tonChange={handleFontSizeChange}\n\t\t\t\t\t\t\t\t\tsx={{ \n\t\t\t\t\t\t\t\t\t\tcolor: 'white',\n\t\t\t\t\t\t\t\t\t\theight: 28,\n\t\t\t\t\t\t\t\t\t\tminWidth: 70,\n\t\t\t\t\t\t\t\t\t\t'& .MuiOutlinedInput-notchedOutline': { border: 'none' },\n\t\t\t\t\t\t\t\t\t\t'& .MuiSvgIcon-root': { color: 'white' }\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{FONT_SIZES.map(size => (\n\t\t\t\t\t\t\t\t\t\t<MenuItem key={size} value={size}>{size}</MenuItem>\n\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t</Select>\n\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t</Box>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t\n\t\t\t{/* Color Picker Popover */}\n\t\t\t{colorPickerState && (\n\t\t\t\t<Popover\n\t\t\t\t\topen\n\t\t\t\t\tanchorEl={colorPickerState.anchor}\n\t\t\t\t\tonClose={() => setColorPickerState(null)}\n\t\t\t\t\tdisableAutoFocus\n\t\t\t\t\tdisableEnforceFocus\n\t\t\t\t\tanchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}\n\t\t\t\t\ttransformOrigin={{ vertical: 'top', horizontal: 'left' }}\n\t\t\t\t>\n\t\t\t\t\t<Box sx={{ p: 1 }}>\n\t\t\t\t\t\t<Box sx={{ display: 'grid', gridTemplateColumns: 'repeat(8, 20px)', gap: '3px' }}>\n\t\t\t\t\t\t\t{PRESET_COLORS.map((color) => (\n\t\t\t\t\t\t\t\t<Box\n\t\t\t\t\t\t\t\t\tkey={color}\n\t\t\t\t\t\t\t\t\tonMouseDown={(e) => {\n\t\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t\t\tif (colorPickerState.type === 'text') {\n\t\t\t\t\t\t\t\t\t\t\texecCommand('foreColor', color);\n\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\texecCommand('hiliteColor', color);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tsetColorPickerState(null);\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tsx={{\n\t\t\t\t\t\t\t\t\t\twidth: 20,\n\t\t\t\t\t\t\t\t\t\theight: 20,\n\t\t\t\t\t\t\t\t\t\tbgcolor: color,\n\t\t\t\t\t\t\t\t\t\tcursor: 'pointer',\n\t\t\t\t\t\t\t\t\t\tborder: '1px solid rgba(0,0,0,0.15)',\n\t\t\t\t\t\t\t\t\t\tborderRadius: '2px',\n\t\t\t\t\t\t\t\t\t\t'&:hover': { transform: 'scale(1.3)', zIndex: 1, position: 'relative' },\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</Box>\n\t\t\t\t\t</Box>\n\t\t\t\t</Popover>\n\t\t\t)}\n\n\t\t\t{/* Table Picker Popover */}\n\t\t\t{showTablePicker && tablePickerAnchor && (\n\t\t\t\t<>\n\t\t\t\t\t<Box\n\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\tsetShowTablePicker(false);\n\t\t\t\t\t\t\tsetTablePickerAnchor(null);\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tsx={{\n\t\t\t\t\t\t\tposition: 'fixed',\n\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\t\tright: 0,\n\t\t\t\t\t\t\tbottom: 0,\n\t\t\t\t\t\t\tzIndex: 9998\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t\t<TablePicker />\n\t\t\t\t</>\n\t\t\t)}\n\t\t</div>\n\t);\n});\n\nCustomEditor.displayName = 'CustomEditor';\nexport default CustomEditor;"],"names":["adapter","protectedHtml","map","error","jsxs","jsx","_","_a","LinkIcon","ImageIcon","Fragment"],"mappings":"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"}
|
|
@@ -2,13 +2,13 @@ import { j as jsxRuntimeExports } from "./jsx-runtime-ClFauRgV.esm.js";
|
|
|
2
2
|
import React__default, { useEffect, Component, useMemo, useState, useRef, useCallback, memo, createElement, Suspense, lazy } from "react";
|
|
3
3
|
import { Outlet, Navigate, useLocation, useNavigate, useSearchParams, Link as Link$2, useParams } from "react-router-dom";
|
|
4
4
|
import { P as Pathname, f as PathnameRental, b as PathnameCrm, e as PathnamePurchase, d as PathnameManufacturing, c as PathnameInventory, a as PathnameAccounting } from "./pathname.rental-VYOFVGX6.esm.js";
|
|
5
|
-
import { T as Typography, u as useAuth, i as default_1$d, r as requireCreateSvgIcon } from "./useAuth-
|
|
6
|
-
import { W as Loader, Y as MaterialTable, M as Footer, C as Checkbox, a4 as Radio, x as DynamicTable, l as DynamicCheckBox, t as DynamicRadioButton, E as DynamicToggleButton, p as DynamicInfo, r as DynamicMedia, z as DynamicTime, n as DynamicDate, w as DynamicSelect, s as DynamicPhone, o as DynamicElementHOC, N as FormHeader, k as DynamicButton, ab as TabBar, v as DynamicSectionHOC, P as FormParser, am as default_1$e, h as ColorPickerInput, e as Android12Switch$2, an as default_1$f, a6 as SearchableSelect, a as ActionBar, F as Fallback } from "./android-12-switch-
|
|
5
|
+
import { T as Typography, u as useAuth, i as default_1$d, r as requireCreateSvgIcon } from "./useAuth-Tfx2guEJ.esm.js";
|
|
6
|
+
import { W as Loader, Y as MaterialTable, M as Footer, C as Checkbox, a4 as Radio, x as DynamicTable, l as DynamicCheckBox, t as DynamicRadioButton, E as DynamicToggleButton, p as DynamicInfo, r as DynamicMedia, z as DynamicTime, n as DynamicDate, w as DynamicSelect, s as DynamicPhone, o as DynamicElementHOC, N as FormHeader, k as DynamicButton, ab as TabBar, v as DynamicSectionHOC, P as FormParser, am as default_1$e, h as ColorPickerInput, e as Android12Switch$2, an as default_1$f, a6 as SearchableSelect, a as ActionBar, F as Fallback } from "./android-12-switch-DSBIf4t0.esm.js";
|
|
7
7
|
import { u as useAppDispatch, a as useAppSelector } from "./hooks-Cj9Yhy-E.esm.js";
|
|
8
8
|
import { createAsyncThunk, createSlice } from "@reduxjs/toolkit";
|
|
9
|
-
import { M as Menu, h as aggregationFns, D as DefaultAggregation, f as formBuilderDeConversion, C as Chip, t as transformTableColumns } from "./form-builder-deconversion-
|
|
9
|
+
import { M as Menu, h as aggregationFns, D as DefaultAggregation, f as formBuilderDeConversion, C as Chip, t as transformTableColumns } from "./form-builder-deconversion-CUwBfP4C.esm.js";
|
|
10
10
|
import { MenuItem, Box, styled, Grid, Stack, FormControl, Slider, FormControlLabel, DialogTitle, IconButton, DialogContent, DialogActions, Select as Select$1, Button as Button$1, RadioGroup, TextField as TextField$1, InputAdornment, AppBar, Toolbar, Link as Link$1, Divider, Skeleton, Paper, Fade, Tooltip, ToggleButton, ToggleButtonGroup, toggleButtonGroupClasses, Switch, Tabs, Tab, Chip as Chip$1, Alert, AccordionSummary, AccordionDetails, Table, TableHead, TableRow, TableCell, TableBody, Dialog, Accordion as Accordion$1, Typography as Typography$1, CircularProgress, ListItemIcon, ListItemText, ListItem, Container } from "@mui/material";
|
|
11
|
-
import { B as Button, G as o, D as DynamicInput, d as Toast, c as Select, T as TextField, M as Modal, y as default_1$g, S as SearchBar, C as ConfirmPopUp } from "./appbar-
|
|
11
|
+
import { B as Button, G as o, D as DynamicInput, d as Toast, c as Select, T as TextField, M as Modal, y as default_1$g, S as SearchBar, C as ConfirmPopUp } from "./appbar-DM2iBqb4.esm.js";
|
|
12
12
|
import { i as images } from "./images-BY6aQF32.esm.js";
|
|
13
13
|
import { useForm, useFieldArray } from "react-hook-form";
|
|
14
14
|
import { E as Eye, a as EyeOff } from "./tick-CRp4S9uN.esm.js";
|
|
@@ -22,15 +22,15 @@ import { DndProvider } from "react-dnd";
|
|
|
22
22
|
import { HTML5Backend } from "react-dnd-html5-backend";
|
|
23
23
|
import { useTranslation } from "react-i18next";
|
|
24
24
|
import { enqueueSnackbar } from "notistack";
|
|
25
|
-
import { f as formBuilderConversion } from "./form-builder-conversion-
|
|
26
|
-
import { aU as formatText$1, S as SECTION_TYPES, a3 as generateRandomId, a8 as getErrorMessage, W as formatLabel, aR as uploadFiles, ar as getToken, j as appendConditionSafely, v as defaultCurrencySymbol, A as fetchApi } from "./common-
|
|
27
|
-
import { E as ErpLoader } from "./page-context-
|
|
28
|
-
import { i as patchFormDataById, h as getFormDataById, g as getFieldsByFormId } from "./reducer-
|
|
25
|
+
import { f as formBuilderConversion } from "./form-builder-conversion-BdWASNEo.esm.js";
|
|
26
|
+
import { aU as formatText$1, S as SECTION_TYPES, a3 as generateRandomId, a8 as getErrorMessage, W as formatLabel, aR as uploadFiles, ar as getToken, j as appendConditionSafely, v as defaultCurrencySymbol, A as fetchApi } from "./common-B6euWODJ.esm.js";
|
|
27
|
+
import { E as ErpLoader } from "./page-context-B_wK6kLR.esm.js";
|
|
28
|
+
import { i as patchFormDataById, h as getFormDataById, g as getFieldsByFormId } from "./reducer-Bpuo5eq1.esm.js";
|
|
29
29
|
import { o as Paragraph, H as Hashtag, A as ArrowCircleDown, r as Calendar, P as PaperClip, L as Link, g as Email, p as Phone, f as DollarCircle, d as Clock, G as Grid$1, n as Location, c as CheckboxSquare, I as Image, m as LinkHorizontal, l as InfoCircle, R as RadioButton, T as Trash, E as Edit, S as Save } from "./trash-jodcm4T5.esm.js";
|
|
30
30
|
import { T as ToggleSwitch } from "./toggle-switch-BHNFcNhi.esm.js";
|
|
31
|
-
import { P as PathnameHrms, a as PathnameUsers } from "./pathname.hrms-
|
|
31
|
+
import { P as PathnameHrms, a as PathnameUsers } from "./pathname.hrms-C5ojsho0.esm.js";
|
|
32
32
|
import { k as interopRequireDefaultExports } from "./identifier-u4E_J1of.esm.js";
|
|
33
|
-
import { bB as initialStyles, bA as TEMPLATE_EDITOR_PATHS } from "./route-page-map-
|
|
33
|
+
import { bB as initialStyles, bA as TEMPLATE_EDITOR_PATHS } from "./route-page-map-C4wM0M4A.esm.js";
|
|
34
34
|
import { useDraggable, useDroppable, DndContext, pointerWithin } from "@dnd-kit/core";
|
|
35
35
|
import _, { debounce } from "lodash";
|
|
36
36
|
import { useDropzone } from "react-dropzone";
|
|
@@ -38,7 +38,7 @@ import { FileCode, Heading, Text, Image as Image$1, Table as Table$1, Blocks, Qr
|
|
|
38
38
|
import { u as postV1Drive, aY as getV1Drive, aZ as patchV1TemplatesId, a_ as postV1Templates, a$ as patchV1TemplateHeaderFooterId, b0 as postV1TemplateHeaderFooter, b1 as getV1SubjectsId, b2 as getV1FormBuilderRelationalSchemaFieldsName, b3 as getV1TemplatesId, b4 as getV1TemplateHeaderFooterCompanyIdHeaderFooter, b5 as getV1Templates, b6 as patchV1TemplatesIdSetDefault, b7 as deleteV1TemplatesId, b8 as getV1Subjects } from "./api-BAbF3OU7.esm.js";
|
|
39
39
|
import { v4 } from "uuid";
|
|
40
40
|
import { v as viewTypes } from "./action-bar-BsXTcYpL.esm.js";
|
|
41
|
-
import { f as usePages, b as useDeepMemo, g as usePermissions } from "./useAccountSetting-
|
|
41
|
+
import { f as usePages, b as useDeepMemo, g as usePermissions } from "./useAccountSetting-D6Hhq1Pz.esm.js";
|
|
42
42
|
const allAggregations = [
|
|
43
43
|
{
|
|
44
44
|
label: "Average",
|
|
@@ -5980,7 +5980,7 @@ var _jsxRuntime$a = jsxRuntimeExports;
|
|
|
5980
5980
|
default_1$a = CallSplit.default = (0, _createSvgIcon$a.default)(/* @__PURE__ */ (0, _jsxRuntime$a.jsx)("path", {
|
|
5981
5981
|
d: "m14 4 2.29 2.29-2.88 2.88 1.42 1.42 2.88-2.88L20 10V4zm-4 0H4v6l2.29-2.29 4.71 4.7V20h2v-8.41l-5.29-5.3z"
|
|
5982
5982
|
}), "CallSplit");
|
|
5983
|
-
const CustomEditor$1 = lazy(() => import("./custom-editor-
|
|
5983
|
+
const CustomEditor$1 = lazy(() => import("./custom-editor-DnfTs5-j.esm.js"));
|
|
5984
5984
|
const EditSectionModal = ({
|
|
5985
5985
|
isOpen,
|
|
5986
5986
|
setIsOpen,
|
|
@@ -6400,7 +6400,7 @@ const useDebouncedUpdate = (callback, delay = 300) => {
|
|
|
6400
6400
|
);
|
|
6401
6401
|
return debouncedCallback;
|
|
6402
6402
|
};
|
|
6403
|
-
const CustomEditor = lazy(() => import("./custom-editor-
|
|
6403
|
+
const CustomEditor = lazy(() => import("./custom-editor-DnfTs5-j.esm.js"));
|
|
6404
6404
|
const editableSections = ["text", "text-block", "heading", "heading-1", "heading-2", "heading-3", "heading-4"];
|
|
6405
6405
|
const EditorSection = ({
|
|
6406
6406
|
section: section2,
|
|
@@ -12907,4 +12907,4 @@ export {
|
|
|
12907
12907
|
activityTag as y,
|
|
12908
12908
|
board as z
|
|
12909
12909
|
};
|
|
12910
|
-
//# sourceMappingURL=default-data-
|
|
12910
|
+
//# sourceMappingURL=default-data-BV_r59U9.esm.js.map
|