@templatical/editor 0.0.1 → 0.0.3
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/AiChatSidebar-busJk9hm.js +214 -0
- package/dist/AiFeatureMenu-DLGv_-pj.js +63 -0
- package/dist/CloudEditor-BDnHd6Um.js +919 -0
- package/dist/CollaboratorBar-Dv3l52vC.js +91 -0
- package/dist/CommentsSidebar-4tjp0VU5.js +439 -0
- package/dist/DesignReferenceSidebar-CmwXvltV.js +273 -0
- package/dist/LoadingTrack-vK8W2PJf.js +10 -0
- package/dist/ModuleBrowserModal-lrk3Fr0H.js +205 -0
- package/dist/ModulePreviewCanvas-BcBJLnwL.js +106 -0
- package/dist/ParagraphEditor-DH8cSC6m.js +625 -0
- package/dist/RichTextEditorContent-CQqodi7p.js +133 -0
- package/dist/SaveModuleDialog-Bmzi72td.js +122 -0
- package/dist/SnapshotHistory-AEgi9Xsn.js +126 -0
- package/dist/TemplateScoringPanel-CTgMtc0-.js +249 -0
- package/dist/TestEmailModal-Dpq1is9S.js +94 -0
- package/dist/TitleEditor-CLcDdcWI.js +167 -0
- package/dist/TplModal-CGzRjR96.js +44 -0
- package/dist/_plugin-vue_export-helper-B1-bu7yR.js +47 -0
- package/dist/blockTypeIcons-BpPTqcok.js +126 -0
- package/dist/cdn/chunks/ParagraphEditor-CCtWbGDv.js +3 -0
- package/dist/cdn/chunks/ParagraphEditor-CCtWbGDv.js.map +1 -0
- package/dist/cdn/chunks/RichTextEditorContent-BUD9veXd.js +2 -0
- package/dist/cdn/chunks/RichTextEditorContent-BUD9veXd.js.map +1 -0
- package/dist/cdn/chunks/TitleEditor-e_UTyxjd.js +3 -0
- package/dist/cdn/chunks/TitleEditor-e_UTyxjd.js.map +1 -0
- package/dist/cdn/chunks/dist-0UheN8rK.js +1 -0
- package/dist/cdn/chunks/dist-55mmbGQ9.js +1 -0
- package/dist/cdn/chunks/dist-B31mxKyP.js +1 -0
- package/dist/cdn/chunks/dist-B5JI9nIg.js +1 -0
- package/dist/cdn/chunks/dist-B93vLKhU.js +1 -0
- package/dist/cdn/chunks/dist-BDt3FJvj.js +1 -0
- package/dist/cdn/chunks/dist-BJRuFHmi.js +1 -0
- package/dist/cdn/chunks/dist-BKSzrf0L.js +1 -0
- package/dist/cdn/chunks/dist-BL8c5gYQ.js +1 -0
- package/dist/cdn/chunks/dist-CYThWMP5.js +1 -0
- package/dist/cdn/chunks/dist-DxZbPJYt.js +1 -0
- package/dist/cdn/chunks/draggable-ClUwYCFL.js +17 -0
- package/dist/cdn/chunks/draggable-ClUwYCFL.js.map +1 -0
- package/dist/cdn/chunks/emojiData-6fVLNqeH.js +2 -0
- package/dist/cdn/chunks/emojiData-6fVLNqeH.js.map +1 -0
- package/dist/cdn/chunks/extensions-ea_ewKUl.js +2 -0
- package/dist/cdn/chunks/extensions-ea_ewKUl.js.map +1 -0
- package/dist/cdn/chunks/icons-vmLJTaJk.js +2 -0
- package/dist/cdn/chunks/icons-vmLJTaJk.js.map +1 -0
- package/dist/cdn/chunks/rolldown-runtime-BakkzWXw.js +1 -0
- package/dist/cdn/chunks/styleConstants-CNejCb-L.js +2 -0
- package/dist/cdn/chunks/styleConstants-CNejCb-L.js.map +1 -0
- package/dist/cdn/chunks/tiptap-Cya4P9CN.js +145 -0
- package/dist/cdn/chunks/tiptap-Cya4P9CN.js.map +1 -0
- package/dist/cdn/chunks/useEditorCore-CwuxQuvh.js +2 -0
- package/dist/cdn/chunks/useEditorCore-CwuxQuvh.js.map +1 -0
- package/dist/cdn/chunks/useMergeTag-DVOz1v9p.js +2 -0
- package/dist/cdn/chunks/useMergeTag-DVOz1v9p.js.map +1 -0
- package/dist/cdn/editor.css +1 -0
- package/dist/cdn/editor.js +2 -0
- package/dist/cdn/editor.js.map +1 -0
- package/dist/check-B7kDuZmP.js +7 -0
- package/dist/chevron-down-DJLW2Q9Z.js +7 -0
- package/dist/circle-alert-E2vYPs5r.js +25 -0
- package/dist/clock-lWIIQA3C.js +12 -0
- package/dist/de-B4Ob4vCo.js +682 -0
- package/dist/dist-4LiM9FDd.js +35 -0
- package/dist/dist-Bu7veieH.js +776 -0
- package/dist/dist-C1BIRHCQ.js +61 -0
- package/dist/dist-CG-vEqSU.js +314 -0
- package/dist/dist-C_ymrGFi.js +10625 -0
- package/dist/dist-ChAGLpWo.js +35 -0
- package/dist/dist-D_HQYSY-.js +189 -0
- package/dist/dist-DkypH7qG.js +5 -0
- package/dist/dist-DmOE-Ubp.js +74 -0
- package/dist/dist-DmpMJbmZ.js +513 -0
- package/dist/dist-DrvKRSU6.js +47 -0
- package/dist/dist-Dxnd0GRf.js +5 -0
- package/dist/dist-DysAFIPy.js +2054 -0
- package/dist/emojiData-BfWQS72m.js +17 -0
- package/dist/en-YXsspZJG.js +682 -0
- package/dist/extensions-CKM99njP.js +420 -0
- package/dist/formatRelativeTime-DX3FgqN9.js +8 -0
- package/dist/i18n-CJsFtdbZ.js +23 -0
- package/dist/image-up-X4xIq4ea.js +23 -0
- package/dist/keys-Dwa2PmdD.js +10 -0
- package/dist/liquid.browser-BemTg3sZ.js +3272 -0
- package/dist/loader-circle-BTQQxC3l.js +7 -0
- package/dist/message-circle-Blgm6V_h.js +7 -0
- package/dist/refresh-cw-Bb4PEeW1.js +44 -0
- package/dist/scan-line-7lZPfOdm.js +25 -0
- package/dist/send-C0ltAQrv.js +10 -0
- package/dist/shield-check-f-qv4RKs.js +10 -0
- package/dist/sparkles-KhBCGlqB.js +23 -0
- package/dist/styleConstants-D4SOZGBV.js +94 -0
- package/dist/styles-DSw1VNU3.js +3406 -0
- package/dist/templatical-editor.css +2 -1
- package/dist/templatical-editor.js +242 -9
- package/dist/templatical-editor.umd.cjs +112 -524
- package/dist/timeouts-CmBrLeZA.js +4 -0
- package/dist/trash-2-OwjZ-guZ.js +25 -0
- package/dist/triangle-alert-DOSRIUYZ.js +17 -0
- package/dist/useEditorCore-Cc4RCwWq.js +5556 -0
- package/dist/useI18n-DUirdXEX.js +17 -0
- package/dist/useMergeTag-DVnlvPYJ.js +33 -0
- package/dist/x-CGlq2XQe.js +10 -0
- package/package.json +30 -20
- package/dist/AiChatSidebar-0vx9TP5B.js +0 -305
- package/dist/AiFeatureMenu-CI-v74ND.js +0 -69
- package/dist/CloudEditor-Wdfv_9xn.js +0 -1132
- package/dist/CollaboratorBar-B3uV4Wtw.js +0 -89
- package/dist/CommentsSidebar-PVUlloyB.js +0 -655
- package/dist/DesignReferenceSidebar-DAlAWrxU.js +0 -351
- package/dist/ModuleBrowserModal-1JEcChd8.js +0 -323
- package/dist/ModulePreviewCanvas-Cdp484Ae.js +0 -169
- package/dist/SaveModuleDialog-eNyr3XKn.js +0 -168
- package/dist/SnapshotHistory-D-ZiIj1v.js +0 -169
- package/dist/TemplateScoringPanel-DSZPo15C.js +0 -385
- package/dist/TestEmailModal-Cwre5elw.js +0 -128
- package/dist/TextEditor-BuUOIByX.js +0 -780
- package/dist/de-BWIAblxs.js +0 -685
- package/dist/en-cYyUzNV1.js +0 -685
- package/dist/index-0tWUczNu.js +0 -47
- package/dist/index-4okvXjqk.js +0 -41
- package/dist/index-BSc6h5zo.js +0 -967
- package/dist/index-CrvwWlhN.js +0 -41
- package/dist/index-D-iD-7lO.js +0 -10961
- package/dist/index-D-ygXbc8.js +0 -2452
- package/dist/index-DbrWKz-e.js +0 -1415
- package/dist/index-DeUeHy6g.js +0 -422
- package/dist/index-Ude6e9RU.js +0 -41
- package/dist/index-ZQzHBwkr.js +0 -12767
- package/dist/liquid.browser-CeNxS2GL.js +0 -3493
- package/dist/loader-circle-tM9j2mRh.js +0 -13
- package/dist/shield-check-Ngi9jAQc.js +0 -20
|
@@ -0,0 +1,2 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@import"https://fonts.bunny.net/css?family=geist:400,500,600";hex-color-picker{--hcp-width: 200px}hex-color-picker::part(hue){border-radius:var(--tpl-radius-sm, 7px)}hex-color-picker::part(saturation){border-radius:var(--tpl-radius-sm, 7px) var(--tpl-radius-sm, 7px) 0 0}@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tpl-comet-angle:0deg;--tpl-comet-start:100%}}}@layer theme{:root,:host{--tpl-radius-sm:.25rem;--tpl-radius-md:.375rem;--tpl-radius-lg:.5rem;--tpl-shadow-sm:0 1px 3px 0 #0000001a, 0 1px 2px -1px #0000001a;--tpl-shadow-md:0 4px 6px -1px #0000001a, 0 2px 4px -2px #0000001a;--tpl-shadow-lg:0 10px 15px -3px #0000001a, 0 4px 6px -4px #0000001a;--tpl-shadow-xl:0 20px 25px -5px #0000001a, 0 8px 10px -6px #0000001a}}.tpl\:pointer-events-auto{pointer-events:auto}.tpl\:pointer-events-none{pointer-events:none}.tpl\:invisible{visibility:hidden}.tpl\:absolute{position:absolute}.tpl\:fixed{position:fixed}.tpl\:relative{position:relative}.tpl\:sticky{position:sticky}.tpl\:inset-0{inset:0}.tpl\:inset-y-1{inset-block:.25rem}.tpl\:-top-0\.5{top:-.125rem}.tpl\:-top-1{top:-.25rem}.tpl\:top-0{top:0}.tpl\:top-1\.5{top:.375rem}.tpl\:top-1\/2{top:50%}.tpl\:top-2{top:.5rem}.tpl\:top-14{top:3.5rem}.tpl\:top-16{top:4rem}.tpl\:top-\[104px\]{top:104px}.tpl\:top-full{top:100%}.tpl\:-right-1{right:-.25rem}.tpl\:-right-2{right:-.5rem}.tpl\:right-0{right:0}.tpl\:right-1\.5{right:.375rem}.tpl\:right-2{right:.5rem}.tpl\:right-2\.5{right:.625rem}.tpl\:right-\[320px\]{right:320px}.tpl\:right-\[360px\]{right:360px}.tpl\:right-\[680px\]{right:680px}.tpl\:bottom-0{bottom:0}.tpl\:bottom-full{bottom:100%}.tpl\:-left-1{left:-.25rem}.tpl\:left-0{left:0}.tpl\:left-1\.5{left:.375rem}.tpl\:left-1\/2{left:50%}.tpl\:left-2\.5{left:.625rem}.tpl\:left-3{left:.75rem}.tpl\:left-12{left:3rem}.tpl\:z-10{z-index:10}.tpl\:z-40{z-index:40}.tpl\:z-50{z-index:50}.tpl\:z-\[4\]{z-index:4}.tpl\:z-\[5\]{z-index:5}.tpl\:z-\[9999\]{z-index:9999}.tpl\:z-\[10000\]{z-index:10000}.tpl\:m-0{margin:0}.tpl\:m-6{margin:1.5rem}.tpl\:mx-0\.5{margin-inline:.125rem}.tpl\:mx-1{margin-inline:.25rem}.tpl\:mx-1\.5{margin-inline:.375rem}.tpl\:mx-3{margin-inline:.75rem}.tpl\:mx-4{margin-inline:1rem}.tpl\:mx-auto{margin-inline:auto}.tpl\:mt-0\.5{margin-top:.125rem}.tpl\:mt-1{margin-top:.25rem}.tpl\:mt-1\.5{margin-top:.375rem}.tpl\:mt-2{margin-top:.5rem}.tpl\:mt-3{margin-top:.75rem}.tpl\:mt-4{margin-top:1rem}.tpl\:mb-1{margin-bottom:.25rem}.tpl\:mb-1\.5{margin-bottom:.375rem}.tpl\:mb-2{margin-bottom:.5rem}.tpl\:mb-2\.5{margin-bottom:.625rem}.tpl\:mb-3{margin-bottom:.75rem}.tpl\:mb-3\.5{margin-bottom:.875rem}.tpl\:mb-4{margin-bottom:1rem}.tpl\:mb-px{margin-bottom:1px}.tpl\:-ml-48{margin-left:-12rem}.tpl\:ml-0{margin-left:0}.tpl\:ml-1{margin-left:.25rem}.tpl\:ml-5{margin-left:1.25rem}.tpl\:ml-auto{margin-left:auto}.tpl\:\!flex{display:flex!important}.tpl\:block{display:block}.tpl\:flex{display:flex}.tpl\:grid{display:grid}.tpl\:hidden{display:none}.tpl\:inline{display:inline}.tpl\:inline-block{display:inline-block}.tpl\:inline-flex{display:inline-flex}.tpl\:aspect-square{aspect-ratio:1}.tpl\:size-1\.5{width:.375rem;height:.375rem}.tpl\:size-2{width:.5rem;height:.5rem}.tpl\:size-3{width:.75rem;height:.75rem}.tpl\:size-3\.5{width:.875rem;height:.875rem}.tpl\:size-4{width:1rem;height:1rem}.tpl\:size-4\.5{width:1.125rem;height:1.125rem}.tpl\:size-5{width:1.25rem;height:1.25rem}.tpl\:size-6{width:1.5rem;height:1.5rem}.tpl\:size-7{width:1.75rem;height:1.75rem}.tpl\:size-8{width:2rem;height:2rem}.tpl\:size-10{width:2.5rem;height:2.5rem}.tpl\:size-12{width:3rem;height:3rem}.tpl\:size-16{width:4rem;height:4rem}.tpl\:size-full{width:100%;height:100%}.tpl\:h-0{height:0}.tpl\:h-2\.5{height:.625rem}.tpl\:h-3{height:.75rem}.tpl\:h-4{height:1rem}.tpl\:h-5{height:1.25rem}.tpl\:h-6{height:1.5rem}.tpl\:h-7{height:1.75rem}.tpl\:h-8{height:2rem}.tpl\:h-9{height:2.25rem}.tpl\:h-10{height:2.5rem}.tpl\:h-12{height:3rem}.tpl\:h-14{height:3.5rem}.tpl\:h-32{height:8rem}.tpl\:h-44{height:11rem}.tpl\:h-\[32px\]{height:32px}.tpl\:h-auto{height:auto}.tpl\:h-full{height:100%}.tpl\:max-h-24{max-height:6rem}.tpl\:max-h-32{max-height:8rem}.tpl\:max-h-40{max-height:10rem}.tpl\:max-h-48{max-height:12rem}.tpl\:max-h-56{max-height:14rem}.tpl\:max-h-64{max-height:16rem}.tpl\:max-h-\[90vh\]{max-height:90vh}.tpl\:min-h-0{min-height:0}.tpl\:min-h-10{min-height:2.5rem}.tpl\:min-h-\[1\.5em\]{min-height:1.5em}.tpl\:min-h-\[1em\]{min-height:1em}.tpl\:min-h-\[5rem\]{min-height:5rem}.tpl\:min-h-\[48px\]{min-height:48px}.tpl\:min-h-\[60px\]{min-height:60px}.tpl\:min-h-\[64px\]{min-height:64px}.tpl\:min-h-\[68px\]{min-height:68px}.tpl\:min-h-\[72px\]{min-height:72px}.tpl\:min-h-\[80px\]{min-height:80px}.tpl\:min-h-\[100px\]{min-height:100px}.tpl\:min-h-\[120px\]{min-height:120px}.tpl\:min-h-\[150px\]{min-height:150px}.tpl\:min-h-\[400px\]{min-height:400px}.tpl\:w-1\/2{width:50%}.tpl\:w-1\/3{width:33.3333%}.tpl\:w-2\/3{width:66.6667%}.tpl\:w-3\/4{width:75%}.tpl\:w-5\/6{width:83.3333%}.tpl\:w-8{width:2rem}.tpl\:w-9{width:2.25rem}.tpl\:w-10{width:2.5rem}.tpl\:w-12{width:3rem}.tpl\:w-16{width:4rem}.tpl\:w-20{width:5rem}.tpl\:w-28{width:7rem}.tpl\:w-32{width:8rem}.tpl\:w-36{width:9rem}.tpl\:w-40{width:10rem}.tpl\:w-48{width:12rem}.tpl\:w-52{width:13rem}.tpl\:w-56{width:14rem}.tpl\:w-72{width:18rem}.tpl\:w-\[280px\]{width:280px}.tpl\:w-\[300px\]{width:300px}.tpl\:w-\[320px\]{width:320px}.tpl\:w-\[360px\]{width:360px}.tpl\:w-\[400px\]{width:400px}.tpl\:w-\[600px\]{width:600px}.tpl\:w-full{width:100%}.tpl\:w-px{width:1px}.tpl\:max-w-2xl{max-width:42rem}.tpl\:max-w-\[220px\]{max-width:220px}.tpl\:max-w-\[240px\]{max-width:240px}.tpl\:max-w-\[600px\]{max-width:600px}.tpl\:max-w-\[1000px\]{max-width:1000px}.tpl\:max-w-full{max-width:100%}.tpl\:max-w-md{max-width:28rem}.tpl\:max-w-sm{max-width:24rem}.tpl\:min-w-0{min-width:0}.tpl\:min-w-\[20px\]{min-width:20px}.tpl\:min-w-\[200px\]{min-width:200px}.tpl\:flex-1{flex:1}.tpl\:shrink-0{flex-shrink:0}.tpl\:origin-top-right{transform-origin:100% 0}.tpl\:-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.tpl\:-translate-x-full{--tw-translate-x:-100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.tpl\:translate-x-0{--tw-translate-x: 0rem ;translate:var(--tw-translate-x) var(--tw-translate-y)}.tpl\:translate-x-4{--tw-translate-x: 1rem ;translate:var(--tw-translate-x) var(--tw-translate-y)}.tpl\:translate-x-full{--tw-translate-x:100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.tpl\:-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.tpl\:-translate-y-2{--tw-translate-y: -.5rem ;translate:var(--tw-translate-x) var(--tw-translate-y)}.tpl\:-translate-y-full{--tw-translate-y:-100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.tpl\:translate-y-0{--tw-translate-y: 0rem ;translate:var(--tw-translate-x) var(--tw-translate-y)}.tpl\:translate-y-1{--tw-translate-y: .25rem ;translate:var(--tw-translate-x) var(--tw-translate-y)}.tpl\:translate-y-\[-8px\]{--tw-translate-y:-8px;translate:var(--tw-translate-x) var(--tw-translate-y)}.tpl\:scale-95{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x) var(--tw-scale-y)}.tpl\:scale-100{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y)}.tpl\:-rotate-90{rotate:-90deg}.tpl\:rotate-0{rotate:0deg}.tpl\:rotate-45{rotate:45deg}.tpl\:rotate-90{rotate:90deg}.tpl\:rotate-180{rotate:180deg}.tpl\:animate-pulse{animation:2s cubic-bezier(.4,0,.6,1) infinite pulse}.tpl\:animate-spin{animation:1s linear infinite spin}.tpl\:cursor-default{cursor:default}.tpl\:cursor-grab{cursor:grab}.tpl\:cursor-help{cursor:help}.tpl\:cursor-not-allowed{cursor:not-allowed}.tpl\:cursor-pointer{cursor:pointer}.tpl\:resize-none{resize:none}.tpl\:resize-y{resize:vertical}.tpl\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.tpl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.tpl\:grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))}.tpl\:grid-cols-\[1fr_auto_1fr\]{grid-template-columns:1fr auto 1fr}.tpl\:flex-col{flex-direction:column}.tpl\:flex-wrap{flex-wrap:wrap}.tpl\:items-center{align-items:center}.tpl\:items-end{align-items:flex-end}.tpl\:items-start{align-items:flex-start}.tpl\:items-stretch{align-items:stretch}.tpl\:justify-between{justify-content:space-between}.tpl\:justify-center{justify-content:center}.tpl\:justify-end{justify-content:flex-end}.tpl\:gap-0{gap:0}.tpl\:gap-0\.5{gap:.125rem}.tpl\:gap-1{gap:.25rem}.tpl\:gap-1\.5{gap:.375rem}.tpl\:gap-2{gap:.5rem}.tpl\:gap-2\.5{gap:.625rem}.tpl\:gap-3{gap:.75rem}.tpl\:gap-4{gap:1rem}.tpl\:gap-5{gap:1.25rem}.tpl\:gap-6{gap:1.5rem}.tpl\:gap-10{gap:2.5rem}:where(.tpl\:space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(.25rem * var(--tw-space-y-reverse));margin-block-end:calc(.25rem * calc(1 - var(--tw-space-y-reverse)))}:where(.tpl\:space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(.5rem * var(--tw-space-y-reverse));margin-block-end:calc(.5rem * calc(1 - var(--tw-space-y-reverse)))}:where(.tpl\:space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(.75rem * var(--tw-space-y-reverse));margin-block-end:calc(.75rem * calc(1 - var(--tw-space-y-reverse)))}.tpl\:gap-x-1{column-gap:.25rem}:where(.tpl\:-space-x-1\.5>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(-.375rem * var(--tw-space-x-reverse));margin-inline-end:calc(-.375rem * calc(1 - var(--tw-space-x-reverse)))}.tpl\:gap-y-0\.5{row-gap:.125rem}.tpl\:self-end{align-self:flex-end}.tpl\:self-start{align-self:flex-start}.tpl\:truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.tpl\:overflow-auto{overflow:auto}.tpl\:overflow-hidden{overflow:hidden}.tpl\:overflow-x-auto{overflow-x:auto}.tpl\:overflow-y-auto{overflow-y:auto}.tpl\:rounded{border-radius:.25rem}.tpl\:rounded-\[calc\(var\(--tpl-radius-sm\)-2px\)\]{border-radius:calc(var(--tpl-radius-sm) - 2px)}.tpl\:rounded-\[var\(--tpl-radius\)\]{border-radius:var(--tpl-radius)}.tpl\:rounded-\[var\(--tpl-radius-lg\)\]{border-radius:var(--tpl-radius-lg)}.tpl\:rounded-\[var\(--tpl-radius-md\)\]{border-radius:var(--tpl-radius-md)}.tpl\:rounded-\[var\(--tpl-radius-sm\)\]{border-radius:var(--tpl-radius-sm)}.tpl\:rounded-full{border-radius:3.40282e38px}.tpl\:rounded-lg{border-radius:.5rem}.tpl\:rounded-md{border-radius:.375rem}.tpl\:rounded-sm{border-radius:.25rem}.tpl\:rounded-xl{border-radius:.75rem}.tpl\:rounded-l-\[var\(--tpl-radius-sm\)\]{border-top-left-radius:var(--tpl-radius-sm);border-bottom-left-radius:var(--tpl-radius-sm)}.tpl\:rounded-tl-lg{border-top-left-radius:.5rem}.tpl\:rounded-r-\[var\(--tpl-radius-sm\)\]{border-top-right-radius:var(--tpl-radius-sm);border-bottom-right-radius:var(--tpl-radius-sm)}.tpl\:rounded-r-none{border-top-right-radius:0;border-bottom-right-radius:0}.tpl\:border{border-style:var(--tw-border-style);border-width:1px}.tpl\:border-0{border-style:var(--tw-border-style);border-width:0}.tpl\:border-2{border-style:var(--tw-border-style);border-width:2px}.tpl\:border-x-0{border-inline-style:var(--tw-border-style);border-inline-width:0}.tpl\:border-y{border-block-style:var(--tw-border-style);border-block-width:1px}.tpl\:border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.tpl\:border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.tpl\:border-r-0{border-right-style:var(--tw-border-style);border-right-width:0}.tpl\:border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.tpl\:border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.tpl\:border-l-0{border-left-style:var(--tw-border-style);border-left-width:0}.tpl\:border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.tpl\:border-dashed{--tw-border-style:dashed;border-style:dashed}.tpl\:border-none{--tw-border-style:none;border-style:none}.tpl\:border-\[var\(--tpl-bg\)\]{border-color:var(--tpl-bg)}.tpl\:border-\[var\(--tpl-border\)\]{border-color:var(--tpl-border)}.tpl\:border-\[var\(--tpl-border-light\)\]{border-color:var(--tpl-border-light)}.tpl\:border-\[var\(--tpl-danger\)\]{border-color:var(--tpl-danger)}.tpl\:border-\[var\(--tpl-primary\)\]{border-color:var(--tpl-primary)}.tpl\:border-\[var\(--tpl-warning\)\]{border-color:var(--tpl-warning)}.tpl\:border-transparent{border-color:#0000}.tpl\:border-b-\[var\(--tpl-border-light\)\]{border-bottom-color:var(--tpl-border-light)}.tpl\:border-l-transparent{border-left-color:#0000}.tpl\:bg-\[var\(--tpl-bg\)\]{background-color:var(--tpl-bg)}.tpl\:bg-\[var\(--tpl-bg-active\)\]{background-color:var(--tpl-bg-active)}.tpl\:bg-\[var\(--tpl-bg-elevated\)\]{background-color:var(--tpl-bg-elevated)}.tpl\:bg-\[var\(--tpl-bg-hover\)\]{background-color:var(--tpl-bg-hover)}.tpl\:bg-\[var\(--tpl-border\)\]{background-color:var(--tpl-border)}.tpl\:bg-\[var\(--tpl-canvas-bg\)\]{background-color:var(--tpl-canvas-bg)}.tpl\:bg-\[var\(--tpl-danger\)\]{background-color:var(--tpl-danger)}.tpl\:bg-\[var\(--tpl-danger-light\)\]{background-color:var(--tpl-danger-light)}.tpl\:bg-\[var\(--tpl-primary\)\]{background-color:var(--tpl-primary)}.tpl\:bg-\[var\(--tpl-primary-light\)\]{background-color:var(--tpl-primary-light)}.tpl\:bg-\[var\(--tpl-warning-light\)\]{background-color:var(--tpl-warning-light)}.tpl\:bg-black\/30{background-color:oklab(0% none none/.3)}.tpl\:bg-transparent{background-color:#0000}.tpl\:bg-white\/90{background-color:#ffffffe6}.tpl\:object-contain{object-fit:contain}.tpl\:object-cover{object-fit:cover}.tpl\:p-0{padding:0}.tpl\:p-0\.5{padding:.125rem}.tpl\:p-1{padding:.25rem}.tpl\:p-1\.5{padding:.375rem}.tpl\:p-2{padding:.5rem}.tpl\:p-3{padding:.75rem}.tpl\:p-4{padding:1rem}.tpl\:p-5{padding:1.25rem}.tpl\:p-6{padding:1.5rem}.tpl\:p-8{padding:2rem}.tpl\:px-0\.5{padding-inline:.125rem}.tpl\:px-1{padding-inline:.25rem}.tpl\:px-1\.5{padding-inline:.375rem}.tpl\:px-2{padding-inline:.5rem}.tpl\:px-2\.5{padding-inline:.625rem}.tpl\:px-3{padding-inline:.75rem}.tpl\:px-3\.5{padding-inline:.875rem}.tpl\:px-4{padding-inline:1rem}.tpl\:px-5{padding-inline:1.25rem}.tpl\:px-6{padding-inline:1.5rem}.tpl\:px-8{padding-inline:2rem}.tpl\:px-10{padding-inline:2.5rem}.tpl\:py-0{padding-block:0}.tpl\:py-0\.5{padding-block:.125rem}.tpl\:py-1{padding-block:.25rem}.tpl\:py-1\.5{padding-block:.375rem}.tpl\:py-2{padding-block:.5rem}.tpl\:py-2\.5{padding-block:.625rem}.tpl\:py-3{padding-block:.75rem}.tpl\:py-3\.5{padding-block:.875rem}.tpl\:py-4{padding-block:1rem}.tpl\:py-5{padding-block:1.25rem}.tpl\:py-6{padding-block:1.5rem}.tpl\:py-8{padding-block:2rem}.tpl\:py-10{padding-block:2.5rem}.tpl\:py-12{padding-block:3rem}.tpl\:py-16{padding-block:4rem}.tpl\:py-\[5px\]{padding-block:5px}.tpl\:py-\[7px\]{padding-block:7px}.tpl\:py-px{padding-block:1px}.tpl\:pt-1{padding-top:.25rem}.tpl\:pt-2{padding-top:.5rem}.tpl\:pt-3{padding-top:.75rem}.tpl\:pt-4{padding-top:1rem}.tpl\:pr-2{padding-right:.5rem}.tpl\:pr-3{padding-right:.75rem}.tpl\:pr-4{padding-right:1rem}.tpl\:pr-6{padding-right:1.5rem}.tpl\:pr-7{padding-right:1.75rem}.tpl\:pr-8{padding-right:2rem}.tpl\:pb-1{padding-bottom:.25rem}.tpl\:pb-2{padding-bottom:.5rem}.tpl\:pb-3{padding-bottom:.75rem}.tpl\:pb-4{padding-bottom:1rem}.tpl\:pl-2{padding-left:.5rem}.tpl\:pl-2\.5{padding-left:.625rem}.tpl\:pl-3{padding-left:.75rem}.tpl\:pl-8{padding-left:2rem}.tpl\:pl-9{padding-left:2.25rem}.tpl\:pl-\[18px\]{padding-left:18px}.tpl\:text-center{text-align:center}.tpl\:text-left{text-align:left}.tpl\:font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.tpl\:font-sans{font-family:Geist,ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.tpl\:text-4xl{font-size:2.25rem;line-height:var(--tw-leading,calc(2.5 / 2.25))}.tpl\:text-base{font-size:1rem;line-height:var(--tw-leading, 1.5 )}.tpl\:text-lg{font-size:1.125rem;line-height:var(--tw-leading,calc(1.75 / 1.125))}.tpl\:text-sm{font-size:.875rem;line-height:var(--tw-leading,calc(1.25 / .875))}.tpl\:text-xs{font-size:.75rem;line-height:var(--tw-leading,calc(1 / .75))}.tpl\:text-\[0\.8em\]{font-size:.8em}.tpl\:text-\[0\.9em\]{font-size:.9em}.tpl\:text-\[1em\]{font-size:1em}.tpl\:text-\[8px\]{font-size:8px}.tpl\:text-\[9px\]{font-size:9px}.tpl\:text-\[10px\]{font-size:10px}.tpl\:text-\[11px\]{font-size:11px}.tpl\:text-\[12px\]{font-size:12px}.tpl\:text-\[13px\]{font-size:13px}.tpl\:leading-normal{--tw-leading:1.5;line-height:1.5}.tpl\:leading-relaxed{--tw-leading:1.625;line-height:1.625}.tpl\:leading-snug{--tw-leading:1.375;line-height:1.375}.tpl\:leading-tight{--tw-leading:1.25;line-height:1.25}.tpl\:font-\[var\(--tpl-font-family\)\]{--tw-font-weight:var(--tpl-font-family);font-weight:var(--tpl-font-family)}.tpl\:font-bold{--tw-font-weight:700;font-weight:700}.tpl\:font-medium{--tw-font-weight:500;font-weight:500}.tpl\:font-normal{--tw-font-weight:400;font-weight:400}.tpl\:font-semibold{--tw-font-weight:600;font-weight:600}.tpl\:tracking-wide{--tw-tracking:.025em;letter-spacing:.025em}.tpl\:tracking-wider{--tw-tracking:.05em;letter-spacing:.05em}.tpl\:whitespace-nowrap{white-space:nowrap}.tpl\:whitespace-pre-wrap{white-space:pre-wrap}.tpl\:text-\[var\(--tpl-bg\)\]{color:var(--tpl-bg)}.tpl\:text-\[var\(--tpl-border\)\]{color:var(--tpl-border)}.tpl\:text-\[var\(--tpl-border-light\)\]{color:var(--tpl-border-light)}.tpl\:text-\[var\(--tpl-danger\)\]{color:var(--tpl-danger)}.tpl\:text-\[var\(--tpl-primary\)\]{color:var(--tpl-primary)}.tpl\:text-\[var\(--tpl-primary-hover\)\]{color:var(--tpl-primary-hover)}.tpl\:text-\[var\(--tpl-success\)\]{color:var(--tpl-success)}.tpl\:text-\[var\(--tpl-text\)\]{color:var(--tpl-text)}.tpl\:text-\[var\(--tpl-text-dim\)\]{color:var(--tpl-text-dim)}.tpl\:text-\[var\(--tpl-text-muted\)\]{color:var(--tpl-text-muted)}.tpl\:text-\[var\(--tpl-warning\)\]{color:var(--tpl-warning)}.tpl\:text-white{color:#fff}.tpl\:normal-case{text-transform:none}.tpl\:uppercase{text-transform:uppercase}.tpl\:italic{font-style:italic}.tpl\:tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.tpl\:no-underline{text-decoration-line:none}.tpl\:underline{text-decoration-line:underline}.tpl\:accent-\[var\(--tpl-primary\)\]{accent-color:var(--tpl-primary)}.tpl\:opacity-0{opacity:0}.tpl\:opacity-50{opacity:.5}.tpl\:opacity-60{opacity:.6}.tpl\:opacity-70{opacity:.7}.tpl\:opacity-90{opacity:.9}.tpl\:opacity-100{opacity:1}.tpl\:shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.tpl\:shadow-\[var\(--tpl-ring\)\]{--tw-shadow:var(--tpl-ring);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.tpl\:shadow-\[var\(--tpl-shadow\)\]{--tw-shadow:var(--tpl-shadow);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.tpl\:shadow-\[var\(--tpl-shadow-lg\)\]{--tw-shadow:var(--tpl-shadow-lg);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.tpl\:shadow-\[var\(--tpl-shadow-md\)\]{--tw-shadow:var(--tpl-shadow-md);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.tpl\:shadow-\[var\(--tpl-shadow-sm\)\]{--tw-shadow:var(--tpl-shadow-sm);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.tpl\:shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.tpl\:shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.tpl\:shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.tpl\:shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.tpl\:shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.tpl\:backdrop-blur-\[2px\]{--tw-backdrop-blur:blur(2px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.tpl\:transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,cubic-bezier(.4, 0, .2, 1));transition-duration:var(--tw-duration,.15s)}.tpl\:transition-\[width\]{transition-property:width;transition-timing-function:var(--tw-ease,cubic-bezier(.4, 0, .2, 1));transition-duration:var(--tw-duration,.15s)}.tpl\:transition-all{transition-property:all;transition-timing-function:var(--tw-ease,cubic-bezier(.4, 0, .2, 1));transition-duration:var(--tw-duration,.15s)}.tpl\:transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,cubic-bezier(.4, 0, .2, 1));transition-duration:var(--tw-duration,.15s)}.tpl\:transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,cubic-bezier(.4, 0, .2, 1));transition-duration:var(--tw-duration,.15s)}.tpl\:transition-shadow{transition-property:box-shadow;transition-timing-function:var(--tw-ease,cubic-bezier(.4, 0, .2, 1));transition-duration:var(--tw-duration,.15s)}.tpl\:transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,cubic-bezier(.4, 0, .2, 1));transition-duration:var(--tw-duration,.15s)}.tpl\:duration-100{--tw-duration:.1s;transition-duration:.1s}.tpl\:duration-150{--tw-duration:.15s;transition-duration:.15s}.tpl\:duration-200{--tw-duration:.2s;transition-duration:.2s}.tpl\:duration-300{--tw-duration:.3s;transition-duration:.3s}.tpl\:duration-\[80ms\]{--tw-duration:80ms;transition-duration:80ms}.tpl\:duration-\[120ms\]{--tw-duration:.12s;transition-duration:.12s}.tpl\:ease-\[cubic-bezier\(0\.16\,1\,0\.3\,1\)\]{--tw-ease:cubic-bezier(.16,1,.3,1);transition-timing-function:cubic-bezier(.16,1,.3,1)}.tpl\:ease-in{--tw-ease:cubic-bezier(.4, 0, 1, 1);transition-timing-function:cubic-bezier(.4,0,1,1)}.tpl\:ease-out{--tw-ease:cubic-bezier(0, 0, .2, 1);transition-timing-function:cubic-bezier(0,0,.2,1)}.tpl\:outline-none{--tw-outline-style:none;outline-style:none}.tpl\:select-none{-webkit-user-select:none;user-select:none}@media(hover:hover){.tpl\:group-hover\:bg-black\/40:is(:where(.tpl\:group):hover *){background-color:oklab(0% none none/.4)}.tpl\:group-hover\:opacity-100:is(:where(.tpl\:group):hover *){opacity:1}}.tpl\:placeholder\:text-\[var\(--tpl-text-dim\)\]::placeholder{color:var(--tpl-text-dim)}.tpl\:last\:mb-0:last-child{margin-bottom:0}@media(hover:hover){.tpl\:hover\:z-10:hover{z-index:10}.tpl\:hover\:scale-110:hover{--tw-scale-x:110%;--tw-scale-y:110%;--tw-scale-z:110%;scale:var(--tw-scale-x) var(--tw-scale-y)}.tpl\:hover\:scale-125:hover{--tw-scale-x:125%;--tw-scale-y:125%;--tw-scale-z:125%;scale:var(--tw-scale-x) var(--tw-scale-y)}.tpl\:hover\:border-\[var\(--tpl-danger\)\]:hover{border-color:var(--tpl-danger)}.tpl\:hover\:border-\[var\(--tpl-primary\)\]:hover{border-color:var(--tpl-primary)}.tpl\:hover\:bg-\[var\(--tpl-bg-active\)\]:hover{background-color:var(--tpl-bg-active)}.tpl\:hover\:bg-\[var\(--tpl-bg-hover\)\]:hover{background-color:var(--tpl-bg-hover)}.tpl\:hover\:bg-\[var\(--tpl-danger-light\)\]:hover{background-color:var(--tpl-danger-light)}.tpl\:hover\:bg-\[var\(--tpl-primary-hover\)\]:hover{background-color:var(--tpl-primary-hover)}.tpl\:hover\:text-\[var\(--tpl-danger\)\]:hover{color:var(--tpl-danger)}.tpl\:hover\:text-\[var\(--tpl-primary\)\]:hover{color:var(--tpl-primary)}.tpl\:hover\:text-\[var\(--tpl-text\)\]:hover{color:var(--tpl-text)}.tpl\:hover\:underline:hover{text-decoration-line:underline}.tpl\:hover\:opacity-80:hover{opacity:.8}.tpl\:hover\:opacity-90:hover{opacity:.9}}.tpl\:focus\:border-\[var\(--tpl-primary\)\]:focus{border-color:var(--tpl-primary)}.tpl\:focus\:shadow-\[0_0_0_3px_var\(--tpl-primary-light\)\]:focus{--tw-shadow:0 0 0 3px var(--tw-shadow-color,var(--tpl-primary-light));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.tpl\:focus\:shadow-\[var\(--tpl-ring\)\]:focus{--tw-shadow:var(--tpl-ring);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.tpl\:active\:cursor-grabbing:active{cursor:grabbing}.tpl\:disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.tpl\:disabled\:opacity-30:disabled{opacity:.3}.tpl\:disabled\:opacity-40:disabled{opacity:.4}.tpl\:disabled\:opacity-50:disabled{opacity:.5}@layer base,components;.tpl{--tpl-bg:oklch(99.5% .002 60);--tpl-bg-elevated:oklch(98% .004 60);--tpl-bg-hover:oklch(96% .006 60);--tpl-bg-active:oklch(93.5% .008 60);--tpl-border:oklch(92% .006 60);--tpl-border-light:oklch(86% .01 60);--tpl-text:oklch(18% .01 60);--tpl-text-muted:oklch(50% .015 60);--tpl-text-dim:oklch(68% .012 60);--tpl-primary:oklch(70% .16 55);--tpl-primary-hover:oklch(63% .17 55);--tpl-primary-light:oklch(95% .04 55);--tpl-secondary:oklch(60% .118 184.71);--tpl-secondary-hover:oklch(53.2% .105 186.39);--tpl-secondary-light:oklch(93.8% .03 186.82);--tpl-success:oklch(62.8% .194 155.1);--tpl-success-light:oklch(93.6% .043 163.51);--tpl-warning:oklch(76.9% .168 70.08);--tpl-warning-light:oklch(95% .038 73.59);--tpl-danger:oklch(63.7% .237 25.33);--tpl-danger-light:oklch(93.6% .032 17.72);--tpl-canvas-bg:oklch(97.5% .003 60);--tpl-radius:10px;--tpl-radius-sm:7px;--tpl-radius-lg:14px;--tpl-font-family:"Geist", ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--tpl-shadow-sm:0 1px 2px #00000008;--tpl-shadow:0 1px 2px #0000000a, 0 1px 3px #00000008;--tpl-shadow-md:0 2px 8px #0000000f, 0 1px 3px #0000000a;--tpl-shadow-lg:0 4px 16px #00000014, 0 2px 6px #0000000a;--tpl-shadow-xl:0 8px 32px #0000001a, 0 4px 12px #0000000f;--tpl-overlay:#00000080;--tpl-ring:0 0 0 3px var(--tpl-primary-light);--tpl-transition:.12s cubic-bezier(.16, 1, .3, 1)}.tpl[data-tpl-theme=dark]{--tpl-bg:oklch(16% .005 60);--tpl-bg-elevated:oklch(21% .006 60);--tpl-bg-hover:oklch(26% .007 60);--tpl-bg-active:oklch(30% .008 60);--tpl-border:oklch(30% .006 60);--tpl-border-light:oklch(38% .008 60);--tpl-text:oklch(93% .005 60);--tpl-text-muted:oklch(65% .01 60);--tpl-text-dim:oklch(50% .008 60);--tpl-primary:oklch(73% .15 55);--tpl-primary-hover:oklch(78% .14 55);--tpl-primary-light:oklch(28% .05 55);--tpl-secondary:oklch(63% .11 184.71);--tpl-secondary-hover:oklch(68% .1 186.39);--tpl-secondary-light:oklch(25% .03 186.82);--tpl-success:oklch(65% .18 155.1);--tpl-success-light:oklch(25% .04 163.51);--tpl-warning:oklch(78% .16 70.08);--tpl-warning-light:oklch(28% .04 73.59);--tpl-danger:oklch(65% .22 25.33);--tpl-danger-light:oklch(25% .04 17.72);--tpl-canvas-bg:oklch(10% .003 60);--tpl-shadow-sm:0 1px 2px #0003;--tpl-shadow:0 1px 2px #0000004d, 0 1px 3px #0003;--tpl-shadow-md:0 2px 8px #00000059, 0 1px 3px #00000040;--tpl-shadow-lg:0 4px 16px #0006, 0 2px 6px #0000004d;--tpl-shadow-xl:0 8px 32px #00000080, 0 4px 12px #00000059;--tpl-overlay:#000000b3;--tpl-ring:0 0 0 3px var(--tpl-primary-light)}.tpl[data-tpl-theme=dark] .tpl-canvas-wrapper{--tpl-bg-elevated:oklch(98% .004 60);--tpl-border-light:oklch(86% .01 60);--tpl-text:oklch(18% .01 60);--tpl-text-muted:oklch(50% .015 60);--tpl-text-dim:oklch(68% .012 60);--tpl-primary-light:oklch(95% .04 55);--tpl-primary-hover:oklch(60% .16 55);color:var(--tpl-text)}.tpl{height:100%;font-family:Geist,ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-size:.875rem;line-height:var(--tw-leading,calc(1.25 / .875));--tw-leading:1.5;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background-color:var(--tpl-bg);min-height:600px;color:var(--tpl-text);line-height:1.5;font-family:var(--tpl-font-family);flex-direction:column;display:flex}.tpl button,.tpl input,.tpl select,.tpl textarea{font-family:inherit}.tpl button{cursor:pointer;background:0 0;border:none}.tpl button:focus-visible,.tpl input:focus-visible,.tpl select:focus-visible,.tpl textarea:focus-visible{box-shadow:var(--tpl-ring);outline:none}.tpl ::-webkit-scrollbar{width:6px;height:6px}.tpl ::-webkit-scrollbar-track{background:0 0}.tpl ::-webkit-scrollbar-thumb{background-color:var(--tpl-border-light)}@supports (color:color-mix(in lab,red,red)){.tpl ::-webkit-scrollbar-thumb{background-color:color-mix(in srgb,var(--tpl-border-light) 60%,transparent)}}.tpl ::-webkit-scrollbar-thumb{border-radius:.25rem}.tpl ::-webkit-scrollbar-thumb:hover{background-color:var(--tpl-border-light)}@keyframes tpl-pulse{0%,to{opacity:1}50%{opacity:.5}}@keyframes tpl-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@keyframes tpl-dot-bounce{0%,80%,to{opacity:.3;transform:scale(.8)}40%{opacity:1;transform:scale(1)}}.tpl-pulse{animation:2s infinite tpl-pulse}.tpl-spinner{animation:1s linear infinite tpl-spin}.tpl-dot{animation:1.2s ease-in-out infinite tpl-dot-bounce}@keyframes tpl-fade-in{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}@keyframes tpl-scale-in{0%{opacity:0;transform:scale(.97)}to{opacity:1;transform:scale(1)}}@keyframes tpl-slide-in-right{0%{opacity:0;transform:translate(16px)}to{opacity:1;transform:translate(0)}}@keyframes tpl-slide-in-up{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}@keyframes tpl-shimmer{0%{background-position:-200% 0}to{background-position:200% 0}}.tpl-fade-in{animation:.2s cubic-bezier(.16,1,.3,1) tpl-fade-in}.tpl-scale-in{animation:.15s cubic-bezier(.16,1,.3,1) tpl-scale-in}.tpl-slide-in-right{animation:.25s cubic-bezier(.16,1,.3,1) tpl-slide-in-right}.tpl-slide-in-up{animation:.2s cubic-bezier(.16,1,.3,1) tpl-slide-in-up}.tpl-shimmer{background:linear-gradient(90deg,var(--tpl-bg-hover) 25%,var(--tpl-bg-active) 50%,var(--tpl-bg-hover) 75%);background-size:200% 100%;animation:1.5s linear infinite tpl-shimmer}.tpl-preview-mode .tpl-block--idle,.tpl-preview-mode .tpl-block--idle:hover,.tpl-preview-mode .tpl-block--selected{box-shadow:none!important;outline:none!important}.tpl-preview-mode .tpl-block{cursor:default;pointer-events:none}.tpl-preview-mode .tpl-block-actions,.tpl-preview-mode .tpl-block-hidden-overlay,.tpl-preview-mode .tpl-condition-toggle,.tpl-preview-mode .tpl-comment-indicator,.tpl-preview-mode .tpl-collab-lock{display:none}.tpl-ghost{border:none!important;border-top:2px dotted var(--tpl-primary)!important;background-color:#0000!important;justify-content:center!important;align-items:center!important;width:100%!important;height:0!important;min-height:0!important;max-height:0!important;margin:12px 0!important;padding:0!important;display:flex!important;position:relative!important;overflow:visible!important}@supports (color:color-mix(in lab,red,red)){.tpl-ghost{border-top:2px dotted color-mix(in srgb,var(--tpl-primary) 50%,transparent)!important}}.tpl-ghost{box-shadow:none!important;border-radius:0!important}.tpl-ghost>*{display:none!important}.tpl-ghost:before{content:var(--tpl-drop-text,"Drop here");white-space:nowrap!important;color:var(--tpl-primary)!important;background-color:var(--tpl-primary)!important;padding:2px 8px!important;font-size:12px!important;font-weight:500!important;position:absolute!important;top:50%!important;left:50%!important;transform:translate(-50%,-50%)!important}@supports (color:color-mix(in lab,red,red)){.tpl-ghost:before{background-color:color-mix(in srgb,var(--tpl-primary) 15%,var(--tpl-bg))!important}}.tpl-ghost:before{border-radius:var(--tpl-radius-sm)!important;box-shadow:none!important}.tpl-dragging{opacity:.8;box-shadow:var(--tpl-shadow-xl)}.tpl-text-toolbar-btn{cursor:pointer;--tw-border-style:none;width:2rem;height:2rem;transition-property:all;transition-timing-function:var(--tw-ease,cubic-bezier(.4, 0, .2, 1));transition-duration:var(--tw-duration,.15s);--tw-duration:.15s;color:var(--tpl-text);background-color:#0000;border-style:none;border-radius:.25rem;justify-content:center;align-items:center;padding:0;transition-duration:.15s;display:flex}.tpl-text-toolbar-btn:hover{background-color:var(--tpl-bg-active)}.tpl-text-toolbar-btn--active{background-color:var(--tpl-primary)!important;color:var(--tpl-bg)!important}.tpl-text-content,.tpl-text-editable .tiptap{--tw-outline-style:none;outline-style:none}.tpl-text-editable{border-style:var(--tw-border-style);--tw-border-style:dashed;border-style:dashed;border-width:1px;border-color:var(--tpl-primary);border-radius:.25rem;min-height:1.5em;padding:.5rem}.tpl-text-content p,.tpl-text-editable .tiptap p{margin:0 0 .5rem}:is(.tpl-text-content p,.tpl-text-editable .tiptap p):last-child{margin-bottom:0}.tpl-text-content ul,.tpl-text-content ol,.tpl-text-editable .tiptap ul,.tpl-text-editable .tiptap ol{margin-block:.5rem;padding-left:1.5rem}.tpl-text-content li,.tpl-text-editable .tiptap li{margin-block:.25rem}.tpl-text-content s,.tpl-text-editable .tiptap s{text-decoration-line:line-through}.tpl-text-content sub,.tpl-text-editable .tiptap sub{vertical-align:sub;font-size:.75em}.tpl-text-content sup,.tpl-text-editable .tiptap sup{vertical-align:super;font-size:.75em}.tpl-text-content a,.tpl-text-editable a{color:var(--tpl-primary);text-decoration-line:underline}.tpl-text-content span[data-merge-tag],.tpl-text-editable span[data-merge-tag]{--tw-font-weight:500;background-color:var(--tpl-primary);border-radius:.25rem;align-items:center;margin-inline:.125rem;padding-block:.125rem;padding-inline:.375rem;font-size:.9em;font-weight:500;display:inline-flex}@supports (color:color-mix(in lab,red,red)){.tpl-text-content span[data-merge-tag],.tpl-text-editable span[data-merge-tag]{background-color:color-mix(in srgb,var(--tpl-primary) 20%,transparent)}}.tpl-text-content span[data-merge-tag],.tpl-text-editable span[data-merge-tag]{color:var(--tpl-primary)}.tpl-text-content span[data-logic-merge-tag],.tpl-text-editable span[data-logic-merge-tag]{--tw-font-weight:700;--tw-tracking:.025em;letter-spacing:.025em;text-transform:uppercase;border:1.5px solid var(--tpl-primary);background-color:#0000;border-radius:.25rem;align-items:center;margin-inline:.125rem;padding-block:.125rem;padding-inline:.375rem;font-size:.8em;font-weight:700;display:inline-flex}@supports (color:color-mix(in lab,red,red)){.tpl-text-content span[data-logic-merge-tag],.tpl-text-editable span[data-logic-merge-tag]{border:1.5px solid color-mix(in srgb,var(--tpl-primary) 50%,transparent)}}.tpl-text-content span[data-logic-merge-tag],.tpl-text-editable span[data-logic-merge-tag]{color:var(--tpl-primary)}.tpl-tooltip{position:relative}.tpl-tooltip:after{content:attr(data-tooltip);border-radius:var(--tpl-radius-sm);background-color:var(--tpl-text);color:var(--tpl-bg);white-space:normal;text-align:center;pointer-events:none;opacity:0;text-transform:none;z-index:50;max-width:220px;padding:4px 10px;font-size:12px;font-weight:500;line-height:1.4;transition:opacity .15s;position:absolute;top:calc(100% + 6px);left:50%;transform:translate(-50%)}.tpl-tooltip:before{content:"";border:4px solid #0000;border-bottom-color:var(--tpl-text);pointer-events:none;opacity:0;z-index:50;transition:opacity .15s;position:absolute;top:calc(100% + 2px);left:50%;transform:translate(-50%)}.tpl-tooltip:hover:after,.tpl-tooltip:hover:before{opacity:1}.tpl.tpl-media-overlay{background-color:var(--tpl-overlay);-webkit-backdrop-filter:blur(8px);height:100%;min-height:0;color:var(--tpl-text);flex-direction:row;justify-content:center;align-items:center;display:flex}.tpl.tpl-text-toolbar{flex-direction:row;height:auto;min-height:0;display:flex}.tpl.tpl-link-dialog{background-color:var(--tpl-overlay);flex-direction:row;justify-content:center;align-items:center;height:100%;min-height:0;display:flex}.tpl-upload-zone-active{border-color:var(--tpl-primary)!important;background-color:var(--tpl-primary-light)!important}@property --tpl-comet-angle{syntax:"<angle>";inherits:false;initial-value:0deg}@property --tpl-comet-start{syntax:"<percentage>";inherits:false;initial-value:100%}@keyframes tpl-ai-comet{0%{--tpl-comet-angle:0deg;--tpl-comet-start:100%}1%{--tpl-comet-angle:24deg;--tpl-comet-start:88%}5%{--tpl-comet-angle:120deg;--tpl-comet-start:60%}25%{--tpl-comet-angle:600deg;--tpl-comet-start:60%}33%{--tpl-comet-angle:720deg;--tpl-comet-start:100%}to{--tpl-comet-angle:720deg;--tpl-comet-start:100%}}.tpl-ai-btn--idle{background-color:var(--tpl-primary-light);color:var(--tpl-primary-hover);box-shadow:none;z-index:0;position:relative}.tpl-ai-btn--idle:before{content:"";border-radius:inherit;background:conic-gradient(from var(--tpl-comet-angle),transparent 0%,transparent var(--tpl-comet-start),var(--tpl-primary) 80%,var(--tpl-primary) 90%,var(--tpl-primary) 97%,transparent 100%);padding:2px;position:absolute;inset:-2px}@supports (color:color-mix(in lab,red,red)){.tpl-ai-btn--idle:before{background:conic-gradient(from var(--tpl-comet-angle),transparent 0%,transparent var(--tpl-comet-start),color-mix(in srgb,var(--tpl-primary) 40%,transparent) 80%,var(--tpl-primary) 90%,var(--tpl-primary) 97%,transparent 100%)}}.tpl-ai-btn--idle:before{z-index:-1;pointer-events:none;animation:20s linear 3s infinite tpl-ai-comet;-webkit-mask-image:linear-gradient(#fff 0 0),linear-gradient(#fff 0 0);mask-image:linear-gradient(#fff 0 0),linear-gradient(#fff 0 0);-webkit-mask-position:0 0,0 0;mask-position:0 0,0 0;-webkit-mask-size:auto,auto;mask-size:auto,auto;-webkit-mask-repeat:repeat,repeat;mask-repeat:repeat,repeat;-webkit-mask-clip:content-box,border-box;mask-clip:content-box,border-box;-webkit-mask-origin:content-box,border-box;mask-origin:content-box,border-box;-webkit-mask-composite:xor;mask-composite:exclude;-webkit-mask-source-type:auto,auto;mask-mode:match-source,match-source}.tpl-ai-btn--idle:hover{background-color:var(--tpl-primary);color:var(--tpl-bg);transform:translateY(-1px);box-shadow:0 0 0 3px var(--tpl-primary),0 4px 16px var(--tpl-primary)!important}@supports (color:color-mix(in lab,red,red)){.tpl-ai-btn--idle:hover{box-shadow:0 0 0 3px color-mix(in srgb,var(--tpl-primary) 20%,transparent),0 4px 16px color-mix(in srgb,var(--tpl-primary) 30%,transparent)!important}}.tpl-ai-btn--idle:hover:before{animation:none}.tpl-ai-btn--active{background-color:var(--tpl-primary-light);color:var(--tpl-primary-hover);border:1px solid var(--tpl-primary)}.tpl-ai-btn--active .tpl-ai-btn-icon{fill:var(--tpl-primary)}@supports (color:color-mix(in lab,red,red)){.tpl-ai-btn--active .tpl-ai-btn-icon{fill:color-mix(in srgb,var(--tpl-primary) 25%,transparent)}}.tpl-ai-btn--active:hover{background-color:var(--tpl-primary-light)}@supports (color:color-mix(in lab,red,red)){.tpl-ai-btn--active:hover{background-color:color-mix(in srgb,var(--tpl-primary-light) 80%,var(--tpl-primary))}}.tpl-merge-tag-delete:hover{color:var(--tpl-danger)!important}@media(prefers-reduced-motion:reduce){.tpl-pulse,.tpl-dot,.tpl-shimmer,.tpl-fade-in,.tpl-scale-in,.tpl-slide-in-right,.tpl-slide-in-up,.tpl-ai-btn--idle:before{animation:none}.tpl-shimmer{background:var(--tpl-bg-hover)}.tpl *,.tpl :before,.tpl :after{transition-duration:.01ms!important}.tpl-spinner{animation:1s linear infinite tpl-spin}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import"./chunks/rolldown-runtime-BakkzWXw.js";import{t as e,z as t}from"./chunks/draggable-ClUwYCFL.js";import"./chunks/icons-vmLJTaJk.js";import"./chunks/useMergeTag-DVOz1v9p.js";import"./chunks/useEditorCore-CwuxQuvh.js";import"./chunks/styleConstants-CNejCb-L.js";e();var n=(e,t=0,n=1)=>e>n?n:e<t?t:e,r=(e,t=0,n=10**t)=>Math.round(n*e)/n;360/(Math.PI*2);var i=e=>f(a(e)),a=e=>(e[0]===`#`&&(e=e.substring(1)),e.length<6?{r:parseInt(e[0]+e[0],16),g:parseInt(e[1]+e[1],16),b:parseInt(e[2]+e[2],16),a:e.length===4?r(parseInt(e[3]+e[3],16)/255,2):1}:{r:parseInt(e.substring(0,2),16),g:parseInt(e.substring(2,4),16),b:parseInt(e.substring(4,6),16),a:e.length===8?r(parseInt(e.substring(6,8),16)/255,2):1}),o=e=>d(l(e)),s=({h:e,s:t,v:n,a:i})=>{let a=(200-t)*n/100;return{h:r(e),s:r(a>0&&a<200?t*n/100/(a<=100?a:200-a)*100:0),l:r(a/2),a:r(i,2)}},c=e=>{let{h:t,s:n,l:r}=s(e);return`hsl(${t}, ${n}%, ${r}%)`},l=({h:e,s:t,v:n,a:i})=>{e=e/360*6,t/=100,n/=100;let a=Math.floor(e),o=n*(1-t),s=n*(1-(e-a)*t),c=n*(1-(1-e+a)*t),l=a%6;return{r:r([n,s,o,o,c,n][l]*255),g:r([c,n,n,s,o,o][l]*255),b:r([o,o,c,n,n,s][l]*255),a:r(i,2)}},u=e=>{let t=e.toString(16);return t.length<2?`0`+t:t},d=({r:e,g:t,b:n,a:i})=>{let a=i<1?u(r(i*255)):``;return`#`+u(e)+u(t)+u(n)+a},f=({r:e,g:t,b:n,a:i})=>{let a=Math.max(e,t,n),o=a-Math.min(e,t,n),s=o?a===e?(t-n)/o:a===t?2+(n-e)/o:4+(e-t)/o:0;return{h:r(60*(s<0?s+6:s)),s:r(a?o/a*100:0),v:r(a/255*100),a:i}},p=(e,t)=>{if(e===t)return!0;for(let n in e)if(e[n]!==t[n])return!1;return!0},m=(e,t)=>e.toLowerCase()===t.toLowerCase()?!0:p(a(e),a(t)),h={},g=e=>{let t=h[e];return t||(t=document.createElement(`template`),t.innerHTML=e,h[e]=t),t},_=(e,t,n)=>{e.dispatchEvent(new CustomEvent(t,{bubbles:!0,detail:n}))},v=!1,y=e=>`touches`in e,b=e=>v&&!y(e)?!1:(v||=y(e),!0),x=(e,t)=>{let r=y(t)?t.touches[0]:t,i=e.el.getBoundingClientRect();_(e.el,`move`,e.getMove({x:n((r.pageX-(i.left+window.pageXOffset))/i.width),y:n((r.pageY-(i.top+window.pageYOffset))/i.height)}))},S=(e,t)=>{let n=t.keyCode;n>40||e.xy&&n<37||n<33||(t.preventDefault(),_(e.el,`move`,e.getMove({x:n===39?.01:n===37?-.01:n===34?.05:n===33?-.05:n===35?1:n===36?-1:0,y:n===40?.01:n===38?-.01:0},!0)))},C=class{constructor(e,t,n,r){let i=g(`<div role="slider" tabindex="0" part="${t}" ${n}><div part="${t}-pointer"></div></div>`);e.appendChild(i.content.cloneNode(!0));let a=e.querySelector(`[part=${t}]`);a.addEventListener(`mousedown`,this),a.addEventListener(`touchstart`,this),a.addEventListener(`keydown`,this),this.el=a,this.xy=r,this.nodes=[a.firstChild,a]}set dragging(e){let t=e?document.addEventListener:document.removeEventListener;t(v?`touchmove`:`mousemove`,this),t(v?`touchend`:`mouseup`,this)}handleEvent(e){switch(e.type){case`mousedown`:case`touchstart`:if(e.preventDefault(),!b(e)||!v&&e.button!=0)return;this.el.focus(),x(this,e),this.dragging=!0;break;case`mousemove`:case`touchmove`:e.preventDefault(),x(this,e);break;case`mouseup`:case`touchend`:this.dragging=!1;break;case`keydown`:S(this,e);break}}style(e){e.forEach((e,t)=>{for(let n in e)this.nodes[t].style.setProperty(n,e[n])})}},w=class extends C{constructor(e){super(e,`hue`,`aria-label="Hue" aria-valuemin="0" aria-valuemax="360"`,!1)}update({h:e}){this.h=e,this.style([{left:`${e/360*100}%`,color:c({h:e,s:100,v:100,a:1})}]),this.el.setAttribute(`aria-valuenow`,`${r(e)}`)}getMove(e,t){return{h:t?n(this.h+e.x*360,0,360):360*e.x}}},T=class extends C{constructor(e){super(e,`saturation`,`aria-label="Color"`,!0)}update(e){this.hsva=e,this.style([{top:`${100-e.v}%`,left:`${e.s}%`,color:c(e)},{"background-color":c({h:e.h,s:100,v:100,a:1})}]),this.el.setAttribute(`aria-valuetext`,`Saturation ${r(e.s)}%, Brightness ${r(e.v)}%`)}getMove(e,t){return{s:t?n(this.hsva.s+e.x*100,0,100):e.x*100,v:t?n(this.hsva.v-e.y*100,0,100):Math.round(100-e.y*100)}}},E=`:host{display:flex;flex-direction:column;position:relative;width:200px;height:200px;user-select:none;-webkit-user-select:none;cursor:default}:host([hidden]){display:none!important}[role=slider]{position:relative;touch-action:none;user-select:none;-webkit-user-select:none;outline:0}[role=slider]:last-child{border-radius:0 0 8px 8px}[part$=pointer]{position:absolute;z-index:1;box-sizing:border-box;width:28px;height:28px;display:flex;place-content:center center;transform:translate(-50%,-50%);background-color:#fff;border:2px solid #fff;border-radius:50%;box-shadow:0 2px 4px rgba(0,0,0,.2)}[part$=pointer]::after{content:"";width:100%;height:100%;border-radius:inherit;background-color:currentColor}[role=slider]:focus [part$=pointer]{transform:translate(-50%,-50%) scale(1.1)}`,D=`[part=hue]{flex:0 0 24px;background:linear-gradient(to right,red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red 100%)}[part=hue-pointer]{top:50%;z-index:2}`,O=`[part=saturation]{flex-grow:1;border-color:transparent;border-bottom:12px solid #000;border-radius:8px 8px 0 0;background-image:linear-gradient(to top,#000,transparent),linear-gradient(to right,#fff,rgba(255,255,255,0));box-shadow:inset 0 0 0 1px rgba(0,0,0,.05)}[part=saturation-pointer]{z-index:3}`,k=Symbol(`same`),A=Symbol(`color`),j=Symbol(`hsva`),M=Symbol(`update`),N=Symbol(`parts`),P=Symbol(`css`),F=Symbol(`sliders`),I=class extends HTMLElement{static get observedAttributes(){return[`color`]}get[P](){return[E,D,O]}get[F](){return[T,w]}get color(){return this[A]}set color(e){if(!this[k](e)){let t=this.colorModel.toHsva(e);this[M](t),this[A]=e}}constructor(){super();let e=g(`<style>${this[P].join(``)}</style>`),t=this.attachShadow({mode:`open`});t.appendChild(e.content.cloneNode(!0)),t.addEventListener(`move`,this),this[N]=this[F].map(e=>new e(t))}connectedCallback(){if(this.hasOwnProperty(`color`)){let e=this.color;delete this.color,this.color=e}else this.color||=this.colorModel.defaultColor}attributeChangedCallback(e,t,n){let r=this.colorModel.fromAttr(n);this[k](r)||(this.color=r)}handleEvent(e){let t=this[j],n={...t,...e.detail};this[M](n);let r;!p(n,t)&&!this[k](r=this.colorModel.fromHsva(n))&&(this[A]=r,_(this,`color-changed`,{value:r}))}[k](e){return this.color&&this.colorModel.equal(e,this.color)}[M](e){this[j]=e,this[N].forEach(t=>t.update(e))}},L={defaultColor:`#000`,toHsva:i,fromHsva:({h:e,s:t,v:n})=>o({h:e,s:t,v:n,a:1}),equal:m,fromAttr:e=>e},R=class extends I{get colorModel(){return L}};customElements.define(`hex-color-picker`,class extends R{}),t(null),t(null);
|
|
2
|
+
//# sourceMappingURL=editor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editor.js","names":["css","hueCss","saturationCss"],"sources":["../../src/components/Canvas.vue","../../../../node_modules/.bun/vanilla-colorful@0.7.2/node_modules/vanilla-colorful/lib/utils/math.js","../../../../node_modules/.bun/vanilla-colorful@0.7.2/node_modules/vanilla-colorful/lib/utils/convert.js","../../../../node_modules/.bun/vanilla-colorful@0.7.2/node_modules/vanilla-colorful/lib/utils/compare.js","../../../../node_modules/.bun/vanilla-colorful@0.7.2/node_modules/vanilla-colorful/lib/utils/dom.js","../../../../node_modules/.bun/vanilla-colorful@0.7.2/node_modules/vanilla-colorful/lib/components/slider.js","../../../../node_modules/.bun/vanilla-colorful@0.7.2/node_modules/vanilla-colorful/lib/components/hue.js","../../../../node_modules/.bun/vanilla-colorful@0.7.2/node_modules/vanilla-colorful/lib/components/saturation.js","../../../../node_modules/.bun/vanilla-colorful@0.7.2/node_modules/vanilla-colorful/lib/styles/color-picker.js","../../../../node_modules/.bun/vanilla-colorful@0.7.2/node_modules/vanilla-colorful/lib/styles/hue.js","../../../../node_modules/.bun/vanilla-colorful@0.7.2/node_modules/vanilla-colorful/lib/styles/saturation.js","../../../../node_modules/.bun/vanilla-colorful@0.7.2/node_modules/vanilla-colorful/lib/components/color-picker.js","../../../../node_modules/.bun/vanilla-colorful@0.7.2/node_modules/vanilla-colorful/lib/entrypoints/hex.js","../../../../node_modules/.bun/vanilla-colorful@0.7.2/node_modules/vanilla-colorful/hex-color-picker.js","../../src/index.ts"],"sourcesContent":["<script setup lang=\"ts\">\nimport { useI18n } from \"../composables/useI18n\";\nimport type {\n Block,\n Collaborator,\n CustomBlock as CustomBlockType,\n TemplateContent,\n ViewportSize,\n} from \"@templatical/types\";\nimport { ImageUp, Sparkles, SquarePlus } from \"@lucide/vue\";\nimport { computed, inject, type Component } from \"vue\";\nimport {\n EDITOR_KEY,\n CONDITION_PREVIEW_KEY,\n BLOCK_REGISTRY_KEY,\n CAPABILITIES_KEY,\n requireInject,\n} from \"../keys\";\nimport draggable from \"vuedraggable\";\nimport { resolveBlockComponent } from \"../utils/blockComponentResolver\";\n\nimport BlockWrapper from \"./blocks/BlockWrapper.vue\";\nimport SectionBlock from \"./blocks/SectionBlock.vue\";\nimport TitleBlock from \"./blocks/TitleBlock.vue\";\nimport ParagraphBlock from \"./blocks/ParagraphBlock.vue\";\nimport ImageBlock from \"./blocks/ImageBlock.vue\";\nimport ButtonBlock from \"./blocks/ButtonBlock.vue\";\nimport DividerBlock from \"./blocks/DividerBlock.vue\";\nimport SpacerBlock from \"./blocks/SpacerBlock.vue\";\nimport HtmlBlock from \"./blocks/HtmlBlock.vue\";\nimport SocialIconsBlock from \"./blocks/SocialIconsBlock.vue\";\nimport MenuBlock from \"./blocks/MenuBlock.vue\";\nimport TableBlock from \"./blocks/TableBlock.vue\";\nimport CustomBlock from \"./blocks/CustomBlock.vue\";\nimport VideoBlock from \"./blocks/VideoBlock.vue\";\nimport CountdownBlockComponent from \"./blocks/CountdownBlock.vue\";\n\nconst blockComponentMap: Record<string, Component> = {\n section: SectionBlock,\n title: TitleBlock,\n paragraph: ParagraphBlock,\n image: ImageBlock,\n button: ButtonBlock,\n divider: DividerBlock,\n spacer: SpacerBlock,\n html: HtmlBlock,\n social: SocialIconsBlock,\n menu: MenuBlock,\n table: TableBlock,\n video: VideoBlock,\n countdown: CountdownBlockComponent,\n custom: CustomBlock,\n};\n\nconst props = defineProps<{\n viewport: ViewportSize;\n content: TemplateContent;\n selectedBlockId: string | null;\n darkMode: boolean;\n previewMode: boolean;\n lockedBlocks?: Map<string, Collaborator>;\n}>();\n\nconst emit = defineEmits<{\n (e: \"select-block\", blockId: string | null): void;\n (e: \"open-ai-chat\"): void;\n (e: \"open-design-reference\"): void;\n}>();\n\nconst { t } = useI18n();\n\nconst editor = requireInject(EDITOR_KEY, \"Canvas\");\nconst conditionPreview = inject(CONDITION_PREVIEW_KEY, null);\nconst blockRegistry = inject(BLOCK_REGISTRY_KEY, null);\n\nconst caps = inject(CAPABILITIES_KEY, {});\n\nconst canUseAiChat = computed(\n () =>\n (caps.plan?.hasFeature(\"ai_generation\") ?? false) &&\n (caps.ai?.isFeatureEnabled(\"chat\") ?? false),\n);\nconst canUseDesignToTemplate = computed(\n () =>\n (caps.plan?.hasFeature(\"ai_generation\") ?? false) &&\n (caps.ai?.isFeatureEnabled(\"designToTemplate\") ?? false),\n);\n\nconst blocks = computed({\n get: () => props.content.blocks,\n set: (value: Block[]) => {\n editor.setContent({\n ...props.content,\n blocks: value,\n });\n },\n});\n\nconst viewportWidth = computed(() => {\n switch (props.viewport) {\n case \"mobile\":\n return 375;\n case \"tablet\":\n return 768;\n default:\n return props.content.settings.width;\n }\n});\n\n// Canvas dark mode preview: simulates how the email will appear in recipients'\n// dark-themed email clients. Uses CSS filter inversion — independent of the\n// editor UI theme (light/dark/auto) which is controlled via uiTheme config.\nconst canvasStyle = computed(() => ({\n backgroundColor: props.content.settings.backgroundColor,\n fontFamily: props.content.settings.fontFamily,\n}));\n\nfunction handleCanvasClick(event: MouseEvent): void {\n if (props.previewMode) {\n return;\n }\n if (event.target === event.currentTarget) {\n emit(\"select-block\", null);\n }\n}\n\nfunction getBlockComponent(block: Block): Component | null {\n return resolveBlockComponent(block, blockRegistry, blockComponentMap);\n}\n\nfunction getBlockLock(blockId: string): Collaborator | null {\n return props.lockedBlocks?.get(blockId) ?? null;\n}\n\nfunction handleFetchData(\n block: Block,\n payload: {\n fieldValues: Record<string, unknown>;\n dataSourceFetched: boolean;\n },\n): void {\n if (block.type !== \"custom\") {\n return;\n }\n\n editor.updateBlock(block.id, {\n fieldValues: payload.fieldValues,\n dataSourceFetched: payload.dataSourceFetched,\n } as Partial<CustomBlockType>);\n}\n</script>\n\n<template>\n <div\n class=\"tpl-canvas-wrapper tpl:rounded-lg tpl:transition-[width] tpl:duration-300\"\n style=\"transition-timing-function: cubic-bezier(0.34, 1.56, 0.64, 1)\"\n :style=\"{\n width: `${viewportWidth}px`,\n backgroundColor: content.settings.backgroundColor,\n boxShadow: darkMode ? 'none' : 'var(--tpl-shadow-xl)',\n filter: darkMode ? 'invert(1) hue-rotate(180deg)' : 'none',\n transition: 'filter 300ms ease',\n }\"\n >\n <div\n class=\"tpl-canvas tpl:rounded-lg\"\n :class=\"{\n 'tpl-canvas--dark-mode': darkMode,\n 'tpl-preview-mode': previewMode,\n }\"\n :style=\"canvasStyle\"\n @click=\"handleCanvasClick\"\n >\n <draggable\n v-model=\"blocks\"\n group=\"blocks\"\n item-key=\"id\"\n :animation=\"150\"\n ghost-class=\"tpl-ghost\"\n drag-class=\"tpl-dragging\"\n handle=\".tpl-block-btn\"\n :invert-swap=\"true\"\n :inverted-swap-threshold=\"0.65\"\n :disabled=\"previewMode\"\n class=\"tpl-canvas-blocks\"\n >\n <template #item=\"{ element: block }\">\n <div v-show=\"!conditionPreview?.isHidden(block.id)\">\n <div class=\"tpl:relative\">\n <!-- Collaboration lock overlay -->\n <div\n v-if=\"getBlockLock(block.id)\"\n class=\"tpl-collab-lock tpl:pointer-events-none tpl:absolute tpl:inset-0 tpl:z-[4] tpl:rounded-sm\"\n :style=\"{\n outline: `2px solid ${getBlockLock(block.id)!.color}`,\n outlineOffset: '-1px',\n }\"\n >\n <span\n class=\"tpl:absolute tpl:-top-0.5 tpl:left-1/2 tpl:z-[5] tpl:flex tpl:-translate-x-1/2 tpl:-translate-y-full tpl:items-center tpl:gap-1 tpl:rounded-full tpl:px-2 tpl:py-0.5 tpl:text-[10px] tpl:font-medium tpl:text-white tpl:whitespace-nowrap\"\n :style=\"{\n backgroundColor: getBlockLock(block.id)!.color,\n }\"\n >\n <span\n class=\"tpl:inline-flex tpl:size-3 tpl:items-center tpl:justify-center tpl:rounded-full tpl:text-[8px] tpl:font-bold\"\n style=\"\n background-color: color-mix(\n in srgb,\n var(--tpl-bg) 30%,\n transparent\n );\n \"\n >\n {{ getBlockLock(block.id)!.name.charAt(0) }}\n </span>\n {{ getBlockLock(block.id)!.name }}\n </span>\n </div>\n <BlockWrapper\n :block=\"block\"\n :is-selected=\"\n !previewMode &&\n selectedBlockId === block.id &&\n !getBlockLock(block.id)\n \"\n :viewport=\"viewport\"\n :preview-mode=\"previewMode\"\n @select=\"\n previewMode || getBlockLock(block.id)\n ? undefined\n : emit('select-block', block.id)\n \"\n >\n <component\n :is=\"getBlockComponent(block)\"\n :block=\"block\"\n :viewport=\"viewport\"\n @fetch-data=\"handleFetchData(block, $event)\"\n @update=\"\n (updates: Partial<Block>) =>\n editor.updateBlock(block.id, updates)\n \"\n />\n </BlockWrapper>\n </div>\n </div>\n </template>\n <template #footer>\n <div\n v-if=\"blocks.length === 0 && !previewMode\"\n class=\"tpl-canvas-empty tpl:m-6 tpl:flex tpl:min-h-[400px] tpl:flex-col tpl:items-center tpl:justify-center tpl:rounded-xl tpl:border-2 tpl:border-dashed tpl:px-10 tpl:py-12 tpl:text-center tpl:border-[var(--tpl-primary)] tpl:bg-[var(--tpl-bg-elevated)] tpl:font-[var(--tpl-font-family)]\"\n >\n <div\n class=\"tpl-canvas-empty-icon tpl:mb-4 tpl:text-[var(--tpl-primary)]\"\n >\n <SquarePlus :size=\"48\" :stroke-width=\"1\" />\n </div>\n <p\n class=\"tpl-canvas-empty-title tpl:m-0 tpl:mb-2 tpl:text-base tpl:font-semibold tpl:text-[var(--tpl-primary)]\"\n >\n {{ t.canvas.noBlocks }}\n </p>\n <p\n class=\"tpl-canvas-empty-text tpl:m-0 tpl:text-sm tpl:text-[var(--tpl-text-dim)]\"\n >\n {{ t.canvas.dragHint }}\n </p>\n <p\n v-if=\"canUseAiChat\"\n class=\"tpl:m-0 tpl:mt-2 tpl:flex tpl:flex-wrap tpl:items-center tpl:justify-center tpl:gap-x-1 tpl:gap-y-0.5 tpl:text-sm tpl:text-[var(--tpl-text-dim)]\"\n >\n {{ t.canvas.aiHintChat }}\n <button\n class=\"tpl:inline-flex tpl:shrink-0 tpl:cursor-pointer tpl:items-center tpl:gap-1 tpl:whitespace-nowrap tpl:rounded-[var(--tpl-radius-sm)] tpl:border-none tpl:px-2 tpl:py-0.5 tpl:text-sm tpl:font-semibold tpl:transition-colors tpl:duration-150 tpl:bg-[var(--tpl-primary-light)] tpl:text-[var(--tpl-primary-hover)]\"\n @click=\"emit('open-ai-chat')\"\n >\n <Sparkles :size=\"14\" :stroke-width=\"2\" />\n {{ t.aiMenu.aiAssistant }}\n </button>\n {{ t.canvas.aiHintChatSuffix }}\n </p>\n <p\n v-if=\"canUseDesignToTemplate\"\n class=\"tpl:m-0 tpl:mt-4 tpl:flex tpl:flex-wrap tpl:items-center tpl:justify-center tpl:gap-x-1 tpl:gap-y-0.5 tpl:text-sm tpl:text-[var(--tpl-text-dim)]\"\n >\n {{ t.canvas.aiHintDesign }}\n <button\n class=\"tpl:inline-flex tpl:shrink-0 tpl:cursor-pointer tpl:items-center tpl:gap-1 tpl:whitespace-nowrap tpl:rounded-[var(--tpl-radius-sm)] tpl:border-none tpl:px-2 tpl:py-0.5 tpl:text-sm tpl:font-semibold tpl:transition-colors tpl:duration-150 tpl:bg-[var(--tpl-primary-light)] tpl:text-[var(--tpl-primary-hover)]\"\n @click=\"emit('open-design-reference')\"\n >\n <ImageUp :size=\"14\" :stroke-width=\"2\" />\n {{ t.aiMenu.designToTemplate }}\n </button>\n {{ t.canvas.aiHintDesignSuffix }}\n </p>\n </div>\n </template>\n </draggable>\n </div>\n </div>\n</template>\n\n<style scoped>\n/* Counter-invert images so they look normal in dark mode */\n.tpl-canvas--dark-mode :deep(img) {\n filter: invert(1) hue-rotate(180deg);\n}\n\n/* Counter-invert editor UI chrome so controls stay readable */\n.tpl-canvas--dark-mode :deep(.tpl-block-actions),\n.tpl-canvas--dark-mode :deep(.tpl-condition-toggle),\n.tpl-canvas--dark-mode :deep(.tpl-block-hidden-overlay) {\n filter: invert(1) hue-rotate(180deg);\n}\n</style>\n","// Clamps a value between an upper and lower bound.\n// We use ternary operators because it makes the minified code\n// 2 times shorter then `Math.min(Math.max(a,b),c)`\nexport const clamp = (number, min = 0, max = 1) => {\n return number > max ? max : number < min ? min : number;\n};\nexport const round = (number, digits = 0, base = Math.pow(10, digits)) => {\n return Math.round(base * number) / base;\n};\n//# sourceMappingURL=math.js.map","import { round } from './math.js';\n/**\n * Valid CSS <angle> units.\n * https://developer.mozilla.org/en-US/docs/Web/CSS/angle\n */\nconst angleUnits = {\n grad: 360 / 400,\n turn: 360,\n rad: 360 / (Math.PI * 2)\n};\nexport const hexToHsva = (hex) => rgbaToHsva(hexToRgba(hex));\nexport const hexToRgba = (hex) => {\n if (hex[0] === '#')\n hex = hex.substring(1);\n if (hex.length < 6) {\n return {\n r: parseInt(hex[0] + hex[0], 16),\n g: parseInt(hex[1] + hex[1], 16),\n b: parseInt(hex[2] + hex[2], 16),\n a: hex.length === 4 ? round(parseInt(hex[3] + hex[3], 16) / 255, 2) : 1\n };\n }\n return {\n r: parseInt(hex.substring(0, 2), 16),\n g: parseInt(hex.substring(2, 4), 16),\n b: parseInt(hex.substring(4, 6), 16),\n a: hex.length === 8 ? round(parseInt(hex.substring(6, 8), 16) / 255, 2) : 1\n };\n};\nexport const parseHue = (value, unit = 'deg') => {\n return Number(value) * (angleUnits[unit] || 1);\n};\nexport const hslaStringToHsva = (hslString) => {\n const matcher = /hsla?\\(?\\s*(-?\\d*\\.?\\d+)(deg|rad|grad|turn)?[,\\s]+(-?\\d*\\.?\\d+)%?[,\\s]+(-?\\d*\\.?\\d+)%?,?\\s*[/\\s]*(-?\\d*\\.?\\d+)?(%)?\\s*\\)?/i;\n const match = matcher.exec(hslString);\n if (!match)\n return { h: 0, s: 0, v: 0, a: 1 };\n return hslaToHsva({\n h: parseHue(match[1], match[2]),\n s: Number(match[3]),\n l: Number(match[4]),\n a: match[5] === undefined ? 1 : Number(match[5]) / (match[6] ? 100 : 1)\n });\n};\nexport const hslStringToHsva = hslaStringToHsva;\nexport const hslaToHsva = ({ h, s, l, a }) => {\n s *= (l < 50 ? l : 100 - l) / 100;\n return {\n h: h,\n s: s > 0 ? ((2 * s) / (l + s)) * 100 : 0,\n v: l + s,\n a\n };\n};\nexport const hsvaToHex = (hsva) => rgbaToHex(hsvaToRgba(hsva));\nexport const hsvaToHsla = ({ h, s, v, a }) => {\n const hh = ((200 - s) * v) / 100;\n return {\n h: round(h),\n s: round(hh > 0 && hh < 200 ? ((s * v) / 100 / (hh <= 100 ? hh : 200 - hh)) * 100 : 0),\n l: round(hh / 2),\n a: round(a, 2)\n };\n};\nexport const hsvaToHsvString = (hsva) => {\n const { h, s, v } = roundHsva(hsva);\n return `hsv(${h}, ${s}%, ${v}%)`;\n};\nexport const hsvaToHsvaString = (hsva) => {\n const { h, s, v, a } = roundHsva(hsva);\n return `hsva(${h}, ${s}%, ${v}%, ${a})`;\n};\nexport const hsvaToHslString = (hsva) => {\n const { h, s, l } = hsvaToHsla(hsva);\n return `hsl(${h}, ${s}%, ${l}%)`;\n};\nexport const hsvaToHslaString = (hsva) => {\n const { h, s, l, a } = hsvaToHsla(hsva);\n return `hsla(${h}, ${s}%, ${l}%, ${a})`;\n};\nexport const hsvaToRgba = ({ h, s, v, a }) => {\n h = (h / 360) * 6;\n s = s / 100;\n v = v / 100;\n const hh = Math.floor(h), b = v * (1 - s), c = v * (1 - (h - hh) * s), d = v * (1 - (1 - h + hh) * s), module = hh % 6;\n return {\n r: round([v, c, b, b, d, v][module] * 255),\n g: round([d, v, v, c, b, b][module] * 255),\n b: round([b, b, d, v, v, c][module] * 255),\n a: round(a, 2)\n };\n};\nexport const hsvaToRgbString = (hsva) => {\n const { r, g, b } = hsvaToRgba(hsva);\n return `rgb(${r}, ${g}, ${b})`;\n};\nexport const hsvaToRgbaString = (hsva) => {\n const { r, g, b, a } = hsvaToRgba(hsva);\n return `rgba(${r}, ${g}, ${b}, ${a})`;\n};\nexport const hsvaStringToHsva = (hsvString) => {\n const matcher = /hsva?\\(?\\s*(-?\\d*\\.?\\d+)(deg|rad|grad|turn)?[,\\s]+(-?\\d*\\.?\\d+)%?[,\\s]+(-?\\d*\\.?\\d+)%?,?\\s*[/\\s]*(-?\\d*\\.?\\d+)?(%)?\\s*\\)?/i;\n const match = matcher.exec(hsvString);\n if (!match)\n return { h: 0, s: 0, v: 0, a: 1 };\n return roundHsva({\n h: parseHue(match[1], match[2]),\n s: Number(match[3]),\n v: Number(match[4]),\n a: match[5] === undefined ? 1 : Number(match[5]) / (match[6] ? 100 : 1)\n });\n};\nexport const hsvStringToHsva = hsvaStringToHsva;\nexport const rgbaStringToHsva = (rgbaString) => {\n const matcher = /rgba?\\(?\\s*(-?\\d*\\.?\\d+)(%)?[,\\s]+(-?\\d*\\.?\\d+)(%)?[,\\s]+(-?\\d*\\.?\\d+)(%)?,?\\s*[/\\s]*(-?\\d*\\.?\\d+)?(%)?\\s*\\)?/i;\n const match = matcher.exec(rgbaString);\n if (!match)\n return { h: 0, s: 0, v: 0, a: 1 };\n return rgbaToHsva({\n r: Number(match[1]) / (match[2] ? 100 / 255 : 1),\n g: Number(match[3]) / (match[4] ? 100 / 255 : 1),\n b: Number(match[5]) / (match[6] ? 100 / 255 : 1),\n a: match[7] === undefined ? 1 : Number(match[7]) / (match[8] ? 100 : 1)\n });\n};\nexport const rgbStringToHsva = rgbaStringToHsva;\nconst format = (number) => {\n const hex = number.toString(16);\n return hex.length < 2 ? '0' + hex : hex;\n};\nexport const rgbaToHex = ({ r, g, b, a }) => {\n const alphaHex = a < 1 ? format(round(a * 255)) : '';\n return '#' + format(r) + format(g) + format(b) + alphaHex;\n};\nexport const rgbaToHsva = ({ r, g, b, a }) => {\n const max = Math.max(r, g, b);\n const delta = max - Math.min(r, g, b);\n // prettier-ignore\n const hh = delta\n ? max === r\n ? (g - b) / delta\n : max === g\n ? 2 + (b - r) / delta\n : 4 + (r - g) / delta\n : 0;\n return {\n h: round(60 * (hh < 0 ? hh + 6 : hh)),\n s: round(max ? (delta / max) * 100 : 0),\n v: round((max / 255) * 100),\n a\n };\n};\nexport const roundHsva = (hsva) => ({\n h: round(hsva.h),\n s: round(hsva.s),\n v: round(hsva.v),\n a: round(hsva.a, 2)\n});\nexport const rgbaToRgb = ({ r, g, b }) => ({ r, g, b });\nexport const hslaToHsl = ({ h, s, l }) => ({ h, s, l });\nexport const hsvaToHsv = (hsva) => {\n const { h, s, v } = roundHsva(hsva);\n return { h, s, v };\n};\n//# sourceMappingURL=convert.js.map","import { hexToRgba } from './convert.js';\nexport const equalColorObjects = (first, second) => {\n if (first === second)\n return true;\n for (const prop in first) {\n // The following allows for a type-safe calling of this function (first & second have to be HSL, HSV, or RGB)\n // with type-unsafe iterating over object keys. TS does not allow this without an index (`[key: string]: number`)\n // on an object to define how iteration is normally done. To ensure extra keys are not allowed on our types,\n // we must cast our object to unknown (as RGB demands `r` be a key, while `Record<string, x>` does not care if\n // there is or not), and then as a type TS can iterate over.\n if (first[prop] !==\n second[prop])\n return false;\n }\n return true;\n};\nexport const equalColorString = (first, second) => {\n return first.replace(/\\s/g, '') === second.replace(/\\s/g, '');\n};\nexport const equalHex = (first, second) => {\n if (first.toLowerCase() === second.toLowerCase())\n return true;\n // To compare colors like `#FFF` and `ffffff` we convert them into RGB objects\n return equalColorObjects(hexToRgba(first), hexToRgba(second));\n};\n//# sourceMappingURL=compare.js.map","const cache = {};\nexport const tpl = (html) => {\n let template = cache[html];\n if (!template) {\n template = document.createElement('template');\n template.innerHTML = html;\n cache[html] = template;\n }\n return template;\n};\nexport const fire = (target, type, detail) => {\n target.dispatchEvent(new CustomEvent(type, {\n bubbles: true,\n detail\n }));\n};\n//# sourceMappingURL=dom.js.map","import { fire, tpl } from '../utils/dom.js';\nimport { clamp } from '../utils/math.js';\nlet hasTouched = false;\n// Check if an event was triggered by touch\nconst isTouch = (e) => 'touches' in e;\n// Prevent mobile browsers from handling mouse events (conflicting with touch ones).\n// If we detected a touch interaction before, we prefer reacting to touch events only.\nconst isValid = (event) => {\n if (hasTouched && !isTouch(event))\n return false;\n if (!hasTouched)\n hasTouched = isTouch(event);\n return true;\n};\nconst pointerMove = (target, event) => {\n const pointer = isTouch(event) ? event.touches[0] : event;\n const rect = target.el.getBoundingClientRect();\n fire(target.el, 'move', target.getMove({\n x: clamp((pointer.pageX - (rect.left + window.pageXOffset)) / rect.width),\n y: clamp((pointer.pageY - (rect.top + window.pageYOffset)) / rect.height)\n }));\n};\nconst keyMove = (target, event) => {\n // We use `keyCode` instead of `key` to reduce the size of the library.\n const keyCode = event.keyCode;\n // Ignore all keys except arrow ones, Page Up, Page Down, Home and End.\n if (keyCode > 40 || (target.xy && keyCode < 37) || keyCode < 33)\n return;\n // Do not scroll page by keys when color picker element has focus.\n event.preventDefault();\n // Send relative offset to the parent component.\n fire(target.el, 'move', target.getMove({\n x: keyCode === 39 // Arrow Right\n ? 0.01\n : keyCode === 37 // Arrow Left\n ? -0.01\n : keyCode === 34 // Page Down\n ? 0.05\n : keyCode === 33 // Page Up\n ? -0.05\n : keyCode === 35 // End\n ? 1\n : keyCode === 36 // Home\n ? -1\n : 0,\n y: keyCode === 40 // Arrow down\n ? 0.01\n : keyCode === 38 // Arrow Up\n ? -0.01\n : 0\n }, true));\n};\nexport class Slider {\n constructor(root, part, aria, xy) {\n const template = tpl(`<div role=\"slider\" tabindex=\"0\" part=\"${part}\" ${aria}><div part=\"${part}-pointer\"></div></div>`);\n root.appendChild(template.content.cloneNode(true));\n const el = root.querySelector(`[part=${part}]`);\n el.addEventListener('mousedown', this);\n el.addEventListener('touchstart', this);\n el.addEventListener('keydown', this);\n this.el = el;\n this.xy = xy;\n this.nodes = [el.firstChild, el];\n }\n set dragging(state) {\n const toggleEvent = state ? document.addEventListener : document.removeEventListener;\n toggleEvent(hasTouched ? 'touchmove' : 'mousemove', this);\n toggleEvent(hasTouched ? 'touchend' : 'mouseup', this);\n }\n handleEvent(event) {\n switch (event.type) {\n case 'mousedown':\n case 'touchstart':\n event.preventDefault();\n // event.button is 0 in mousedown for left button activation\n if (!isValid(event) || (!hasTouched && event.button != 0))\n return;\n this.el.focus();\n pointerMove(this, event);\n this.dragging = true;\n break;\n case 'mousemove':\n case 'touchmove':\n event.preventDefault();\n pointerMove(this, event);\n break;\n case 'mouseup':\n case 'touchend':\n this.dragging = false;\n break;\n case 'keydown':\n keyMove(this, event);\n break;\n }\n }\n style(styles) {\n styles.forEach((style, i) => {\n for (const p in style) {\n this.nodes[i].style.setProperty(p, style[p]);\n }\n });\n }\n}\n//# sourceMappingURL=slider.js.map","import { Slider } from './slider.js';\nimport { hsvaToHslString } from '../utils/convert.js';\nimport { clamp, round } from '../utils/math.js';\nexport class Hue extends Slider {\n constructor(root) {\n super(root, 'hue', 'aria-label=\"Hue\" aria-valuemin=\"0\" aria-valuemax=\"360\"', false);\n }\n update({ h }) {\n this.h = h;\n this.style([\n {\n left: `${(h / 360) * 100}%`,\n color: hsvaToHslString({ h, s: 100, v: 100, a: 1 })\n }\n ]);\n this.el.setAttribute('aria-valuenow', `${round(h)}`);\n }\n getMove(offset, key) {\n // Hue measured in degrees of the color circle ranging from 0 to 360\n return { h: key ? clamp(this.h + offset.x * 360, 0, 360) : 360 * offset.x };\n }\n}\n//# sourceMappingURL=hue.js.map","import { Slider } from './slider.js';\nimport { hsvaToHslString } from '../utils/convert.js';\nimport { clamp, round } from '../utils/math.js';\nexport class Saturation extends Slider {\n constructor(root) {\n super(root, 'saturation', 'aria-label=\"Color\"', true);\n }\n update(hsva) {\n this.hsva = hsva;\n this.style([\n {\n top: `${100 - hsva.v}%`,\n left: `${hsva.s}%`,\n color: hsvaToHslString(hsva)\n },\n {\n 'background-color': hsvaToHslString({ h: hsva.h, s: 100, v: 100, a: 1 })\n }\n ]);\n this.el.setAttribute('aria-valuetext', `Saturation ${round(hsva.s)}%, Brightness ${round(hsva.v)}%`);\n }\n getMove(offset, key) {\n // Saturation and brightness always fit into [0, 100] range\n return {\n s: key ? clamp(this.hsva.s + offset.x * 100, 0, 100) : offset.x * 100,\n v: key ? clamp(this.hsva.v - offset.y * 100, 0, 100) : Math.round(100 - offset.y * 100)\n };\n }\n}\n//# sourceMappingURL=saturation.js.map","export default `:host{display:flex;flex-direction:column;position:relative;width:200px;height:200px;user-select:none;-webkit-user-select:none;cursor:default}:host([hidden]){display:none!important}[role=slider]{position:relative;touch-action:none;user-select:none;-webkit-user-select:none;outline:0}[role=slider]:last-child{border-radius:0 0 8px 8px}[part$=pointer]{position:absolute;z-index:1;box-sizing:border-box;width:28px;height:28px;display:flex;place-content:center center;transform:translate(-50%,-50%);background-color:#fff;border:2px solid #fff;border-radius:50%;box-shadow:0 2px 4px rgba(0,0,0,.2)}[part$=pointer]::after{content:\"\";width:100%;height:100%;border-radius:inherit;background-color:currentColor}[role=slider]:focus [part$=pointer]{transform:translate(-50%,-50%) scale(1.1)}`;\n//# sourceMappingURL=color-picker.js.map","export default `[part=hue]{flex:0 0 24px;background:linear-gradient(to right,red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red 100%)}[part=hue-pointer]{top:50%;z-index:2}`;\n//# sourceMappingURL=hue.js.map","export default `[part=saturation]{flex-grow:1;border-color:transparent;border-bottom:12px solid #000;border-radius:8px 8px 0 0;background-image:linear-gradient(to top,#000,transparent),linear-gradient(to right,#fff,rgba(255,255,255,0));box-shadow:inset 0 0 0 1px rgba(0,0,0,.05)}[part=saturation-pointer]{z-index:3}`;\n//# sourceMappingURL=saturation.js.map","import { equalColorObjects } from '../utils/compare.js';\nimport { fire, tpl } from '../utils/dom.js';\nimport { Hue } from './hue.js';\nimport { Saturation } from './saturation.js';\nimport css from '../styles/color-picker.js';\nimport hueCss from '../styles/hue.js';\nimport saturationCss from '../styles/saturation.js';\nconst $isSame = Symbol('same');\nconst $color = Symbol('color');\nconst $hsva = Symbol('hsva');\nconst $update = Symbol('update');\nconst $parts = Symbol('parts');\nexport const $css = Symbol('css');\nexport const $sliders = Symbol('sliders');\nexport class ColorPicker extends HTMLElement {\n static get observedAttributes() {\n return ['color'];\n }\n get [$css]() {\n return [css, hueCss, saturationCss];\n }\n get [$sliders]() {\n return [Saturation, Hue];\n }\n get color() {\n return this[$color];\n }\n set color(newColor) {\n if (!this[$isSame](newColor)) {\n const newHsva = this.colorModel.toHsva(newColor);\n this[$update](newHsva);\n this[$color] = newColor;\n }\n }\n constructor() {\n super();\n const template = tpl(`<style>${this[$css].join('')}</style>`);\n const root = this.attachShadow({ mode: 'open' });\n root.appendChild(template.content.cloneNode(true));\n root.addEventListener('move', this);\n this[$parts] = this[$sliders].map((slider) => new slider(root));\n }\n connectedCallback() {\n // A user may set a property on an _instance_ of an element,\n // before its prototype has been connected to this class.\n // If so, we need to run it through the proper class setter.\n if (this.hasOwnProperty('color')) {\n const value = this.color;\n delete this['color'];\n this.color = value;\n }\n else if (!this.color) {\n this.color = this.colorModel.defaultColor;\n }\n }\n attributeChangedCallback(_attr, _oldVal, newVal) {\n const color = this.colorModel.fromAttr(newVal);\n if (!this[$isSame](color)) {\n this.color = color;\n }\n }\n handleEvent(event) {\n // Merge the current HSV color object with updated params.\n const oldHsva = this[$hsva];\n const newHsva = { ...oldHsva, ...event.detail };\n this[$update](newHsva);\n let newColor;\n if (!equalColorObjects(newHsva, oldHsva) &&\n !this[$isSame]((newColor = this.colorModel.fromHsva(newHsva)))) {\n this[$color] = newColor;\n fire(this, 'color-changed', { value: newColor });\n }\n }\n [$isSame](color) {\n return this.color && this.colorModel.equal(color, this.color);\n }\n [$update](hsva) {\n this[$hsva] = hsva;\n this[$parts].forEach((part) => part.update(hsva));\n }\n}\n//# sourceMappingURL=color-picker.js.map","import { ColorPicker } from '../components/color-picker.js';\nimport { hexToHsva, hsvaToHex } from '../utils/convert.js';\nimport { equalHex } from '../utils/compare.js';\nconst colorModel = {\n defaultColor: '#000',\n toHsva: hexToHsva,\n fromHsva: ({ h, s, v }) => hsvaToHex({ h, s, v, a: 1 }),\n equal: equalHex,\n fromAttr: (color) => color\n};\nexport class HexBase extends ColorPicker {\n get colorModel() {\n return colorModel;\n }\n}\n//# sourceMappingURL=hex.js.map","import { HexBase } from './lib/entrypoints/hex.js';\n/**\n * A color picker custom element that uses HEX format.\n *\n * @element hex-color-picker\n *\n * @prop {string} color - Selected color in HEX format.\n * @attr {string} color - Selected color in HEX format.\n *\n * @fires color-changed - Event fired when color property changes.\n *\n * @csspart hue - A hue selector container.\n * @csspart saturation - A saturation selector container\n * @csspart hue-pointer - A hue pointer element.\n * @csspart saturation-pointer - A saturation pointer element.\n */\nexport class HexColorPicker extends HexBase {\n}\ncustomElements.define('hex-color-picker', HexColorPicker);\n//# sourceMappingURL=hex-color-picker.js.map","import { createApp, h, ref, type App, type Ref } from \"vue\";\nimport { INIT_TIMEOUT_MS } from \"./constants/timeouts\";\nimport type {\n BlockDefaults,\n CustomBlockDefinition,\n DisplayConditionsConfig,\n FontsConfig,\n MediaResult,\n MergeTagsConfig,\n SaveResult,\n Template,\n TemplateContent,\n TemplateDefaults,\n ThemeOverrides,\n UiTheme,\n} from \"@templatical/types\";\nimport type { MediaRequestContext } from \"@templatical/media-library\";\n\nimport Editor from \"./Editor.vue\";\nimport { loadTranslations } from \"./i18n\";\nimport { useFonts } from \"./composables\";\n\n// ---------------------------------------------------------------------------\n// OSS config + return types\n// ---------------------------------------------------------------------------\n\nexport interface TemplaticalEditorConfig {\n container: string | HTMLElement;\n content?: TemplateContent;\n\n onChange?: (content: TemplateContent) => void;\n onSave?: (content: TemplateContent) => void;\n onError?: (error: Error) => void;\n\n onRequestMedia?: OnRequestMedia;\n\n mergeTags?: MergeTagsConfig;\n displayConditions?: DisplayConditionsConfig;\n customBlocks?: CustomBlockDefinition[];\n fonts?: FontsConfig;\n\n blockDefaults?: BlockDefaults;\n templateDefaults?: TemplateDefaults;\n\n theme?: ThemeOverrides;\n uiTheme?: UiTheme;\n locale?: string;\n}\n\n/** Function type for media browser requests, used by both OSS and Cloud editors. */\nexport type OnRequestMedia = (\n context?: MediaRequestContext,\n) => Promise<MediaResult | null>;\n\nexport interface TemplaticalEditor {\n getContent(): TemplateContent;\n setContent(content: TemplateContent): void;\n setTheme(theme: UiTheme): void;\n unmount(): void;\n toMjml?(): string;\n}\n\nexport interface TemplaticalCloudEditor extends TemplaticalEditor {\n create(content?: TemplateContent): Promise<Template>;\n load(templateId: string): Promise<Template>;\n save(): Promise<SaveResult>;\n}\n\n// ---------------------------------------------------------------------------\n// OSS init — sync\n// ---------------------------------------------------------------------------\n\nlet appInstance: App | null = null;\nconst editorRef: Ref<InstanceType<typeof Editor> | null> = ref(null);\n\nexport async function init(\n config: TemplaticalEditorConfig,\n): Promise<TemplaticalEditor> {\n const container =\n typeof config.container === \"string\"\n ? document.querySelector(config.container)\n : config.container;\n\n if (!container) {\n throw new Error(\n `[Templatical] Container element not found: ${config.container}`,\n );\n }\n\n if (appInstance) {\n unmount();\n }\n\n // Load translations before mounting so child components can use useI18n synchronously\n const translations = await loadTranslations(config.locale ?? \"en\");\n\n // Create fonts manager to pass to Editor\n const fontsManager = useFonts(config.fonts);\n\n appInstance = createApp({\n setup() {\n return () =>\n h(Editor, {\n config,\n translations,\n fontsManager,\n ref: editorRef,\n });\n },\n });\n\n appInstance.mount(container);\n\n const instance: TemplaticalEditor = {\n getContent() {\n if (editorRef.value) {\n return JSON.parse(JSON.stringify(editorRef.value.getContent()));\n }\n return JSON.parse(JSON.stringify(config.content));\n },\n setContent(content: TemplateContent) {\n if (editorRef.value) {\n editorRef.value.setContent(content);\n }\n config.content = content;\n },\n setTheme(theme: UiTheme) {\n if (editorRef.value) {\n editorRef.value.setTheme(theme);\n }\n },\n unmount,\n };\n\n // Try to detect @templatical/renderer for export methods\n attachRenderer(instance);\n\n return instance;\n}\n\n// ---------------------------------------------------------------------------\n// Cloud init — async, flat config, tree-shaken when not called\n// ---------------------------------------------------------------------------\n\nlet cloudAppInstance: App | null = null;\n\nconst cloudEditorRef: Ref<InstanceType<\n typeof import(\"./cloud/CloudEditor.vue\").default\n> | null> = ref(null);\n\nexport async function initCloud(\n config: import(\"./cloud/CloudEditor.vue\").TemplaticalCloudEditorConfig,\n): Promise<TemplaticalCloudEditor> {\n const container =\n typeof config.container === \"string\"\n ? document.querySelector(config.container)\n : config.container;\n\n if (!container) {\n throw new Error(\n `[Templatical] Container element not found: ${config.container}`,\n );\n }\n\n if (cloudAppInstance) {\n unmountCloud();\n }\n\n // Dynamic import — CloudEditor.vue is tree-shaken from the OSS bundle\n const { default: CloudEditor } = await import(\"./cloud/CloudEditor.vue\");\n\n // Load translations before mounting so child components can use useI18n synchronously\n const { loadTranslations } = await import(\"./i18n\");\n const translations = await loadTranslations(config.locale ?? \"en\");\n\n // Create fonts manager to pass to CloudEditor\n const fontsManager = useFonts(config.fonts);\n\n // Promise that resolves when CloudEditor emits 'ready'\n const readyPromise = new Promise<void>((resolve, reject) => {\n const timeout = setTimeout(() => {\n reject(new Error(\"[Templatical] Cloud editor initialization timed out\"));\n }, INIT_TIMEOUT_MS);\n\n cloudAppInstance = createApp({\n setup() {\n return () =>\n h(CloudEditor, {\n config,\n translations,\n fontsManager,\n ref: cloudEditorRef,\n onReady: () => {\n clearTimeout(timeout);\n resolve();\n },\n });\n },\n });\n\n cloudAppInstance.mount(container);\n });\n\n await readyPromise;\n\n const instance: TemplaticalCloudEditor = {\n getContent() {\n if (cloudEditorRef.value) {\n return JSON.parse(JSON.stringify(cloudEditorRef.value.getContent()));\n }\n return JSON.parse(JSON.stringify(config.content));\n },\n setContent(content: TemplateContent) {\n if (cloudEditorRef.value) {\n cloudEditorRef.value.setContent(content);\n }\n },\n setTheme(theme: UiTheme) {\n if (cloudEditorRef.value) {\n cloudEditorRef.value.setTheme(theme);\n }\n },\n unmount: unmountCloud,\n create(content?: TemplateContent) {\n if (!cloudEditorRef.value) {\n return Promise.reject(\n new Error(\"[Templatical] Cloud editor not ready\"),\n );\n }\n return cloudEditorRef.value.create(content);\n },\n load(templateId: string) {\n if (!cloudEditorRef.value) {\n return Promise.reject(\n new Error(\"[Templatical] Cloud editor not ready\"),\n );\n }\n return cloudEditorRef.value.load(templateId);\n },\n save() {\n if (!cloudEditorRef.value) {\n return Promise.reject(\n new Error(\"[Templatical] Cloud editor not ready\"),\n );\n }\n return cloudEditorRef.value.save();\n },\n };\n\n // Try to detect @templatical/renderer for export methods\n attachRenderer(instance);\n\n return instance;\n}\n\n// ---------------------------------------------------------------------------\n// Unmount helpers\n// ---------------------------------------------------------------------------\n\nexport function unmount(): void {\n if (appInstance) {\n appInstance.unmount();\n appInstance = null;\n editorRef.value = null;\n }\n}\n\nfunction unmountCloud(): void {\n if (cloudAppInstance) {\n cloudAppInstance.unmount();\n cloudAppInstance = null;\n cloudEditorRef.value = null;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Renderer attachment (shared by OSS + Cloud)\n// ---------------------------------------------------------------------------\n\nfunction attachRenderer(instance: TemplaticalEditor): void {\n import(\"@templatical/renderer\")\n .then((renderer) => {\n instance.toMjml = () => renderer.renderToMjml(instance.getContent());\n })\n .catch(() => {\n // @templatical/renderer not installed — export methods not available\n });\n}\n\n// ---------------------------------------------------------------------------\n// Re-exports\n// ---------------------------------------------------------------------------\n\nexport type { TemplaticalCloudEditorConfig } from \"./cloud/CloudEditor.vue\";\nexport type {\n BlockDefaults,\n TemplateContent,\n TemplateDefaults,\n ThemeOverrides,\n UiTheme,\n MergeTagsConfig,\n DisplayConditionsConfig,\n CustomBlockDefinition,\n ViewportSize,\n CustomFont,\n FontsConfig,\n SaveResult,\n Template,\n} from \"@templatical/types\";\n\nexport type { UseFontsReturn, FontOption } from \"./composables/useFonts\";\nexport { useFonts } from \"./composables/useFonts\";\nexport type { EditorCapabilities } from \"./types/editor-capabilities\";\nexport {\n TRANSLATIONS_KEY,\n EDITOR_KEY,\n HISTORY_KEY,\n BLOCK_ACTIONS_KEY,\n CONDITION_PREVIEW_KEY,\n FONTS_MANAGER_KEY,\n THEME_STYLES_KEY,\n UI_THEME_KEY,\n BLOCK_DEFAULTS_KEY,\n BLOCK_REGISTRY_KEY,\n CUSTOM_BLOCK_DEFINITIONS_KEY,\n MERGE_TAGS_KEY,\n MERGE_TAG_SYNTAX_KEY,\n ON_REQUEST_MERGE_TAG_KEY,\n ON_REQUEST_MEDIA_KEY,\n DISPLAY_CONDITIONS_KEY,\n ALLOW_CUSTOM_CONDITIONS_KEY,\n CAPABILITIES_KEY,\n} from \"./keys\";\n"],"x_google_ignoreList":[1,2,3,4,5,6,7,8,9,10,11,12,13],"mappings":"+QCGA,IAAa,GAAS,EAAQ,EAAM,EAAG,EAAM,IAClC,EAAS,EAAM,EAAM,EAAS,EAAM,EAAM,EAExC,GAAS,EAAQ,EAAS,EAAG,EAAgB,IAAI,IACnD,KAAK,MAAM,EAAO,EAAO,CAAG,ECC9B,KAAO,KAAK,GAAK,GAE1B,IAAa,EAAa,GAAQ,EAAW,EAAU,EAAI,CAAC,CAC/C,EAAa,IAClB,EAAI,KAAO,MACX,EAAM,EAAI,UAAU,EAAE,EACtB,EAAI,OAAS,EACN,CACH,EAAG,SAAS,EAAI,GAAK,EAAI,GAAI,GAAG,CAChC,EAAG,SAAS,EAAI,GAAK,EAAI,GAAI,GAAG,CAChC,EAAG,SAAS,EAAI,GAAK,EAAI,GAAI,GAAG,CAChC,EAAG,EAAI,SAAW,EAAI,EAAM,SAAS,EAAI,GAAK,EAAI,GAAI,GAAG,CAAG,IAAK,EAAE,CAAG,EACzE,CAEE,CACH,EAAG,SAAS,EAAI,UAAU,EAAG,EAAE,CAAE,GAAG,CACpC,EAAG,SAAS,EAAI,UAAU,EAAG,EAAE,CAAE,GAAG,CACpC,EAAG,SAAS,EAAI,UAAU,EAAG,EAAE,CAAE,GAAG,CACpC,EAAG,EAAI,SAAW,EAAI,EAAM,SAAS,EAAI,UAAU,EAAG,EAAE,CAAE,GAAG,CAAG,IAAK,EAAE,CAAG,EAC7E,EA2BQ,EAAa,GAAS,EAAU,EAAW,EAAK,CAAC,CACjD,GAAc,CAAE,IAAG,IAAG,IAAG,OAAQ,CAC1C,IAAM,GAAO,IAAM,GAAK,EAAK,IAC7B,MAAO,CACH,EAAG,EAAM,EAAE,CACX,EAAG,EAAM,EAAK,GAAK,EAAK,IAAQ,EAAI,EAAK,KAAO,GAAM,IAAM,EAAK,IAAM,GAAO,IAAM,EAAE,CACtF,EAAG,EAAM,EAAK,EAAE,CAChB,EAAG,EAAM,EAAG,EAAE,CACjB,EAUQ,EAAmB,GAAS,CACrC,GAAM,CAAE,IAAG,IAAG,KAAM,EAAW,EAAK,CACpC,MAAO,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAMpB,GAAc,CAAE,IAAG,IAAG,IAAG,OAAQ,CAC1C,EAAK,EAAI,IAAO,EAChB,GAAQ,IACR,GAAQ,IACR,IAAM,EAAK,KAAK,MAAM,EAAE,CAAE,EAAI,GAAK,EAAI,GAAI,EAAI,GAAK,GAAK,EAAI,GAAM,GAAI,EAAI,GAAK,GAAK,EAAI,EAAI,GAAM,GAAI,EAAS,EAAK,EACrH,MAAO,CACH,EAAG,EAAM,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CAAC,GAAU,IAAI,CAC1C,EAAG,EAAM,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CAAC,GAAU,IAAI,CAC1C,EAAG,EAAM,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CAAC,GAAU,IAAI,CAC1C,EAAG,EAAM,EAAG,EAAE,CACjB,EAoCC,EAAU,GAAW,CACvB,IAAM,EAAM,EAAO,SAAS,GAAG,CAC/B,OAAO,EAAI,OAAS,EAAI,IAAM,EAAM,GAE3B,GAAa,CAAE,IAAG,IAAG,IAAG,OAAQ,CACzC,IAAM,EAAW,EAAI,EAAI,EAAO,EAAM,EAAI,IAAI,CAAC,CAAG,GAClD,MAAO,IAAM,EAAO,EAAE,CAAG,EAAO,EAAE,CAAG,EAAO,EAAE,CAAG,GAExC,GAAc,CAAE,IAAG,IAAG,IAAG,OAAQ,CAC1C,IAAM,EAAM,KAAK,IAAI,EAAG,EAAG,EAAE,CACvB,EAAQ,EAAM,KAAK,IAAI,EAAG,EAAG,EAAE,CAE/B,EAAK,EACL,IAAQ,GACH,EAAI,GAAK,EACV,IAAQ,EACJ,GAAK,EAAI,GAAK,EACd,GAAK,EAAI,GAAK,EACtB,EACN,MAAO,CACH,EAAG,EAAM,IAAM,EAAK,EAAI,EAAK,EAAI,GAAI,CACrC,EAAG,EAAM,EAAO,EAAQ,EAAO,IAAM,EAAE,CACvC,EAAG,EAAO,EAAM,IAAO,IAAI,CAC3B,IACH,ECrJQ,GAAqB,EAAO,IAAW,CAChD,GAAI,IAAU,EACV,MAAO,GACX,IAAK,IAAM,KAAQ,EAMf,GAAI,EAAM,KACN,EAAO,GACP,MAAO,GAEf,MAAO,IAKE,GAAY,EAAO,IACxB,EAAM,aAAa,GAAK,EAAO,aAAa,CACrC,GAEJ,EAAkB,EAAU,EAAM,CAAE,EAAU,EAAO,CAAC,CCvB3D,EAAQ,EAAE,CACH,EAAO,GAAS,CACzB,IAAI,EAAW,EAAM,GAMrB,OALK,IACD,EAAW,SAAS,cAAc,WAAW,CAC7C,EAAS,UAAY,EACrB,EAAM,GAAQ,GAEX,GAEE,GAAQ,EAAQ,EAAM,IAAW,CAC1C,EAAO,cAAc,IAAI,YAAY,EAAM,CACvC,QAAS,GACT,SACH,CAAC,CAAC,ECZH,EAAa,GAEX,EAAW,GAAM,YAAa,EAG9B,EAAW,GACT,GAAc,CAAC,EAAQ,EAAM,CACtB,IACX,AACI,IAAa,EAAQ,EAAM,CACxB,IAEL,GAAe,EAAQ,IAAU,CACnC,IAAM,EAAU,EAAQ,EAAM,CAAG,EAAM,QAAQ,GAAK,EAC9C,EAAO,EAAO,GAAG,uBAAuB,CAC9C,EAAK,EAAO,GAAI,OAAQ,EAAO,QAAQ,CACnC,EAAG,GAAO,EAAQ,OAAS,EAAK,KAAO,OAAO,cAAgB,EAAK,MAAM,CACzE,EAAG,GAAO,EAAQ,OAAS,EAAK,IAAM,OAAO,cAAgB,EAAK,OAAO,CAC5E,CAAC,CAAC,EAED,GAAW,EAAQ,IAAU,CAE/B,IAAM,EAAU,EAAM,QAElB,EAAU,IAAO,EAAO,IAAM,EAAU,IAAO,EAAU,KAG7D,EAAM,gBAAgB,CAEtB,EAAK,EAAO,GAAI,OAAQ,EAAO,QAAQ,CACnC,EAAG,IAAY,GACT,IACA,IAAY,GACR,KACA,IAAY,GACR,IACA,IAAY,GACR,KACA,IAAY,GACR,EACA,IAAY,GACR,GACA,EAC1B,EAAG,IAAY,GACT,IACA,IAAY,GACR,KACA,EACb,CAAE,GAAK,CAAC,GAEA,EAAb,KAAoB,CAChB,YAAY,EAAM,EAAM,EAAM,EAAI,CAC9B,IAAM,EAAW,EAAI,yCAAyC,EAAK,IAAI,EAAK,cAAc,EAAK,wBAAwB,CACvH,EAAK,YAAY,EAAS,QAAQ,UAAU,GAAK,CAAC,CAClD,IAAM,EAAK,EAAK,cAAc,SAAS,EAAK,GAAG,CAC/C,EAAG,iBAAiB,YAAa,KAAK,CACtC,EAAG,iBAAiB,aAAc,KAAK,CACvC,EAAG,iBAAiB,UAAW,KAAK,CACpC,KAAK,GAAK,EACV,KAAK,GAAK,EACV,KAAK,MAAQ,CAAC,EAAG,WAAY,EAAG,CAEpC,IAAI,SAAS,EAAO,CAChB,IAAM,EAAc,EAAQ,SAAS,iBAAmB,SAAS,oBACjE,EAAY,EAAa,YAAc,YAAa,KAAK,CACzD,EAAY,EAAa,WAAa,UAAW,KAAK,CAE1D,YAAY,EAAO,CACf,OAAQ,EAAM,KAAd,CACI,IAAK,YACL,IAAK,aAGD,GAFA,EAAM,gBAAgB,CAElB,CAAC,EAAQ,EAAM,EAAK,CAAC,GAAc,EAAM,QAAU,EACnD,OACJ,KAAK,GAAG,OAAO,CACf,EAAY,KAAM,EAAM,CACxB,KAAK,SAAW,GAChB,MACJ,IAAK,YACL,IAAK,YACD,EAAM,gBAAgB,CACtB,EAAY,KAAM,EAAM,CACxB,MACJ,IAAK,UACL,IAAK,WACD,KAAK,SAAW,GAChB,MACJ,IAAK,UACD,EAAQ,KAAM,EAAM,CACpB,OAGZ,MAAM,EAAQ,CACV,EAAO,SAAS,EAAO,IAAM,CACzB,IAAK,IAAM,KAAK,EACZ,KAAK,MAAM,GAAG,MAAM,YAAY,EAAG,EAAM,GAAG,EAElD,GCjGG,EAAb,cAAyB,CAAO,CAC5B,YAAY,EAAM,CACd,MAAM,EAAM,MAAO,yDAA0D,GAAM,CAEvF,OAAO,CAAE,KAAK,CACV,KAAK,EAAI,EACT,KAAK,MAAM,CACP,CACI,KAAM,GAAI,EAAI,IAAO,IAAI,GACzB,MAAO,EAAgB,CAAE,IAAG,EAAG,IAAK,EAAG,IAAK,EAAG,EAAG,CAAC,CACtD,CACJ,CAAC,CACF,KAAK,GAAG,aAAa,gBAAiB,GAAG,EAAM,EAAE,GAAG,CAExD,QAAQ,EAAQ,EAAK,CAEjB,MAAO,CAAE,EAAG,EAAM,EAAM,KAAK,EAAI,EAAO,EAAI,IAAK,EAAG,IAAI,CAAG,IAAM,EAAO,EAAG,GChBtE,EAAb,cAAgC,CAAO,CACnC,YAAY,EAAM,CACd,MAAM,EAAM,aAAc,qBAAsB,GAAK,CAEzD,OAAO,EAAM,CACT,KAAK,KAAO,EACZ,KAAK,MAAM,CACP,CACI,IAAK,GAAG,IAAM,EAAK,EAAE,GACrB,KAAM,GAAG,EAAK,EAAE,GAChB,MAAO,EAAgB,EAAK,CAC/B,CACD,CACI,mBAAoB,EAAgB,CAAE,EAAG,EAAK,EAAG,EAAG,IAAK,EAAG,IAAK,EAAG,EAAG,CAAC,CAC3E,CACJ,CAAC,CACF,KAAK,GAAG,aAAa,iBAAkB,cAAc,EAAM,EAAK,EAAE,CAAC,gBAAgB,EAAM,EAAK,EAAE,CAAC,GAAG,CAExG,QAAQ,EAAQ,EAAK,CAEjB,MAAO,CACH,EAAG,EAAM,EAAM,KAAK,KAAK,EAAI,EAAO,EAAI,IAAK,EAAG,IAAI,CAAG,EAAO,EAAI,IAClE,EAAG,EAAM,EAAM,KAAK,KAAK,EAAI,EAAO,EAAI,IAAK,EAAG,IAAI,CAAG,KAAK,MAAM,IAAM,EAAO,EAAI,IAAI,CAC1F,GC1BT,EAAe,8wBCAf,EAAe,kKCAf,EAAe,8SCOT,EAAU,OAAO,OAAO,CACxB,EAAS,OAAO,QAAQ,CACxB,EAAQ,OAAO,OAAO,CACtB,EAAU,OAAO,SAAS,CAC1B,EAAS,OAAO,QAAQ,CACjB,EAAO,OAAO,MAAM,CACpB,EAAW,OAAO,UAAU,CAC5B,EAAb,cAAiC,WAAY,CACzC,WAAW,oBAAqB,CAC5B,MAAO,CAAC,QAAQ,CAEpB,IAAK,IAAQ,CACT,MAAO,CAACA,EAAKC,EAAQC,EAAc,CAEvC,IAAK,IAAY,CACb,MAAO,CAAC,EAAY,EAAI,CAE5B,IAAI,OAAQ,CACR,OAAO,KAAK,GAEhB,IAAI,MAAM,EAAU,CAChB,GAAI,CAAC,KAAK,GAAS,EAAS,CAAE,CAC1B,IAAM,EAAU,KAAK,WAAW,OAAO,EAAS,CAChD,KAAK,GAAS,EAAQ,CACtB,KAAK,GAAU,GAGvB,aAAc,CACV,OAAO,CACP,IAAM,EAAW,EAAI,UAAU,KAAK,GAAM,KAAK,GAAG,CAAC,UAAU,CACvD,EAAO,KAAK,aAAa,CAAE,KAAM,OAAQ,CAAC,CAChD,EAAK,YAAY,EAAS,QAAQ,UAAU,GAAK,CAAC,CAClD,EAAK,iBAAiB,OAAQ,KAAK,CACnC,KAAK,GAAU,KAAK,GAAU,IAAK,GAAW,IAAI,EAAO,EAAK,CAAC,CAEnE,mBAAoB,CAIhB,GAAI,KAAK,eAAe,QAAQ,CAAE,CAC9B,IAAM,EAAQ,KAAK,MACnB,OAAO,KAAK,MACZ,KAAK,MAAQ,OAGb,KAAK,QAAQ,KAAK,WAAW,aAGrC,yBAAyB,EAAO,EAAS,EAAQ,CAC7C,IAAM,EAAQ,KAAK,WAAW,SAAS,EAAO,CACzC,KAAK,GAAS,EAAM,GACrB,KAAK,MAAQ,GAGrB,YAAY,EAAO,CAEf,IAAM,EAAU,KAAK,GACf,EAAU,CAAE,GAAG,EAAS,GAAG,EAAM,OAAQ,CAC/C,KAAK,GAAS,EAAQ,CACtB,IAAI,EACA,CAAC,EAAkB,EAAS,EAAQ,EACpC,CAAC,KAAK,GAAU,EAAW,KAAK,WAAW,SAAS,EAAQ,CAAE,GAC9D,KAAK,GAAU,EACf,EAAK,KAAM,gBAAiB,CAAE,MAAO,EAAU,CAAC,EAGxD,CAAC,GAAS,EAAO,CACb,OAAO,KAAK,OAAS,KAAK,WAAW,MAAM,EAAO,KAAK,MAAM,CAEjE,CAAC,GAAS,EAAM,CACZ,KAAK,GAAS,EACd,KAAK,GAAQ,QAAS,GAAS,EAAK,OAAO,EAAK,CAAC,GC3EnD,EAAa,CACf,aAAc,OACd,OAAQ,EACR,UAAW,CAAE,IAAG,IAAG,OAAQ,EAAU,CAAE,IAAG,IAAG,IAAG,EAAG,EAAG,CAAC,CACvD,MAAO,EACP,SAAW,GAAU,EACxB,CACY,EAAb,cAA6B,CAAY,CACrC,IAAI,YAAa,CACb,OAAO,ICMf,eAAe,OAAO,mBAFtB,cAAoC,CAAQ,GAEa,CCuDE,EAAI,KAAK,CA2ExD,EAAI,KAAK"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { n as e } from "./_plugin-vue_export-helper-B1-bu7yR.js";
|
|
2
|
+
var t = e("circle-alert", [
|
|
3
|
+
["circle", {
|
|
4
|
+
cx: "12",
|
|
5
|
+
cy: "12",
|
|
6
|
+
r: "10",
|
|
7
|
+
key: "1mglay"
|
|
8
|
+
}],
|
|
9
|
+
["line", {
|
|
10
|
+
x1: "12",
|
|
11
|
+
x2: "12",
|
|
12
|
+
y1: "8",
|
|
13
|
+
y2: "12",
|
|
14
|
+
key: "1pkeuh"
|
|
15
|
+
}],
|
|
16
|
+
["line", {
|
|
17
|
+
x1: "12",
|
|
18
|
+
x2: "12.01",
|
|
19
|
+
y1: "16",
|
|
20
|
+
y2: "16",
|
|
21
|
+
key: "4dfq90"
|
|
22
|
+
}]
|
|
23
|
+
]);
|
|
24
|
+
//#endregion
|
|
25
|
+
export { t };
|