@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 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-G7Ak2dWQ.mjs';
2
- export { b as EditorTheme, S as SavedSectionInput } from './types-G7Ak2dWQ.mjs';
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-G7Ak2dWQ.js';
2
- export { b as EditorTheme, S as SavedSectionInput } from './types-G7Ak2dWQ.js';
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 { TemplateSnapshotIn, TemplateSnapshotOut, BlockDefinition } from '@marlinjai/email-editor-core';
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-G7Ak2dWQ.mjs';
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 { TemplateSnapshotIn, TemplateSnapshotOut, BlockDefinition } from '@marlinjai/email-editor-core';
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-G7Ak2dWQ.js';
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
- EmailEditorReact: () => EmailEditorReact
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 import_react = require("react");
27
- var import_email_editor_core2 = require("@marlinjai/email-editor-core");
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, import_react.useState)(() => {
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, import_react.useState)(() => {
99
- const reg = builtInSections ? (0, import_email_editor_blocks.createStandardPrebuiltRegistry)({ placeholderBase }) : (0, import_email_editor_core2.createPrebuiltTemplateRegistry)();
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, import_react.useMemo)(() => (savedSections ?? []).map((s) => s.name), [savedSections]);
104
- const style = (0, import_react.useMemo)(() => themeToStyle(theme), [theme]);
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
- EmailEditorReact
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] = useState(() => {
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] = useState(() => {
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
- EmailEditorReact
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.2.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.2.0",
51
- "@marlinjai/email-editor-ui": "^0.2.0",
52
- "@marlinjai/email-editor-core": "^0.2.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 };
@@ -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 };