@savvycal/mjml-editor 0.0.2 → 0.1.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.
@@ -1,24 +1,38 @@
1
1
  import { jsxs as r, jsx as n } from "react/jsx-runtime";
2
- import { useRef as f, useState as u, useEffect as m, useMemo as b } from "react";
2
+ import { useRef as h, useState as f, useEffect as a } from "react";
3
3
  import { renderMjmlString as x } from "../../lib/mjml/renderer.js";
4
- function v({
4
+ function w({
5
5
  mjmlSource: s,
6
- debounceMs: i = 300
6
+ debounceMs: c = 300
7
7
  }) {
8
- const o = f(null), [l, c] = u(s);
9
- m(() => {
8
+ const l = h(null), [o, u] = f(s), [b, m] = f({
9
+ html: "",
10
+ errors: []
11
+ });
12
+ a(() => {
10
13
  const e = setTimeout(() => {
11
- c(s);
12
- }, i);
14
+ u(s);
15
+ }, c);
13
16
  return () => clearTimeout(e);
14
- }, [s, i]);
15
- const { html: a, errors: t } = b(() => l.trim() ? x(l) : { html: "", errors: [] }, [l]);
16
- return m(() => {
17
- if (o.current) {
18
- const e = o.current.contentDocument;
19
- e && (e.open(), e.write(a), e.close());
17
+ }, [s, c]), a(() => {
18
+ if (!o.trim()) {
19
+ m({ html: "", errors: [] });
20
+ return;
20
21
  }
21
- }, [a]), /* @__PURE__ */ r("div", { className: "flex flex-col h-full", children: [
22
+ let e = !1;
23
+ return x(o).then((i) => {
24
+ e || m(i);
25
+ }), () => {
26
+ e = !0;
27
+ };
28
+ }, [o]);
29
+ const { html: d, errors: t } = b;
30
+ return a(() => {
31
+ if (l.current) {
32
+ const e = l.current.contentDocument;
33
+ e && (e.open(), e.write(d), e.close());
34
+ }
35
+ }, [d]), /* @__PURE__ */ r("div", { className: "flex flex-col h-full", children: [
22
36
  /* @__PURE__ */ r("div", { className: "h-11 px-4 flex items-center justify-between border-b border-border bg-background", children: [
23
37
  /* @__PURE__ */ n("span", { className: "text-sm font-semibold text-foreground", children: "Preview" }),
24
38
  t.length > 0 && /* @__PURE__ */ r("span", { className: "text-xs font-medium text-amber-600 bg-amber-50 px-2 py-0.5 rounded-md", children: [
@@ -30,7 +44,7 @@ function v({
30
44
  /* @__PURE__ */ n("div", { className: "flex-1 overflow-auto bg-muted", children: /* @__PURE__ */ n(
31
45
  "iframe",
32
46
  {
33
- ref: o,
47
+ ref: l,
34
48
  title: "Source Preview",
35
49
  className: "w-full h-full border-0 bg-white",
36
50
  sandbox: "allow-same-origin"
@@ -38,7 +52,7 @@ function v({
38
52
  ) }),
39
53
  t.length > 0 && /* @__PURE__ */ r("div", { className: "max-h-28 overflow-auto border-t border-border bg-amber-50/50 p-3", children: [
40
54
  /* @__PURE__ */ n("div", { className: "text-xs font-semibold text-amber-700 mb-2", children: "Warnings" }),
41
- /* @__PURE__ */ n("div", { className: "space-y-1", children: t.map((e, d) => /* @__PURE__ */ r("div", { className: "text-xs text-amber-600", children: [
55
+ /* @__PURE__ */ n("div", { className: "space-y-1", children: t.map((e, i) => /* @__PURE__ */ r("div", { className: "text-xs text-amber-600", children: [
42
56
  /* @__PURE__ */ r("span", { className: "font-mono", children: [
43
57
  "Line ",
44
58
  e.line,
@@ -46,10 +60,10 @@ function v({
46
60
  ] }),
47
61
  " ",
48
62
  e.message
49
- ] }, d)) })
63
+ ] }, i)) })
50
64
  ] })
51
65
  ] });
52
66
  }
53
67
  export {
54
- v as SourcePreview
68
+ w as SourcePreview
55
69
  };
@@ -10,7 +10,7 @@ const i = n(
10
10
  default: "border-transparent bg-primary text-primary-foreground shadow hover:bg-primary/80",
11
11
  secondary: "border-transparent bg-muted text-foreground hover:bg-muted/80",
12
12
  destructive: "border-transparent bg-destructive text-destructive-foreground shadow hover:bg-destructive/80",
13
- outline: "text-foreground"
13
+ outline: "border-border text-foreground"
14
14
  }
15
15
  },
16
16
  defaultVariants: {
@@ -18,8 +18,8 @@ const i = n(
18
18
  }
19
19
  }
20
20
  );
21
- function m({ className: r, variant: t, ...e }) {
22
- return /* @__PURE__ */ o("div", { className: a(i({ variant: t }), r), ...e });
21
+ function m({ className: r, variant: e, ...t }) {
22
+ return /* @__PURE__ */ o("div", { className: a(i({ variant: e }), r), ...t });
23
23
  }
24
24
  export {
25
25
  m as Badge
@@ -10,9 +10,9 @@ const u = a(
10
10
  variant: {
11
11
  default: "bg-primary text-primary-foreground hover:bg-primary/90",
12
12
  destructive: "bg-destructive text-white hover:bg-destructive/90",
13
- outline: "border border-border bg-background hover:bg-accent hover:border-border",
13
+ outline: "border border-border bg-background text-foreground hover:bg-accent hover:border-border",
14
14
  secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80",
15
- ghost: "hover:bg-accent hover:text-accent-foreground",
15
+ ghost: "text-foreground hover:bg-accent hover:text-accent-foreground",
16
16
  link: "text-primary underline-offset-4 hover:underline"
17
17
  },
18
18
  size: {
@@ -1,18 +1,18 @@
1
1
  import { jsx as o } from "react/jsx-runtime";
2
2
  import "react";
3
- import { PanelLeft as f, PanelRight as d } from "lucide-react";
3
+ import { PanelLeft as f, PanelRight as u } from "lucide-react";
4
4
  import { cn as n } from "../../lib/utils.js";
5
5
  function c({
6
6
  side: t,
7
7
  onClick: e
8
8
  }) {
9
- const r = t === "left" ? f : d;
9
+ const r = t === "left" ? f : u;
10
10
  return /* @__PURE__ */ o(
11
11
  "button",
12
12
  {
13
13
  onClick: e,
14
14
  className: n(
15
- "fixed top-14 z-40",
15
+ "absolute top-14 z-40",
16
16
  "h-8 w-8 rounded-md",
17
17
  "flex items-center justify-center",
18
18
  "text-foreground-muted hover:text-foreground hover:bg-accent/50",
@@ -24,31 +24,31 @@ function c({
24
24
  }
25
25
  );
26
26
  }
27
- function g({
27
+ function h({
28
28
  children: t,
29
29
  side: e,
30
30
  isOpen: r,
31
31
  onToggle: l,
32
- width: i,
33
- className: a
32
+ width: a,
33
+ className: i
34
34
  }) {
35
35
  return r ? /* @__PURE__ */ o(
36
36
  "div",
37
37
  {
38
38
  className: n(
39
- "fixed top-14 bottom-3 z-40",
40
- "bg-background border border-border rounded-lg",
39
+ "absolute top-14 bottom-3 z-40",
40
+ "bg-background text-foreground border border-border rounded-lg",
41
41
  "shadow-lg",
42
42
  "flex flex-col overflow-hidden",
43
43
  "transition-all duration-150 ease-out",
44
44
  e === "left" ? "left-3" : "right-3",
45
- a
45
+ i
46
46
  ),
47
- style: { width: i },
47
+ style: { width: a },
48
48
  children: t
49
49
  }
50
50
  ) : /* @__PURE__ */ o(c, { side: e, onClick: l });
51
51
  }
52
52
  export {
53
- g as FloatingPanel
53
+ h as FloatingPanel
54
54
  };
@@ -10,7 +10,7 @@ function a({ className: o, type: r, ...t }) {
10
10
  autoComplete: "off",
11
11
  "data-1p-ignore": !0,
12
12
  className: n(
13
- "h-9 w-full min-w-0 rounded-md border border-border bg-background px-3 py-1 text-sm",
13
+ "h-9 w-full min-w-0 rounded-md border border-border bg-background text-foreground px-3 py-1 text-sm",
14
14
  "placeholder:text-foreground-muted",
15
15
  "transition-smooth",
16
16
  "focus:border-ring focus:ring-2 focus:ring-ring/20 focus:outline-none",
@@ -1,7 +1,7 @@
1
1
  import { jsx as t } from "react/jsx-runtime";
2
2
  import "react";
3
3
  import * as e from "@radix-ui/react-popover";
4
- import { cn as n } from "../../lib/utils.js";
4
+ import { cn as d } from "../../lib/utils.js";
5
5
  function m({
6
6
  ...o
7
7
  }) {
@@ -24,8 +24,8 @@ function l({
24
24
  "data-slot": "popover-content",
25
25
  align: r,
26
26
  sideOffset: a,
27
- className: n(
28
- "bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-72 origin-(--radix-popover-content-transform-origin) rounded-md border p-4 shadow-md outline-hidden",
27
+ className: d(
28
+ "bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-72 origin-(--radix-popover-content-transform-origin) rounded-md border border-border p-4 shadow-md outline-hidden",
29
29
  o
30
30
  ),
31
31
  ...i
@@ -1,7 +1,7 @@
1
1
  import { jsxs as u, jsx as r } from "react/jsx-runtime";
2
2
  import "react";
3
3
  import * as o from "@radix-ui/react-scroll-area";
4
- import { cn as s } from "../../lib/utils.js";
4
+ import { cn as i } from "../../lib/utils.js";
5
5
  function h({
6
6
  className: a,
7
7
  viewportClassName: l,
@@ -14,29 +14,29 @@ function h({
14
14
  o.Root,
15
15
  {
16
16
  "data-slot": "scroll-area",
17
- className: s("relative", a),
17
+ className: i("relative", a),
18
18
  ...n,
19
19
  children: [
20
20
  /* @__PURE__ */ r(
21
21
  o.Viewport,
22
22
  {
23
23
  "data-slot": "scroll-area-viewport",
24
- className: s(
25
- "focus-visible:ring-ring/50 size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:outline-1",
24
+ className: i(
25
+ "focus-visible:ring-ring/50 size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:outline-1 focus-visible:outline-ring/50",
26
26
  l
27
27
  ),
28
28
  style: t,
29
29
  children: c
30
30
  }
31
31
  ),
32
- (e === "vertical" || e === "both") && /* @__PURE__ */ r(i, { orientation: "vertical" }),
33
- (e === "horizontal" || e === "both") && /* @__PURE__ */ r(i, { orientation: "horizontal" }),
32
+ (e === "vertical" || e === "both") && /* @__PURE__ */ r(s, { orientation: "vertical" }),
33
+ (e === "horizontal" || e === "both") && /* @__PURE__ */ r(s, { orientation: "horizontal" }),
34
34
  /* @__PURE__ */ r(o.Corner, {})
35
35
  ]
36
36
  }
37
37
  );
38
38
  }
39
- function i({
39
+ function s({
40
40
  className: a,
41
41
  orientation: l = "vertical",
42
42
  ...t
@@ -46,7 +46,7 @@ function i({
46
46
  {
47
47
  "data-slot": "scroll-area-scrollbar",
48
48
  orientation: l,
49
- className: s(
49
+ className: i(
50
50
  "flex touch-none p-px transition-colors select-none",
51
51
  l === "vertical" && "h-full w-2.5 border-l border-l-transparent",
52
52
  l === "horizontal" && "h-2.5 flex-col border-t border-t-transparent",
@@ -65,5 +65,5 @@ function i({
65
65
  }
66
66
  export {
67
67
  h as ScrollArea,
68
- i as ScrollBar
68
+ s as ScrollBar
69
69
  };
@@ -48,7 +48,7 @@ function y({
48
48
  {
49
49
  "data-slot": "select-content",
50
50
  className: o(
51
- "bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 relative z-50 max-h-(--radix-select-content-available-height) min-w-[8rem] origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border shadow-md",
51
+ "bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 relative z-50 max-h-(--radix-select-content-available-height) min-w-[8rem] origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border border-border shadow-md",
52
52
  r === "popper" && "data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1",
53
53
  t
54
54
  ),
@@ -0,0 +1,365 @@
1
+ /**
2
+ * Component styles for @savvycal/mjml-editor
3
+ *
4
+ * Import this file in your app's CSS AFTER the preset and tailwindcss:
5
+ *
6
+ * @import "@savvycal/mjml-editor/preset.css";
7
+ * @import "tailwindcss";
8
+ * @import "tw-animate-css";
9
+ * @import "@savvycal/mjml-editor/components.css";
10
+ */
11
+
12
+ /* Base CSS variable defaults at :root level */
13
+ :root {
14
+ --radius: 0.5rem;
15
+
16
+ /* Core backgrounds */
17
+ --background: var(--color-white);
18
+ --background-subtle: var(--color-zinc-50);
19
+ --canvas: oklch(0.975 0.005 250);
20
+ --surface: var(--color-white);
21
+
22
+ /* Foregrounds */
23
+ --foreground: var(--color-zinc-950);
24
+ --foreground-muted: var(--color-zinc-600);
25
+ --foreground-subtle: var(--color-zinc-500);
26
+
27
+ /* Card/Popover */
28
+ --card: var(--color-white);
29
+ --card-foreground: var(--color-zinc-950);
30
+ --popover: var(--color-white);
31
+ --popover-foreground: var(--color-zinc-950);
32
+
33
+ /* Primary */
34
+ --primary: var(--color-zinc-900);
35
+ --primary-foreground: var(--color-zinc-50);
36
+
37
+ /* Secondary */
38
+ --secondary: var(--color-zinc-100);
39
+ --secondary-foreground: var(--color-zinc-900);
40
+
41
+ /* Muted */
42
+ --muted: var(--color-zinc-100);
43
+ --muted-foreground: var(--color-zinc-600);
44
+
45
+ /* Accent */
46
+ --accent: oklch(0.97 0.005 250);
47
+ --accent-foreground: var(--color-zinc-950);
48
+
49
+ /* Borders */
50
+ --border: var(--color-zinc-200);
51
+ --border-subtle: var(--color-zinc-200);
52
+ --border-strong: var(--color-zinc-300);
53
+
54
+ /* Focus/Selection */
55
+ --ring: oklch(0.55 0.15 250);
56
+ --selection: oklch(0.92 0.03 250);
57
+ --selection-foreground: oklch(0.35 0.12 250);
58
+ --input: var(--color-zinc-300);
59
+
60
+ /* Destructive */
61
+ --destructive: oklch(0.55 0.22 25);
62
+
63
+ /* Inspector */
64
+ --inspector: var(--color-zinc-50);
65
+ --inspector-header: var(--color-white);
66
+
67
+ /* Toolbar */
68
+ --toolbar: var(--color-white);
69
+ --toolbar-border: var(--color-zinc-200);
70
+
71
+ /* Block states */
72
+ --block-hover: oklch(0.97 0.02 250);
73
+ --block-selected: oklch(0.40 0.15 250);
74
+ --block-selected-bg: oklch(0.96 0.02 250);
75
+
76
+ /* Chart colors */
77
+ --chart-1: oklch(0.646 0.222 41.116);
78
+ --chart-2: oklch(0.6 0.118 184.704);
79
+ --chart-3: oklch(0.398 0.07 227.392);
80
+ --chart-4: oklch(0.828 0.189 84.429);
81
+ --chart-5: oklch(0.769 0.188 70.08);
82
+
83
+ /* Sidebar */
84
+ --sidebar: var(--color-zinc-50);
85
+ --sidebar-foreground: var(--color-zinc-950);
86
+ --sidebar-primary: var(--color-zinc-900);
87
+ --sidebar-primary-foreground: var(--color-zinc-50);
88
+ --sidebar-accent: var(--color-zinc-100);
89
+ --sidebar-accent-foreground: var(--color-zinc-900);
90
+ --sidebar-border: var(--color-zinc-200);
91
+ --sidebar-ring: oklch(0.55 0.15 250);
92
+ }
93
+
94
+ /* Dark mode at root level (for Radix UI portals that render outside .mjml-editor) */
95
+ :root.dark, .dark {
96
+ --background: var(--color-zinc-950);
97
+ --background-subtle: var(--color-zinc-900);
98
+ --canvas: oklch(0.10 0.005 250);
99
+ --surface: var(--color-zinc-800);
100
+ --foreground: var(--color-zinc-50);
101
+ --foreground-muted: var(--color-zinc-400);
102
+ --foreground-subtle: var(--color-zinc-500);
103
+ --card: var(--color-zinc-900);
104
+ --card-foreground: var(--color-zinc-50);
105
+ --popover: var(--color-zinc-900);
106
+ --popover-foreground: var(--color-zinc-50);
107
+ --primary: var(--color-zinc-50);
108
+ --primary-foreground: var(--color-zinc-950);
109
+ --secondary: var(--color-zinc-800);
110
+ --secondary-foreground: var(--color-zinc-200);
111
+ --muted: var(--color-zinc-800);
112
+ --muted-foreground: var(--color-zinc-400);
113
+ --accent: var(--color-zinc-800);
114
+ --accent-foreground: var(--color-zinc-50);
115
+ --border: var(--color-zinc-700);
116
+ --border-subtle: var(--color-zinc-800);
117
+ --border-strong: var(--color-zinc-600);
118
+ --ring: oklch(0.60 0.15 250);
119
+ --selection: oklch(0.25 0.06 250);
120
+ --selection-foreground: oklch(0.75 0.12 250);
121
+ --input: var(--color-zinc-800);
122
+ --destructive: oklch(0.60 0.22 25);
123
+ --inspector: var(--color-zinc-950);
124
+ --inspector-header: var(--color-zinc-900);
125
+ --toolbar: var(--color-zinc-950);
126
+ --toolbar-border: var(--color-zinc-800);
127
+ --block-hover: oklch(0.20 0.03 250);
128
+ --block-selected: oklch(0.50 0.15 250);
129
+ --block-selected-bg: oklch(0.22 0.04 250);
130
+ --chart-1: oklch(0.70 0.20 41);
131
+ --chart-2: oklch(0.65 0.12 185);
132
+ --chart-3: oklch(0.50 0.08 227);
133
+ --chart-4: oklch(0.80 0.17 84);
134
+ --chart-5: oklch(0.75 0.17 70);
135
+ --sidebar: var(--color-zinc-950);
136
+ --sidebar-foreground: var(--color-zinc-50);
137
+ --sidebar-primary: var(--color-zinc-50);
138
+ --sidebar-primary-foreground: var(--color-zinc-950);
139
+ --sidebar-accent: var(--color-zinc-800);
140
+ --sidebar-accent-foreground: var(--color-zinc-200);
141
+ --sidebar-border: var(--color-zinc-800);
142
+ --sidebar-ring: oklch(0.60 0.15 250);
143
+ }
144
+
145
+ /* Scoped CSS variable defaults - applied to .mjml-editor container */
146
+ .mjml-editor {
147
+ --radius: 0.5rem;
148
+
149
+ /* Core backgrounds */
150
+ --background: var(--color-white);
151
+ --background-subtle: var(--color-zinc-50);
152
+ --canvas: oklch(0.975 0.005 250);
153
+ --surface: var(--color-white);
154
+
155
+ /* Foregrounds */
156
+ --foreground: var(--color-zinc-950);
157
+ --foreground-muted: var(--color-zinc-600);
158
+ --foreground-subtle: var(--color-zinc-500);
159
+
160
+ /* Card/Popover */
161
+ --card: var(--color-white);
162
+ --card-foreground: var(--color-zinc-950);
163
+ --popover: var(--color-white);
164
+ --popover-foreground: var(--color-zinc-950);
165
+
166
+ /* Primary */
167
+ --primary: var(--color-zinc-900);
168
+ --primary-foreground: var(--color-zinc-50);
169
+
170
+ /* Secondary */
171
+ --secondary: var(--color-zinc-100);
172
+ --secondary-foreground: var(--color-zinc-900);
173
+
174
+ /* Muted */
175
+ --muted: var(--color-zinc-100);
176
+ --muted-foreground: var(--color-zinc-600);
177
+
178
+ /* Accent */
179
+ --accent: oklch(0.97 0.005 250);
180
+ --accent-foreground: var(--color-zinc-950);
181
+
182
+ /* Borders */
183
+ --border: var(--color-zinc-200);
184
+ --border-subtle: var(--color-zinc-200);
185
+ --border-strong: var(--color-zinc-300);
186
+
187
+ /* Focus/Selection */
188
+ --ring: oklch(0.55 0.15 250);
189
+ --selection: oklch(0.92 0.03 250);
190
+ --selection-foreground: oklch(0.35 0.12 250);
191
+ --input: var(--color-zinc-300);
192
+
193
+ /* Destructive */
194
+ --destructive: oklch(0.55 0.22 25);
195
+
196
+ /* Inspector */
197
+ --inspector: var(--color-zinc-50);
198
+ --inspector-header: var(--color-white);
199
+
200
+ /* Toolbar */
201
+ --toolbar: var(--color-white);
202
+ --toolbar-border: var(--color-zinc-200);
203
+
204
+ /* Block states */
205
+ --block-hover: oklch(0.97 0.02 250);
206
+ --block-selected: oklch(0.40 0.15 250);
207
+ --block-selected-bg: oklch(0.96 0.02 250);
208
+
209
+ /* Chart colors */
210
+ --chart-1: oklch(0.646 0.222 41.116);
211
+ --chart-2: oklch(0.6 0.118 184.704);
212
+ --chart-3: oklch(0.398 0.07 227.392);
213
+ --chart-4: oklch(0.828 0.189 84.429);
214
+ --chart-5: oklch(0.769 0.188 70.08);
215
+
216
+ /* Sidebar */
217
+ --sidebar: var(--color-zinc-50);
218
+ --sidebar-foreground: var(--color-zinc-950);
219
+ --sidebar-primary: var(--color-zinc-900);
220
+ --sidebar-primary-foreground: var(--color-zinc-50);
221
+ --sidebar-accent: var(--color-zinc-100);
222
+ --sidebar-accent-foreground: var(--color-zinc-900);
223
+ --sidebar-border: var(--color-zinc-200);
224
+ --sidebar-ring: oklch(0.55 0.15 250);
225
+ }
226
+
227
+ /* Dark mode - when .mjml-editor has .dark class or is inside .dark */
228
+ .mjml-editor.dark,
229
+ .dark .mjml-editor {
230
+ /* Core backgrounds */
231
+ --background: var(--color-zinc-950);
232
+ --background-subtle: var(--color-zinc-900);
233
+ --canvas: oklch(0.10 0.005 250);
234
+ --surface: var(--color-zinc-800);
235
+
236
+ /* Foregrounds */
237
+ --foreground: var(--color-zinc-50);
238
+ --foreground-muted: var(--color-zinc-400);
239
+ --foreground-subtle: var(--color-zinc-500);
240
+
241
+ /* Card/Popover */
242
+ --card: var(--color-zinc-900);
243
+ --card-foreground: var(--color-zinc-50);
244
+ --popover: var(--color-zinc-900);
245
+ --popover-foreground: var(--color-zinc-50);
246
+
247
+ /* Primary - inverted */
248
+ --primary: var(--color-zinc-50);
249
+ --primary-foreground: var(--color-zinc-950);
250
+
251
+ /* Secondary */
252
+ --secondary: var(--color-zinc-800);
253
+ --secondary-foreground: var(--color-zinc-200);
254
+
255
+ /* Muted */
256
+ --muted: var(--color-zinc-800);
257
+ --muted-foreground: var(--color-zinc-400);
258
+
259
+ /* Accent */
260
+ --accent: var(--color-zinc-800);
261
+ --accent-foreground: var(--color-zinc-50);
262
+
263
+ /* Borders */
264
+ --border: var(--color-zinc-700);
265
+ --border-subtle: var(--color-zinc-800);
266
+ --border-strong: var(--color-zinc-600);
267
+
268
+ /* Focus/Selection */
269
+ --ring: oklch(0.60 0.15 250);
270
+ --selection: oklch(0.25 0.06 250);
271
+ --selection-foreground: oklch(0.75 0.12 250);
272
+ --input: var(--color-zinc-800);
273
+
274
+ /* Destructive */
275
+ --destructive: oklch(0.60 0.22 25);
276
+
277
+ /* Inspector */
278
+ --inspector: var(--color-zinc-950);
279
+ --inspector-header: var(--color-zinc-900);
280
+
281
+ /* Toolbar */
282
+ --toolbar: var(--color-zinc-950);
283
+ --toolbar-border: var(--color-zinc-800);
284
+
285
+ /* Block states */
286
+ --block-hover: oklch(0.20 0.03 250);
287
+ --block-selected: oklch(0.50 0.15 250);
288
+ --block-selected-bg: oklch(0.22 0.04 250);
289
+
290
+ /* Chart colors - adjusted for dark bg */
291
+ --chart-1: oklch(0.70 0.20 41);
292
+ --chart-2: oklch(0.65 0.12 185);
293
+ --chart-3: oklch(0.50 0.08 227);
294
+ --chart-4: oklch(0.80 0.17 84);
295
+ --chart-5: oklch(0.75 0.17 70);
296
+
297
+ /* Sidebar */
298
+ --sidebar: var(--color-zinc-950);
299
+ --sidebar-foreground: var(--color-zinc-50);
300
+ --sidebar-primary: var(--color-zinc-50);
301
+ --sidebar-primary-foreground: var(--color-zinc-950);
302
+ --sidebar-accent: var(--color-zinc-800);
303
+ --sidebar-accent-foreground: var(--color-zinc-200);
304
+ --sidebar-border: var(--color-zinc-800);
305
+ --sidebar-ring: oklch(0.60 0.15 250);
306
+ }
307
+
308
+ /* Force light mode within .light scope (e.g., email canvas preview) */
309
+ .mjml-editor.dark .light,
310
+ .dark .mjml-editor .light {
311
+ --background: var(--color-white);
312
+ --background-subtle: var(--color-zinc-50);
313
+ --canvas: oklch(0.975 0.005 250);
314
+ --surface: var(--color-white);
315
+ --foreground: var(--color-zinc-950);
316
+ --foreground-muted: var(--color-zinc-600);
317
+ --foreground-subtle: var(--color-zinc-500);
318
+ --card: var(--color-white);
319
+ --card-foreground: var(--color-zinc-950);
320
+ --popover: var(--color-white);
321
+ --popover-foreground: var(--color-zinc-950);
322
+ --primary: var(--color-zinc-900);
323
+ --primary-foreground: var(--color-zinc-50);
324
+ --secondary: var(--color-zinc-100);
325
+ --secondary-foreground: var(--color-zinc-900);
326
+ --muted: var(--color-zinc-100);
327
+ --muted-foreground: var(--color-zinc-600);
328
+ --accent: oklch(0.97 0.005 250);
329
+ --accent-foreground: var(--color-zinc-950);
330
+ --border: var(--color-zinc-200);
331
+ --border-subtle: var(--color-zinc-200);
332
+ --border-strong: var(--color-zinc-300);
333
+ --ring: oklch(0.55 0.15 250);
334
+ --selection: oklch(0.92 0.03 250);
335
+ --selection-foreground: oklch(0.35 0.12 250);
336
+ --input: var(--color-zinc-300);
337
+ --destructive: oklch(0.55 0.22 25);
338
+ --block-hover: oklch(0.97 0.02 250);
339
+ --block-selected: oklch(0.40 0.15 250);
340
+ --block-selected-bg: oklch(0.96 0.02 250);
341
+ }
342
+
343
+ /* Tiptap Editor Styles */
344
+ .ProseMirror {
345
+ outline: none;
346
+ }
347
+
348
+ .ProseMirror p {
349
+ margin: 0;
350
+ }
351
+
352
+ .ProseMirror a {
353
+ color: inherit;
354
+ text-decoration: underline;
355
+ cursor: text;
356
+ }
357
+
358
+ /* Liquid syntax highlighting */
359
+ .liquid-highlight {
360
+ background-color: oklch(0.93 0.04 250);
361
+ border-radius: 3px;
362
+ padding: 1px 2px;
363
+ margin: 0 -2px;
364
+ pointer-events: none;
365
+ }
@@ -11,8 +11,19 @@ interface ThemeProviderProps {
11
11
  children: ReactNode;
12
12
  defaultTheme?: Theme;
13
13
  storageKey?: string;
14
+ /**
15
+ * Whether to apply the theme class to document.documentElement.
16
+ * This is needed for Radix UI portals (popovers, menus, etc.) which
17
+ * render outside the .mjml-editor container.
18
+ *
19
+ * Set to false if the host app manages document-level theme classes
20
+ * and you want to prevent conflicts.
21
+ *
22
+ * @default true
23
+ */
24
+ applyToDocument?: boolean;
14
25
  }
15
- export declare function ThemeProvider({ children, defaultTheme, storageKey, }: ThemeProviderProps): import("react/jsx-runtime").JSX.Element;
26
+ export declare function ThemeProvider({ children, defaultTheme, storageKey, applyToDocument, }: ThemeProviderProps): import("react/jsx-runtime").JSX.Element;
16
27
  export declare function useTheme(): ThemeContextValue;
17
28
  export {};
18
29
  //# sourceMappingURL=ThemeContext.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ThemeContext.d.ts","sourceRoot":"","sources":["../../src/context/ThemeContext.tsx"],"names":[],"mappings":"AAAA,OAAO,EAOL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAEf,KAAK,KAAK,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;AACzC,KAAK,aAAa,GAAG,OAAO,GAAG,MAAM,CAAC;AAEtC,UAAU,iBAAiB;IACzB,KAAK,EAAE,KAAK,CAAC;IACb,aAAa,EAAE,aAAa,CAAC;IAC7B,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,WAAW,EAAE,MAAM,IAAI,CAAC;CACzB;AAsBD,UAAU,kBAAkB;IAC1B,QAAQ,EAAE,SAAS,CAAC;IACpB,YAAY,CAAC,EAAE,KAAK,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,aAAa,CAAC,EAC5B,QAAQ,EACR,YAAY,EACZ,UAAwB,GACzB,EAAE,kBAAkB,2CA6CpB;AAGD,wBAAgB,QAAQ,sBAMvB"}
1
+ {"version":3,"file":"ThemeContext.d.ts","sourceRoot":"","sources":["../../src/context/ThemeContext.tsx"],"names":[],"mappings":"AAAA,OAAO,EAOL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAEf,KAAK,KAAK,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;AACzC,KAAK,aAAa,GAAG,OAAO,GAAG,MAAM,CAAC;AAEtC,UAAU,iBAAiB;IACzB,KAAK,EAAE,KAAK,CAAC;IACb,aAAa,EAAE,aAAa,CAAC;IAC7B,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,WAAW,EAAE,MAAM,IAAI,CAAC;CACzB;AAsBD,UAAU,kBAAkB;IAC1B,QAAQ,EAAE,SAAS,CAAC;IACpB,YAAY,CAAC,EAAE,KAAK,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;;;;;OASG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,wBAAgB,aAAa,CAAC,EAC5B,QAAQ,EACR,YAAY,EACZ,UAAwB,EACxB,eAAsB,GACvB,EAAE,kBAAkB,2CAgDpB;AAGD,wBAAgB,QAAQ,sBAMvB"}