@maildeno/editor 0.1.3 → 0.4.2
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/CHANGELOG.md +258 -0
- package/README.md +397 -381
- package/dist/RowPreviewChildren-DT0y0lKC.js +4 -0
- package/dist/RowPreviewChildren-OsbF7_vu.js +4 -0
- package/dist/RowPreviewLegacyComponent-BV4b5bHQ.js +487 -0
- package/dist/RowPreviewLegacyComponent-C08MGJVT.js +487 -0
- package/dist/RowPreviewRow-ByxeBYV8.js +112 -0
- package/dist/RowPreviewRow-N-hh5l_H.js +112 -0
- package/dist/adapters/errors.d.ts +59 -0
- package/dist/adapters/index.d.ts +31 -0
- package/dist/adapters/types.d.ts +68 -0
- package/dist/brand.d.ts +15 -0
- package/dist/components/DesktopOnlyNotice.vue.d.ts +20 -0
- package/dist/components/features/emailBuilder/EmailEditor.vue.d.ts +182 -0
- package/dist/components/features/emailBuilder/assistant/AssistantPanel.vue.d.ts +37 -0
- package/dist/components/features/emailBuilder/blocks/AnchorBlock.vue.d.ts +3 -0
- package/dist/components/features/emailBuilder/blocks/ButtonBlock.vue.d.ts +3 -0
- package/dist/components/features/emailBuilder/blocks/DividerBlock.vue.d.ts +3 -0
- package/dist/components/features/emailBuilder/blocks/HeadingBlock.vue.d.ts +3 -0
- package/dist/components/features/emailBuilder/blocks/ImageBlock.vue.d.ts +3 -0
- package/dist/components/features/emailBuilder/blocks/ListBlock.vue.d.ts +3 -0
- package/dist/components/features/emailBuilder/blocks/MenuBlock.vue.d.ts +3 -0
- package/dist/components/features/emailBuilder/blocks/ParagraphBlock.vue.d.ts +3 -0
- package/dist/components/features/emailBuilder/blocks/SocialsBlock.vue.d.ts +3 -0
- package/dist/components/features/emailBuilder/blocks/SpacerBlock.vue.d.ts +3 -0
- package/dist/components/features/emailBuilder/blocks/VideoBlock.vue.d.ts +3 -0
- package/dist/components/features/emailBuilder/canvas/Canvas.vue.d.ts +3 -0
- package/dist/components/features/emailBuilder/canvas/CanvasColumn.vue.d.ts +49 -0
- package/dist/components/features/emailBuilder/canvas/CanvasComponent.vue.d.ts +56 -0
- package/dist/components/features/emailBuilder/canvas/CanvasElement.vue.d.ts +21 -0
- package/dist/components/features/emailBuilder/canvas/CanvasRow.vue.d.ts +49 -0
- package/dist/components/features/emailBuilder/canvas/CanvasRowSpacer.vue.d.ts +40 -0
- package/dist/components/features/emailBuilder/health/HealthIndicator.vue.d.ts +3 -0
- package/dist/components/features/emailBuilder/layout/Header.vue.d.ts +54 -0
- package/dist/components/features/emailBuilder/layout/SendEmail.vue.d.ts +21 -0
- package/dist/components/features/emailBuilder/layout/SidebarLeft.vue.d.ts +3 -0
- package/dist/components/features/emailBuilder/layout/SidebarRight.vue.d.ts +3 -0
- package/dist/components/features/emailBuilder/panels/AnchorPanel.vue.d.ts +3 -0
- package/dist/components/features/emailBuilder/panels/ButtonPanel.vue.d.ts +3 -0
- package/dist/components/features/emailBuilder/panels/DividerPanel.vue.d.ts +3 -0
- package/dist/components/features/emailBuilder/panels/HeadingPanel.vue.d.ts +3 -0
- package/dist/components/features/emailBuilder/panels/ImagePanel.vue.d.ts +3 -0
- package/dist/components/features/emailBuilder/panels/ListPanel.vue.d.ts +3 -0
- package/dist/components/features/emailBuilder/panels/MenuPanel.vue.d.ts +3 -0
- package/dist/components/features/emailBuilder/panels/ParagraphPanel.vue.d.ts +3 -0
- package/dist/components/features/emailBuilder/panels/RowColumnPanel.vue.d.ts +13 -0
- package/dist/components/features/emailBuilder/panels/RowPanel.vue.d.ts +13 -0
- package/dist/components/features/emailBuilder/panels/RowSpacerPanel.vue.d.ts +13 -0
- package/dist/components/features/emailBuilder/panels/SocialsPanel.vue.d.ts +3 -0
- package/dist/components/features/emailBuilder/panels/SpacerPanel.vue.d.ts +3 -0
- package/dist/components/features/emailBuilder/panels/VideoPanel.vue.d.ts +3 -0
- package/dist/components/features/emailBuilder/panels/shared/DeviceTabs.vue.d.ts +19 -0
- package/dist/components/features/emailBuilder/panels/shared/LinkFieldMergeTags.vue.d.ts +31 -0
- package/dist/components/features/emailBuilder/panels/shared/OverrideBadge.vue.d.ts +9 -0
- package/dist/components/features/emailBuilder/panels/shared/PreviewBadge.vue.d.ts +11 -0
- package/dist/components/features/emailBuilder/panels/shared/TextFieldMergeTags.vue.d.ts +25 -0
- package/dist/components/features/emailBuilder/panels/ui/BoxStylingSection.vue.d.ts +7 -0
- package/dist/components/features/emailBuilder/panels/ui/PropertyAlignment.vue.d.ts +30 -0
- package/dist/components/features/emailBuilder/panels/ui/PropertyColor.vue.d.ts +75 -0
- package/dist/components/features/emailBuilder/panels/ui/PropertyGradientColor.vue.d.ts +27 -0
- package/dist/components/features/emailBuilder/panels/ui/PropertyNumberSlider.vue.d.ts +74 -0
- package/dist/components/features/emailBuilder/panels/ui/PropertySection.vue.d.ts +17 -0
- package/dist/components/features/emailBuilder/panels/ui/PropertySelect.vue.d.ts +74 -0
- package/dist/components/features/emailBuilder/panels/ui/PropertyTextStyle.vue.d.ts +52 -0
- package/dist/components/features/emailBuilder/panels/ui/PropertyTextStylePanel.vue.d.ts +72 -0
- package/dist/components/features/emailBuilder/panels/ui/PropertyToggle.vue.d.ts +45 -0
- package/dist/components/features/emailBuilder/panels/ui/PropertyVisibility.vue.d.ts +32 -0
- package/dist/components/features/emailBuilder/panels/ui/SpacingControl.vue.d.ts +19 -0
- package/dist/components/features/emailBuilder/panels/ui/color-picker/AlphaSlider.vue.d.ts +28 -0
- package/dist/components/features/emailBuilder/panels/ui/color-picker/ColorPickerPanel.vue.d.ts +31 -0
- package/dist/components/features/emailBuilder/panels/ui/color-picker/HueSlider.vue.d.ts +19 -0
- package/dist/components/features/emailBuilder/panels/ui/color-picker/RecentColors.vue.d.ts +20 -0
- package/dist/components/features/emailBuilder/panels/ui/color-picker/SVPanel.vue.d.ts +39 -0
- package/dist/components/features/emailBuilder/panels/ui/visibility-rule/Rule.vue.d.ts +28 -0
- package/dist/components/features/emailBuilder/preview/PreviewScreen.vue.d.ts +7 -0
- package/dist/components/features/emailBuilder/preview/ui/PreviewCanvas.vue.d.ts +10 -0
- package/dist/components/features/emailBuilder/preview/ui/PreviewCapabilityBadges.vue.d.ts +12 -0
- package/dist/components/features/emailBuilder/preview/ui/PreviewClientCard.vue.d.ts +20 -0
- package/dist/components/features/emailBuilder/preview/ui/PreviewClientList.vue.d.ts +21 -0
- package/dist/components/features/emailBuilder/preview/ui/PreviewClientPicker.vue.d.ts +16 -0
- package/dist/components/features/emailBuilder/preview/ui/PreviewComponent.vue.d.ts +10 -0
- package/dist/components/features/emailBuilder/preview/ui/PreviewDetailView.vue.d.ts +41 -0
- package/dist/components/features/emailBuilder/preview/ui/PreviewRendered.vue.d.ts +8 -0
- package/dist/components/features/emailBuilder/product/RowPreview.vue.d.ts +8 -0
- package/dist/components/features/emailBuilder/product/RowPreviewChildren.vue.d.ts +14 -0
- package/dist/components/features/emailBuilder/product/RowPreviewLegacyComponent.vue.d.ts +14 -0
- package/dist/components/features/emailBuilder/product/RowPreviewRow.vue.d.ts +9 -0
- package/dist/components/features/emailBuilder/product/SavedRowsPanel.vue.d.ts +3 -0
- package/dist/components/features/emailBuilder/product/SavedTemplatesPanel.vue.d.ts +13 -0
- package/dist/components/features/emailBuilder/product/VersionHistoryPanel.vue.d.ts +14 -0
- package/dist/components/features/emailBuilder/sidebar/SidebarBlockButton.vue.d.ts +35 -0
- package/dist/components/features/emailBuilder/tabs/GeneralTab.vue.d.ts +3 -0
- package/dist/components/features/emailBuilder/tabs/LayoutTab.vue.d.ts +3 -0
- package/dist/components/features/emailBuilder/tabs/content/ContentTab.vue.d.ts +3 -0
- package/dist/components/features/emailBuilder/tabs/content/LayersPanel.vue.d.ts +7 -0
- package/dist/components/features/emailBuilder/tabs/general/MergeTagsTab.vue.d.ts +3 -0
- package/dist/components/features/emailBuilder/tabs/general/StylesTab.vue.d.ts +3 -0
- package/dist/components/features/emailBuilder/tabs/general/VisibilityTab.vue.d.ts +3 -0
- package/dist/components/features/emailBuilder/tabs/general/VisibilityWrapESPTab.vue.d.ts +3 -0
- package/dist/components/features/emailBuilder/tabs/general/merge-tags/LinkTagTab.vue.d.ts +3 -0
- package/dist/components/features/emailBuilder/tabs/general/merge-tags/MergeTagTab.vue.d.ts +3 -0
- package/dist/components/features/emailBuilder/ui/LinkInputDialog.vue.d.ts +17 -0
- package/dist/components/features/emailBuilder/ui/canvas/CanvasRowDropZone.vue.d.ts +12 -0
- package/dist/components/features/emailBuilder/ui/canvas/DropZone.vue.d.ts +10 -0
- package/dist/components/features/emailBuilder/ui/canvas/Loader.vue.d.ts +19 -0
- package/dist/components/features/emailBuilder/ui/layers-panel/ComponentIcon.vue.d.ts +7 -0
- package/dist/components/features/emailBuilder/ui/layers-panel/LayerColumnChildren.vue.d.ts +42 -0
- package/dist/components/features/emailBuilder/ui/layers-panel/LayerDropLine.vue.d.ts +8 -0
- package/dist/components/features/emailBuilder/ui/renderers/AnchorRenderer.vue.d.ts +10 -0
- package/dist/components/features/emailBuilder/ui/renderers/DividerRenderer.vue.d.ts +10 -0
- package/dist/components/features/emailBuilder/ui/renderers/HeadingRenderer.vue.d.ts +10 -0
- package/dist/components/features/emailBuilder/ui/renderers/ImageRenderer.vue.d.ts +10 -0
- package/dist/components/features/emailBuilder/ui/renderers/ListRenderer.vue.d.ts +10 -0
- package/dist/components/features/emailBuilder/ui/renderers/MenuRenderer.vue.d.ts +10 -0
- package/dist/components/features/emailBuilder/ui/renderers/ParagraphRenderer.vue.d.ts +10 -0
- package/dist/components/features/emailBuilder/ui/renderers/SocialsRenderer.vue.d.ts +10 -0
- package/dist/components/features/emailBuilder/ui/renderers/SpacerRenderer.vue.d.ts +10 -0
- package/dist/components/features/emailBuilder/ui/renderers/VideoRenderer.vue.d.ts +10 -0
- package/dist/components/features/emailBuilder/ui/rich-text-editor/RichTextEditor.vue.d.ts +12 -0
- package/dist/components/features/emailBuilder/ui/rich-text-editor/pickers/MergeTagPicker.vue.d.ts +18 -0
- package/dist/components/features/emailBuilder/ui/rich-text-editor/pickers/RichTextColorPicker.vue.d.ts +15 -0
- package/dist/components/features/emailBuilder/ui/visibility/SupportBadge.vue.d.ts +10 -0
- package/dist/components/features/emailBuilder/ui/visibility/VisibilityPopover.vue.d.ts +45 -0
- package/dist/components/ui/ConfirmDialog.vue.d.ts +3 -0
- package/dist/components/ui/Icon.vue.d.ts +33 -0
- package/dist/components/ui/InfoDialog.vue.d.ts +12 -0
- package/dist/components/ui/Loading.vue.d.ts +6 -0
- package/dist/components/ui/ShadowSafeToast.vue.d.ts +3 -0
- package/dist/components/ui/primitives/Button.vue.d.ts +23 -0
- package/dist/components/ui/primitives/DatePicker.vue.d.ts +16 -0
- package/dist/components/ui/primitives/Dialog.vue.d.ts +34 -0
- package/dist/components/ui/primitives/InputText.vue.d.ts +29 -0
- package/dist/components/ui/primitives/Message.vue.d.ts +20 -0
- package/dist/components/ui/primitives/Select.vue.d.ts +22 -0
- package/dist/composables/emailBuilder/components/useSystemRows.d.ts +22 -0
- package/dist/composables/emailBuilder/core/ui/useLayerHoverScroll.d.ts +10 -10
- package/dist/composables/emailBuilder/core/useEmailBuilder.d.ts +18 -0
- package/dist/composables/emailBuilder/export/logic/espLogicWrapper.d.ts +4 -4
- package/dist/composables/emailBuilder/export/targets/templateSnapshot.d.ts +24 -0
- package/dist/composables/emailBuilder/persistence/useEmailBuilderPersistence.d.ts +1 -1
- package/dist/composables/system/useColorScheme.d.ts +16 -0
- package/dist/editor.css +1072 -682
- package/dist/element-C2ZH0Z_i.js +86561 -0
- package/dist/element-scoped-styles.css +1072 -682
- package/dist/element.d.ts +1 -1
- package/dist/element.js +5 -2
- package/dist/estree-DBJlF9un.js +4876 -0
- package/dist/html-3PMDtB0V.js +3123 -0
- package/dist/index-DhFg3uKs.js +75864 -0
- package/dist/index.d.ts +4 -2
- package/dist/index.js +16 -67053
- package/dist/init.d.ts +95 -2
- package/dist/init.js +166 -122
- package/dist/standalone-DKWMQftY.js +2391 -0
- package/dist/theme.d.ts +68 -17
- package/dist/types/assistant.d.ts +56 -0
- package/dist/typescript-l6-4tT8s.js +13240 -0
- package/package.json +6 -3
- package/dist/RowPreviewLegacyComponent-CXsY4P-R.js +0 -439
- package/dist/RowPreviewLegacyComponent-yjHSkZLz.js +0 -439
- package/dist/RowPreviewRow-CBfAnQ6o.js +0 -107
- package/dist/RowPreviewRow-CeowK6Q_.js +0 -107
- package/dist/composables/emailBuilder/transform/pipeline/optimizeAI.d.ts +0 -125
- package/dist/element-CMhqxYnE.js +0 -67099
- package/dist/estree-B67dfAo1.js +0 -7989
- package/dist/html-DGrfikay.js +0 -7353
- package/dist/standalone-Bd2oQFm3.js +0 -3639
- package/dist/typescript-C_Ru9PRN.js +0 -23184
- package/dist/vue.runtime.esm-bundler-CfYyFhW6.js +0 -9097
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { n as defineComponent, o as computed, q as openBlock, t as createElementBlock, F as Fragment, u as renderList, v as normalizeStyle, w as createVNode, x as unref, y as createCommentVNode, z as defineAsyncComponent } from "./element-C2ZH0Z_i.js";
|
|
2
|
+
const _hoisted_1 = {
|
|
3
|
+
key: 0,
|
|
4
|
+
class: "w-full border border-dashed border-(--md-border) rounded",
|
|
5
|
+
style: { "min-height": "10px" }
|
|
6
|
+
};
|
|
7
|
+
const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
8
|
+
__name: "RowPreviewRow",
|
|
9
|
+
props: {
|
|
10
|
+
row: {},
|
|
11
|
+
scale: {},
|
|
12
|
+
depth: {}
|
|
13
|
+
},
|
|
14
|
+
setup(__props) {
|
|
15
|
+
const RowPreviewChildren = defineAsyncComponent(
|
|
16
|
+
() => import("./RowPreviewChildren-DT0y0lKC.js")
|
|
17
|
+
);
|
|
18
|
+
const props = __props;
|
|
19
|
+
function resolveBackground(item) {
|
|
20
|
+
var _a;
|
|
21
|
+
const bg = item == null ? void 0 : item.backgroundGradient;
|
|
22
|
+
const hasGradient = (bg == null ? void 0 : bg.useGradient) === true && Array.isArray((_a = bg == null ? void 0 : bg.gradient) == null ? void 0 : _a.colors) && bg.gradient.colors.length >= 2;
|
|
23
|
+
if (hasGradient) {
|
|
24
|
+
const { type, direction, colors } = bg.gradient;
|
|
25
|
+
const stops = colors.map((c) => `${c.color} ${c.position}%`).join(", ");
|
|
26
|
+
return type === "radial" ? `radial-gradient(circle at center, ${stops})` : `linear-gradient(${direction}, ${stops})`;
|
|
27
|
+
}
|
|
28
|
+
return (item == null ? void 0 : item.backgroundColor) ?? "transparent";
|
|
29
|
+
}
|
|
30
|
+
const rowStyle = computed(() => {
|
|
31
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
32
|
+
const r = props.row;
|
|
33
|
+
const style = {
|
|
34
|
+
display: "flex",
|
|
35
|
+
flexDirection: "row",
|
|
36
|
+
background: resolveBackground(r),
|
|
37
|
+
padding: `${((_a = r.padding) == null ? void 0 : _a.top) ?? 0}px ${((_b = r.padding) == null ? void 0 : _b.right) ?? 0}px ${((_c = r.padding) == null ? void 0 : _c.bottom) ?? 0}px ${((_d = r.padding) == null ? void 0 : _d.left) ?? 0}px`,
|
|
38
|
+
alignItems: "stretch",
|
|
39
|
+
border: `${((_e = r.border) == null ? void 0 : _e.width) ?? 0}px ${((_f = r.border) == null ? void 0 : _f.style) ?? "solid"} ${((_g = r.border) == null ? void 0 : _g.color) ?? "transparent"}`,
|
|
40
|
+
borderRadius: `${((_h = r.border) == null ? void 0 : _h.radius) ?? 0}px`,
|
|
41
|
+
gap: `${r.gap ?? 0}px`,
|
|
42
|
+
overflow: "hidden"
|
|
43
|
+
};
|
|
44
|
+
if (r.backgroundImage) {
|
|
45
|
+
style.backgroundImage = `url(${r.backgroundImage})`;
|
|
46
|
+
style.backgroundSize = r.backgroundSize ?? "cover";
|
|
47
|
+
style.backgroundPosition = r.backgroundPosition ?? "center center";
|
|
48
|
+
}
|
|
49
|
+
return style;
|
|
50
|
+
});
|
|
51
|
+
function colStyle(col, parentRow) {
|
|
52
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _i;
|
|
53
|
+
const verticalAlignMap = {
|
|
54
|
+
top: "flex-start",
|
|
55
|
+
middle: "center",
|
|
56
|
+
bottom: "flex-end"
|
|
57
|
+
};
|
|
58
|
+
const widthPct = col.width ?? 50;
|
|
59
|
+
const siblingCount = ((_a = parentRow == null ? void 0 : parentRow.columns) == null ? void 0 : _a.length) || 1;
|
|
60
|
+
const gapPx = (parentRow == null ? void 0 : parentRow.gap) ?? 0;
|
|
61
|
+
const gapShare = siblingCount > 1 ? gapPx * (siblingCount - 1) / siblingCount : 0;
|
|
62
|
+
const widthValue = gapShare > 0 ? `calc(${widthPct}% - ${gapShare}px)` : `${widthPct}%`;
|
|
63
|
+
const style = {
|
|
64
|
+
flex: `0 0 ${widthValue}`,
|
|
65
|
+
width: widthValue,
|
|
66
|
+
maxWidth: widthValue,
|
|
67
|
+
boxSizing: "border-box",
|
|
68
|
+
background: resolveBackground(col),
|
|
69
|
+
padding: `${((_b = col.padding) == null ? void 0 : _b.top) ?? 10}px ${((_c = col.padding) == null ? void 0 : _c.right) ?? 10}px ${((_d = col.padding) == null ? void 0 : _d.bottom) ?? 10}px ${((_e = col.padding) == null ? void 0 : _e.left) ?? 10}px`,
|
|
70
|
+
border: `${((_f = col.border) == null ? void 0 : _f.width) ?? 0}px ${((_g = col.border) == null ? void 0 : _g.style) ?? "solid"} ${((_h = col.border) == null ? void 0 : _h.color) ?? "transparent"}`,
|
|
71
|
+
borderRadius: `${((_i = col.border) == null ? void 0 : _i.radius) ?? 0}px`,
|
|
72
|
+
overflow: "hidden",
|
|
73
|
+
minWidth: "0",
|
|
74
|
+
display: "flex",
|
|
75
|
+
flexDirection: "column",
|
|
76
|
+
justifyContent: verticalAlignMap[col.verticalAlign] ?? "flex-start"
|
|
77
|
+
};
|
|
78
|
+
if (col.backgroundImage) {
|
|
79
|
+
style.backgroundImage = `url(${col.backgroundImage})`;
|
|
80
|
+
style.backgroundSize = col.backgroundSize ?? "cover";
|
|
81
|
+
style.backgroundPosition = col.backgroundPosition ?? "center center";
|
|
82
|
+
style.minHeight = "14px";
|
|
83
|
+
}
|
|
84
|
+
return style;
|
|
85
|
+
}
|
|
86
|
+
return (_ctx, _cache) => {
|
|
87
|
+
return (__props.depth ?? 0) < 5 ? (openBlock(), createElementBlock("div", {
|
|
88
|
+
key: 0,
|
|
89
|
+
style: normalizeStyle(rowStyle.value),
|
|
90
|
+
class: "w-full"
|
|
91
|
+
}, [
|
|
92
|
+
(openBlock(true), createElementBlock(Fragment, null, renderList(__props.row.columns ?? [], (col) => {
|
|
93
|
+
return openBlock(), createElementBlock("div", {
|
|
94
|
+
key: col.id,
|
|
95
|
+
style: normalizeStyle(colStyle(col, __props.row)),
|
|
96
|
+
class: "overflow-hidden shrink-0"
|
|
97
|
+
}, [
|
|
98
|
+
createVNode(unref(RowPreviewChildren), {
|
|
99
|
+
children: col.children ?? col.components ?? [],
|
|
100
|
+
scale: __props.scale,
|
|
101
|
+
depth: (__props.depth ?? 0) + 1
|
|
102
|
+
}, null, 8, ["children", "scale", "depth"]),
|
|
103
|
+
(col.children ?? col.components ?? []).length === 0 ? (openBlock(), createElementBlock("div", _hoisted_1)) : createCommentVNode("", true)
|
|
104
|
+
], 4);
|
|
105
|
+
}), 128))
|
|
106
|
+
], 4)) : createCommentVNode("", true);
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
export {
|
|
111
|
+
_sfc_main as default
|
|
112
|
+
};
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* adapters/errors.ts — the one thing the editor and a host adapter need to
|
|
3
|
+
* agree on about failure.
|
|
4
|
+
*
|
|
5
|
+
* The editor has no user, role, plan or HTTP model, deliberately (see the
|
|
6
|
+
* README's "Positioning" section, and the comment at the top of
|
|
7
|
+
* SavedRowsPanel.vue). So it cannot say anything useful about a 403, a 402 or
|
|
8
|
+
* an expired session — only the host knows what its own statuses mean and
|
|
9
|
+
* what the user should do about them.
|
|
10
|
+
*
|
|
11
|
+
* That leaves a gap. A host adapter that catches its own 403 and shows a
|
|
12
|
+
* precise message ("your role can't delete saved rows — ask an admin") gets a
|
|
13
|
+
* second, vaguer toast from the editor's own catch block a moment later
|
|
14
|
+
* ("Delete failed"). Two toasts for one click, the less useful one last.
|
|
15
|
+
*
|
|
16
|
+
* `handled` closes it without teaching the editor anything about permissions.
|
|
17
|
+
* The host marks an error it has already surfaced; the editor only asks "did
|
|
18
|
+
* someone already tell the user?" and stays quiet if so. It still gets the
|
|
19
|
+
* rejection — which matters, because every optimistic update in this package
|
|
20
|
+
* is applied on resolve, so a swallowed failure would leave the UI showing a
|
|
21
|
+
* delete or rename that never happened.
|
|
22
|
+
*
|
|
23
|
+
* Hosts that don't use this lose nothing: unmarked errors take the editor's
|
|
24
|
+
* generic message exactly as before.
|
|
25
|
+
*/
|
|
26
|
+
/**
|
|
27
|
+
* Marks an error as already reported to the user, and returns it for
|
|
28
|
+
* rethrowing:
|
|
29
|
+
*
|
|
30
|
+
* ```ts
|
|
31
|
+
* catch (err) {
|
|
32
|
+
* toast.add({ severity: "warn", summary: "Not allowed", detail });
|
|
33
|
+
* throw markHandled(err);
|
|
34
|
+
* }
|
|
35
|
+
* ```
|
|
36
|
+
*
|
|
37
|
+
* Mutates in place when it can, so `err.status` / `err.data` and any other
|
|
38
|
+
* fields the host reads downstream survive. Some rejections can't be mutated
|
|
39
|
+
* — ofetch's FetchError is frozen, and a thrown string isn't an object at all
|
|
40
|
+
* — so those get a fresh Error carrying the original as `cause` rather than
|
|
41
|
+
* throwing a TypeError from inside a catch block, which would replace the
|
|
42
|
+
* real failure with a confusing one.
|
|
43
|
+
*/
|
|
44
|
+
export declare function markHandled(err: unknown): unknown;
|
|
45
|
+
/**
|
|
46
|
+
* Whether the host already showed the user a message for this failure.
|
|
47
|
+
*
|
|
48
|
+
* Guard the editor's own toast with it, never the recovery logic — a handled
|
|
49
|
+
* error is still an error, and state that was rolled back or a panel that was
|
|
50
|
+
* left open must behave identically either way:
|
|
51
|
+
*
|
|
52
|
+
* ```ts
|
|
53
|
+
* catch (err) {
|
|
54
|
+
* console.error("[maildeno-editor] failed to delete version:", err);
|
|
55
|
+
* if (!isHandled(err)) toast.add({ severity: "error", summary: "Delete failed" });
|
|
56
|
+
* }
|
|
57
|
+
* ```
|
|
58
|
+
*/
|
|
59
|
+
export declare function isHandled(err: unknown): boolean;
|
package/dist/adapters/index.d.ts
CHANGED
|
@@ -1,7 +1,38 @@
|
|
|
1
|
+
import { Ref } from 'vue';
|
|
1
2
|
import { EditorStorageAdapter, PartialStorageAdapter } from './types';
|
|
3
|
+
export declare function useCanSave(): Ref<boolean>;
|
|
4
|
+
export declare function provideCanSave(canSave: Ref<boolean>): void;
|
|
5
|
+
export declare function useHasTemplateLibrary(): boolean;
|
|
2
6
|
export declare function provideStorageAdapter(adapter?: PartialStorageAdapter): EditorStorageAdapter;
|
|
3
7
|
/** For genuine child components of <EmailEditor> — Header.vue,
|
|
4
8
|
* SavedRowsPanel.vue, etc. Their inject() correctly sees EmailEditor.vue's
|
|
5
9
|
* provides via instance.parent.provides, since they're actual children,
|
|
6
10
|
* not the same instance that called provide(). */
|
|
7
11
|
export declare const useStorageAdapter: () => EditorStorageAdapter;
|
|
12
|
+
/**
|
|
13
|
+
* Host-declared restrictions on the saved-row library.
|
|
14
|
+
*
|
|
15
|
+
* Same contract as EmailEditor's `capabilities` prop that carries it: this
|
|
16
|
+
* only ever takes affordances away. Omitting a key, or the whole object,
|
|
17
|
+
* leaves that control exactly as it is today, so no existing host changes
|
|
18
|
+
* behaviour by upgrading.
|
|
19
|
+
*
|
|
20
|
+
* Separate from the read-only Shared tab, which is a property of the data (no
|
|
21
|
+
* adapter method backs renaming an org's curated rows, so no host can grant
|
|
22
|
+
* it). This is a property of the *person* — a viewer in a host's role model
|
|
23
|
+
* who may look at their org's rows but not add to them. The editor still has
|
|
24
|
+
* no user model and isn't learning one: it takes three booleans and asks no
|
|
25
|
+
* questions about where they came from.
|
|
26
|
+
*
|
|
27
|
+
* A gate is not enforcement. The server is still the only thing standing
|
|
28
|
+
* between a viewer and a write; this just stops the editor offering a button
|
|
29
|
+
* whose only outcome is a 403.
|
|
30
|
+
*/
|
|
31
|
+
export interface SavedRowCapabilities {
|
|
32
|
+
create?: boolean;
|
|
33
|
+
rename?: boolean;
|
|
34
|
+
delete?: boolean;
|
|
35
|
+
}
|
|
36
|
+
export declare function provideSavedRowCapabilities(caps: Ref<SavedRowCapabilities>): void;
|
|
37
|
+
/** Defaults to fully permitted — see the "only ever restricts" note above. */
|
|
38
|
+
export declare function useSavedRowCapabilities(): Ref<SavedRowCapabilities>;
|
package/dist/adapters/types.d.ts
CHANGED
|
@@ -28,6 +28,27 @@ export interface TemplateSummary {
|
|
|
28
28
|
name?: string;
|
|
29
29
|
updatedAt?: string;
|
|
30
30
|
}
|
|
31
|
+
/**
|
|
32
|
+
* One entry in the version-history panel. A summary for the same reason
|
|
33
|
+
* TemplateSummary is: rendering a list of fifty versions shouldn't mean
|
|
34
|
+
* downloading fifty full documents. getTemplateVersion(id) fetches content
|
|
35
|
+
* for the one the user actually restores.
|
|
36
|
+
*/
|
|
37
|
+
export interface TemplateVersionSummary {
|
|
38
|
+
versionId: string;
|
|
39
|
+
createdAt: string;
|
|
40
|
+
/** Optional human label ("Before redesign"). Falls back to a relative
|
|
41
|
+
* timestamp in the panel when absent. */
|
|
42
|
+
label?: string;
|
|
43
|
+
/** Pinned. Kept versions are excluded from deleteAllTemplateVersions and
|
|
44
|
+
* are the ones a host's retention policy should spare. The editor only
|
|
45
|
+
* reads and toggles this; what "spared" means is the host's business. */
|
|
46
|
+
kept?: boolean;
|
|
47
|
+
/** Free-form attribution, shown verbatim if present. Deliberately a
|
|
48
|
+
* string, not a user object — the editor has no user model and shouldn't
|
|
49
|
+
* grow one just to render a name. */
|
|
50
|
+
author?: string;
|
|
51
|
+
}
|
|
31
52
|
export interface SavedRow {
|
|
32
53
|
id: string;
|
|
33
54
|
name: string;
|
|
@@ -51,7 +72,54 @@ export interface EditorStorageAdapter {
|
|
|
51
72
|
listTemplates(): Promise<TemplateSummary[]>;
|
|
52
73
|
/** Optional, and only surfaced in the panel when implemented. */
|
|
53
74
|
deleteTemplate(templateId: string): Promise<void>;
|
|
75
|
+
/**
|
|
76
|
+
* ── Version history ──────────────────────────────────────────────────
|
|
77
|
+
*
|
|
78
|
+
* All five are optional, like listTemplates above, and gated the same
|
|
79
|
+
* way: the panel is only reachable when `versions` is set on the editor,
|
|
80
|
+
* and each control within it only appears when its method exists. An
|
|
81
|
+
* adapter can therefore support listing and restoring without supporting
|
|
82
|
+
* deletion, and the UI reflects exactly that.
|
|
83
|
+
*
|
|
84
|
+
* Note the asymmetry with saveTemplate: nothing here creates a version.
|
|
85
|
+
* When a save produces a new version is a policy question — every save,
|
|
86
|
+
* on a timer, on explicit request — and the host already owns saveTemplate,
|
|
87
|
+
* so it can decide there. Putting version creation in this interface would
|
|
88
|
+
* force one policy on every host.
|
|
89
|
+
*/
|
|
90
|
+
listTemplateVersions(templateId: string): Promise<TemplateVersionSummary[]>;
|
|
91
|
+
/** Full content for one version, in the same shape as loadTemplate. */
|
|
92
|
+
getTemplateVersion(templateId: string, versionId: string): Promise<TemplateSnapshot | null>;
|
|
93
|
+
deleteTemplateVersion(templateId: string, versionId: string): Promise<void>;
|
|
94
|
+
/** Bulk delete. Kept versions survive — see TemplateVersionSummary.kept.
|
|
95
|
+
* The panel's confirm copy says so, so an implementation that deletes
|
|
96
|
+
* kept versions too would contradict what the user was told. */
|
|
97
|
+
deleteAllTemplateVersions(templateId: string): Promise<void>;
|
|
98
|
+
setTemplateVersionKept(templateId: string, versionId: string, kept: boolean): Promise<void>;
|
|
54
99
|
listSavedRows(): Promise<SavedRow[]>;
|
|
100
|
+
/**
|
|
101
|
+
* A second, read-only row library shown in its own tab beside the user's
|
|
102
|
+
* own rows — an organisation's shared blocks, a starter set, whatever the
|
|
103
|
+
* host curates.
|
|
104
|
+
*
|
|
105
|
+
* Optional, and the tab only appears when it is implemented, so a host with
|
|
106
|
+
* one row library sees exactly the panel it has today. The built-in
|
|
107
|
+
* localStorage adapter deliberately does NOT implement it: "shared across
|
|
108
|
+
* an organisation" has no meaning in a single browser's storage, and
|
|
109
|
+
* faking it would demonstrate a feature that cannot work.
|
|
110
|
+
*
|
|
111
|
+
* Read-only by construction. There is no saveSystemSavedRow /
|
|
112
|
+
* deleteSystemSavedRow / renameSystemSavedRow, so the panel renders this
|
|
113
|
+
* tab without rename or delete controls. Who may curate a shared library is
|
|
114
|
+
* a permissions question the host answers in its own admin UI — the editor
|
|
115
|
+
* has no user model to answer it with, and inventing one to grey out a
|
|
116
|
+
* button would be the wrong boundary.
|
|
117
|
+
*
|
|
118
|
+
* cloneSavedRowForCanvas must resolve ids from BOTH libraries. It is the
|
|
119
|
+
* single synchronous entry point used when a row is dragged onto the
|
|
120
|
+
* canvas, and the drag doesn't know which tab the row came from.
|
|
121
|
+
*/
|
|
122
|
+
listSystemSavedRows(): Promise<SavedRow[]>;
|
|
55
123
|
saveSavedRow(row: Record<string, any>, name: string): Promise<SavedRow | null>;
|
|
56
124
|
deleteSavedRow(id: string): Promise<void>;
|
|
57
125
|
renameSavedRow(id: string, name: string): Promise<void>;
|
package/dist/brand.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The package's own name, shown wherever a host hasn't supplied its own.
|
|
3
|
+
*
|
|
4
|
+
* Extracted to a constant because two components now render it — the
|
|
5
|
+
* desktop-only notice and the loading overlay — and DesktopOnlyNotice.vue's
|
|
6
|
+
* prop comment already promised there would be exactly one place to change
|
|
7
|
+
* it. A second `withDefaults(..., { brandName: "Maildeno" })` written inline
|
|
8
|
+
* would quietly make that false, and the two would drift the first time
|
|
9
|
+
* someone renamed one of them.
|
|
10
|
+
*
|
|
11
|
+
* Not a theme token: `theme` carries colours, and this is text, so it has no
|
|
12
|
+
* sensible home in the token map — see the `brandName` prop on EmailEditor
|
|
13
|
+
* for the longer version of that reasoning.
|
|
14
|
+
*/
|
|
15
|
+
export declare const DEFAULT_BRAND_NAME = "Maildeno";
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
interface Props {
|
|
2
|
+
/**
|
|
3
|
+
* Name shown in the "Powered by" line at the bottom of the notice.
|
|
4
|
+
*
|
|
5
|
+
* EmailEditor.vue forwards the prop through without redeclaring a default
|
|
6
|
+
* of its own, so an undefined value arriving from any of the three mount
|
|
7
|
+
* paths (Vue component, custom element, light DOM) lands here and resolves
|
|
8
|
+
* the same way. Pass an empty string to hide the line entirely.
|
|
9
|
+
*
|
|
10
|
+
* The default itself now lives in brand.ts — Loader.vue renders the same
|
|
11
|
+
* name, and two inline copies of the string would be two things to keep in
|
|
12
|
+
* step. Behaviour here is unchanged.
|
|
13
|
+
*/
|
|
14
|
+
brandName?: string;
|
|
15
|
+
}
|
|
16
|
+
declare const __VLS_export: import('vue').DefineComponent<Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<Props> & Readonly<{}>, {
|
|
17
|
+
brandName: string;
|
|
18
|
+
}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
|
|
19
|
+
declare const _default: typeof __VLS_export;
|
|
20
|
+
export default _default;
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import { ColorMode } from '../../../composables/system/useColorScheme';
|
|
2
|
+
import { PartialStorageAdapter } from '../../../adapters/types';
|
|
3
|
+
import { ThemeOptions } from '../../../theme';
|
|
4
|
+
import { AssistantMount, EditorWriteApi } from '../../../types/assistant';
|
|
5
|
+
type __VLS_Props = {
|
|
6
|
+
isReady?: boolean;
|
|
7
|
+
storageAdapter?: PartialStorageAdapter;
|
|
8
|
+
/** If given, loaded via the adapter on mount. Omit to start blank
|
|
9
|
+
* (create mode) — matches the original app's /create vs /edit split,
|
|
10
|
+
* now driven by a prop instead of a route. */
|
|
11
|
+
templateId?: string;
|
|
12
|
+
/** Applied via CSS custom properties (see theme.ts) — works whether this
|
|
13
|
+
* component is used directly or wrapped by element.ts's
|
|
14
|
+
* defineCustomElement, because both write to the same place: this
|
|
15
|
+
* component's own root element, which is where the package's bundled
|
|
16
|
+
* defaults land too once the library build has scoped them. Reactive:
|
|
17
|
+
* assigning a new object re-themes live, no remount. */
|
|
18
|
+
theme?: ThemeOptions;
|
|
19
|
+
/**
|
|
20
|
+
* Which half of `theme` applies.
|
|
21
|
+
*
|
|
22
|
+
* `auto` (the default) follows the host page: useColorScheme.ts watches
|
|
23
|
+
* for a `dark` class on <html> or <body> and mirrors it onto the editor
|
|
24
|
+
* root. A host that already has a Tailwind-style theme switcher needs no
|
|
25
|
+
* wiring at all — flipping the class moves the editor in the same frame.
|
|
26
|
+
*
|
|
27
|
+
* Pass `light` or `dark` to pin the editor regardless of the page: a
|
|
28
|
+
* light editor deliberately embedded in a dark shell, or a host whose
|
|
29
|
+
* switcher signals something other than a class.
|
|
30
|
+
*/
|
|
31
|
+
colorMode?: ColorMode;
|
|
32
|
+
/** If provided, the "Send test" button appears in the header. Editor
|
|
33
|
+
* owns the form/validation UI; this callback owns what actually
|
|
34
|
+
* happens on submit (SMTP, an API, anything) — same host-owns-the-
|
|
35
|
+
* operation pattern as the storage adapter. */
|
|
36
|
+
/**
|
|
37
|
+
* Called after a successful save. Its presence is what reveals the Save
|
|
38
|
+
* button — same idiom as onSendTestEmail below.
|
|
39
|
+
*
|
|
40
|
+
* Gating on an explicit handler rather than on the storage adapter,
|
|
41
|
+
* because the adapter can't answer the question: PartialStorageAdapter
|
|
42
|
+
* is merged with the localStorage defaults, so `saveTemplate` always
|
|
43
|
+
* exists by the time anything reads it. A host that wants a read-only or
|
|
44
|
+
* guest editor simply omits this.
|
|
45
|
+
*
|
|
46
|
+
* The `save` event still fires alongside, so `@save` keeps working — and
|
|
47
|
+
* because Vue compiles `@save="fn"` to an `onSave` prop, writing the
|
|
48
|
+
* listener is itself enough to reveal the button.
|
|
49
|
+
*/
|
|
50
|
+
onSave?: (payload: {
|
|
51
|
+
templateId: string | null;
|
|
52
|
+
}) => void;
|
|
53
|
+
/**
|
|
54
|
+
* The same handler, under a name that doesn't begin with "on".
|
|
55
|
+
*
|
|
56
|
+
* For the custom-element path only. Vue's defineCustomElement treats
|
|
57
|
+
* `on*` keys as event listeners rather than props, so `el.onSave = fn`
|
|
58
|
+
* never reaches this component — the button appeared and the callback
|
|
59
|
+
* never fired. init() sets this instead. Vue hosts should use `@save`.
|
|
60
|
+
*/
|
|
61
|
+
saveHandler?: (payload: {
|
|
62
|
+
templateId: string | null;
|
|
63
|
+
}) => void;
|
|
64
|
+
onSendTestEmail?: (payload: {
|
|
65
|
+
to: string;
|
|
66
|
+
subject: string;
|
|
67
|
+
html: string;
|
|
68
|
+
}) => Promise<void> | void;
|
|
69
|
+
/** Explicit UI restrictions, layered on top of the implicit ones
|
|
70
|
+
* (e.g. onSendTestEmail's mere presence/absence already gates that
|
|
71
|
+
* button — capabilities doesn't replace that, it adds to it).
|
|
72
|
+
* Omit any key to leave that area fully enabled — this restricts,
|
|
73
|
+
* it never grants something that wasn't already possible. */
|
|
74
|
+
capabilities?: {
|
|
75
|
+
/** Which formats appear in the Export dropdown. Omit for all four. */
|
|
76
|
+
export?: Array<"html" | "mjml" | "react" | "json">;
|
|
77
|
+
/** Which saved-row controls this user gets: the canvas row's bookmark
|
|
78
|
+
* button, and the panel's per-row rename and delete. Omit a key for
|
|
79
|
+
* "allowed", the same as omitting the object. For a host with roles,
|
|
80
|
+
* this is what stops a viewer being shown three buttons that can only
|
|
81
|
+
* 403 — the toast their adapter raises afterwards is the backstop, not
|
|
82
|
+
* the design. Does not touch the Shared tab, which is read-only for
|
|
83
|
+
* everyone because no adapter method backs writing to it. */
|
|
84
|
+
savedRows?: {
|
|
85
|
+
create?: boolean;
|
|
86
|
+
rename?: boolean;
|
|
87
|
+
delete?: boolean;
|
|
88
|
+
};
|
|
89
|
+
};
|
|
90
|
+
/** Name shown in the loading overlay and in the desktop-only notice's
|
|
91
|
+
* "Powered by" line.
|
|
92
|
+
*
|
|
93
|
+
* Deliberately a prop rather than a theme token: `theme` carries
|
|
94
|
+
* colours, and this is text, so it has no sensible home in the token
|
|
95
|
+
* map. It is also the one piece of chrome a host cannot restyle away,
|
|
96
|
+
* since the notice replaces the entire editor on small screens.
|
|
97
|
+
*
|
|
98
|
+
* No default is declared here on purpose. Both consumers resolve an
|
|
99
|
+
* undefined value from DEFAULT_BRAND_NAME in brand.ts, so there is one
|
|
100
|
+
* place to change it rather than three that can drift — and declaring a
|
|
101
|
+
* default here would also make the empty-string case unreachable, since
|
|
102
|
+
* the prop would never arrive undefined. Omit for the package default;
|
|
103
|
+
* pass an empty string to render no wordmark and drop the attribution
|
|
104
|
+
* line entirely. */
|
|
105
|
+
brandName?: string;
|
|
106
|
+
/** Replaces the saved-templates panel (and its header button) with
|
|
107
|
+
* version history.
|
|
108
|
+
*
|
|
109
|
+
* A swap rather than an addition, because the two answer different
|
|
110
|
+
* questions — "which template?" versus "which state of this template?"
|
|
111
|
+
* — and a host that has its own template browser elsewhere in its app
|
|
112
|
+
* has no use for the former inside the editor. Two panels competing for
|
|
113
|
+
* the same slot would also mean two header buttons and a layout
|
|
114
|
+
* decision the editor shouldn't be making.
|
|
115
|
+
*
|
|
116
|
+
* Top-level rather than a `capabilities` key on purpose: capabilities
|
|
117
|
+
* documents itself as only ever restricting, never granting, and this
|
|
118
|
+
* grants.
|
|
119
|
+
*
|
|
120
|
+
* The panel still degrades per-method — see the version methods on
|
|
121
|
+
* EditorStorageAdapter. Setting this with an adapter that can't list
|
|
122
|
+
* versions gets an honest "not supported" message, not a broken panel. */
|
|
123
|
+
versions?: boolean;
|
|
124
|
+
/** Fills the assistant drawer from a non-Vue host (init(), React,
|
|
125
|
+
* vanilla). Vue hosts use the #assistant slot instead; either one being
|
|
126
|
+
* present reveals the trigger button, and neither means no assistant UI
|
|
127
|
+
* renders at all.
|
|
128
|
+
*
|
|
129
|
+
* The editor supplies the drawer, its trigger, open/close state, escape
|
|
130
|
+
* handling, focus return and shadow-DOM-safe teleporting. What goes
|
|
131
|
+
* inside is entirely the host's — see the AssistantPanel comment for
|
|
132
|
+
* why the assistant itself isn't in this package. */
|
|
133
|
+
assistant?: AssistantMount;
|
|
134
|
+
};
|
|
135
|
+
declare var __VLS_17: {
|
|
136
|
+
templateId: string | null;
|
|
137
|
+
isSaving: boolean;
|
|
138
|
+
saveStatus: import('../../../composables/emailBuilder/persistence/useEmailBuilderPersistence').AutoSaveStatus;
|
|
139
|
+
}, __VLS_80: {
|
|
140
|
+
editor: EditorWriteApi;
|
|
141
|
+
};
|
|
142
|
+
type __VLS_Slots = {} & {
|
|
143
|
+
'header-actions'?: (props: typeof __VLS_17) => any;
|
|
144
|
+
} & {
|
|
145
|
+
assistant?: (props: typeof __VLS_80) => any;
|
|
146
|
+
};
|
|
147
|
+
declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
|
|
148
|
+
getHtml: (mode?: "prune" | "wrap") => string | null;
|
|
149
|
+
getMjml: (mode?: "prune" | "wrap") => string | null;
|
|
150
|
+
getReactEmail: (mode?: "prune" | "wrap") => string | null;
|
|
151
|
+
getJson: () => {
|
|
152
|
+
template_id: string;
|
|
153
|
+
template_name: string;
|
|
154
|
+
canvas: Partial<import('../../../composables/emailBuilder/transform/pipeline/optimize').Canvas>;
|
|
155
|
+
rows: Partial<import('../../../composables/emailBuilder/transform/pipeline/optimize').NestedRow | import('../../../composables/emailBuilder/transform/pipeline/optimize').RowSpacer>[];
|
|
156
|
+
schema_version: string;
|
|
157
|
+
} | null;
|
|
158
|
+
setJson: (data: any, opts?: {
|
|
159
|
+
history?: "undoable" | "reset";
|
|
160
|
+
}) => void;
|
|
161
|
+
getSelection: () => {
|
|
162
|
+
id: string;
|
|
163
|
+
type: string | null;
|
|
164
|
+
} | null;
|
|
165
|
+
setSelection: (id: string | null) => boolean;
|
|
166
|
+
onChange: (cb: () => void) => (() => void);
|
|
167
|
+
}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
|
|
168
|
+
ready: () => any;
|
|
169
|
+
}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
170
|
+
onReady?: (() => any) | undefined;
|
|
171
|
+
}>, {
|
|
172
|
+
isReady: boolean;
|
|
173
|
+
colorMode: ColorMode;
|
|
174
|
+
}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
|
|
175
|
+
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|
|
176
|
+
declare const _default: typeof __VLS_export;
|
|
177
|
+
export default _default;
|
|
178
|
+
type __VLS_WithSlots<T, S> = T & {
|
|
179
|
+
new (): {
|
|
180
|
+
$slots: S;
|
|
181
|
+
};
|
|
182
|
+
};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { EditorWriteApi } from '../../../../types/assistant';
|
|
2
|
+
type __VLS_Props = {
|
|
3
|
+
/** Imperative filler for the init()/custom-element path. */
|
|
4
|
+
assistant?: {
|
|
5
|
+
mount: (el: HTMLElement, editor: EditorWriteApi) => void;
|
|
6
|
+
unmount?: (el: HTMLElement) => void;
|
|
7
|
+
};
|
|
8
|
+
/** True when the host passed a #assistant slot. Computed by the parent
|
|
9
|
+
* rather than read from $slots here, because a parent forwarding its own
|
|
10
|
+
* slot down always produces a truthy $slots entry in this child even when
|
|
11
|
+
* the host supplied nothing — which would render an assistant button that
|
|
12
|
+
* opens an empty drawer. */
|
|
13
|
+
hasSlot?: boolean;
|
|
14
|
+
/** Handed to the host so its panel can drive the canvas. */
|
|
15
|
+
editor: EditorWriteApi;
|
|
16
|
+
};
|
|
17
|
+
declare function close(): void;
|
|
18
|
+
declare function toggle(): void;
|
|
19
|
+
declare var __VLS_23: {
|
|
20
|
+
editor: EditorWriteApi;
|
|
21
|
+
};
|
|
22
|
+
type __VLS_Slots = {} & {
|
|
23
|
+
assistant?: (props: typeof __VLS_23) => any;
|
|
24
|
+
};
|
|
25
|
+
declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
|
|
26
|
+
open: () => boolean;
|
|
27
|
+
close: typeof close;
|
|
28
|
+
toggle: typeof toggle;
|
|
29
|
+
}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
|
|
30
|
+
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|
|
31
|
+
declare const _default: typeof __VLS_export;
|
|
32
|
+
export default _default;
|
|
33
|
+
type __VLS_WithSlots<T, S> = T & {
|
|
34
|
+
new (): {
|
|
35
|
+
$slots: S;
|
|
36
|
+
};
|
|
37
|
+
};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
declare const __VLS_export: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
|
|
2
|
+
declare const _default: typeof __VLS_export;
|
|
3
|
+
export default _default;
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
declare const __VLS_export: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
|
|
2
|
+
declare const _default: typeof __VLS_export;
|
|
3
|
+
export default _default;
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
declare const __VLS_export: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
|
|
2
|
+
declare const _default: typeof __VLS_export;
|
|
3
|
+
export default _default;
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
declare const __VLS_export: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
|
|
2
|
+
declare const _default: typeof __VLS_export;
|
|
3
|
+
export default _default;
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
declare const __VLS_export: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
|
|
2
|
+
declare const _default: typeof __VLS_export;
|
|
3
|
+
export default _default;
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
declare const __VLS_export: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
|
|
2
|
+
declare const _default: typeof __VLS_export;
|
|
3
|
+
export default _default;
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
declare const __VLS_export: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
|
|
2
|
+
declare const _default: typeof __VLS_export;
|
|
3
|
+
export default _default;
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
declare const __VLS_export: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
|
|
2
|
+
declare const _default: typeof __VLS_export;
|
|
3
|
+
export default _default;
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
declare const __VLS_export: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
|
|
2
|
+
declare const _default: typeof __VLS_export;
|
|
3
|
+
export default _default;
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
declare const __VLS_export: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
|
|
2
|
+
declare const _default: typeof __VLS_export;
|
|
3
|
+
export default _default;
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
declare const __VLS_export: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
|
|
2
|
+
declare const _default: typeof __VLS_export;
|
|
3
|
+
export default _default;
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
declare const __VLS_export: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
|
|
2
|
+
declare const _default: typeof __VLS_export;
|
|
3
|
+
export default _default;
|