@aswin.dev/editor 0.6.3 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/README.md +3 -3
  2. package/dist/AccessibilityPanel-COL6Wm7p.js +108 -0
  3. package/dist/AiChatSidebar-DWGPVtvC.js +229 -0
  4. package/dist/AiFeatureMenu-duUFSfDf.js +63 -0
  5. package/dist/BlockA11yBadge-Qs6HtXid.js +34 -0
  6. package/dist/CloudEditor-CFldoCOb.js +1207 -0
  7. package/dist/CollaboratorBar-Bw-lbt61.js +95 -0
  8. package/dist/CommentsSidebar-BaD5F53-.js +436 -0
  9. package/dist/CountdownBlock-DaYGxKqo.js +92 -0
  10. package/dist/CountdownToolbar-Dg4F8MTk.js +210 -0
  11. package/dist/DesignReferenceSidebar-BSH7uNP_.js +276 -0
  12. package/dist/LoadingTrack-Ba2pfF57.js +10 -0
  13. package/dist/ModuleBrowserModal-6phxZSKI.js +206 -0
  14. package/dist/ModulePreviewCanvas-BW8L3eQX.js +108 -0
  15. package/dist/NumberWithSuffix-BpUzQOJt.js +422 -0
  16. package/dist/ParagraphEditor-DNSzAB-I.js +695 -0
  17. package/dist/RichTextEditorContent-CrqPQdnk.js +137 -0
  18. package/dist/SaveModuleDialog-zMQTpez7.js +123 -0
  19. package/dist/SnapshotHistory-Do-A5rYU.js +122 -0
  20. package/dist/TemplateScoringPanel-CS7o62zS.js +256 -0
  21. package/dist/TestEmailModal-DGj_9V1u.js +94 -0
  22. package/dist/TitleEditor-C7IDnAoS.js +172 -0
  23. package/dist/TplModal-BAsVzcTb.js +44 -0
  24. package/dist/_plugin-vue_export-helper-BVAJ4lgT.js +8 -0
  25. package/dist/accessibility-BU09xZrQ.js +27 -0
  26. package/dist/blockTypeIcons-C6LDKvmd.js +140 -0
  27. package/dist/bundle-stats.json +10 -0
  28. package/dist/check-DJrpDKO_.js +7 -0
  29. package/dist/chevron-down-C5oBUhT8.js +7 -0
  30. package/dist/chevron-right-BqCptpdp.js +10 -0
  31. package/dist/circle-alert-ZQQc98HC.js +25 -0
  32. package/dist/clock-ik2pRJKG.js +12 -0
  33. package/dist/cloud-6ZmAvF0j.js +1791 -0
  34. package/dist/createLucideIcon-ClREiSx3.js +43 -0
  35. package/dist/de-DWcgp-7T.js +729 -0
  36. package/dist/de-GOtR9DwW.js +207 -0
  37. package/dist/dist-BUzw1buG.js +35 -0
  38. package/dist/dist-BZyY-SS4.js +74 -0
  39. package/dist/dist-BadNx4qo.js +5 -0
  40. package/dist/dist-BesOh2mk.js +35 -0
  41. package/dist/dist-Bz3M4RXG.js +2082 -0
  42. package/dist/dist-C04s_fLA.js +563 -0
  43. package/dist/dist-C3T2AKtB.js +776 -0
  44. package/dist/dist-C9ckKEZL.js +519 -0
  45. package/dist/dist-CBItRG-Z.js +47 -0
  46. package/dist/dist-COSzWQUs.js +5 -0
  47. package/dist/dist-CivF9P8b.js +382 -0
  48. package/dist/dist-DXa1uAMh.js +10658 -0
  49. package/dist/dist-DtiDUrX-.js +189 -0
  50. package/dist/dist-Dzt5foyL.js +61 -0
  51. package/dist/emojiData-DrBuvEoP.js +17 -0
  52. package/dist/en-Cxd4fhNm.js +729 -0
  53. package/dist/en-dFFQVzNn.js +207 -0
  54. package/dist/extensions-D__hOlV1.js +799 -0
  55. package/dist/formatRelativeTime-BhhO8yCl.js +12 -0
  56. package/dist/image-up-DT7gcJLN.js +23 -0
  57. package/dist/index.d.ts +352 -0
  58. package/dist/info-BSPGcsSM.js +19 -0
  59. package/dist/keys-CvX8D-8C.js +10 -0
  60. package/dist/liquid.browser-BvCyLQII.js +3277 -0
  61. package/dist/loader-circle-Balo8p3d.js +7 -0
  62. package/dist/message-circle-B39qAHxs.js +7 -0
  63. package/dist/pencil-BZJPNYWR.js +10 -0
  64. package/dist/readableTextColor-DVuzNX1y.js +30 -0
  65. package/dist/refresh-cw-DwDqGUM0.js +29 -0
  66. package/dist/rolldown-runtime-BZGGJVDF.js +20 -0
  67. package/dist/scan-line-CzfFJO1o.js +25 -0
  68. package/dist/send-D2eSo4GH.js +10 -0
  69. package/dist/shield-check-jkpgcC0-.js +10 -0
  70. package/dist/sparkles-Chm5CZfb.js +23 -0
  71. package/dist/style.css +2 -0
  72. package/dist/styleConstants-34eUKPOZ.js +55 -0
  73. package/dist/styles-B4tjX5SP.js +5224 -0
  74. package/dist/templatical-editor.js +312 -0
  75. package/dist/text-align-start-CzBnJsW8.js +43 -0
  76. package/dist/timeouts-BSGxjuUF.js +4 -0
  77. package/dist/trash-2-CtK2apEH.js +25 -0
  78. package/dist/triangle-alert-KpDVNbpn.js +17 -0
  79. package/dist/useCloudI18n-DOKSZql1.js +23 -0
  80. package/dist/useEditorCore-wslttMH-.js +9517 -0
  81. package/dist/useI18n-C2xQZ6K9.js +17 -0
  82. package/dist/useMergeTag-DX0XG5V9.js +34 -0
  83. package/dist/vue.runtime.esm-bundler-CjauPXjj.js +5775 -0
  84. package/dist/x-BkaOMosX.js +10 -0
  85. package/package.json +10 -10
