@marlinjai/email-editor 0.2.0 → 0.4.0
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/README.md +3 -3
- package/dist/index.d.mts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +6 -0
- package/dist/index.mjs +6 -0
- package/dist/react.d.mts +53 -4
- package/dist/react.d.ts +53 -4
- package/dist/react.js +61 -10
- package/dist/react.mjs +54 -5
- package/dist/styles.css +1 -1
- package/dist/{types-G7Ak2dWQ.d.mts → types-BVSyfGwc.d.mts} +10 -0
- package/dist/{types-G7Ak2dWQ.d.ts → types-BVSyfGwc.d.ts} +10 -0
- package/package.json +4 -4
- package/dist/types-BoNyjNFe.d.mts +0 -42
- package/dist/types-BoNyjNFe.d.ts +0 -42
package/README.md
CHANGED
|
@@ -116,7 +116,7 @@ export async function POST(request: Request) {
|
|
|
116
116
|
// { webFonts: false } leaves out MJML's automatic Google Fonts imports
|
|
117
117
|
// (for fonts such as Roboto or Lato), when your mails must load nothing
|
|
118
118
|
// from third parties.
|
|
119
|
-
const { html, mjml, errors } = createMJMLCompiler().compile(doc);
|
|
119
|
+
const { html, mjml, errors } = await createMJMLCompiler().compile(doc);
|
|
120
120
|
return Response.json({ html, mjml, errors });
|
|
121
121
|
} catch (error) {
|
|
122
122
|
if (isTemplateMigrationError(error)) {
|
|
@@ -143,7 +143,7 @@ import { createMJMLCompiler } from '@marlinjai/email-editor-core/server';
|
|
|
143
143
|
|
|
144
144
|
export async function POST(request: Request) {
|
|
145
145
|
const format = new URL(request.url).searchParams.get('format') === 'mjml' ? 'mjml' : 'html';
|
|
146
|
-
const { html, mjml, errors } = createMJMLCompiler().compile(migrateTemplate(await request.json()));
|
|
146
|
+
const { html, mjml, errors } = await createMJMLCompiler().compile(migrateTemplate(await request.json()));
|
|
147
147
|
return new Response(format === 'mjml' ? mjml : html, {
|
|
148
148
|
headers: {
|
|
149
149
|
'content-type': format === 'mjml' ? 'text/plain; charset=utf-8' : 'text/html; charset=utf-8',
|
|
@@ -162,7 +162,7 @@ The editor's `getHTML()` and `getMJML()` cannot compile in the browser; call you
|
|
|
162
162
|
import { importMjml, isMjmlImportError } from '@marlinjai/email-editor-core/server';
|
|
163
163
|
|
|
164
164
|
try {
|
|
165
|
-
const { document, warnings } = importMjml(mjmlSource);
|
|
165
|
+
const { document, warnings } = await importMjml(mjmlSource);
|
|
166
166
|
// `document` passed migrateTemplate: open it in the editor, or store it.
|
|
167
167
|
// `warnings`: what could not become an editable block, with where and why.
|
|
168
168
|
} catch (error) {
|
package/dist/index.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { E as EditorOptions, a as EditorInstance } from './types-
|
|
2
|
-
export { b as EditorTheme, S as SavedSectionInput } from './types-
|
|
1
|
+
import { E as EditorOptions, a as EditorInstance } from './types-BVSyfGwc.mjs';
|
|
2
|
+
export { b as EditorTheme, S as SavedSectionInput } from './types-BVSyfGwc.mjs';
|
|
3
3
|
export { ImageRequest, OnRequestImage, OnSaveSection, RequestedImage } from '@marlinjai/email-editor-ui';
|
|
4
4
|
export { Block, BlockDefinition, Column, EmailTemplate, Section } from '@marlinjai/email-editor-core';
|
|
5
5
|
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { E as EditorOptions, a as EditorInstance } from './types-
|
|
2
|
-
export { b as EditorTheme, S as SavedSectionInput } from './types-
|
|
1
|
+
import { E as EditorOptions, a as EditorInstance } from './types-BVSyfGwc.js';
|
|
2
|
+
export { b as EditorTheme, S as SavedSectionInput } from './types-BVSyfGwc.js';
|
|
3
3
|
export { ImageRequest, OnRequestImage, OnSaveSection, RequestedImage } from '@marlinjai/email-editor-ui';
|
|
4
4
|
export { Block, BlockDefinition, Column, EmailTemplate, Section } from '@marlinjai/email-editor-core';
|
|
5
5
|
|
package/dist/index.js
CHANGED
|
@@ -98,6 +98,7 @@ function createEditor(options) {
|
|
|
98
98
|
builtInSections = true,
|
|
99
99
|
placeholderBase
|
|
100
100
|
} = options;
|
|
101
|
+
let policyErrors = options.policyErrors;
|
|
101
102
|
assertSupportedBlocks(blocks);
|
|
102
103
|
const registry = (0, import_email_editor_blocks.createStandardBlockRegistry)({ placeholderBase });
|
|
103
104
|
blocks.forEach((block) => {
|
|
@@ -131,6 +132,7 @@ function createEditor(options) {
|
|
|
131
132
|
onRequestImage,
|
|
132
133
|
onSaveSection,
|
|
133
134
|
savedSectionNames: savedSections.map((s) => s.name),
|
|
135
|
+
policyErrors,
|
|
134
136
|
style: themeToStyle(theme)
|
|
135
137
|
})
|
|
136
138
|
);
|
|
@@ -164,6 +166,10 @@ function createEditor(options) {
|
|
|
164
166
|
root.unmount();
|
|
165
167
|
root = null;
|
|
166
168
|
}
|
|
169
|
+
},
|
|
170
|
+
setPolicyErrors(errors) {
|
|
171
|
+
policyErrors = errors;
|
|
172
|
+
if (root) render();
|
|
167
173
|
}
|
|
168
174
|
};
|
|
169
175
|
}
|
package/dist/index.mjs
CHANGED
|
@@ -38,6 +38,7 @@ function createEditor(options) {
|
|
|
38
38
|
builtInSections = true,
|
|
39
39
|
placeholderBase
|
|
40
40
|
} = options;
|
|
41
|
+
let policyErrors = options.policyErrors;
|
|
41
42
|
assertSupportedBlocks(blocks);
|
|
42
43
|
const registry = createStandardBlockRegistry({ placeholderBase });
|
|
43
44
|
blocks.forEach((block) => {
|
|
@@ -71,6 +72,7 @@ function createEditor(options) {
|
|
|
71
72
|
onRequestImage,
|
|
72
73
|
onSaveSection,
|
|
73
74
|
savedSectionNames: savedSections.map((s) => s.name),
|
|
75
|
+
policyErrors,
|
|
74
76
|
style: themeToStyle(theme)
|
|
75
77
|
})
|
|
76
78
|
);
|
|
@@ -104,6 +106,10 @@ function createEditor(options) {
|
|
|
104
106
|
root.unmount();
|
|
105
107
|
root = null;
|
|
106
108
|
}
|
|
109
|
+
},
|
|
110
|
+
setPolicyErrors(errors) {
|
|
111
|
+
policyErrors = errors;
|
|
112
|
+
if (root) render();
|
|
107
113
|
}
|
|
108
114
|
};
|
|
109
115
|
}
|
package/dist/react.d.mts
CHANGED
|
@@ -1,9 +1,56 @@
|
|
|
1
1
|
import * as react from 'react';
|
|
2
|
-
import {
|
|
2
|
+
import { CSSProperties } from 'react';
|
|
3
|
+
import { TemplateSnapshotOut, TemplateSnapshotIn, BlockDefinition } from '@marlinjai/email-editor-core';
|
|
3
4
|
export { BlockDefinition, TemplateSnapshotIn, TemplateSnapshotOut } from '@marlinjai/email-editor-core';
|
|
4
5
|
import { OnRequestImage, OnSaveSection } from '@marlinjai/email-editor-ui';
|
|
5
6
|
export { ImageRequest, OnRequestImage, OnSaveSection, RequestedImage } from '@marlinjai/email-editor-ui';
|
|
6
|
-
import { b as EditorTheme, S as SavedSectionInput } from './types-
|
|
7
|
+
import { b as EditorTheme, S as SavedSectionInput } from './types-BVSyfGwc.mjs';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Two things about the editor are easy to get wrong, and getting either wrong
|
|
11
|
+
* loses somebody's work silently, so they live here rather than in each screen
|
|
12
|
+
* that embeds the editor:
|
|
13
|
+
*
|
|
14
|
+
* 1. **The editor reports a snapshot on mount.** It normalises what it was
|
|
15
|
+
* given, and says so. That first report is the baseline, not an edit: a
|
|
16
|
+
* screen that treated it as one would show "unsaved changes" on every open
|
|
17
|
+
* and would ask before leaving a document nobody touched. `touched` is set
|
|
18
|
+
* by a real interaction (a pointer or a key inside the editor), and only
|
|
19
|
+
* then does a report mean a change.
|
|
20
|
+
*
|
|
21
|
+
* 2. **The editor reports changes debounced.** The document it last reported
|
|
22
|
+
* may be one edit behind, so reading it the moment somebody presses Save
|
|
23
|
+
* would store the previous document and drop the edit just made. `settled()`
|
|
24
|
+
* waits out that window since the last interaction before reading.
|
|
25
|
+
*/
|
|
26
|
+
/** The store's own `onChange` debounce, plus a little room. */
|
|
27
|
+
declare const EDITOR_CHANGE_DEBOUNCE_MS = 300;
|
|
28
|
+
/** The document as a service stores it: the editor's snapshot without its local id. */
|
|
29
|
+
declare function toStoredDocument(snapshot: TemplateSnapshotOut | Record<string, unknown>): Record<string, unknown>;
|
|
30
|
+
type EditorDocument = {
|
|
31
|
+
/** Whether the person has changed anything since the last save. */
|
|
32
|
+
dirty: boolean;
|
|
33
|
+
setDirty: (dirty: boolean) => void;
|
|
34
|
+
/** Hand to the editor's `onChange`. */
|
|
35
|
+
onChange: (snapshot: TemplateSnapshotOut) => void;
|
|
36
|
+
/** Hand to the host element's `onPointerDownCapture` and `onKeyDownCapture`. */
|
|
37
|
+
interacted: () => void;
|
|
38
|
+
/** The current document, once the editor's debounce window has passed. */
|
|
39
|
+
settled: () => Promise<Record<string, unknown>>;
|
|
40
|
+
/** Replaces what is held, for a document loaded or rewritten from outside the editor. */
|
|
41
|
+
replace: (document: Record<string, unknown>, opts?: {
|
|
42
|
+
touched?: boolean;
|
|
43
|
+
}) => void;
|
|
44
|
+
/** What is held right now, without waiting. Prefer `settled()` before storing it. */
|
|
45
|
+
current: () => Record<string, unknown>;
|
|
46
|
+
};
|
|
47
|
+
declare function useEditorDocument(initial: Record<string, unknown>): EditorDocument;
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* CSS custom properties for the editor's root element. Returns an empty
|
|
51
|
+
* object when there is no theme, so the stylesheet defaults apply.
|
|
52
|
+
*/
|
|
53
|
+
declare function themeToStyle(theme: EditorTheme | undefined): CSSProperties;
|
|
7
54
|
|
|
8
55
|
interface EmailEditorReactProps {
|
|
9
56
|
/** Initial template data (uncontrolled) */
|
|
@@ -41,11 +88,13 @@ interface EmailEditorReactProps {
|
|
|
41
88
|
* section" action. Without it no action appears, rather than one that fails.
|
|
42
89
|
*/
|
|
43
90
|
onSaveSection?: OnSaveSection;
|
|
91
|
+
/** The messages of the host's most recent server compile, when it refused something; a badge in the toolbar. See `EditorOptions.policyErrors`. */
|
|
92
|
+
policyErrors?: string[];
|
|
44
93
|
}
|
|
45
94
|
/**
|
|
46
95
|
* React wrapper for email editor
|
|
47
96
|
* Convenience component for React applications
|
|
48
97
|
*/
|
|
49
|
-
declare function EmailEditorReact({ initialTemplate, onChange, theme, blocks, onSave, onExport, onNavigateBack, onRequestImage, savedSections, onSaveSection, builtInSections, placeholderBase, }: EmailEditorReactProps): react.JSX.Element;
|
|
98
|
+
declare function EmailEditorReact({ initialTemplate, onChange, theme, blocks, onSave, onExport, onNavigateBack, onRequestImage, savedSections, onSaveSection, builtInSections, placeholderBase, policyErrors, }: EmailEditorReactProps): react.JSX.Element;
|
|
50
99
|
|
|
51
|
-
export { EditorTheme, EmailEditorReact, SavedSectionInput };
|
|
100
|
+
export { EDITOR_CHANGE_DEBOUNCE_MS, type EditorDocument, EditorTheme, EmailEditorReact, type EmailEditorReactProps, SavedSectionInput, themeToStyle, toStoredDocument, useEditorDocument };
|
package/dist/react.d.ts
CHANGED
|
@@ -1,9 +1,56 @@
|
|
|
1
1
|
import * as react from 'react';
|
|
2
|
-
import {
|
|
2
|
+
import { CSSProperties } from 'react';
|
|
3
|
+
import { TemplateSnapshotOut, TemplateSnapshotIn, BlockDefinition } from '@marlinjai/email-editor-core';
|
|
3
4
|
export { BlockDefinition, TemplateSnapshotIn, TemplateSnapshotOut } from '@marlinjai/email-editor-core';
|
|
4
5
|
import { OnRequestImage, OnSaveSection } from '@marlinjai/email-editor-ui';
|
|
5
6
|
export { ImageRequest, OnRequestImage, OnSaveSection, RequestedImage } from '@marlinjai/email-editor-ui';
|
|
6
|
-
import { b as EditorTheme, S as SavedSectionInput } from './types-
|
|
7
|
+
import { b as EditorTheme, S as SavedSectionInput } from './types-BVSyfGwc.js';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Two things about the editor are easy to get wrong, and getting either wrong
|
|
11
|
+
* loses somebody's work silently, so they live here rather than in each screen
|
|
12
|
+
* that embeds the editor:
|
|
13
|
+
*
|
|
14
|
+
* 1. **The editor reports a snapshot on mount.** It normalises what it was
|
|
15
|
+
* given, and says so. That first report is the baseline, not an edit: a
|
|
16
|
+
* screen that treated it as one would show "unsaved changes" on every open
|
|
17
|
+
* and would ask before leaving a document nobody touched. `touched` is set
|
|
18
|
+
* by a real interaction (a pointer or a key inside the editor), and only
|
|
19
|
+
* then does a report mean a change.
|
|
20
|
+
*
|
|
21
|
+
* 2. **The editor reports changes debounced.** The document it last reported
|
|
22
|
+
* may be one edit behind, so reading it the moment somebody presses Save
|
|
23
|
+
* would store the previous document and drop the edit just made. `settled()`
|
|
24
|
+
* waits out that window since the last interaction before reading.
|
|
25
|
+
*/
|
|
26
|
+
/** The store's own `onChange` debounce, plus a little room. */
|
|
27
|
+
declare const EDITOR_CHANGE_DEBOUNCE_MS = 300;
|
|
28
|
+
/** The document as a service stores it: the editor's snapshot without its local id. */
|
|
29
|
+
declare function toStoredDocument(snapshot: TemplateSnapshotOut | Record<string, unknown>): Record<string, unknown>;
|
|
30
|
+
type EditorDocument = {
|
|
31
|
+
/** Whether the person has changed anything since the last save. */
|
|
32
|
+
dirty: boolean;
|
|
33
|
+
setDirty: (dirty: boolean) => void;
|
|
34
|
+
/** Hand to the editor's `onChange`. */
|
|
35
|
+
onChange: (snapshot: TemplateSnapshotOut) => void;
|
|
36
|
+
/** Hand to the host element's `onPointerDownCapture` and `onKeyDownCapture`. */
|
|
37
|
+
interacted: () => void;
|
|
38
|
+
/** The current document, once the editor's debounce window has passed. */
|
|
39
|
+
settled: () => Promise<Record<string, unknown>>;
|
|
40
|
+
/** Replaces what is held, for a document loaded or rewritten from outside the editor. */
|
|
41
|
+
replace: (document: Record<string, unknown>, opts?: {
|
|
42
|
+
touched?: boolean;
|
|
43
|
+
}) => void;
|
|
44
|
+
/** What is held right now, without waiting. Prefer `settled()` before storing it. */
|
|
45
|
+
current: () => Record<string, unknown>;
|
|
46
|
+
};
|
|
47
|
+
declare function useEditorDocument(initial: Record<string, unknown>): EditorDocument;
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* CSS custom properties for the editor's root element. Returns an empty
|
|
51
|
+
* object when there is no theme, so the stylesheet defaults apply.
|
|
52
|
+
*/
|
|
53
|
+
declare function themeToStyle(theme: EditorTheme | undefined): CSSProperties;
|
|
7
54
|
|
|
8
55
|
interface EmailEditorReactProps {
|
|
9
56
|
/** Initial template data (uncontrolled) */
|
|
@@ -41,11 +88,13 @@ interface EmailEditorReactProps {
|
|
|
41
88
|
* section" action. Without it no action appears, rather than one that fails.
|
|
42
89
|
*/
|
|
43
90
|
onSaveSection?: OnSaveSection;
|
|
91
|
+
/** The messages of the host's most recent server compile, when it refused something; a badge in the toolbar. See `EditorOptions.policyErrors`. */
|
|
92
|
+
policyErrors?: string[];
|
|
44
93
|
}
|
|
45
94
|
/**
|
|
46
95
|
* React wrapper for email editor
|
|
47
96
|
* Convenience component for React applications
|
|
48
97
|
*/
|
|
49
|
-
declare function EmailEditorReact({ initialTemplate, onChange, theme, blocks, onSave, onExport, onNavigateBack, onRequestImage, savedSections, onSaveSection, builtInSections, placeholderBase, }: EmailEditorReactProps): react.JSX.Element;
|
|
98
|
+
declare function EmailEditorReact({ initialTemplate, onChange, theme, blocks, onSave, onExport, onNavigateBack, onRequestImage, savedSections, onSaveSection, builtInSections, placeholderBase, policyErrors, }: EmailEditorReactProps): react.JSX.Element;
|
|
50
99
|
|
|
51
|
-
export { EditorTheme, EmailEditorReact, SavedSectionInput };
|
|
100
|
+
export { EDITOR_CHANGE_DEBOUNCE_MS, type EditorDocument, EditorTheme, EmailEditorReact, type EmailEditorReactProps, SavedSectionInput, themeToStyle, toStoredDocument, useEditorDocument };
|
package/dist/react.js
CHANGED
|
@@ -20,11 +20,15 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
20
20
|
// src/react.tsx
|
|
21
21
|
var react_exports = {};
|
|
22
22
|
__export(react_exports, {
|
|
23
|
-
|
|
23
|
+
EDITOR_CHANGE_DEBOUNCE_MS: () => EDITOR_CHANGE_DEBOUNCE_MS,
|
|
24
|
+
EmailEditorReact: () => EmailEditorReact,
|
|
25
|
+
themeToStyle: () => themeToStyle,
|
|
26
|
+
toStoredDocument: () => toStoredDocument,
|
|
27
|
+
useEditorDocument: () => useEditorDocument
|
|
24
28
|
});
|
|
25
29
|
module.exports = __toCommonJS(react_exports);
|
|
26
|
-
var
|
|
27
|
-
var
|
|
30
|
+
var import_react2 = require("react");
|
|
31
|
+
var import_email_editor_core3 = require("@marlinjai/email-editor-core");
|
|
28
32
|
var import_email_editor_blocks = require("@marlinjai/email-editor-blocks");
|
|
29
33
|
var import_email_editor_ui = require("@marlinjai/email-editor-ui");
|
|
30
34
|
|
|
@@ -70,6 +74,47 @@ function assertSupportedBlocks(blocks) {
|
|
|
70
74
|
}
|
|
71
75
|
}
|
|
72
76
|
|
|
77
|
+
// src/editorDocument.ts
|
|
78
|
+
var import_react = require("react");
|
|
79
|
+
var import_email_editor_core2 = require("@marlinjai/email-editor-core");
|
|
80
|
+
var EDITOR_CHANGE_DEBOUNCE_MS = import_email_editor_core2.DEFAULT_ON_CHANGE_DEBOUNCE_MS;
|
|
81
|
+
var SETTLE_MARGIN_MS = 100;
|
|
82
|
+
function toStoredDocument(snapshot) {
|
|
83
|
+
const { id: _id, ...rest } = snapshot;
|
|
84
|
+
return rest;
|
|
85
|
+
}
|
|
86
|
+
function useEditorDocument(initial) {
|
|
87
|
+
const [dirty, setDirty] = (0, import_react.useState)(false);
|
|
88
|
+
const latest = (0, import_react.useRef)(toStoredDocument(initial));
|
|
89
|
+
const touched = (0, import_react.useRef)(false);
|
|
90
|
+
const lastInteraction = (0, import_react.useRef)(0);
|
|
91
|
+
const onChange = (0, import_react.useCallback)((snapshot) => {
|
|
92
|
+
latest.current = toStoredDocument(snapshot);
|
|
93
|
+
if (touched.current) setDirty(true);
|
|
94
|
+
}, []);
|
|
95
|
+
const interacted = (0, import_react.useCallback)(() => {
|
|
96
|
+
touched.current = true;
|
|
97
|
+
lastInteraction.current = Date.now();
|
|
98
|
+
}, []);
|
|
99
|
+
const settled = (0, import_react.useCallback)(async () => {
|
|
100
|
+
const wait = lastInteraction.current + EDITOR_CHANGE_DEBOUNCE_MS + SETTLE_MARGIN_MS - Date.now();
|
|
101
|
+
if (wait > 0) await new Promise((r) => setTimeout(r, wait));
|
|
102
|
+
return latest.current;
|
|
103
|
+
}, []);
|
|
104
|
+
const replace = (0, import_react.useCallback)((document, opts = {}) => {
|
|
105
|
+
latest.current = toStoredDocument(document);
|
|
106
|
+
if (opts.touched) {
|
|
107
|
+
touched.current = true;
|
|
108
|
+
setDirty(true);
|
|
109
|
+
} else {
|
|
110
|
+
touched.current = false;
|
|
111
|
+
setDirty(false);
|
|
112
|
+
}
|
|
113
|
+
}, []);
|
|
114
|
+
const current = (0, import_react.useCallback)(() => latest.current, []);
|
|
115
|
+
return { dirty, setDirty, onChange, interacted, settled, replace, current };
|
|
116
|
+
}
|
|
117
|
+
|
|
73
118
|
// src/react.tsx
|
|
74
119
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
75
120
|
function EmailEditorReact({
|
|
@@ -84,9 +129,10 @@ function EmailEditorReact({
|
|
|
84
129
|
savedSections,
|
|
85
130
|
onSaveSection,
|
|
86
131
|
builtInSections = true,
|
|
87
|
-
placeholderBase
|
|
132
|
+
placeholderBase,
|
|
133
|
+
policyErrors
|
|
88
134
|
}) {
|
|
89
|
-
const [registry] = (0,
|
|
135
|
+
const [registry] = (0, import_react2.useState)(() => {
|
|
90
136
|
assertSupportedBlocks(blocks);
|
|
91
137
|
const reg = (0, import_email_editor_blocks.createStandardBlockRegistry)({ placeholderBase });
|
|
92
138
|
blocks.forEach((block) => {
|
|
@@ -95,13 +141,13 @@ function EmailEditorReact({
|
|
|
95
141
|
});
|
|
96
142
|
return reg;
|
|
97
143
|
});
|
|
98
|
-
const [prebuiltRegistry] = (0,
|
|
99
|
-
const reg = builtInSections ? (0, import_email_editor_blocks.createStandardPrebuiltRegistry)({ placeholderBase }) : (0,
|
|
144
|
+
const [prebuiltRegistry] = (0, import_react2.useState)(() => {
|
|
145
|
+
const reg = builtInSections ? (0, import_email_editor_blocks.createStandardPrebuiltRegistry)({ placeholderBase }) : (0, import_email_editor_core3.createPrebuiltTemplateRegistry)();
|
|
100
146
|
registerSavedSections(reg, savedSections ?? []);
|
|
101
147
|
return reg;
|
|
102
148
|
});
|
|
103
|
-
const savedSectionNames = (0,
|
|
104
|
-
const style = (0,
|
|
149
|
+
const savedSectionNames = (0, import_react2.useMemo)(() => (savedSections ?? []).map((s) => s.name), [savedSections]);
|
|
150
|
+
const style = (0, import_react2.useMemo)(() => themeToStyle(theme), [theme]);
|
|
105
151
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
106
152
|
import_email_editor_ui.EmailEditor,
|
|
107
153
|
{
|
|
@@ -115,11 +161,16 @@ function EmailEditorReact({
|
|
|
115
161
|
onRequestImage,
|
|
116
162
|
onSaveSection,
|
|
117
163
|
savedSectionNames,
|
|
164
|
+
policyErrors,
|
|
118
165
|
style
|
|
119
166
|
}
|
|
120
167
|
);
|
|
121
168
|
}
|
|
122
169
|
// Annotate the CommonJS export names for ESM import in node:
|
|
123
170
|
0 && (module.exports = {
|
|
124
|
-
|
|
171
|
+
EDITOR_CHANGE_DEBOUNCE_MS,
|
|
172
|
+
EmailEditorReact,
|
|
173
|
+
themeToStyle,
|
|
174
|
+
toStoredDocument,
|
|
175
|
+
useEditorDocument
|
|
125
176
|
});
|
package/dist/react.mjs
CHANGED
|
@@ -5,10 +5,53 @@ import {
|
|
|
5
5
|
} from "./chunk-EFHKH3BN.mjs";
|
|
6
6
|
|
|
7
7
|
// src/react.tsx
|
|
8
|
-
import { useMemo, useState } from "react";
|
|
8
|
+
import { useMemo, useState as useState2 } from "react";
|
|
9
9
|
import { createPrebuiltTemplateRegistry } from "@marlinjai/email-editor-core";
|
|
10
10
|
import { createStandardBlockRegistry, createStandardPrebuiltRegistry } from "@marlinjai/email-editor-blocks";
|
|
11
11
|
import { EmailEditor } from "@marlinjai/email-editor-ui";
|
|
12
|
+
|
|
13
|
+
// src/editorDocument.ts
|
|
14
|
+
import { useCallback, useRef, useState } from "react";
|
|
15
|
+
import { DEFAULT_ON_CHANGE_DEBOUNCE_MS } from "@marlinjai/email-editor-core";
|
|
16
|
+
var EDITOR_CHANGE_DEBOUNCE_MS = DEFAULT_ON_CHANGE_DEBOUNCE_MS;
|
|
17
|
+
var SETTLE_MARGIN_MS = 100;
|
|
18
|
+
function toStoredDocument(snapshot) {
|
|
19
|
+
const { id: _id, ...rest } = snapshot;
|
|
20
|
+
return rest;
|
|
21
|
+
}
|
|
22
|
+
function useEditorDocument(initial) {
|
|
23
|
+
const [dirty, setDirty] = useState(false);
|
|
24
|
+
const latest = useRef(toStoredDocument(initial));
|
|
25
|
+
const touched = useRef(false);
|
|
26
|
+
const lastInteraction = useRef(0);
|
|
27
|
+
const onChange = useCallback((snapshot) => {
|
|
28
|
+
latest.current = toStoredDocument(snapshot);
|
|
29
|
+
if (touched.current) setDirty(true);
|
|
30
|
+
}, []);
|
|
31
|
+
const interacted = useCallback(() => {
|
|
32
|
+
touched.current = true;
|
|
33
|
+
lastInteraction.current = Date.now();
|
|
34
|
+
}, []);
|
|
35
|
+
const settled = useCallback(async () => {
|
|
36
|
+
const wait = lastInteraction.current + EDITOR_CHANGE_DEBOUNCE_MS + SETTLE_MARGIN_MS - Date.now();
|
|
37
|
+
if (wait > 0) await new Promise((r) => setTimeout(r, wait));
|
|
38
|
+
return latest.current;
|
|
39
|
+
}, []);
|
|
40
|
+
const replace = useCallback((document, opts = {}) => {
|
|
41
|
+
latest.current = toStoredDocument(document);
|
|
42
|
+
if (opts.touched) {
|
|
43
|
+
touched.current = true;
|
|
44
|
+
setDirty(true);
|
|
45
|
+
} else {
|
|
46
|
+
touched.current = false;
|
|
47
|
+
setDirty(false);
|
|
48
|
+
}
|
|
49
|
+
}, []);
|
|
50
|
+
const current = useCallback(() => latest.current, []);
|
|
51
|
+
return { dirty, setDirty, onChange, interacted, settled, replace, current };
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// src/react.tsx
|
|
12
55
|
import { jsx } from "react/jsx-runtime";
|
|
13
56
|
function EmailEditorReact({
|
|
14
57
|
initialTemplate,
|
|
@@ -22,9 +65,10 @@ function EmailEditorReact({
|
|
|
22
65
|
savedSections,
|
|
23
66
|
onSaveSection,
|
|
24
67
|
builtInSections = true,
|
|
25
|
-
placeholderBase
|
|
68
|
+
placeholderBase,
|
|
69
|
+
policyErrors
|
|
26
70
|
}) {
|
|
27
|
-
const [registry] =
|
|
71
|
+
const [registry] = useState2(() => {
|
|
28
72
|
assertSupportedBlocks(blocks);
|
|
29
73
|
const reg = createStandardBlockRegistry({ placeholderBase });
|
|
30
74
|
blocks.forEach((block) => {
|
|
@@ -33,7 +77,7 @@ function EmailEditorReact({
|
|
|
33
77
|
});
|
|
34
78
|
return reg;
|
|
35
79
|
});
|
|
36
|
-
const [prebuiltRegistry] =
|
|
80
|
+
const [prebuiltRegistry] = useState2(() => {
|
|
37
81
|
const reg = builtInSections ? createStandardPrebuiltRegistry({ placeholderBase }) : createPrebuiltTemplateRegistry();
|
|
38
82
|
registerSavedSections(reg, savedSections ?? []);
|
|
39
83
|
return reg;
|
|
@@ -53,10 +97,15 @@ function EmailEditorReact({
|
|
|
53
97
|
onRequestImage,
|
|
54
98
|
onSaveSection,
|
|
55
99
|
savedSectionNames,
|
|
100
|
+
policyErrors,
|
|
56
101
|
style
|
|
57
102
|
}
|
|
58
103
|
);
|
|
59
104
|
}
|
|
60
105
|
export {
|
|
61
|
-
|
|
106
|
+
EDITOR_CHANGE_DEBOUNCE_MS,
|
|
107
|
+
EmailEditorReact,
|
|
108
|
+
themeToStyle,
|
|
109
|
+
toStoredDocument,
|
|
110
|
+
useEditorDocument
|
|
62
111
|
};
|
package/dist/styles.css
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
.ee-root *,.ee-root :after,.ee-root :before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }.ee-root ::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }
|
|
2
2
|
|
|
3
|
-
/*! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com*/.ee-root *,.ee-root :after,.ee-root :before{box-sizing:border-box;border:0 solid #e5e7eb}.ee-root :after,.ee-root :before{--tw-content:""}.ee-root{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:var(--ee-font-sans);font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}.ee-root{margin:0;line-height:inherit}.ee-root hr{height:0;color:inherit;border-top-width:1px}.ee-root abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.ee-root h1,.ee-root h2,.ee-root h3,.ee-root h4,.ee-root h5,.ee-root h6{font-size:inherit;font-weight:inherit}.ee-root a{color:inherit;text-decoration:inherit}.ee-root b,.ee-root strong{font-weight:bolder}.ee-root code,.ee-root kbd,.ee-root pre,.ee-root samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}.ee-root small{font-size:80%}.ee-root sub,.ee-root sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}.ee-root sub{bottom:-.25em}.ee-root sup{top:-.5em}.ee-root table{text-indent:0;border-color:inherit;border-collapse:collapse}.ee-root button,.ee-root input,.ee-root optgroup,.ee-root select,.ee-root textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}.ee-root button,.ee-root select{text-transform:none}.ee-root button,.ee-root input:where([type=button]),.ee-root input:where([type=reset]),.ee-root input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}.ee-root :-moz-focusring{outline:auto}.ee-root :-moz-ui-invalid{box-shadow:none}.ee-root progress{vertical-align:baseline}.ee-root ::-webkit-inner-spin-button,.ee-root ::-webkit-outer-spin-button{height:auto}.ee-root [type=search]{-webkit-appearance:textfield;outline-offset:-2px}.ee-root ::-webkit-search-decoration{-webkit-appearance:none}.ee-root ::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}.ee-root summary{display:list-item}.ee-root blockquote,.ee-root dd,.ee-root dl,.ee-root figure,.ee-root h1,.ee-root h2,.ee-root h3,.ee-root h4,.ee-root h5,.ee-root h6,.ee-root hr,.ee-root p,.ee-root pre{margin:0}.ee-root fieldset{margin:0;padding:0}.ee-root legend{padding:0}.ee-root menu,.ee-root ol,.ee-root ul{list-style:none;margin:0;padding:0}.ee-root dialog{padding:0}.ee-root textarea{resize:vertical}.ee-root input::-moz-placeholder,.ee-root textarea::-moz-placeholder{opacity:1;color:#9ca3af}.ee-root input::placeholder,.ee-root textarea::placeholder{opacity:1;color:#9ca3af}.ee-root [role=button],.ee-root button{cursor:pointer}.ee-root :disabled{cursor:default}.ee-root audio,.ee-root canvas,.ee-root embed,.ee-root iframe,.ee-root img,.ee-root object,.ee-root svg,.ee-root video{display:block;vertical-align:middle}.ee-root img,.ee-root video{max-width:100%;height:auto}.ee-root [hidden]:where(:not([hidden=until-found])){display:none}.ee-root *{border-color:var(--ee-border-light)}.ee-root{font-family:var(--ee-font-sans);color:var(--ee-text-dark)}.ee-root .container{width:100%}@media (min-width:640px){.ee-root .container{max-width:640px}}@media (min-width:768px){.ee-root .container{max-width:768px}}@media (min-width:1024px){.ee-root .container{max-width:1024px}}@media (min-width:1280px){.ee-root .container{max-width:1280px}}@media (min-width:1536px){.ee-root .container{max-width:1536px}}.ee-root .pointer-events-none{pointer-events:none}.ee-root .visible{visibility:visible}.ee-root .collapse{visibility:collapse}.ee-root .fixed{position:fixed}.ee-root .absolute{position:absolute}.ee-root .relative{position:relative}.ee-root .inset-0{inset:0}.ee-root .inset-x-0{left:0;right:0}.ee-root .-top-5{top:-1.25rem}.ee-root .bottom-0{bottom:0}.ee-root .bottom-3{bottom:.75rem}.ee-root .left-0{left:0}.ee-root .left-1\/2{left:50%}.ee-root .right-0{right:0}.ee-root .right-1{right:.25rem}.ee-root .right-3{right:.75rem}.ee-root .top-0{top:0}.ee-root .top-1{top:.25rem}.ee-root .top-1\/2{top:50%}.ee-root .z-10{z-index:10}.ee-root .z-20{z-index:20}.ee-root .z-30{z-index:30}.ee-root .z-50{z-index:50}.ee-root .z-\[5\]{z-index:5}.ee-root .m-4{margin:1rem}.ee-root .mx-1{margin-left:.25rem;margin-right:.25rem}.ee-root .mx-4{margin-left:1rem;margin-right:1rem}.ee-root .my-0\.5{margin-top:.125rem;margin-bottom:.125rem}.ee-root .my-1{margin-top:.25rem;margin-bottom:.25rem}.ee-root .my-2{margin-top:.5rem;margin-bottom:.5rem}.ee-root .my-4{margin-top:1rem;margin-bottom:1rem}.ee-root .mb-1{margin-bottom:.25rem}.ee-root .mb-1\.5{margin-bottom:.375rem}.ee-root .mb-2{margin-bottom:.5rem}.ee-root .mb-3{margin-bottom:.75rem}.ee-root .mb-4{margin-bottom:1rem}.ee-root .ml-1{margin-left:.25rem}.ee-root .ml-2{margin-left:.5rem}.ee-root .ml-3{margin-left:.75rem}.ee-root .ml-4{margin-left:1rem}.ee-root .ml-6{margin-left:1.5rem}.ee-root .ml-auto{margin-left:auto}.ee-root .mt-0\.5{margin-top:.125rem}.ee-root .mt-1{margin-top:.25rem}.ee-root .mt-2{margin-top:.5rem}.ee-root .mt-3{margin-top:.75rem}.ee-root .mt-4{margin-top:1rem}.ee-root .mt-6{margin-top:1.5rem}.ee-root .\!block{display:block!important}.ee-root .block{display:block}.ee-root .inline-block{display:inline-block}.ee-root .inline{display:inline}.ee-root .flex{display:flex}.ee-root .inline-flex{display:inline-flex}.ee-root .table{display:table}.ee-root .grid{display:grid}.ee-root .contents{display:contents}.ee-root .hidden{display:none}.ee-root .h-1{height:.25rem}.ee-root .h-16{height:4rem}.ee-root .h-2{height:.5rem}.ee-root .h-6{height:1.5rem}.ee-root .h-7{height:1.75rem}.ee-root .h-8{height:2rem}.ee-root .h-\[min\(880px\2c 92vh\)\]{height:min(880px,92vh)}.ee-root .h-full{height:100%}.ee-root .min-h-\[20px\]{min-height:20px}.ee-root .min-h-\[400px\]{min-height:400px}.ee-root .min-h-\[80px\]{min-height:80px}.ee-root .w-10{width:2.5rem}.ee-root .w-12{width:3rem}.ee-root .w-16{width:4rem}.ee-root .w-4{width:1rem}.ee-root .w-6{width:1.5rem}.ee-root .w-64{width:16rem}.ee-root .w-7{width:1.75rem}.ee-root .w-72{width:18rem}.ee-root .w-8{width:2rem}.ee-root .w-\[min\(1280px\2c 95vw\)\]{width:min(1280px,95vw)}.ee-root .w-\[min\(440px\2c 92vw\)\]{width:min(440px,92vw)}.ee-root .w-full{width:100%}.ee-root .w-px{width:1px}.ee-root .min-w-0{min-width:0}.ee-root .min-w-\[140px\]{min-width:140px}.ee-root .max-w-md{max-width:28rem}.ee-root .flex-1{flex:1 1 0%}.ee-root .flex-shrink-0,.ee-root .shrink-0{flex-shrink:0}.ee-root .-translate-x-1\/2{--tw-translate-x:-50%}.ee-root .-translate-x-1\/2,.ee-root .-translate-y-1\/2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.ee-root .-translate-y-1\/2{--tw-translate-y:-50%}.ee-root .translate-y-1{--tw-translate-y:0.25rem}.ee-root .rotate-90,.ee-root .translate-y-1{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.ee-root .rotate-90{--tw-rotate:90deg}.ee-root .transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes ee-spin{to{transform:rotate(1turn)}}.ee-root .animate-spin{animation:ee-spin 1s linear infinite}.ee-root .cursor-grab{cursor:grab}.ee-root .cursor-not-allowed{cursor:not-allowed}.ee-root .cursor-pointer{cursor:pointer}.ee-root .grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.ee-root .grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.ee-root .grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.ee-root .grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.ee-root .flex-col{flex-direction:column}.ee-root .flex-wrap{flex-wrap:wrap}.ee-root .items-start{align-items:flex-start}.ee-root .items-center{align-items:center}.ee-root .items-baseline{align-items:baseline}.ee-root .justify-end{justify-content:flex-end}.ee-root .justify-center{justify-content:center}.ee-root .justify-between{justify-content:space-between}.ee-root .gap-1{gap:.25rem}.ee-root .gap-1\.5{gap:.375rem}.ee-root .gap-2{gap:.5rem}.ee-root .gap-3{gap:.75rem}.ee-root .gap-4{gap:1rem}.ee-root .gap-6{gap:1.5rem}.ee-root .space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.ee-root .space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.ee-root .space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem*var(--tw-space-y-reverse))}.ee-root .space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.ee-root .overflow-auto{overflow:auto}.ee-root .overflow-hidden{overflow:hidden}.ee-root .overflow-y-auto{overflow-y:auto}.ee-root .truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ee-root .rounded{border-radius:.25rem}.ee-root .rounded-2xl{border-radius:1rem}.ee-root .rounded-full{border-radius:9999px}.ee-root .rounded-lg{border-radius:.5rem}.ee-root .rounded-md{border-radius:.375rem}.ee-root .rounded-sm{border-radius:.125rem}.ee-root .rounded-xl{border-radius:.75rem}.ee-root .rounded-b{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.ee-root .rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.ee-root .rounded-bl{border-bottom-left-radius:.25rem}.ee-root .rounded-br{border-bottom-right-radius:.25rem}.ee-root .border{border-width:1px}.ee-root .border-2{border-width:2px}.ee-root .border-b{border-bottom-width:1px}.ee-root .border-b-2{border-bottom-width:2px}.ee-root .border-l{border-left-width:1px}.ee-root .border-l-2{border-left-width:2px}.ee-root .border-r{border-right-width:1px}.ee-root .border-t{border-top-width:1px}.ee-root .border-dashed{border-style:dashed}.ee-root .border-accent{border-color:var(--ee-accent)}.ee-root .border-amber-300{--tw-border-opacity:1;border-color:rgb(252 211 77/var(--tw-border-opacity,1))}.ee-root .border-black\/\[0\.04\]{border-color:rgba(0,0,0,.04)}.ee-root .border-blue-500{--tw-border-opacity:1;border-color:rgb(59 130 246/var(--tw-border-opacity,1))}.ee-root .border-border-default{border-color:var(--ee-border-default)}.ee-root .border-border-light,.ee-root .border-brand-border{border-color:var(--ee-border-light)}.ee-root .border-brand-primary{border-color:var(--ee-accent)}.ee-root .border-gray-200{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity,1))}.ee-root .border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity,1))}.ee-root .border-red-200{--tw-border-opacity:1;border-color:rgb(254 202 202/var(--tw-border-opacity,1))}.ee-root .border-red-300{--tw-border-opacity:1;border-color:rgb(252 165 165/var(--tw-border-opacity,1))}.ee-root .border-red-400{--tw-border-opacity:1;border-color:rgb(248 113 113/var(--tw-border-opacity,1))}.ee-root .border-violet-200{--tw-border-opacity:1;border-color:rgb(221 214 254/var(--tw-border-opacity,1))}.ee-root .border-violet-300{--tw-border-opacity:1;border-color:rgb(196 181 253/var(--tw-border-opacity,1))}.ee-root .border-yellow-200{--tw-border-opacity:1;border-color:rgb(254 240 138/var(--tw-border-opacity,1))}.ee-root .bg-\[\#fafaf7\]{--tw-bg-opacity:1;background-color:rgb(250 250 247/var(--tw-bg-opacity,1))}.ee-root .bg-accent{background-color:var(--ee-accent)}.ee-root .bg-accent-muted{background-color:var(--ee-accent-muted)}.ee-root .bg-amber-100{--tw-bg-opacity:1;background-color:rgb(254 243 199/var(--tw-bg-opacity,1))}.ee-root .bg-amber-50{--tw-bg-opacity:1;background-color:rgb(255 251 235/var(--tw-bg-opacity,1))}.ee-root .bg-amber-500{--tw-bg-opacity:1;background-color:rgb(245 158 11/var(--tw-bg-opacity,1))}.ee-root .bg-black\/50{background-color:rgba(0,0,0,.5)}.ee-root .bg-black\/60{background-color:rgba(0,0,0,.6)}.ee-root .bg-black\/\[0\.04\]{background-color:rgba(0,0,0,.04)}.ee-root .bg-blue-100{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity,1))}.ee-root .bg-blue-400{--tw-bg-opacity:1;background-color:rgb(96 165 250/var(--tw-bg-opacity,1))}.ee-root .bg-blue-50{--tw-bg-opacity:1;background-color:rgb(239 246 255/var(--tw-bg-opacity,1))}.ee-root .bg-blue-500{--tw-bg-opacity:1;background-color:rgb(59 130 246/var(--tw-bg-opacity,1))}.ee-root .bg-canvas-1{background-color:var(--ee-canvas-1)}.ee-root .bg-canvas-2{background-color:var(--ee-canvas-2)}.ee-root .bg-canvas-3{background-color:var(--ee-canvas-3)}.ee-root .bg-emerald-600{--tw-bg-opacity:1;background-color:rgb(5 150 105/var(--tw-bg-opacity,1))}.ee-root .bg-gray-100{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.ee-root .bg-gray-300{--tw-bg-opacity:1;background-color:rgb(209 213 219/var(--tw-bg-opacity,1))}.ee-root .bg-gray-50{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.ee-root .bg-midnight-2{background-color:var(--ee-midnight-2)}.ee-root .bg-midnight-3{background-color:var(--ee-midnight-3)}.ee-root .bg-midnight-4{background-color:var(--ee-midnight-4)}.ee-root .bg-red-500{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity,1))}.ee-root .bg-red-600{--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity,1))}.ee-root .bg-transparent{background-color:transparent}.ee-root .bg-violet-100{--tw-bg-opacity:1;background-color:rgb(237 233 254/var(--tw-bg-opacity,1))}.ee-root .bg-violet-50{--tw-bg-opacity:1;background-color:rgb(245 243 255/var(--tw-bg-opacity,1))}.ee-root .bg-violet-600{--tw-bg-opacity:1;background-color:rgb(124 58 237/var(--tw-bg-opacity,1))}.ee-root .bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.ee-root .bg-yellow-50{--tw-bg-opacity:1;background-color:rgb(254 252 232/var(--tw-bg-opacity,1))}.ee-root .bg-gradient-to-b{background-image:linear-gradient(to bottom,var(--tw-gradient-stops))}.ee-root .from-transparent{--tw-gradient-from:transparent var(--tw-gradient-from-position);--tw-gradient-to:transparent var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.ee-root .to-white{--tw-gradient-to:#fff var(--tw-gradient-to-position)}.ee-root .p-0\.5{padding:.125rem}.ee-root .p-1{padding:.25rem}.ee-root .p-1\.5{padding:.375rem}.ee-root .p-12{padding:3rem}.ee-root .p-2{padding:.5rem}.ee-root .p-3{padding:.75rem}.ee-root .p-4{padding:1rem}.ee-root .p-6{padding:1.5rem}.ee-root .p-8{padding:2rem}.ee-root .px-1{padding-left:.25rem;padding-right:.25rem}.ee-root .px-1\.5{padding-left:.375rem;padding-right:.375rem}.ee-root .px-2{padding-left:.5rem;padding-right:.5rem}.ee-root .px-3{padding-left:.75rem;padding-right:.75rem}.ee-root .px-4{padding-left:1rem;padding-right:1rem}.ee-root .px-8{padding-left:2rem;padding-right:2rem}.ee-root .py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.ee-root .py-1{padding-top:.25rem;padding-bottom:.25rem}.ee-root .py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.ee-root .py-16{padding-top:4rem;padding-bottom:4rem}.ee-root .py-2{padding-top:.5rem;padding-bottom:.5rem}.ee-root .py-3{padding-top:.75rem;padding-bottom:.75rem}.ee-root .py-8{padding-top:2rem;padding-bottom:2rem}.ee-root .pb-1{padding-bottom:.25rem}.ee-root .pb-5{padding-bottom:1.25rem}.ee-root .pb-8{padding-bottom:2rem}.ee-root .pl-1{padding-left:.25rem}.ee-root .pt-3{padding-top:.75rem}.ee-root .pt-7{padding-top:1.75rem}.ee-root .text-left{text-align:left}.ee-root .text-center{text-align:center}.ee-root .text-right{text-align:right}.ee-root .align-top{vertical-align:top}.ee-root .align-middle{vertical-align:middle}.ee-root .font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.ee-root .font-serif{font-family:ui-serif,Georgia,Cambria,Times New Roman,Times,serif}.ee-root .text-4xl{font-size:2.25rem;line-height:2.5rem}.ee-root .text-\[10px\]{font-size:10px}.ee-root .text-\[11px\]{font-size:11px}.ee-root .text-\[15px\]{font-size:15px}.ee-root .text-\[28px\]{font-size:28px}.ee-root .text-base{font-size:1rem;line-height:1.5rem}.ee-root .text-lg{font-size:1.125rem;line-height:1.75rem}.ee-root .text-sm{font-size:.875rem;line-height:1.25rem}.ee-root .text-xs{font-size:.75rem;line-height:1rem}.ee-root .font-medium{font-weight:500}.ee-root .font-semibold{font-weight:600}.ee-root .uppercase{text-transform:uppercase}.ee-root .capitalize{text-transform:capitalize}.ee-root .italic{font-style:italic}.ee-root .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)}.ee-root .leading-none{line-height:1}.ee-root .leading-snug{line-height:1.375}.ee-root .tracking-\[0\.12em\]{letter-spacing:.12em}.ee-root .tracking-\[0\.18em\]{letter-spacing:.18em}.ee-root .tracking-wide{letter-spacing:.025em}.ee-root .tracking-wider{letter-spacing:.05em}.ee-root .text-accent{color:var(--ee-accent)}.ee-root .text-amber-700{--tw-text-opacity:1;color:rgb(180 83 9/var(--tw-text-opacity,1))}.ee-root .text-amber-700\/80{color:rgba(180,83,9,.8)}.ee-root .text-amber-800{--tw-text-opacity:1;color:rgb(146 64 14/var(--tw-text-opacity,1))}.ee-root .text-blue-500{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity,1))}.ee-root .text-blue-600{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity,1))}.ee-root .text-blue-700{--tw-text-opacity:1;color:rgb(29 78 216/var(--tw-text-opacity,1))}.ee-root .text-blue-800{--tw-text-opacity:1;color:rgb(30 64 175/var(--tw-text-opacity,1))}.ee-root .text-danger{color:var(--ee-danger)}.ee-root .text-gray-300{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.ee-root .text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.ee-root .text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.ee-root .text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.ee-root .text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.ee-root .text-neutral-400{--tw-text-opacity:1;color:rgb(163 163 163/var(--tw-text-opacity,1))}.ee-root .text-neutral-500{--tw-text-opacity:1;color:rgb(115 115 115/var(--tw-text-opacity,1))}.ee-root .text-neutral-900{--tw-text-opacity:1;color:rgb(23 23 23/var(--tw-text-opacity,1))}.ee-root .text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity,1))}.ee-root .text-red-600{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity,1))}.ee-root .text-red-700{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity,1))}.ee-root .text-text-dark{color:var(--ee-text-dark)}.ee-root .text-text-dark-muted{color:var(--ee-text-dark-muted)}.ee-root .text-text-primary{color:var(--ee-text-primary)}.ee-root .text-text-secondary{color:var(--ee-text-secondary)}.ee-root .text-violet-800{--tw-text-opacity:1;color:rgb(91 33 182/var(--tw-text-opacity,1))}.ee-root .text-violet-900{--tw-text-opacity:1;color:rgb(76 29 149/var(--tw-text-opacity,1))}.ee-root .text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.ee-root .text-yellow-700{--tw-text-opacity:1;color:rgb(161 98 7/var(--tw-text-opacity,1))}.ee-root .underline{text-decoration-line:underline}.ee-root .opacity-0{opacity:0}.ee-root .opacity-100{opacity:1}.ee-root .opacity-30{opacity:.3}.ee-root .opacity-50{opacity:.5}.ee-root .opacity-60{opacity:.6}.ee-root .opacity-75{opacity:.75}.ee-root .shadow-2xl{--tw-shadow:0 25px 50px -12px rgba(0,0,0,.25);--tw-shadow-colored:0 25px 50px -12px var(--tw-shadow-color)}.ee-root .shadow-2xl,.ee-root .shadow-\[0_1px_2px_rgba\(0\2c 0\2c 0\2c 0\.04\)\]{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.ee-root .shadow-\[0_1px_2px_rgba\(0\2c 0\2c 0\2c 0\.04\)\]{--tw-shadow:0 1px 2px rgba(0,0,0,.04);--tw-shadow-colored:0 1px 2px var(--tw-shadow-color)}.ee-root .shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.ee-root .shadow-lg,.ee-root .shadow-md{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.ee-root .shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.ee-root .shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.ee-root .shadow-sm,.ee-root .shadow-xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.ee-root .shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color)}.ee-root .outline-none{outline:2px solid transparent;outline-offset:2px}.ee-root .outline{outline-style:solid}.ee-root .outline-1{outline-width:1px}.ee-root .outline-2{outline-width:2px}.ee-root .-outline-offset-1{outline-offset:-1px}.ee-root .-outline-offset-2{outline-offset:-2px}.ee-root .outline-violet-300{outline-color:#c4b5fd}.ee-root .outline-violet-500{outline-color:#8b5cf6}.ee-root .ring{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.ee-root .ring,.ee-root .ring-1{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ee-root .ring-1{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.ee-root .ring-2{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ee-root .ring-inset{--tw-ring-inset:inset}.ee-root .ring-amber-300{--tw-ring-opacity:1;--tw-ring-color:rgb(252 211 77/var(--tw-ring-opacity,1))}.ee-root .ring-amber-500{--tw-ring-opacity:1;--tw-ring-color:rgb(245 158 11/var(--tw-ring-opacity,1))}.ee-root .ring-black\/10{--tw-ring-color:rgba(0,0,0,.1)}.ee-root .ring-black\/\[0\.04\]{--tw-ring-color:rgba(0,0,0,.04)}.ee-root .ring-black\/\[0\.06\]{--tw-ring-color:rgba(0,0,0,.06)}.ee-root .ring-blue-300{--tw-ring-opacity:1;--tw-ring-color:rgb(147 197 253/var(--tw-ring-opacity,1))}.ee-root .ring-blue-500{--tw-ring-opacity:1;--tw-ring-color:rgb(59 130 246/var(--tw-ring-opacity,1))}.ee-root .ring-violet-500{--tw-ring-opacity:1;--tw-ring-color:rgb(139 92 246/var(--tw-ring-opacity,1))}.ee-root .ring-offset-1{--tw-ring-offset-width:1px}.ee-root .blur{--tw-blur:blur(8px)}.ee-root .blur,.ee-root .filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.ee-root .backdrop-blur-sm{--tw-backdrop-blur:blur(4px);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)}.ee-root .transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.ee-root .transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.ee-root .transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.ee-root .transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.ee-root .transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.ee-root .duration-150{transition-duration:.15s}.ee-root .duration-200{transition-duration:.2s}.ee-root .ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.ee-root{--ee-midnight-1:#0b0b10;--ee-midnight-2:#111118;--ee-midnight-3:#171720;--ee-midnight-4:#1e1e2a;--ee-canvas-1:#f8f8fa;--ee-canvas-2:#fff;--ee-canvas-3:#f1f1f5;--ee-border-default:#252530;--ee-border-subtle:#1c1c28;--ee-border-light:#e2e2ea;--ee-text-primary:#e8e6f0;--ee-text-secondary:#8886a0;--ee-text-tertiary:#5c5a72;--ee-text-dark:#1a1a2e;--ee-text-dark-muted:#6b6b80;--ee-accent:#6366f1;--ee-accent-hover:#818cf8;--ee-accent-muted:rgba(99,102,241,.12);--ee-success:#34d399;--ee-success-muted:rgba(52,211,153,.12);--ee-danger:#ef4444;--ee-danger-muted:rgba(239,68,68,.12);--ee-font-sans:ui-sans-serif,system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif}.ee-root .placeholder\:text-text-secondary::-moz-placeholder{color:var(--ee-text-secondary)}.ee-root .placeholder\:text-text-secondary::placeholder{color:var(--ee-text-secondary)}.ee-root .hover\:h-2:hover{height:.5rem}.ee-root .hover\:-translate-y-0\.5:hover{--tw-translate-y:-0.125rem}.ee-root .hover\:-translate-y-0\.5:hover,.ee-root .hover\:scale-110:hover{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.ee-root .hover\:scale-110:hover{--tw-scale-x:1.1;--tw-scale-y:1.1}.ee-root .hover\:border-accent:hover,.ee-root .hover\:border-brand-primary:hover{border-color:var(--ee-accent)}.ee-root .hover\:border-violet-400:hover{--tw-border-opacity:1;border-color:rgb(167 139 250/var(--tw-border-opacity,1))}.ee-root .hover\:bg-accent-hover:hover{background-color:var(--ee-accent-hover)}.ee-root .hover\:bg-accent-muted:hover{background-color:var(--ee-accent-muted)}.ee-root .hover\:bg-amber-600:hover{--tw-bg-opacity:1;background-color:rgb(217 119 6/var(--tw-bg-opacity,1))}.ee-root .hover\:bg-black\/5:hover{background-color:rgba(0,0,0,.05)}.ee-root .hover\:bg-blue-200:hover{--tw-bg-opacity:1;background-color:rgb(191 219 254/var(--tw-bg-opacity,1))}.ee-root .hover\:bg-canvas-1:hover{background-color:var(--ee-canvas-1)}.ee-root .hover\:bg-canvas-3:hover{background-color:var(--ee-canvas-3)}.ee-root .hover\:bg-emerald-700:hover{--tw-bg-opacity:1;background-color:rgb(4 120 87/var(--tw-bg-opacity,1))}.ee-root .hover\:bg-gray-200:hover{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity,1))}.ee-root .hover\:bg-gray-50:hover{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.ee-root .hover\:bg-midnight-3:hover{background-color:var(--ee-midnight-3)}.ee-root .hover\:bg-midnight-4:hover{background-color:var(--ee-midnight-4)}.ee-root .hover\:bg-red-50:hover{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity,1))}.ee-root .hover\:bg-red-600:hover{--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity,1))}.ee-root .hover\:bg-red-700:hover{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity,1))}.ee-root .hover\:bg-violet-50:hover{--tw-bg-opacity:1;background-color:rgb(245 243 255/var(--tw-bg-opacity,1))}.ee-root .hover\:bg-violet-700:hover{--tw-bg-opacity:1;background-color:rgb(109 40 217/var(--tw-bg-opacity,1))}.ee-root .hover\:text-gray-700:hover{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.ee-root .hover\:text-gray-800:hover{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity,1))}.ee-root .hover\:text-neutral-700:hover{--tw-text-opacity:1;color:rgb(64 64 64/var(--tw-text-opacity,1))}.ee-root .hover\:text-neutral-800:hover{--tw-text-opacity:1;color:rgb(38 38 38/var(--tw-text-opacity,1))}.ee-root .hover\:text-red-500:hover{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity,1))}.ee-root .hover\:text-text-dark:hover{color:var(--ee-text-dark)}.ee-root .hover\:text-text-primary:hover{color:var(--ee-text-primary)}.ee-root .hover\:underline:hover{text-decoration-line:underline}.ee-root .hover\:opacity-100:hover{opacity:1}.ee-root .hover\:shadow-\[0_8px_24px_-4px_rgba\(0\2c 0\2c 0\2c 0\.12\)\]:hover{--tw-shadow:0 8px 24px -4px rgba(0,0,0,.12);--tw-shadow-colored:0 8px 24px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.ee-root .hover\:ring-amber-400\/40:hover{--tw-ring-color:rgba(251,191,36,.4)}.ee-root .focus\:opacity-100:focus{opacity:1}.ee-root .focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.ee-root .focus\:ring-1:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.ee-root .focus\:ring-1:focus,.ee-root .focus\:ring-2:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ee-root .focus\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.ee-root .focus\:ring-accent:focus{--tw-ring-color:var(--ee-accent)}.ee-root .focus\:ring-amber-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(245 158 11/var(--tw-ring-opacity,1))}.ee-root .focus\:ring-blue-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(59 130 246/var(--tw-ring-opacity,1))}.ee-root .active\:cursor-grabbing:active{cursor:grabbing}.ee-root .disabled\:cursor-wait:disabled{cursor:wait}.ee-root .disabled\:opacity-30:disabled{opacity:.3}.ee-root .disabled\:opacity-50:disabled{opacity:.5}.ee-root .disabled\:opacity-60:disabled{opacity:.6}.ee-root .group:hover .group-hover\:translate-y-0{--tw-translate-y:0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.ee-root .group:hover .group-hover\:opacity-100{opacity:1}@media (min-width:640px){.ee-root .sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (min-width:1024px){.ee-root .lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}
|
|
3
|
+
/*! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com*/.ee-root *,.ee-root :after,.ee-root :before{border:0 solid #e5e7eb;box-sizing:border-box}.ee-root :after,.ee-root :before{--tw-content:""}.ee-root{line-height:1.5;-webkit-text-size-adjust:100%;font-family:var(--ee-font-sans);font-feature-settings:normal;font-variation-settings:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-tap-highlight-color:transparent}.ee-root{line-height:inherit;margin:0}.ee-root hr{border-top-width:1px;color:inherit;height:0}.ee-root abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.ee-root h1,.ee-root h2,.ee-root h3,.ee-root h4,.ee-root h5,.ee-root h6{font-size:inherit;font-weight:inherit}.ee-root a{color:inherit;text-decoration:inherit}.ee-root b,.ee-root strong{font-weight:bolder}.ee-root code,.ee-root kbd,.ee-root pre,.ee-root samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-size:1em;font-variation-settings:normal}.ee-root small{font-size:80%}.ee-root sub,.ee-root sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}.ee-root sub{bottom:-.25em}.ee-root sup{top:-.5em}.ee-root table{border-collapse:collapse;border-color:inherit;text-indent:0}.ee-root button,.ee-root input,.ee-root optgroup,.ee-root select,.ee-root textarea{color:inherit;font-family:inherit;font-feature-settings:inherit;font-size:100%;font-variation-settings:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;margin:0;padding:0}.ee-root button,.ee-root select{text-transform:none}.ee-root button,.ee-root input:where([type=button]),.ee-root input:where([type=reset]),.ee-root input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}.ee-root :-moz-focusring{outline:auto}.ee-root :-moz-ui-invalid{box-shadow:none}.ee-root progress{vertical-align:baseline}.ee-root ::-webkit-inner-spin-button,.ee-root ::-webkit-outer-spin-button{height:auto}.ee-root [type=search]{-webkit-appearance:textfield;outline-offset:-2px}.ee-root ::-webkit-search-decoration{-webkit-appearance:none}.ee-root ::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}.ee-root summary{display:list-item}.ee-root blockquote,.ee-root dd,.ee-root dl,.ee-root figure,.ee-root h1,.ee-root h2,.ee-root h3,.ee-root h4,.ee-root h5,.ee-root h6,.ee-root hr,.ee-root p,.ee-root pre{margin:0}.ee-root fieldset{margin:0;padding:0}.ee-root legend{padding:0}.ee-root menu,.ee-root ol,.ee-root ul{list-style:none;margin:0;padding:0}.ee-root dialog{padding:0}.ee-root textarea{resize:vertical}.ee-root input::-moz-placeholder,.ee-root textarea::-moz-placeholder{color:#9ca3af;opacity:1}.ee-root input::placeholder,.ee-root textarea::placeholder{color:#9ca3af;opacity:1}.ee-root [role=button],.ee-root button{cursor:pointer}.ee-root :disabled{cursor:default}.ee-root audio,.ee-root canvas,.ee-root embed,.ee-root iframe,.ee-root img,.ee-root object,.ee-root svg,.ee-root video{display:block;vertical-align:middle}.ee-root img,.ee-root video{height:auto;max-width:100%}.ee-root [hidden]:where(:not([hidden=until-found])){display:none}.ee-root *{border-color:var(--ee-border-light)}.ee-root{color:var(--ee-text-dark);font-family:var(--ee-font-sans)}.ee-root .container{width:100%}@media (min-width:640px){.ee-root .container{max-width:640px}}@media (min-width:768px){.ee-root .container{max-width:768px}}@media (min-width:1024px){.ee-root .container{max-width:1024px}}@media (min-width:1280px){.ee-root .container{max-width:1280px}}@media (min-width:1536px){.ee-root .container{max-width:1536px}}.ee-root .pointer-events-none{pointer-events:none}.ee-root .pointer-events-auto{pointer-events:auto}.ee-root .collapse{visibility:collapse}.ee-root .fixed{position:fixed}.ee-root .absolute{position:absolute}.ee-root .relative{position:relative}.ee-root .inset-0{inset:0}.ee-root .inset-x-0{left:0;right:0}.ee-root .bottom-0{bottom:0}.ee-root .bottom-3{bottom:.75rem}.ee-root .left-0{left:0}.ee-root .left-1\/2{left:50%}.ee-root .right-0{right:0}.ee-root .right-3{right:.75rem}.ee-root .top-0{top:0}.ee-root .top-1\/2{top:50%}.ee-root .top-full{top:100%}.ee-root .z-20{z-index:20}.ee-root .z-30{z-index:30}.ee-root .z-40{z-index:40}.ee-root .z-50{z-index:50}.ee-root .mx-1{margin-left:.25rem;margin-right:.25rem}.ee-root .mx-auto{margin-left:auto;margin-right:auto}.ee-root .my-4{margin-bottom:1rem;margin-top:1rem}.ee-root .mb-1{margin-bottom:.25rem}.ee-root .mb-1\.5{margin-bottom:.375rem}.ee-root .mb-2{margin-bottom:.5rem}.ee-root .mb-3{margin-bottom:.75rem}.ee-root .mb-4{margin-bottom:1rem}.ee-root .ml-1{margin-left:.25rem}.ee-root .ml-2{margin-left:.5rem}.ee-root .ml-3{margin-left:.75rem}.ee-root .ml-4{margin-left:1rem}.ee-root .ml-6{margin-left:1.5rem}.ee-root .ml-auto{margin-left:auto}.ee-root .mt-0\.5{margin-top:.125rem}.ee-root .mt-1{margin-top:.25rem}.ee-root .mt-2{margin-top:.5rem}.ee-root .mt-3{margin-top:.75rem}.ee-root .mt-4{margin-top:1rem}.ee-root .mt-6{margin-top:1.5rem}.ee-root .\!block{display:block!important}.ee-root .block{display:block}.ee-root .inline{display:inline}.ee-root .flex{display:flex}.ee-root .inline-flex{display:inline-flex}.ee-root .table{display:table}.ee-root .grid{display:grid}.ee-root .contents{display:contents}.ee-root .hidden{display:none}.ee-root .h-0\.5{height:.125rem}.ee-root .h-1\.5{height:.375rem}.ee-root .h-16{height:4rem}.ee-root .h-2{height:.5rem}.ee-root .h-6{height:1.5rem}.ee-root .h-7{height:1.75rem}.ee-root .h-8{height:2rem}.ee-root .h-\[min\(880px\2c 92vh\)\]{height:min(880px,92vh)}.ee-root .h-full{height:100%}.ee-root .min-h-\[20px\]{min-height:20px}.ee-root .min-h-\[400px\]{min-height:400px}.ee-root .w-10{width:2.5rem}.ee-root .w-16{width:4rem}.ee-root .w-4{width:1rem}.ee-root .w-6{width:1.5rem}.ee-root .w-64{width:16rem}.ee-root .w-7{width:1.75rem}.ee-root .w-72{width:18rem}.ee-root .w-8{width:2rem}.ee-root .w-80{width:20rem}.ee-root .w-\[min\(1280px\2c 95vw\)\]{width:min(1280px,95vw)}.ee-root .w-\[min\(440px\2c 92vw\)\]{width:min(440px,92vw)}.ee-root .w-full{width:100%}.ee-root .w-px{width:1px}.ee-root .min-w-0{min-width:0}.ee-root .min-w-\[140px\]{min-width:140px}.ee-root .max-w-\[60\%\]{max-width:60%}.ee-root .max-w-md{max-width:28rem}.ee-root .flex-1{flex:1 1 0%}.ee-root .flex-shrink-0,.ee-root .shrink-0{flex-shrink:0}.ee-root .-translate-x-1\/2{--tw-translate-x:-50%}.ee-root .-translate-x-1\/2,.ee-root .-translate-y-1\/2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.ee-root .-translate-y-1\/2{--tw-translate-y:-50%}.ee-root .translate-y-1{--tw-translate-y:0.25rem}.ee-root .rotate-90,.ee-root .translate-y-1{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.ee-root .rotate-90{--tw-rotate:90deg}.ee-root .transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes ee-spin{to{transform:rotate(1turn)}}.ee-root .animate-spin{animation:ee-spin 1s linear infinite}.ee-root .cursor-grab{cursor:grab}.ee-root .cursor-not-allowed{cursor:not-allowed}.ee-root .cursor-pointer{cursor:pointer}.ee-root .resize{resize:both}.ee-root .list-disc{list-style-type:disc}.ee-root .grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.ee-root .grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.ee-root .grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.ee-root .grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.ee-root .flex-col{flex-direction:column}.ee-root .flex-wrap{flex-wrap:wrap}.ee-root .items-start{align-items:flex-start}.ee-root .items-center{align-items:center}.ee-root .items-baseline{align-items:baseline}.ee-root .justify-end{justify-content:flex-end}.ee-root .justify-center{justify-content:center}.ee-root .justify-between{justify-content:space-between}.ee-root .gap-1{gap:.25rem}.ee-root .gap-1\.5{gap:.375rem}.ee-root .gap-2{gap:.5rem}.ee-root .gap-3{gap:.75rem}.ee-root .gap-4{gap:1rem}.ee-root .gap-6{gap:1.5rem}.ee-root .space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.25rem*var(--tw-space-y-reverse));margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)))}.ee-root .space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.5rem*var(--tw-space-y-reverse));margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)))}.ee-root .space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.75rem*var(--tw-space-y-reverse));margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)))}.ee-root .space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1rem*var(--tw-space-y-reverse));margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)))}.ee-root .overflow-auto{overflow:auto}.ee-root .overflow-hidden{overflow:hidden}.ee-root .overflow-y-auto{overflow-y:auto}.ee-root .truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ee-root .break-words{overflow-wrap:break-word}.ee-root .rounded{border-radius:.25rem}.ee-root .rounded-2xl{border-radius:1rem}.ee-root .rounded-full{border-radius:9999px}.ee-root .rounded-lg{border-radius:.5rem}.ee-root .rounded-md{border-radius:.375rem}.ee-root .rounded-sm{border-radius:.125rem}.ee-root .rounded-xl{border-radius:.75rem}.ee-root .rounded-bl{border-bottom-left-radius:.25rem}.ee-root .rounded-br{border-bottom-right-radius:.25rem}.ee-root .border{border-width:1px}.ee-root .border-0{border-width:0}.ee-root .border-2{border-width:2px}.ee-root .border-b{border-bottom-width:1px}.ee-root .border-b-2{border-bottom-width:2px}.ee-root .border-l{border-left-width:1px}.ee-root .border-l-2{border-left-width:2px}.ee-root .border-r{border-right-width:1px}.ee-root .border-t{border-top-width:1px}.ee-root .border-dashed{border-style:dashed}.ee-root .border-accent{border-color:var(--ee-accent)}.ee-root .border-amber-300{--tw-border-opacity:1;border-color:rgb(252 211 77/var(--tw-border-opacity,1))}.ee-root .border-black\/\[0\.04\]{border-color:rgba(0,0,0,.04)}.ee-root .border-blue-500{--tw-border-opacity:1;border-color:rgb(59 130 246/var(--tw-border-opacity,1))}.ee-root .border-border-default{border-color:var(--ee-border-default)}.ee-root .border-border-light,.ee-root .border-brand-border{border-color:var(--ee-border-light)}.ee-root .border-brand-primary{border-color:var(--ee-accent)}.ee-root .border-gray-200{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity,1))}.ee-root .border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity,1))}.ee-root .border-red-200{--tw-border-opacity:1;border-color:rgb(254 202 202/var(--tw-border-opacity,1))}.ee-root .border-red-300{--tw-border-opacity:1;border-color:rgb(252 165 165/var(--tw-border-opacity,1))}.ee-root .border-red-400{--tw-border-opacity:1;border-color:rgb(248 113 113/var(--tw-border-opacity,1))}.ee-root .border-violet-200{--tw-border-opacity:1;border-color:rgb(221 214 254/var(--tw-border-opacity,1))}.ee-root .border-violet-300{--tw-border-opacity:1;border-color:rgb(196 181 253/var(--tw-border-opacity,1))}.ee-root .bg-\[\#fafaf7\]{--tw-bg-opacity:1;background-color:rgb(250 250 247/var(--tw-bg-opacity,1))}.ee-root .bg-accent{background-color:var(--ee-accent)}.ee-root .bg-accent-muted{background-color:var(--ee-accent-muted)}.ee-root .bg-amber-100{--tw-bg-opacity:1;background-color:rgb(254 243 199/var(--tw-bg-opacity,1))}.ee-root .bg-amber-50{--tw-bg-opacity:1;background-color:rgb(255 251 235/var(--tw-bg-opacity,1))}.ee-root .bg-amber-500{--tw-bg-opacity:1;background-color:rgb(245 158 11/var(--tw-bg-opacity,1))}.ee-root .bg-amber-500\/20{background-color:rgba(245,158,11,.2)}.ee-root .bg-black\/50{background-color:rgba(0,0,0,.5)}.ee-root .bg-black\/60{background-color:rgba(0,0,0,.6)}.ee-root .bg-black\/\[0\.04\]{background-color:rgba(0,0,0,.04)}.ee-root .bg-blue-100{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity,1))}.ee-root .bg-blue-300\/60{background-color:rgba(147,197,253,.6)}.ee-root .bg-blue-50{--tw-bg-opacity:1;background-color:rgb(239 246 255/var(--tw-bg-opacity,1))}.ee-root .bg-blue-500{--tw-bg-opacity:1;background-color:rgb(59 130 246/var(--tw-bg-opacity,1))}.ee-root .bg-canvas-1{background-color:var(--ee-canvas-1)}.ee-root .bg-canvas-2{background-color:var(--ee-canvas-2)}.ee-root .bg-canvas-3{background-color:var(--ee-canvas-3)}.ee-root .bg-emerald-600{--tw-bg-opacity:1;background-color:rgb(5 150 105/var(--tw-bg-opacity,1))}.ee-root .bg-gray-300{--tw-bg-opacity:1;background-color:rgb(209 213 219/var(--tw-bg-opacity,1))}.ee-root .bg-gray-50{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.ee-root .bg-gray-500{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity,1))}.ee-root .bg-midnight-2{background-color:var(--ee-midnight-2)}.ee-root .bg-midnight-3{background-color:var(--ee-midnight-3)}.ee-root .bg-midnight-4{background-color:var(--ee-midnight-4)}.ee-root .bg-red-50{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity,1))}.ee-root .bg-red-500{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity,1))}.ee-root .bg-red-600{--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity,1))}.ee-root .bg-violet-100{--tw-bg-opacity:1;background-color:rgb(237 233 254/var(--tw-bg-opacity,1))}.ee-root .bg-violet-50{--tw-bg-opacity:1;background-color:rgb(245 243 255/var(--tw-bg-opacity,1))}.ee-root .bg-violet-600{--tw-bg-opacity:1;background-color:rgb(124 58 237/var(--tw-bg-opacity,1))}.ee-root .bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.ee-root .bg-gradient-to-b{background-image:linear-gradient(to bottom,var(--tw-gradient-stops))}.ee-root .from-transparent{--tw-gradient-from:transparent var(--tw-gradient-from-position);--tw-gradient-to:transparent var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.ee-root .to-white{--tw-gradient-to:#fff var(--tw-gradient-to-position)}.ee-root .p-0\.5{padding:.125rem}.ee-root .p-1{padding:.25rem}.ee-root .p-1\.5{padding:.375rem}.ee-root .p-12{padding:3rem}.ee-root .p-2{padding:.5rem}.ee-root .p-3{padding:.75rem}.ee-root .p-4{padding:1rem}.ee-root .p-6{padding:1.5rem}.ee-root .p-8{padding:2rem}.ee-root .px-1{padding-left:.25rem;padding-right:.25rem}.ee-root .px-1\.5{padding-left:.375rem;padding-right:.375rem}.ee-root .px-2{padding-left:.5rem;padding-right:.5rem}.ee-root .px-3{padding-left:.75rem;padding-right:.75rem}.ee-root .px-4{padding-left:1rem;padding-right:1rem}.ee-root .px-8{padding-left:2rem;padding-right:2rem}.ee-root .py-0\.5{padding-bottom:.125rem;padding-top:.125rem}.ee-root .py-1{padding-bottom:.25rem;padding-top:.25rem}.ee-root .py-1\.5{padding-bottom:.375rem;padding-top:.375rem}.ee-root .py-16{padding-bottom:4rem;padding-top:4rem}.ee-root .py-2{padding-bottom:.5rem;padding-top:.5rem}.ee-root .py-3{padding-bottom:.75rem;padding-top:.75rem}.ee-root .py-8{padding-bottom:2rem;padding-top:2rem}.ee-root .pb-1{padding-bottom:.25rem}.ee-root .pb-5{padding-bottom:1.25rem}.ee-root .pb-8{padding-bottom:2rem}.ee-root .pl-1{padding-left:.25rem}.ee-root .pl-4{padding-left:1rem}.ee-root .pt-3{padding-top:.75rem}.ee-root .pt-7{padding-top:1.75rem}.ee-root .text-left{text-align:left}.ee-root .text-center{text-align:center}.ee-root .text-right{text-align:right}.ee-root .font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.ee-root .font-serif{font-family:ui-serif,Georgia,Cambria,Times New Roman,Times,serif}.ee-root .text-4xl{font-size:2.25rem;line-height:2.5rem}.ee-root .text-\[10px\]{font-size:10px}.ee-root .text-\[11px\]{font-size:11px}.ee-root .text-\[15px\]{font-size:15px}.ee-root .text-\[28px\]{font-size:28px}.ee-root .text-base{font-size:1rem;line-height:1.5rem}.ee-root .text-lg{font-size:1.125rem;line-height:1.75rem}.ee-root .text-sm{font-size:.875rem;line-height:1.25rem}.ee-root .text-xs{font-size:.75rem;line-height:1rem}.ee-root .font-medium{font-weight:500}.ee-root .font-semibold{font-weight:600}.ee-root .uppercase{text-transform:uppercase}.ee-root .capitalize{text-transform:capitalize}.ee-root .italic{font-style:italic}.ee-root .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)}.ee-root .leading-none{line-height:1}.ee-root .leading-snug{line-height:1.375}.ee-root .tracking-\[0\.12em\]{letter-spacing:.12em}.ee-root .tracking-\[0\.18em\]{letter-spacing:.18em}.ee-root .tracking-wide{letter-spacing:.025em}.ee-root .tracking-wider{letter-spacing:.05em}.ee-root .text-accent{color:var(--ee-accent)}.ee-root .text-amber-300{--tw-text-opacity:1;color:rgb(252 211 77/var(--tw-text-opacity,1))}.ee-root .text-amber-700{--tw-text-opacity:1;color:rgb(180 83 9/var(--tw-text-opacity,1))}.ee-root .text-amber-700\/80{color:rgba(180,83,9,.8)}.ee-root .text-amber-800{--tw-text-opacity:1;color:rgb(146 64 14/var(--tw-text-opacity,1))}.ee-root .text-amber-900{--tw-text-opacity:1;color:rgb(120 53 15/var(--tw-text-opacity,1))}.ee-root .text-blue-500{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity,1))}.ee-root .text-blue-600{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity,1))}.ee-root .text-blue-700{--tw-text-opacity:1;color:rgb(29 78 216/var(--tw-text-opacity,1))}.ee-root .text-blue-800{--tw-text-opacity:1;color:rgb(30 64 175/var(--tw-text-opacity,1))}.ee-root .text-danger{color:var(--ee-danger)}.ee-root .text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.ee-root .text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.ee-root .text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.ee-root .text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.ee-root .text-neutral-400{--tw-text-opacity:1;color:rgb(163 163 163/var(--tw-text-opacity,1))}.ee-root .text-neutral-500{--tw-text-opacity:1;color:rgb(115 115 115/var(--tw-text-opacity,1))}.ee-root .text-neutral-900{--tw-text-opacity:1;color:rgb(23 23 23/var(--tw-text-opacity,1))}.ee-root .text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity,1))}.ee-root .text-red-600{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity,1))}.ee-root .text-red-700{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity,1))}.ee-root .text-red-800{--tw-text-opacity:1;color:rgb(153 27 27/var(--tw-text-opacity,1))}.ee-root .text-text-dark{color:var(--ee-text-dark)}.ee-root .text-text-dark-muted{color:var(--ee-text-dark-muted)}.ee-root .text-text-primary{color:var(--ee-text-primary)}.ee-root .text-text-secondary{color:var(--ee-text-secondary)}.ee-root .text-violet-700{--tw-text-opacity:1;color:rgb(109 40 217/var(--tw-text-opacity,1))}.ee-root .text-violet-800{--tw-text-opacity:1;color:rgb(91 33 182/var(--tw-text-opacity,1))}.ee-root .text-violet-900{--tw-text-opacity:1;color:rgb(76 29 149/var(--tw-text-opacity,1))}.ee-root .text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.ee-root .underline{text-decoration-line:underline}.ee-root .opacity-0{opacity:0}.ee-root .opacity-30{opacity:.3}.ee-root .opacity-50{opacity:.5}.ee-root .opacity-60{opacity:.6}.ee-root .shadow-2xl{--tw-shadow:0 25px 50px -12px rgba(0,0,0,.25);--tw-shadow-colored:0 25px 50px -12px var(--tw-shadow-color)}.ee-root .shadow-2xl,.ee-root .shadow-\[0_1px_2px_rgba\(0\2c 0\2c 0\2c 0\.04\)\]{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.ee-root .shadow-\[0_1px_2px_rgba\(0\2c 0\2c 0\2c 0\.04\)\]{--tw-shadow:0 1px 2px rgba(0,0,0,.04);--tw-shadow-colored:0 1px 2px var(--tw-shadow-color)}.ee-root .shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.ee-root .shadow-lg,.ee-root .shadow-md{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.ee-root .shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.ee-root .shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.ee-root .shadow-sm,.ee-root .shadow-xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.ee-root .shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color)}.ee-root .outline{outline-style:solid}.ee-root .ring{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.ee-root .ring,.ee-root .ring-1{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ee-root .ring-1{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.ee-root .ring-2{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ee-root .ring-inset{--tw-ring-inset:inset}.ee-root .ring-amber-300{--tw-ring-opacity:1;--tw-ring-color:rgb(252 211 77/var(--tw-ring-opacity,1))}.ee-root .ring-amber-500{--tw-ring-opacity:1;--tw-ring-color:rgb(245 158 11/var(--tw-ring-opacity,1))}.ee-root .ring-black\/10{--tw-ring-color:rgba(0,0,0,.1)}.ee-root .ring-black\/\[0\.04\]{--tw-ring-color:rgba(0,0,0,.04)}.ee-root .ring-black\/\[0\.06\]{--tw-ring-color:rgba(0,0,0,.06)}.ee-root .ring-blue-300{--tw-ring-opacity:1;--tw-ring-color:rgb(147 197 253/var(--tw-ring-opacity,1))}.ee-root .ring-blue-500{--tw-ring-opacity:1;--tw-ring-color:rgb(59 130 246/var(--tw-ring-opacity,1))}.ee-root .ring-violet-300{--tw-ring-opacity:1;--tw-ring-color:rgb(196 181 253/var(--tw-ring-opacity,1))}.ee-root .ring-violet-500{--tw-ring-opacity:1;--tw-ring-color:rgb(139 92 246/var(--tw-ring-opacity,1))}.ee-root .blur{--tw-blur:blur(8px)}.ee-root .blur,.ee-root .filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.ee-root .backdrop-blur-sm{--tw-backdrop-blur:blur(4px);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)}.ee-root .transition{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1)}.ee-root .transition-all{transition-duration:.15s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1)}.ee-root .transition-colors{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1)}.ee-root .transition-transform{transition-duration:.15s;transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}.ee-root .duration-150{transition-duration:.15s}.ee-root .duration-200{transition-duration:.2s}.ee-root .ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.ee-root.ee-fullscreen{background:var(--ee-canvas-1);height:100vh!important;height:100dvh!important;inset:0;min-height:0;position:fixed;z-index:2147483000}.ee-root{--ee-midnight-1:#0b0b10;--ee-midnight-2:#111118;--ee-midnight-3:#171720;--ee-midnight-4:#1e1e2a;--ee-canvas-1:#f8f8fa;--ee-canvas-2:#fff;--ee-canvas-3:#f1f1f5;--ee-border-default:#252530;--ee-border-subtle:#1c1c28;--ee-border-light:#e2e2ea;--ee-text-primary:#e8e6f0;--ee-text-secondary:#8886a0;--ee-text-tertiary:#5c5a72;--ee-text-dark:#1a1a2e;--ee-text-dark-muted:#6b6b80;--ee-accent:#6366f1;--ee-accent-hover:#818cf8;--ee-accent-muted:rgba(99,102,241,.12);--ee-success:#34d399;--ee-success-muted:rgba(52,211,153,.12);--ee-danger:#ef4444;--ee-danger-muted:rgba(239,68,68,.12);--ee-font-sans:ui-sans-serif,system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif}.ee-root .placeholder\:text-text-secondary::-moz-placeholder{color:var(--ee-text-secondary)}.ee-root .placeholder\:text-text-secondary::placeholder{color:var(--ee-text-secondary)}.ee-root .hover\:-translate-y-0\.5:hover{--tw-translate-y:-0.125rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.ee-root .hover\:scale-110:hover{--tw-scale-x:1.1;--tw-scale-y:1.1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.ee-root .hover\:border-accent:hover{border-color:var(--ee-accent)}.ee-root .hover\:border-brand-primary:hover{border-color:var(--ee-accent)}.ee-root .hover\:border-violet-400:hover{--tw-border-opacity:1;border-color:rgb(167 139 250/var(--tw-border-opacity,1))}.ee-root .hover\:bg-accent-hover:hover{background-color:var(--ee-accent-hover)}.ee-root .hover\:bg-accent-muted:hover{background-color:var(--ee-accent-muted)}.ee-root .hover\:bg-amber-500\/30:hover{background-color:rgba(245,158,11,.3)}.ee-root .hover\:bg-amber-600:hover{--tw-bg-opacity:1;background-color:rgb(217 119 6/var(--tw-bg-opacity,1))}.ee-root .hover\:bg-black\/5:hover{background-color:rgba(0,0,0,.05)}.ee-root .hover\:bg-blue-600:hover{--tw-bg-opacity:1;background-color:rgb(37 99 235/var(--tw-bg-opacity,1))}.ee-root .hover\:bg-canvas-1:hover{background-color:var(--ee-canvas-1)}.ee-root .hover\:bg-canvas-3:hover{background-color:var(--ee-canvas-3)}.ee-root .hover\:bg-emerald-700:hover{--tw-bg-opacity:1;background-color:rgb(4 120 87/var(--tw-bg-opacity,1))}.ee-root .hover\:bg-gray-200:hover{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity,1))}.ee-root .hover\:bg-gray-50:hover{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.ee-root .hover\:bg-gray-600:hover{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.ee-root .hover\:bg-midnight-3:hover{background-color:var(--ee-midnight-3)}.ee-root .hover\:bg-midnight-4:hover{background-color:var(--ee-midnight-4)}.ee-root .hover\:bg-red-50:hover{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity,1))}.ee-root .hover\:bg-red-600:hover{--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity,1))}.ee-root .hover\:bg-red-700:hover{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity,1))}.ee-root .hover\:bg-violet-50:hover{--tw-bg-opacity:1;background-color:rgb(245 243 255/var(--tw-bg-opacity,1))}.ee-root .hover\:bg-violet-700:hover{--tw-bg-opacity:1;background-color:rgb(109 40 217/var(--tw-bg-opacity,1))}.ee-root .hover\:text-gray-700:hover{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.ee-root .hover\:text-gray-800:hover{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity,1))}.ee-root .hover\:text-neutral-700:hover{--tw-text-opacity:1;color:rgb(64 64 64/var(--tw-text-opacity,1))}.ee-root .hover\:text-neutral-800:hover{--tw-text-opacity:1;color:rgb(38 38 38/var(--tw-text-opacity,1))}.ee-root .hover\:text-red-500:hover{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity,1))}.ee-root .hover\:text-text-dark:hover{color:var(--ee-text-dark)}.ee-root .hover\:text-text-primary:hover{color:var(--ee-text-primary)}.ee-root .hover\:underline:hover{text-decoration-line:underline}.ee-root .hover\:opacity-100:hover{opacity:1}.ee-root .hover\:shadow-\[0_8px_24px_-4px_rgba\(0\2c 0\2c 0\2c 0\.12\)\]:hover{--tw-shadow:0 8px 24px -4px rgba(0,0,0,.12);--tw-shadow-colored:0 8px 24px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.ee-root .hover\:ring-amber-400\/40:hover{--tw-ring-color:rgba(251,191,36,.4)}.ee-root .focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.ee-root .focus\:ring-1:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ee-root .focus\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ee-root .focus\:ring-accent:focus{--tw-ring-color:var(--ee-accent)}.ee-root .focus\:ring-amber-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(245 158 11/var(--tw-ring-opacity,1))}.ee-root .focus\:ring-blue-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(59 130 246/var(--tw-ring-opacity,1))}.ee-root .active\:cursor-grabbing:active{cursor:grabbing}.ee-root .disabled\:cursor-wait:disabled{cursor:wait}.ee-root .disabled\:opacity-30:disabled{opacity:.3}.ee-root .disabled\:opacity-40:disabled{opacity:.4}.ee-root .disabled\:opacity-50:disabled{opacity:.5}.ee-root .disabled\:opacity-60:disabled{opacity:.6}.ee-root .group:hover .group-hover\:translate-y-0{--tw-translate-y:0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.ee-root .group:hover .group-hover\:opacity-100{opacity:1}@media (min-width:640px){.ee-root .sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (min-width:1024px){.ee-root .lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}
|
|
@@ -89,6 +89,14 @@ interface EditorOptions {
|
|
|
89
89
|
* list and passes a new one when it has stored the section.
|
|
90
90
|
*/
|
|
91
91
|
onSaveSection?: (section: Record<string, unknown>, name: string) => Promise<void>;
|
|
92
|
+
/**
|
|
93
|
+
* The messages of the host's most recent server compile, when it refused
|
|
94
|
+
* something (an image host outside the asset policy, a missing unsubscribe
|
|
95
|
+
* link). Shown as a badge in the editor's toolbar. The canvas is compiled in
|
|
96
|
+
* the browser, which cannot run the service's policy, so the host feeds the
|
|
97
|
+
* server's verdict in; `setPolicyErrors` updates it on a running editor.
|
|
98
|
+
*/
|
|
99
|
+
policyErrors?: string[];
|
|
92
100
|
}
|
|
93
101
|
/**
|
|
94
102
|
* One saved section as the host holds it. The `section` is a snapshot of a
|
|
@@ -112,6 +120,8 @@ interface EditorInstance {
|
|
|
112
120
|
undo(): void;
|
|
113
121
|
redo(): void;
|
|
114
122
|
destroy(): void;
|
|
123
|
+
/** Replace the policy messages shown in the toolbar (see `EditorOptions.policyErrors`). */
|
|
124
|
+
setPolicyErrors(errors: string[] | undefined): void;
|
|
115
125
|
}
|
|
116
126
|
|
|
117
127
|
export type { EditorOptions as E, SavedSectionInput as S, EditorInstance as a, EditorTheme as b };
|
|
@@ -89,6 +89,14 @@ interface EditorOptions {
|
|
|
89
89
|
* list and passes a new one when it has stored the section.
|
|
90
90
|
*/
|
|
91
91
|
onSaveSection?: (section: Record<string, unknown>, name: string) => Promise<void>;
|
|
92
|
+
/**
|
|
93
|
+
* The messages of the host's most recent server compile, when it refused
|
|
94
|
+
* something (an image host outside the asset policy, a missing unsubscribe
|
|
95
|
+
* link). Shown as a badge in the editor's toolbar. The canvas is compiled in
|
|
96
|
+
* the browser, which cannot run the service's policy, so the host feeds the
|
|
97
|
+
* server's verdict in; `setPolicyErrors` updates it on a running editor.
|
|
98
|
+
*/
|
|
99
|
+
policyErrors?: string[];
|
|
92
100
|
}
|
|
93
101
|
/**
|
|
94
102
|
* One saved section as the host holds it. The `section` is a snapshot of a
|
|
@@ -112,6 +120,8 @@ interface EditorInstance {
|
|
|
112
120
|
undo(): void;
|
|
113
121
|
redo(): void;
|
|
114
122
|
destroy(): void;
|
|
123
|
+
/** Replace the policy messages shown in the toolbar (see `EditorOptions.policyErrors`). */
|
|
124
|
+
setPolicyErrors(errors: string[] | undefined): void;
|
|
115
125
|
}
|
|
116
126
|
|
|
117
127
|
export type { EditorOptions as E, SavedSectionInput as S, EditorInstance as a, EditorTheme as b };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@marlinjai/email-editor",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "Embeddable visual email editor (React component and vanilla factory) that produces an MJML-compilable document",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -47,9 +47,9 @@
|
|
|
47
47
|
"./styles.css": "./dist/styles.css"
|
|
48
48
|
},
|
|
49
49
|
"dependencies": {
|
|
50
|
-
"@marlinjai/email-editor-blocks": "^0.
|
|
51
|
-
"@marlinjai/email-editor-ui": "^0.
|
|
52
|
-
"@marlinjai/email-editor-core": "^0.
|
|
50
|
+
"@marlinjai/email-editor-blocks": "^0.4.0",
|
|
51
|
+
"@marlinjai/email-editor-ui": "^0.4.0",
|
|
52
|
+
"@marlinjai/email-editor-core": "^0.4.0"
|
|
53
53
|
},
|
|
54
54
|
"peerDependencies": {
|
|
55
55
|
"react": "^18.2.0 || ^19.0.0",
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import { EmailTemplate, BlockDefinition } from '@marlinjai/email-editor-core';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Editor theme configuration
|
|
5
|
-
*/
|
|
6
|
-
interface EditorTheme {
|
|
7
|
-
colors?: {
|
|
8
|
-
primary?: string;
|
|
9
|
-
surface?: string;
|
|
10
|
-
text?: string;
|
|
11
|
-
border?: string;
|
|
12
|
-
};
|
|
13
|
-
fonts?: {
|
|
14
|
-
heading?: string;
|
|
15
|
-
body?: string;
|
|
16
|
-
};
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* Editor configuration options
|
|
20
|
-
*/
|
|
21
|
-
interface EditorOptions {
|
|
22
|
-
container: HTMLElement;
|
|
23
|
-
initialValue?: EmailTemplate;
|
|
24
|
-
theme?: EditorTheme;
|
|
25
|
-
blocks?: BlockDefinition[];
|
|
26
|
-
onChange?: (template: EmailTemplate) => void;
|
|
27
|
-
onSave?: (template: EmailTemplate) => void;
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* Editor instance API
|
|
31
|
-
*/
|
|
32
|
-
interface EditorInstance {
|
|
33
|
-
getValue(): EmailTemplate;
|
|
34
|
-
setValue(template: EmailTemplate): void;
|
|
35
|
-
getHTML(): string;
|
|
36
|
-
getMJML(): string;
|
|
37
|
-
undo(): void;
|
|
38
|
-
redo(): void;
|
|
39
|
-
destroy(): void;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
export type { EditorOptions as E, EditorInstance as a, EditorTheme as b };
|
package/dist/types-BoNyjNFe.d.ts
DELETED
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import { EmailTemplate, BlockDefinition } from '@marlinjai/email-editor-core';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Editor theme configuration
|
|
5
|
-
*/
|
|
6
|
-
interface EditorTheme {
|
|
7
|
-
colors?: {
|
|
8
|
-
primary?: string;
|
|
9
|
-
surface?: string;
|
|
10
|
-
text?: string;
|
|
11
|
-
border?: string;
|
|
12
|
-
};
|
|
13
|
-
fonts?: {
|
|
14
|
-
heading?: string;
|
|
15
|
-
body?: string;
|
|
16
|
-
};
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* Editor configuration options
|
|
20
|
-
*/
|
|
21
|
-
interface EditorOptions {
|
|
22
|
-
container: HTMLElement;
|
|
23
|
-
initialValue?: EmailTemplate;
|
|
24
|
-
theme?: EditorTheme;
|
|
25
|
-
blocks?: BlockDefinition[];
|
|
26
|
-
onChange?: (template: EmailTemplate) => void;
|
|
27
|
-
onSave?: (template: EmailTemplate) => void;
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* Editor instance API
|
|
31
|
-
*/
|
|
32
|
-
interface EditorInstance {
|
|
33
|
-
getValue(): EmailTemplate;
|
|
34
|
-
setValue(template: EmailTemplate): void;
|
|
35
|
-
getHTML(): string;
|
|
36
|
-
getMJML(): string;
|
|
37
|
-
undo(): void;
|
|
38
|
-
redo(): void;
|
|
39
|
-
destroy(): void;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
export type { EditorOptions as E, EditorInstance as a, EditorTheme as b };
|