@templatical/editor 0.0.3 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/dist/{AiChatSidebar-busJk9hm.js → AiChatSidebar-CjfhTZwo.js} +1 -1
  2. package/dist/{AiFeatureMenu-DLGv_-pj.js → AiFeatureMenu-K44aZa_P.js} +3 -3
  3. package/dist/CloudEditor-DFyuRxUV.js +926 -0
  4. package/dist/{CollaboratorBar-Dv3l52vC.js → CollaboratorBar-BuCEcdbB.js} +25 -21
  5. package/dist/{CommentsSidebar-4tjp0VU5.js → CommentsSidebar-2lcqMfIP.js} +2 -2
  6. package/dist/{DesignReferenceSidebar-CmwXvltV.js → DesignReferenceSidebar-CNMu4Zrx.js} +2 -2
  7. package/dist/{ModuleBrowserModal-lrk3Fr0H.js → ModuleBrowserModal-CvQ0xyQf.js} +6 -6
  8. package/dist/{ModulePreviewCanvas-BcBJLnwL.js → ModulePreviewCanvas-Be2B3Y07.js} +2 -2
  9. package/dist/ParagraphEditor-CcMPnbDr.js +652 -0
  10. package/dist/{RichTextEditorContent-CQqodi7p.js → RichTextEditorContent-CHJlh7HJ.js} +8 -4
  11. package/dist/{SaveModuleDialog-Bmzi72td.js → SaveModuleDialog-BaaeH5Xm.js} +5 -5
  12. package/dist/{SnapshotHistory-AEgi9Xsn.js → SnapshotHistory-BPfjiuu1.js} +2 -2
  13. package/dist/{TemplateScoringPanel-CTgMtc0-.js → TemplateScoringPanel-D58A23Vq.js} +3 -3
  14. package/dist/{TestEmailModal-Dpq1is9S.js → TestEmailModal-DIAlB3e_.js} +3 -3
  15. package/dist/{TitleEditor-CLcDdcWI.js → TitleEditor-D9DPjQkX.js} +7 -7
  16. package/dist/{TplModal-CGzRjR96.js → TplModal-CmTSvCY-.js} +2 -2
  17. package/dist/{blockTypeIcons-BpPTqcok.js → blockTypeIcons-D1RTWOkx.js} +1 -1
  18. package/dist/cdn/chunks/AiChatSidebar-CmPTbTFG.js +2 -0
  19. package/dist/cdn/chunks/AiFeatureMenu-lxVm1RjH.js +59 -0
  20. package/dist/cdn/chunks/AiFeatureMenu-lxVm1RjH.js.map +1 -0
  21. package/dist/cdn/chunks/CloudEditor-Bmp5IlWi.js +900 -0
  22. package/dist/cdn/chunks/CloudEditor-Bmp5IlWi.js.map +1 -0
  23. package/dist/cdn/chunks/CollaboratorBar-D2PKtlOw.js +51 -0
  24. package/dist/cdn/chunks/CollaboratorBar-D2PKtlOw.js.map +1 -0
  25. package/dist/cdn/chunks/CommentsSidebar-BOelj4Ca.js +2 -0
  26. package/dist/cdn/chunks/DesignReferenceSidebar-Bf6rg0A7.js +2 -0
  27. package/dist/cdn/chunks/ModuleBrowserModal-CxDXzkKS.js +195 -0
  28. package/dist/cdn/chunks/ModuleBrowserModal-CxDXzkKS.js.map +1 -0
  29. package/dist/cdn/chunks/ModulePreviewCanvas-DEfHampA.js +107 -0
  30. package/dist/cdn/chunks/ModulePreviewCanvas-DEfHampA.js.map +1 -0
  31. package/dist/cdn/chunks/ParagraphEditor-DHdu6lb3.js +503 -0
  32. package/dist/cdn/chunks/ParagraphEditor-DHdu6lb3.js.map +1 -0
  33. package/dist/cdn/chunks/RichTextEditorContent-DWUzizsC.js +106 -0
  34. package/dist/cdn/chunks/RichTextEditorContent-DWUzizsC.js.map +1 -0
  35. package/dist/cdn/chunks/SaveModuleDialog-DVna2xUl.js +119 -0
  36. package/dist/cdn/chunks/SaveModuleDialog-DVna2xUl.js.map +1 -0
  37. package/dist/cdn/chunks/SnapshotHistory-BFF2SsTN.js +2 -0
  38. package/dist/cdn/chunks/TemplateScoringPanel-gi8wc_m7.js +2 -0
  39. package/dist/cdn/chunks/TestEmailModal-Qtd6aC-6.js +2 -0
  40. package/dist/cdn/chunks/TitleEditor-DDf_OcHS.js +166 -0
  41. package/dist/cdn/chunks/TitleEditor-DDf_OcHS.js.map +1 -0
  42. package/dist/cdn/chunks/_rolldown_dynamic_import_helper-DMEI4TQ3.js +9 -0
  43. package/dist/cdn/chunks/blockTypeIcons-BnobReQm.js +22 -0
  44. package/dist/cdn/chunks/blockTypeIcons-BnobReQm.js.map +1 -0
  45. package/dist/cdn/chunks/de-BB3dgVOc.js +700 -0
  46. package/dist/cdn/chunks/de-BB3dgVOc.js.map +1 -0
  47. package/dist/cdn/chunks/de-BvYD17KT.js +89 -0
  48. package/dist/cdn/chunks/de-BvYD17KT.js.map +1 -0
  49. package/dist/cdn/chunks/dist-B6AUkMyh.js +2 -0
  50. package/dist/cdn/chunks/dist-B878xb_62.js +457 -0
  51. package/dist/cdn/chunks/dist-B878xb_62.js.map +1 -0
  52. package/dist/cdn/chunks/dist-Bf1Op9A1.js +2 -0
  53. package/dist/cdn/chunks/dist-BkETaOfw.js +2 -0
  54. package/dist/cdn/chunks/dist-CJcMnY7o.js +2 -0
  55. package/dist/cdn/chunks/dist-CWsl6S1K.js +2 -0
  56. package/dist/cdn/chunks/dist-CllLxIMQ.js +2 -0
  57. package/dist/cdn/chunks/dist-Cs0wFwdw.js +2 -0
  58. package/dist/cdn/chunks/dist-DLWHlekl.js +2 -0
  59. package/dist/cdn/chunks/dist-DS3_HVpX.js +2 -0
  60. package/dist/cdn/chunks/dist-DTXopj1a.js +2 -0
  61. package/dist/cdn/chunks/dist-DnwLoNLm.js +2 -0
  62. package/dist/cdn/chunks/draggable-BQNU47zu.js +11544 -0
  63. package/dist/cdn/chunks/{draggable-ClUwYCFL.js.map → draggable-BQNU47zu.js.map} +1 -1
  64. package/dist/cdn/chunks/emojiData-BVEJHcNH.js +19 -0
  65. package/dist/cdn/chunks/{emojiData-6fVLNqeH.js.map → emojiData-BVEJHcNH.js.map} +1 -1
  66. package/dist/cdn/chunks/en-CpotcOPr.js +89 -0
  67. package/dist/cdn/chunks/en-CpotcOPr.js.map +1 -0
  68. package/dist/cdn/chunks/en-DeDcpnoS.js +700 -0
  69. package/dist/cdn/chunks/en-DeDcpnoS.js.map +1 -0
  70. package/dist/cdn/chunks/extensions-B_kcV0tK.js +419 -0
  71. package/dist/cdn/chunks/{extensions-ea_ewKUl.js.map → extensions-B_kcV0tK.js.map} +1 -1
  72. package/dist/cdn/chunks/features-ofOGnSC0.js +6700 -0
  73. package/dist/cdn/chunks/features-ofOGnSC0.js.map +1 -0
  74. package/dist/cdn/chunks/icons-bIb7PBOE.js +653 -0
  75. package/dist/cdn/chunks/icons-bIb7PBOE.js.map +1 -0
  76. package/dist/cdn/chunks/liquid.browser-C1VIYISn.js +3272 -0
  77. package/dist/cdn/chunks/liquid.browser-C1VIYISn.js.map +1 -0
  78. package/dist/cdn/chunks/media-library-BIYzV2Y2.js +6005 -0
  79. package/dist/cdn/chunks/media-library-BIYzV2Y2.js.map +1 -0
  80. package/dist/cdn/chunks/pusher-DJPhQnE8.js +2505 -0
  81. package/dist/cdn/chunks/pusher-DJPhQnE8.js.map +1 -0
  82. package/dist/cdn/chunks/readableTextColor-Cd_cgWO_.js +32 -0
  83. package/dist/cdn/chunks/readableTextColor-Cd_cgWO_.js.map +1 -0
  84. package/dist/cdn/chunks/rolldown-runtime-DPITmOBR.js +20 -0
  85. package/dist/cdn/chunks/src-BuW9oYtm.js +494 -0
  86. package/dist/cdn/chunks/src-BuW9oYtm.js.map +1 -0
  87. package/dist/cdn/chunks/styleConstants-1KwsBMxJ.js +57 -0
  88. package/dist/cdn/chunks/{styleConstants-CNejCb-L.js.map → styleConstants-1KwsBMxJ.js.map} +1 -1
  89. package/dist/cdn/chunks/styles-DQFExz-T.js +3222 -0
  90. package/dist/cdn/chunks/styles-DQFExz-T.js.map +1 -0
  91. package/dist/cdn/chunks/tiptap-DplY-S-k.js +14208 -0
  92. package/dist/cdn/chunks/{tiptap-Cya4P9CN.js.map → tiptap-DplY-S-k.js.map} +1 -1
  93. package/dist/cdn/editor.css +2 -1
  94. package/dist/cdn/editor.js +260 -1
  95. package/dist/cdn/editor.js.map +1 -1
  96. package/dist/{de-B4Ob4vCo.js → de-D7TLGIPA.js} +20 -4
  97. package/dist/{dist-DmpMJbmZ.js → dist-BkIys9zn.js} +1 -1
  98. package/dist/{en-YXsspZJG.js → en-DvtiEMwP.js} +20 -4
  99. package/dist/{extensions-CKM99njP.js → extensions-DEjfEFhD.js} +3 -3
  100. package/dist/{keys-Dwa2PmdD.js → keys-C0MQRs8d.js} +3 -3
  101. package/dist/readableTextColor-LDlmVEUv.js +30 -0
  102. package/dist/{styles-DSw1VNU3.js → styles-CgLaxDfu.js} +1096 -1074
  103. package/dist/templatical-editor.css +1 -1
  104. package/dist/templatical-editor.js +113 -89
  105. package/dist/templatical-editor.umd.cjs +59 -59
  106. package/dist/{useEditorCore-Cc4RCwWq.js → useEditorCore-CjwRMl7K.js} +1152 -1014
  107. package/dist/{useI18n-DUirdXEX.js → useI18n-D6m7ZUgY.js} +1 -1
  108. package/dist/{useMergeTag-DVnlvPYJ.js → useMergeTag-BZ3X0bNr.js} +1 -1
  109. package/package.json +2 -2
  110. package/dist/CloudEditor-BDnHd6Um.js +0 -919
  111. package/dist/ParagraphEditor-DH8cSC6m.js +0 -625
  112. package/dist/cdn/chunks/ParagraphEditor-CCtWbGDv.js +0 -3
  113. package/dist/cdn/chunks/ParagraphEditor-CCtWbGDv.js.map +0 -1
  114. package/dist/cdn/chunks/RichTextEditorContent-BUD9veXd.js +0 -2
  115. package/dist/cdn/chunks/RichTextEditorContent-BUD9veXd.js.map +0 -1
  116. package/dist/cdn/chunks/TitleEditor-e_UTyxjd.js +0 -3
  117. package/dist/cdn/chunks/TitleEditor-e_UTyxjd.js.map +0 -1
  118. package/dist/cdn/chunks/dist-0UheN8rK.js +0 -1
  119. package/dist/cdn/chunks/dist-55mmbGQ9.js +0 -1
  120. package/dist/cdn/chunks/dist-B31mxKyP.js +0 -1
  121. package/dist/cdn/chunks/dist-B5JI9nIg.js +0 -1
  122. package/dist/cdn/chunks/dist-B93vLKhU.js +0 -1
  123. package/dist/cdn/chunks/dist-BDt3FJvj.js +0 -1
  124. package/dist/cdn/chunks/dist-BJRuFHmi.js +0 -1
  125. package/dist/cdn/chunks/dist-BKSzrf0L.js +0 -1
  126. package/dist/cdn/chunks/dist-BL8c5gYQ.js +0 -1
  127. package/dist/cdn/chunks/dist-CYThWMP5.js +0 -1
  128. package/dist/cdn/chunks/dist-DxZbPJYt.js +0 -1
  129. package/dist/cdn/chunks/draggable-ClUwYCFL.js +0 -17
  130. package/dist/cdn/chunks/emojiData-6fVLNqeH.js +0 -2
  131. package/dist/cdn/chunks/extensions-ea_ewKUl.js +0 -2
  132. package/dist/cdn/chunks/icons-vmLJTaJk.js +0 -2
  133. package/dist/cdn/chunks/icons-vmLJTaJk.js.map +0 -1
  134. package/dist/cdn/chunks/rolldown-runtime-BakkzWXw.js +0 -1
  135. package/dist/cdn/chunks/styleConstants-CNejCb-L.js +0 -2
  136. package/dist/cdn/chunks/tiptap-Cya4P9CN.js +0 -145
  137. package/dist/cdn/chunks/useEditorCore-CwuxQuvh.js +0 -2
  138. package/dist/cdn/chunks/useEditorCore-CwuxQuvh.js.map +0 -1
  139. package/dist/cdn/chunks/useMergeTag-DVOz1v9p.js +0 -2
  140. package/dist/cdn/chunks/useMergeTag-DVOz1v9p.js.map +0 -1
  141. package/dist/i18n-CJsFtdbZ.js +0 -23