@@ -0,0 +1,12 @@
1
+ //#region src/utils/formatRelativeTime.ts
2
+ var e = 6e4, t = 36e5, n = 864e5;
3
+ function r(r, i, a, o) {
4
+ let s = new Date(r).getTime();
5
+ if (Number.isNaN(s)) return null;
6
+ let c = Date.now() - s;
7
+ if (c < -e) return null;
8
+ let l = Math.floor(c / e), u = Math.floor(c / t), d = Math.floor(c / n);
9
+ return l < 1 ? i.justNow : l < 60 ? a ? a(i.minutesAgo, { minutes: l }) : i.minutesAgo.replace("{minutes}", String(l)) : u < 24 ? a ? a(i.hoursAgo, { hours: u }) : i.hoursAgo.replace("{hours}", String(u)) : o !== void 0 && d >= o ? null : a ? a(i.daysAgo, { days: d }) : i.daysAgo.replace("{days}", String(d));
10
+ }
11
+ //#endregion
12
+ export { r as t };
@@ -0,0 +1,23 @@
1
+ import { t as e } from "./createLucideIcon-ClREiSx3.js";
2
+ var t = e("image-up", [
3
+ ["path", {
4
+ d: "M10.3 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2v10l-3.1-3.1a2 2 0 0 0-2.814.014L6 21",
5
+ key: "9csbqa"
6
+ }],
7
+ ["path", {
8
+ d: "m14 19.5 3-3 3 3",
9
+ key: "9vmjn0"
10
+ }],
11
+ ["path", {
12
+ d: "M17 22v-5.5",
13
+ key: "1aa6fl"
14
+ }],
15
+ ["circle", {
16
+ cx: "9",
17
+ cy: "9",
18
+ r: "2",
19
+ key: "af1f0g"
20
+ }]
21
+ ]);
22
+ //#endregion
23
+ export { t };
@@ -0,0 +1,352 @@
1
+ import { A11yOptions } from '../../quality/src/index.ts';
2
+ import { A11yOptions as A11yOptions_2 } from '../../../quality/src/index.ts';
3
+ import { AiConfig } from '../../../types/src/index.ts';
4
+ import { BlockDefaults } from '../../types/src/index.ts';
5
+ import { BlockDefaults as BlockDefaults_2 } from '../../../types/src/index.ts';
6
+ import { CollaborationConfig } from '../../../types/src/index.ts';
7
+ import { CommentEvent } from '../../../types/src/index.ts';
8
+ import { ComputedRef } from 'vue';
9
+ import { CustomBlock } from '../../types/src/index.ts';
10
+ import { CustomBlockDefinition } from '../../types/src/index.ts';
11
+ import { CustomBlockDefinition as CustomBlockDefinition_2 } from '../../../types/src/index.ts';
12
+ import { CustomFont } from '../../types/src/index.ts';
13
+ import { CustomFont as CustomFont_2 } from '../../../types/src/index.ts';
14
+ import { DisplayConditionsConfig } from '../../types/src/index.ts';
15
+ import { DisplayConditionsConfig as DisplayConditionsConfig_2 } from '../../../types/src/index.ts';
16
+ import { FontsConfig } from '../../types/src/index.ts';
17
+ import { FontsConfig as FontsConfig_2 } from '../../../types/src/index.ts';
18
+ import { McpConfig } from '../../../types/src/index.ts';
19
+ import { MediaItem } from '../../../media-library/src/index.ts';
20
+ import { MediaRequestContext } from '../../media-library/src/index.ts';
21
+ import { MediaRequestContext as MediaRequestContext_2 } from '../../../media-library/src/index.ts';
22
+ import { MediaResult } from '../../types/src/index.ts';
23
+ import { MergeTagsConfig } from '../../types/src/index.ts';
24
+ import { MergeTagsConfig as MergeTagsConfig_2 } from '../../../types/src/index.ts';
25
+ import { Ref } from 'vue';
26
+ import { SaveResult } from '../../types/src/index.ts';
27
+ import { SaveResult as SaveResult_2 } from '../../../types/src/index.ts';
28
+ import { Template } from '../../types/src/index.ts';
29
+ import { Template as Template_2 } from '../../../types/src/index.ts';
30
+ import { TemplateContent } from '../../types/src/index.ts';
31
+ import { TemplateContent as TemplateContent_2 } from '../../../types/src/index.ts';
32
+ import { TemplateDefaults } from '../../types/src/index.ts';
33
+ import { TemplateDefaults as TemplateDefaults_2 } from '../../../types/src/index.ts';
34
+ import { ThemeOverrides } from '../../types/src/index.ts';
35
+ import { ThemeOverrides as ThemeOverrides_2 } from '../../../types/src/index.ts';
36
+ import { UiTheme } from '../../types/src/index.ts';
37
+ import { UiTheme as UiTheme_2 } from '../../../types/src/index.ts';
38
+ import { ViewportSize } from '../../types/src/index.ts';
39
+
40
+ export { BlockDefaults }
41
+
42
+ export { CustomBlockDefinition }
43
+
44
+ export { CustomFont }
45
+
46
+ export declare const DEFAULT_EDITOR_TOUR_STORAGE_KEY = "templatical-editor-tour-dismissed";
47
+
48
+ export { DisplayConditionsConfig }
49
+
50
+ export declare interface EditorCapabilities {
51
+ plan?: {
52
+ hasFeature(feature: string): boolean;
53
+ };
54
+ ai?: {
55
+ isFeatureEnabled(feature: string): boolean;
56
+ };
57
+ comments?: {
58
+ getBlockCount(blockId: string): number;
59
+ openForBlock(blockId: string): void;
60
+ };
61
+ savedModules?: {
62
+ openSaveDialog(blockId: string): void;
63
+ openBrowser(): void;
64
+ moduleCount: ComputedRef<number>;
65
+ };
66
+ }
67
+
68
+ export declare interface EditorTourConfig {
69
+ /**
70
+ * Steps to show in order. Omit to use built-in defaults (canvas, block rail, right sidebar).
71
+ */
72
+ steps?: EditorTourStep[];
73
+ /** Start automatically after mount when the tour has not been dismissed. Default `false`. */
74
+ autoStart?: boolean;
75
+ /**
76
+ * `localStorage` key for dismissal persistence.
77
+ * Set to `false` to disable persistence (tour can restart every load).
78
+ * Default key is `DEFAULT_EDITOR_TOUR_STORAGE_KEY` when omitted.
79
+ */
80
+ storageKey?: string | false;
81
+ }
82
+
83
+ export declare interface EditorTourStartOptions {
84
+ /** Zero-based index into the active (filtered) step list */
85
+ stepIndex?: number;
86
+ }
87
+
88
+ export declare interface EditorTourStep {
89
+ /** Any valid `document.querySelector` selector (editor internals or host DOM). */
90
+ target: string;
91
+ title: string;
92
+ text: string;
93
+ placement?: EditorTourStepPlacement;
94
+ /**
95
+ * When the target is absent, skip this step. Default `true`.
96
+ * Set `false` to keep the step even if the node is missing (rect will be null — avoided).
97
+ */
98
+ skipIfMissing?: boolean;
99
+ }
100
+
101
+ /**
102
+ * Guided tour types for Templatical Editor `init()` / `initCloud()`.
103
+ */
104
+ /** Reserved tooltip placement hints for layout inside the viewport. */
105
+ export declare type EditorTourStepPlacement = "canvas" | "sidebar" | "rightSidebar" | "below";
106
+
107
+ /** Email vs popup builder chrome (sidebar layout). */
108
+ export declare type EditorType = "email" | "popup";
109
+
110
+ export declare interface FontOption {
111
+ value: string;
112
+ label: string;
113
+ isCustom?: boolean;
114
+ }
115
+
116
+ export { FontsConfig }
117
+
118
+ export declare function init(config: TemplaticalEditorConfig): Promise<TemplaticalEditor>;
119
+
120
+ export declare function initCloud(config: TemplaticalCloudEditorConfig): Promise<TemplaticalCloudEditor>;
121
+
122
+ export { MergeTagsConfig }
123
+
124
+ /** Function type for media browser requests, used by both OSS and Cloud editors. */
125
+ export declare type OnRequestMedia = (context?: MediaRequestContext) => Promise<MediaResult | null>;
126
+
127
+ export { SaveResult }
128
+
129
+ export { Template }
130
+
131
+ export { TemplateContent }
132
+
133
+ export { TemplateDefaults }
134
+
135
+ /**
136
+ * Cloud editor does not expose `toMjml` or `renderCustomBlock`: the cloud
137
+ * backend performs MJML conversion server-side with additional processing
138
+ * (e.g., signed image URLs, attachment handling) that isn't available client
139
+ * side. Use the cloud `save()` flow to persist content; the backend handles
140
+ * MJML/HTML export from there.
141
+ */
142
+ export declare interface TemplaticalCloudEditor extends TemplaticalEditorBase {
143
+ create(content?: TemplateContent): Promise<Template>;
144
+ load(templateId: string): Promise<Template>;
145
+ save(): Promise<SaveResult>;
146
+ }
147
+
148
+ export declare interface TemplaticalCloudEditorConfig {
149
+ container: string | HTMLElement;
150
+ content?: TemplateContent_2;
151
+ auth: {
152
+ url: string;
153
+ baseUrl?: string;
154
+ requestOptions?: {
155
+ method?: "GET" | "POST";
156
+ headers?: Record<string, string>;
157
+ body?: Record<string, unknown>;
158
+ credentials?: RequestCredentials;
159
+ };
160
+ };
161
+ theme?: ThemeOverrides_2;
162
+ uiTheme?: UiTheme_2;
163
+ locale?: string;
164
+ /**
165
+ * Show the "Powered by Templatical" footer. Defaults to `true`.
166
+ * Set to `false` to hide the footer (no attribution required by the license).
167
+ * Cloud white-label plans hide the footer regardless of this setting.
168
+ */
169
+ branding?: boolean;
170
+ /**
171
+ * Multi-step canvas for popup-style flows. See {@link TemplaticalEditorConfig.multiPageCanvas}.
172
+ */
173
+ multiPageCanvas?: boolean;
174
+ /**
175
+ * Same semantics as {@link TemplaticalEditorConfig.editorType} (popup adds icon rail).
176
+ */
177
+ editorType?: EditorType | string;
178
+ ai?: AiConfig | false;
179
+ commenting?: boolean;
180
+ collaboration?: CollaborationConfig;
181
+ mcp?: McpConfig;
182
+ blockDefaults?: BlockDefaults_2;
183
+ templateDefaults?: TemplateDefaults_2;
184
+ modules?: boolean;
185
+ autoSave?: boolean;
186
+ autoSaveDebounce?: number;
187
+ mergeTags?: MergeTagsConfig_2;
188
+ displayConditions?: DisplayConditionsConfig_2;
189
+ customBlocks?: CustomBlockDefinition_2[];
190
+ fonts?: FontsConfig_2;
191
+ onChange?: (content: TemplateContent_2) => void;
192
+ onSave?: (result: SaveResult_2) => void;
193
+ onCreate?: (template: Template_2) => void;
194
+ onLoad?: (template: Template_2) => void;
195
+ onError?: (error: Error) => void;
196
+ onComment?: (event: CommentEvent) => void;
197
+ onUnmount?: () => void;
198
+ onRequestMedia?: (context: MediaRequestContext_2) => Promise<MediaItem | null>;
199
+ onBeforeTestEmail?: (html: string) => string | Promise<string>;
200
+ /**
201
+ * Accessibility linter (`@aswin.dev/quality`) configuration. Cloud
202
+ * additionally merges `planConfig.accessibility` from the server (server
203
+ * policy wins on conflict) — this option sets the consumer-supplied baseline.
204
+ */
205
+ accessibility?: A11yOptions_2;
206
+ /** Optional guided tour (same shape as the OSS editor `tour` option). */
207
+ tour?: EditorTourConfig;
208
+ }
209
+
210
+ export declare interface TemplaticalEditor extends TemplaticalEditorBase {
211
+ /**
212
+ * Render the current template to an MJML string. Resolves custom blocks
213
+ * via the editor's internal block registry. Throws if the optional
214
+ * `@aswin.dev/renderer` package is not installed.
215
+ */
216
+ toMjml(): Promise<string>;
217
+ /**
218
+ * Render a single custom block to its HTML representation, using the
219
+ * registered custom block definition's template and the block's current
220
+ * field values. Exposed for headless callers that want to reuse the
221
+ * editor's renderer (e.g., to drive `@aswin.dev/renderer`'s
222
+ * `renderCustomBlock` option from outside the editor instance).
223
+ */
224
+ renderCustomBlock(block: CustomBlock): Promise<string>;
225
+ }
226
+
227
+ declare interface TemplaticalEditorBase {
228
+ getContent(): TemplateContent;
229
+ setContent(content: TemplateContent): void;
230
+ setTheme(theme: UiTheme): void;
231
+ unmount(): void;
232
+ /** Requires `tour` in editor config; otherwise no-ops. */
233
+ startTour(options?: EditorTourStartOptions): void;
234
+ dismissTour(): void;
235
+ resetTourDismissed(): void;
236
+ /** `true` when no tour is configured or the user dismissed a persisted tour. */
237
+ isTourDismissed(): boolean;
238
+ }
239
+
240
+ export declare interface TemplaticalEditorConfig {
241
+ container: string | HTMLElement;
242
+ content?: TemplateContent;
243
+ onChange?: (content: TemplateContent) => void;
244
+ onSave?: (content: TemplateContent) => void;
245
+ onError?: (error: Error) => void;
246
+ onRequestMedia?: OnRequestMedia;
247
+ mergeTags?: MergeTagsConfig;
248
+ displayConditions?: DisplayConditionsConfig;
249
+ customBlocks?: CustomBlockDefinition[];
250
+ fonts?: FontsConfig;
251
+ blockDefaults?: BlockDefaults;
252
+ templateDefaults?: TemplateDefaults;
253
+ theme?: ThemeOverrides;
254
+ uiTheme?: UiTheme;
255
+ locale?: string;
256
+ /**
257
+ * Show the "Powered by Templatical" footer. Defaults to `true`.
258
+ * Set to `false` to hide the footer (no attribution required by the license).
259
+ */
260
+ branding?: boolean;
261
+ /**
262
+ * Multi-step canvas (popup flows): step strip above the canvas; content exposes
263
+ * {@link TemplateContent.canvasPages} and {@link TemplateContent.activeCanvasPageId}.
264
+ */
265
+ multiPageCanvas?: boolean;
266
+ /**
267
+ * `'email'` (default): single hover-expand block rail. `'popup'`: adds a left icon rail
268
+ * (Design, Blocks, Tab, …) beside the same block palette when Blocks is selected.
269
+ * The value is provided through `EDITOR_TYPE_KEY`. Case-insensitive strings such as
270
+ * `'POPUP'` are accepted.
271
+ */
272
+ editorType?: EditorType | string;
273
+ /**
274
+ * Accessibility linter (`@aswin.dev/quality`) configuration.
275
+ *
276
+ * - When unset, the linter loads on demand once the user opens the panel.
277
+ * - When `disabled: true`, the optional peer is never imported (saves the
278
+ * chunk download) and the sidebar tab + inline badges are suppressed.
279
+ * - `rules`/`thresholds` follow the shape exported by `@aswin.dev/quality`.
280
+ */
281
+ accessibility?: A11yOptions;
282
+ /**
283
+ * Optional spotlight tour (inside or outside the editor DOM via selectors).
284
+ * Use `startTour` / `isTourDismissed` on the instance; default copy lives under locale `tour.defaults`.
285
+ */
286
+ tour?: EditorTourConfig;
287
+ }
288
+
289
+ export { ThemeOverrides }
290
+
291
+ export { UiTheme }
292
+
293
+ export declare function unmount(): void;
294
+
295
+ export declare function useFonts(config?: FontsConfig_2): UseFontsReturn;
296
+
297
+ export declare interface UseFontsReturn {
298
+ fonts: ComputedRef<FontOption[]>;
299
+ defaultFont: ComputedRef<string>;
300
+ defaultFallback: ComputedRef<string>;
301
+ customFonts: Ref<CustomFont_2[]>;
302
+ customFontsEnabled: Ref<boolean>;
303
+ isLoaded: Ref<boolean>;
304
+ setCustomFontsEnabled: (enabled: boolean) => void;
305
+ loadCustomFonts: () => Promise<void>;
306
+ cleanupFontLinks: () => void;
307
+ getFontWithFallback: (fontName: string) => string;
308
+ getDefaultFont: () => string;
309
+ }
310
+
311
+ export { ViewportSize }
312
+
313
+ export { }
314
+
315
+
316
+ declare module "@tiptap/core" {
317
+ interface Commands<ReturnType> {
318
+ letterSpacing: {
319
+ setLetterSpacing: (spacing: string) => ReturnType;
320
+ unsetLetterSpacing: () => ReturnType;
321
+ };
322
+ }
323
+ }
324
+
325
+
326
+ declare module "@tiptap/core" {
327
+ interface Commands<ReturnType> {
328
+ fontSize: {
329
+ setFontSize: (size: string) => ReturnType;
330
+ unsetFontSize: () => ReturnType;
331
+ };
332
+ }
333
+ }
334
+
335
+
336
+ declare module "@tiptap/core" {
337
+ interface Commands<ReturnType> {
338
+ mergeTagNode: {
339
+ insertMergeTag: (attrs: MergeTag) => ReturnType;
340
+ };
341
+ }
342
+ }
343
+
344
+
345
+ declare module "@tiptap/core" {
346
+ interface Commands<ReturnType> {
347
+ lineHeight: {
348
+ setLineHeight: (lineHeight: string) => ReturnType;
349
+ unsetLineHeight: () => ReturnType;
350
+ };
351
+ }
352
+ }
@@ -0,0 +1,19 @@
1
+ import { t as e } from "./createLucideIcon-ClREiSx3.js";
2
+ var t = e("info", [
3
+ ["circle", {
4
+ cx: "12",
5
+ cy: "12",
6
+ r: "10",
7
+ key: "1mglay"
8
+ }],
9
+ ["path", {
10
+ d: "M12 16v-4",
11
+ key: "1dtifu"
12
+ }],
13
+ ["path", {
14
+ d: "M12 8h.01",
15
+ key: "e9boi3"
16
+ }]
17
+ ]);
18
+ //#endregion
19
+ export { t };
@@ -0,0 +1,10 @@
1
+ import { D as e } from "./vue.runtime.esm-bundler-CjauPXjj.js";
2
+ //#region src/keys.ts
3
+ var t = Symbol("translations"), n = Symbol("editor"), r = Symbol("editorType"), i = Symbol("popupRailTab"), a = Symbol("history"), o = Symbol("blockActions"), s = Symbol("conditionPreview"), c = Symbol("fontsManager"), l = Symbol("themeStyles"), u = Symbol("tplUiTheme"), d = Symbol("blockDefaults"), f = Symbol("blockRegistry"), p = Symbol("customBlockDefinitions"), m = Symbol("mergeTags"), h = Symbol("mergeTagSyntax"), g = Symbol("onRequestMergeTag"), _ = Symbol("mergeTagAutocomplete"), v = Symbol("onRequestMedia"), y = Symbol("displayConditions"), b = Symbol("allowCustomConditions"), x = Symbol("capabilities"), S = Symbol("keyboardReorder"), C = Symbol("accessibilityLint"), w = Symbol("authManager"), T = Symbol("aiConfig"), E = Symbol("comments"), D = Symbol("savedModulesHeadless"), O = Symbol("scoring"), k = Symbol("cloudTranslations");
4
+ function A(t, n) {
5
+ let r = e(t, null);
6
+ if (r == null) throw Error(`${n} requires a provider for ${t.description ?? "unknown key"}. Ensure it is a descendant of Editor or CloudEditor.`);
7
+ return r;
8
+ }
9
+ //#endregion
10
+ export { A, g as C, l as D, O as E, t as O, v as S, D as T, a as _, o as a, _ as b, x as c, s as d, p as f, c as g, r as h, w as i, u as k, k as l, n as m, T as n, d as o, y as p, b as r, f as s, C as t, E as u, S as v, i as w, h as x, m as y };