@@ -1,2 +0,0 @@
1
- import{F as e,y as t,z as n}from"./draggable-ClUwYCFL.js";import"./icons-vmLJTaJk.js";var r={liquid:{value:/\{\{.+?\}\}/g,logic:/\{%-?\s*(\w+).*?-?%\}/g},handlebars:{value:/\{\{\{?.+?\}?\}\}/g,logic:/\{\{[#/](\w+).*?\}\}/g},mailchimp:{value:/\*\|\w+\|\*/g,logic:/\*\|(\w+)[:|].*?\|\*/g},ampscript:{value:/%%=.+?=%%/g,logic:/%%\[\s*(\w+).*?\]%%/g}};function i(e){let t=e.source,n=e.flags.replace(`g`,``);return RegExp(`^${t}$`,n)}function a(e,t){return i(t.value).test(e?.trim()||``)}function o(e,t){let n=t.find(t=>t.value===e);return n?n.label:e}function s(e,t){return i(t.logic).test(e?.trim()||``)}function c(e,t){let n=new RegExp(t.logic.source,t.logic.flags.replace(`g`,``)),r=e.match(n);return r&&r[1]?r[1].toUpperCase():e}var l=Symbol(`translations`),u=Symbol(`editor`),d=Symbol(`fontsManager`),f=Symbol(`themeStyles`),p=Symbol(`tplUiTheme`),m=Symbol(`mergeTags`),h=Symbol(`mergeTagSyntax`),g=Symbol(`onRequestMergeTag`);function _(e,n){let r=t(e,null);if(r==null)throw Error(`${n} requires a provider for ${e.description??`unknown key`}. Ensure it is a descendant of Editor or CloudEditor.`);return r}function v(n){let r=n??t(l,null);if(!r)throw Error(`useI18n() requires a translations provider. Ensure the component is a descendant of Editor or CloudEditor.`);let i=e(r)?r.value:r;function a(e,t){return e.replace(/\{(\w+)\}/g,(e,n)=>n in t?String(t[n]):`{${n}}`)}return{t:i,format:a}}function y(){let e=t(m,[]),i=t(h,r.liquid),s=t(g,null),c=n(!1);function l(e){return a(e,i)}function u(t){return o(t,e)}async function d(){if(!s)return null;c.value=!0;try{return await s()}finally{c.value=!1}}return{mergeTags:e,isRequesting:c,isEnabled:e.length>0||!!s,syntax:i,isMergeTagValue:l,getMergeTagLabel:u,requestMergeTag:d}}export{m as a,f as c,_ as d,r as f,s as h,d as i,l,o as m,v as n,h as o,c as p,u as r,g as s,y as t,p as u};
2
- //# sourceMappingURL=useMergeTag-DVOz1v9p.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useMergeTag-DVOz1v9p.js","names":[],"sources":["../../../../types/src/merge-tags.ts","../../../src/keys.ts","../../../src/composables/useI18n.ts","../../../src/composables/useMergeTag.ts"],"sourcesContent":["import type { MergeTag } from \"./config\";\n\n// --- Syntax Presets ---\n\nexport interface SyntaxPreset {\n value: RegExp;\n logic: RegExp;\n}\n\nexport type SyntaxPresetName =\n | \"liquid\"\n | \"handlebars\"\n | \"mailchimp\"\n | \"ampscript\";\n\nexport const SYNTAX_PRESETS: Record<SyntaxPresetName, SyntaxPreset> = {\n liquid: { value: /\\{\\{.+?\\}\\}/g, logic: /\\{%-?\\s*(\\w+).*?-?%\\}/g },\n handlebars: {\n value: /\\{\\{\\{?.+?\\}?\\}\\}/g,\n logic: /\\{\\{[#/](\\w+).*?\\}\\}/g,\n },\n mailchimp: { value: /\\*\\|\\w+\\|\\*/g, logic: /\\*\\|(\\w+)[:|].*?\\|\\*/g },\n ampscript: { value: /%%=.+?=%%/g, logic: /%%\\[\\s*(\\w+).*?\\]%%/g },\n};\n\nexport function resolveSyntax(\n syntax?: SyntaxPresetName | SyntaxPreset,\n): SyntaxPreset {\n if (!syntax) {\n return SYNTAX_PRESETS.liquid;\n }\n\n if (typeof syntax === \"string\") {\n return SYNTAX_PRESETS[syntax];\n }\n\n return syntax;\n}\n\n// --- Merge Tag Utilities ---\n\nfunction escapeRegExp(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction anchoredRegex(pattern: RegExp): RegExp {\n const source = pattern.source;\n const flags = pattern.flags.replace(\"g\", \"\");\n return new RegExp(`^${source}$`, flags);\n}\n\nexport function isMergeTagValue(value: string, syntax: SyntaxPreset): boolean {\n return anchoredRegex(syntax.value).test(value?.trim() || \"\");\n}\n\nexport function getMergeTagLabel(value: string, mergeTags: MergeTag[]): string {\n const found = mergeTags.find((p) => p.value === value);\n if (found) {\n return found.label;\n }\n return value;\n}\n\nexport function resolveHtmlMergeTagLabels(\n html: string,\n mergeTags: MergeTag[],\n): string {\n return html.replace(\n /(<span[^>]*\\sdata-merge-tag=\"([^\"]*)\"[^>]*>)(.*?)(<\\/span>)/g,\n (_match, openTag, value, _oldLabel, closeTag) => {\n const label = getMergeTagLabel(value, mergeTags);\n return `${openTag}${label}${closeTag}`;\n },\n );\n}\n\nexport function containsMergeTag(value: string, syntax: SyntaxPreset): boolean {\n if (!value) return false;\n\n const valueRegex = new RegExp(syntax.value.source, syntax.value.flags);\n const logicRegex = new RegExp(syntax.logic.source, syntax.logic.flags);\n\n return valueRegex.test(value) || logicRegex.test(value);\n}\n\nexport function restoreMergeTagMarkup(\n html: string,\n mergeTags: MergeTag[],\n syntax: SyntaxPreset,\n): string {\n let result = html;\n\n for (const tag of mergeTags) {\n const escaped = escapeRegExp(tag.value);\n const pattern = new RegExp(`(?<!data-merge-tag=\")${escaped}`, \"g\");\n result = result.replace(pattern, (match) => {\n const label = getMergeTagLabel(match, mergeTags);\n return `<span data-merge-tag=\"${match}\">${label}</span>`;\n });\n }\n\n const logicRegex = new RegExp(\n `(?<!data-logic-merge-tag=\")${syntax.logic.source}`,\n syntax.logic.flags,\n );\n result = result.replace(logicRegex, (match) => {\n const keyword = getLogicMergeTagKeyword(match, syntax);\n return `<span data-logic-merge-tag=\"${match}\">${keyword}</span>`;\n });\n\n return result;\n}\n\nexport function isLogicMergeTagValue(\n value: string,\n syntax: SyntaxPreset,\n): boolean {\n return anchoredRegex(syntax.logic).test(value?.trim() || \"\");\n}\n\nexport function getLogicMergeTagKeyword(\n value: string,\n syntax: SyntaxPreset,\n): string {\n const regex = new RegExp(\n syntax.logic.source,\n syntax.logic.flags.replace(\"g\", \"\"),\n );\n const match = value.match(regex);\n return match && match[1] ? match[1].toUpperCase() : value;\n}\n\nexport function resolveHtmlLogicMergeTagLabels(\n html: string,\n syntax: SyntaxPreset,\n): string {\n return html.replace(\n /(<span[^>]*\\sdata-logic-merge-tag=\"([^\"]*)\"[^>]*>)(.*?)(<\\/span>)/g,\n (_match, openTag, value, _oldLabel, closeTag) => {\n const keyword = getLogicMergeTagKeyword(value, syntax);\n return `${openTag}${keyword}${closeTag}`;\n },\n );\n}\n","import { inject, type InjectionKey, type ComputedRef } from \"vue\";\nimport type {\n UseHistoryReturn,\n UseBlockActionsReturn,\n UseConditionPreviewReturn,\n} from \"@templatical/core\";\nimport type {\n BlockDefaults,\n CustomBlockDefinition,\n DisplayCondition,\n MergeTag,\n SyntaxPreset,\n} from \"@templatical/types\";\nimport type { Translations } from \"./i18n\";\nimport type {\n AuthManager,\n UseAiConfigReturn,\n UseCommentsReturn,\n UseSavedModulesReturn,\n UseTemplateScoringReturn,\n} from \"@templatical/core/cloud\";\nimport type { BaseEditorReturn } from \"./composables/useEditorCore\";\nimport type { UseFontsReturn } from \"./composables/useFonts\";\nimport type { UseBlockRegistryReturn } from \"./composables/useBlockRegistry\";\nimport type { EditorCapabilities } from \"./types/editor-capabilities\";\nimport type { OnRequestMedia } from \"./index\";\n\n// ---------------------------------------------------------------------------\n// Shared keys (provided by useEditorCore, consumed by all components)\n// ---------------------------------------------------------------------------\n\nexport const TRANSLATIONS_KEY: InjectionKey<Translations> =\n Symbol(\"translations\");\n\nexport const EDITOR_KEY: InjectionKey<BaseEditorReturn> = Symbol(\"editor\");\n\nexport const HISTORY_KEY: InjectionKey<UseHistoryReturn> = Symbol(\"history\");\n\nexport const BLOCK_ACTIONS_KEY: InjectionKey<UseBlockActionsReturn> =\n Symbol(\"blockActions\");\n\nexport const CONDITION_PREVIEW_KEY: InjectionKey<UseConditionPreviewReturn> =\n Symbol(\"conditionPreview\");\n\nexport const FONTS_MANAGER_KEY: InjectionKey<UseFontsReturn> =\n Symbol(\"fontsManager\");\n\nexport const THEME_STYLES_KEY: InjectionKey<\n ComputedRef<Record<string, string>>\n> = Symbol(\"themeStyles\");\n\nexport const UI_THEME_KEY: InjectionKey<ComputedRef<string>> =\n Symbol(\"tplUiTheme\");\n\nexport const BLOCK_DEFAULTS_KEY: InjectionKey<BlockDefaults | undefined> =\n Symbol(\"blockDefaults\");\n\nexport const BLOCK_REGISTRY_KEY: InjectionKey<UseBlockRegistryReturn> =\n Symbol(\"blockRegistry\");\n\nexport const CUSTOM_BLOCK_DEFINITIONS_KEY: InjectionKey<\n CustomBlockDefinition[]\n> = Symbol(\"customBlockDefinitions\");\n\nexport const MERGE_TAGS_KEY: InjectionKey<MergeTag[]> = Symbol(\"mergeTags\");\n\nexport const MERGE_TAG_SYNTAX_KEY: InjectionKey<SyntaxPreset> =\n Symbol(\"mergeTagSyntax\");\n\nexport const ON_REQUEST_MERGE_TAG_KEY: InjectionKey<\n (() => Promise<MergeTag | null>) | null\n> = Symbol(\"onRequestMergeTag\");\n\nexport const ON_REQUEST_MEDIA_KEY: InjectionKey<OnRequestMedia | null> =\n Symbol(\"onRequestMedia\");\n\nexport const DISPLAY_CONDITIONS_KEY: InjectionKey<DisplayCondition[]> =\n Symbol(\"displayConditions\");\n\nexport const ALLOW_CUSTOM_CONDITIONS_KEY: InjectionKey<boolean> = Symbol(\n \"allowCustomConditions\",\n);\n\nexport const CAPABILITIES_KEY: InjectionKey<EditorCapabilities> =\n Symbol(\"capabilities\");\n\n// ---------------------------------------------------------------------------\n// Cloud-only keys (provided by CloudEditor, consumed by cloud components)\n// ---------------------------------------------------------------------------\n\nexport const AUTH_MANAGER_KEY: InjectionKey<AuthManager> =\n Symbol(\"authManager\");\n\nexport const AI_CONFIG_KEY: InjectionKey<UseAiConfigReturn> =\n Symbol(\"aiConfig\");\n\nexport const COMMENTS_KEY: InjectionKey<UseCommentsReturn> = Symbol(\"comments\");\n\nexport const SAVED_MODULES_HEADLESS_KEY: InjectionKey<UseSavedModulesReturn> =\n Symbol(\"savedModulesHeadless\");\n\nexport const SCORING_KEY: InjectionKey<UseTemplateScoringReturn> =\n Symbol(\"scoring\");\n\n// ---------------------------------------------------------------------------\n// Helper for required injections with explicit null default + throw\n// ---------------------------------------------------------------------------\n\nexport function requireInject<T>(\n key: InjectionKey<T>,\n componentName: string,\n): T {\n const value = inject(key, null) as T | null;\n if (value === null || value === undefined) {\n throw new Error(\n `${componentName} requires a provider for ${key.description ?? \"unknown key\"}. Ensure it is a descendant of Editor or CloudEditor.`,\n );\n }\n return value;\n}\n","import type { Translations } from \"../i18n\";\nimport { type Ref, inject, isRef } from \"vue\";\nimport { TRANSLATIONS_KEY } from \"../keys\";\n\nexport interface UseI18nReturn {\n /** Current translations object */\n t: Translations;\n /** Format a string with placeholders */\n format: (template: string, values: Record<string, string | number>) => string;\n}\n\n/**\n * Composable for internationalization.\n * Provides access to the current locale's translations.\n *\n * @param translationsOverride - Optional translations to use instead of injected value\n */\nexport function useI18n(translationsOverride?: Translations): UseI18nReturn {\n const injected =\n translationsOverride ??\n (inject(TRANSLATIONS_KEY, null) as Translations | Ref<Translations> | null);\n\n if (!injected) {\n throw new Error(\n \"useI18n() requires a translations provider. Ensure the component is a descendant of Editor or CloudEditor.\",\n );\n }\n\n const t: Translations = isRef(injected) ? injected.value : injected;\n\n /**\n * Format a string with placeholders.\n * e.g., format('{minutes}m ago', { minutes: 5 }) -> '5m ago'\n */\n function format(\n template: string,\n values: Record<string, string | number>,\n ): string {\n return template.replace(/\\{(\\w+)\\}/g, (_, key) => {\n return key in values ? String(values[key]) : `{${key}}`;\n });\n }\n\n return {\n t,\n format,\n };\n}\n","import type { MergeTag, SyntaxPreset } from \"@templatical/types\";\nimport {\n isMergeTagValue as checkIsMergeTagValue,\n getMergeTagLabel as resolveMergeTagLabel,\n SYNTAX_PRESETS,\n} from \"@templatical/types\";\nimport { inject, ref, type Ref } from \"vue\";\nimport {\n MERGE_TAGS_KEY,\n MERGE_TAG_SYNTAX_KEY,\n ON_REQUEST_MERGE_TAG_KEY,\n} from \"../keys\";\n\nexport interface UseMergeTagReturn {\n /** Available merge tags from config */\n mergeTags: MergeTag[];\n /** Whether a merge tag request is in progress */\n isRequesting: Ref<boolean>;\n /** Whether merge tag functionality is enabled (has merge tags and callback) */\n isEnabled: boolean;\n /** The resolved syntax preset for merge tags */\n syntax: SyntaxPreset;\n /** Check if a value matches the configured merge tag syntax */\n isMergeTagValue: (value: string) => boolean;\n /** Get the human-readable label for a merge tag value */\n getMergeTagLabel: (value: string) => string;\n /** Request a merge tag from the user via the configured callback */\n requestMergeTag: () => Promise<MergeTag | null>;\n}\n\n/**\n * Composable for merge tag functionality.\n * Provides utilities for detecting, displaying, and requesting merge tags.\n */\nexport function useMergeTag(): UseMergeTagReturn {\n const mergeTags = inject(MERGE_TAGS_KEY, []);\n const syntax = inject(MERGE_TAG_SYNTAX_KEY, SYNTAX_PRESETS.liquid);\n const onRequestMergeTag = inject(ON_REQUEST_MERGE_TAG_KEY, null);\n\n const isRequesting = ref(false);\n\n function isMergeTagValue(value: string): boolean {\n return checkIsMergeTagValue(value, syntax);\n }\n\n function getMergeTagLabel(value: string): string {\n return resolveMergeTagLabel(value, mergeTags);\n }\n\n /**\n * Request a merge tag from the user via the configured callback.\n * Returns null if no callback is configured or user cancels.\n */\n async function requestMergeTag(): Promise<MergeTag | null> {\n if (!onRequestMergeTag) {\n return null;\n }\n\n isRequesting.value = true;\n try {\n return await onRequestMergeTag();\n } finally {\n isRequesting.value = false;\n }\n }\n\n // Merge tag functionality is enabled when either:\n // 1. There are merge tags configured (non-empty array), OR\n // 2. The onRequestMergeTag callback is provided\n const isEnabled = mergeTags.length > 0 || !!onRequestMergeTag;\n\n return {\n mergeTags,\n isRequesting,\n isEnabled,\n syntax,\n isMergeTagValue,\n getMergeTagLabel,\n requestMergeTag,\n };\n}\n"],"mappings":"sFAeA,IAAa,EAAyD,CACpE,OAAQ,CAAE,MAAO,eAAgB,MAAO,yBAA0B,CAClE,WAAY,CACV,MAAO,qBACP,MAAO,wBACR,CACD,UAAW,CAAE,MAAO,eAAgB,MAAO,wBAAyB,CACpE,UAAW,CAAE,MAAO,aAAc,MAAO,uBAAwB,CAClE,CAsBD,SAAS,EAAc,EAAyB,CAC9C,IAAM,EAAS,EAAQ,OACjB,EAAQ,EAAQ,MAAM,QAAQ,IAAK,GAAG,CAC5C,OAAW,OAAO,IAAI,EAAO,GAAI,EAAM,CAGzC,SAAgB,EAAgB,EAAe,EAA+B,CAC5E,OAAO,EAAc,EAAO,MAAM,CAAC,KAAK,GAAO,MAAM,EAAI,GAAG,CAG9D,SAAgB,EAAiB,EAAe,EAA+B,CAC7E,IAAM,EAAQ,EAAU,KAAM,GAAM,EAAE,QAAU,EAAM,CAItD,OAHI,EACK,EAAM,MAER,EAqDT,SAAgB,EACd,EACA,EACS,CACT,OAAO,EAAc,EAAO,MAAM,CAAC,KAAK,GAAO,MAAM,EAAI,GAAG,CAG9D,SAAgB,EACd,EACA,EACQ,CACR,IAAM,EAAQ,IAAI,OAChB,EAAO,MAAM,OACb,EAAO,MAAM,MAAM,QAAQ,IAAK,GAAG,CACpC,CACK,EAAQ,EAAM,MAAM,EAAM,CAChC,OAAO,GAAS,EAAM,GAAK,EAAM,GAAG,aAAa,CAAG,EClGtD,IAAa,EACX,OAAO,eAAe,CAEX,EAA6C,OAAO,SAAS,CAU7D,EACX,OAAO,eAAe,CAEX,EAET,OAAO,cAAc,CAEZ,EACX,OAAO,aAAa,CAYT,EAA2C,OAAO,YAAY,CAE9D,EACX,OAAO,iBAAiB,CAEb,EAET,OAAO,oBAAoB,CAqC/B,SAAgB,EACd,EACA,EACG,CACH,IAAM,EAAQ,EAAO,EAAK,KAAK,CAC/B,GAAI,GAAU,KACZ,MAAU,MACR,GAAG,EAAc,2BAA2B,EAAI,aAAe,cAAc,uDAC9E,CAEH,OAAO,ECrGT,SAAgB,EAAQ,EAAoD,CAC1E,IAAM,EACJ,GACC,EAAO,EAAkB,KAAK,CAEjC,GAAI,CAAC,EACH,MAAU,MACR,6GACD,CAGH,IAAM,EAAkB,EAAM,EAAS,CAAG,EAAS,MAAQ,EAM3D,SAAS,EACP,EACA,EACQ,CACR,OAAO,EAAS,QAAQ,cAAe,EAAG,IACjC,KAAO,EAAS,OAAO,EAAO,GAAK,CAAG,IAAI,EAAI,GACrD,CAGJ,MAAO,CACL,IACA,SACD,CCZH,SAAgB,GAAiC,CAC/C,IAAM,EAAY,EAAO,EAAgB,EAAE,CAAC,CACtC,EAAS,EAAO,EAAsB,EAAe,OAAO,CAC5D,EAAoB,EAAO,EAA0B,KAAK,CAE1D,EAAe,EAAI,GAAM,CAE/B,SAAS,EAAgB,EAAwB,CAC/C,OAAO,EAAqB,EAAO,EAAO,CAG5C,SAAS,EAAiB,EAAuB,CAC/C,OAAO,EAAqB,EAAO,EAAU,CAO/C,eAAe,GAA4C,CACzD,GAAI,CAAC,EACH,OAAO,KAGT,EAAa,MAAQ,GACrB,GAAI,CACF,OAAO,MAAM,GAAmB,QACxB,CACR,EAAa,MAAQ,IASzB,MAAO,CACL,YACA,eACA,UALgB,EAAU,OAAS,GAAK,CAAC,CAAC,EAM1C,SACA,gBAAA,EACA,iBAAA,EACA,kBACD"}
@@ -1,23 +0,0 @@
1
- import { F as e } from "./useEditorCore-Cc4RCwWq.js";
2
- //#region \0rolldown_dynamic_import_helper.js
3
- var t = (e, t, n) => {
4
- let r = t.lastIndexOf("?"), i = e[r === -1 || r < t.lastIndexOf("/") ? t : t.slice(0, r)];
5
- return i ? typeof i == "function" ? i() : Promise.resolve(i) : new Promise((e, r) => {
6
- (typeof queueMicrotask == "function" ? queueMicrotask : setTimeout)(r.bind(null, /* @__PURE__ */ Error("Unknown variable dynamic import: " + t + (t.split("/").length === n ? "" : ". Note that variables only represent file names one level deep."))));
7
- });
8
- }, n = /* @__PURE__ */ e({
9
- getBaseLocale: () => i,
10
- loadTranslations: () => a
11
- }), r = ["en", "de"];
12
- function i(e) {
13
- return e.split("-")[0].toLowerCase();
14
- }
15
- async function a(e) {
16
- let n = i(e), a = r.includes(n) ? n : "en";
17
- return (await t(/* @__PURE__ */ Object.assign({
18
- "./locales/de.ts": () => import("./de-B4Ob4vCo.js"),
19
- "./locales/en.ts": () => import("./en-YXsspZJG.js")
20
- }), `./locales/${a}.ts`, 3)).default;
21
- }
22
- //#endregion
23
- export { a as n, n as t };