@mjml-agent-editor/editor 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.
@@ -0,0 +1,411 @@
1
+ /*
2
+ * Editor chrome theme.
3
+ *
4
+ * Every colour below is a custom property, so a host restyles the editor by redefining
5
+ * these rather than by forking the stylesheet. Import this file and then override any
6
+ * token in your own `:root` — later declarations win.
7
+ *
8
+ * Before this, the file carried eighteen hardcoded hex values and no `var()` at all,
9
+ * which made "apply your own styling" untrue in practice.
10
+ */
11
+ :root {
12
+ /* Deepest chrome surface: sidebar and panel backgrounds. */
13
+ --mjml-editor-panel: #101a30;
14
+ /* Recessed areas inside a panel. */
15
+ --mjml-editor-panel-sunken: #16203a;
16
+ /* Cards, fields and anything raised off the panel. */
17
+ --mjml-editor-panel-elevated: #1a2440;
18
+ /* Hover state for elevated surfaces. */
19
+ --mjml-editor-panel-raised: #22304f;
20
+ /* Default divider. */
21
+ --mjml-editor-border: #263250;
22
+ /* Divider that needs to read against elevated surfaces. */
23
+ --mjml-editor-border-strong: #2a3654;
24
+ /* Primary text on the chrome. */
25
+ --mjml-editor-fg: #e6ebf4;
26
+ /* Text that must sit on the accent colour. */
27
+ --mjml-editor-fg-strong: #ffffff;
28
+ /* Secondary text. */
29
+ --mjml-editor-fg-muted: #aeb8cf;
30
+ /* Labels and inactive tabs. */
31
+ --mjml-editor-fg-subtle: #8b96ac;
32
+ /* Placeholders. */
33
+ --mjml-editor-fg-faint: #6b7891;
34
+ /* Text on the light canvas, not on the chrome. */
35
+ --mjml-editor-fg-on-light: #18181b;
36
+ /* Icons and controls needing more contrast than fg-muted. */
37
+ --mjml-editor-neutral: #cbd5e1;
38
+ /* Scrollbar thumb. */
39
+ --mjml-editor-scrollbar: #2f3d5e;
40
+ /* Scrollbar thumb, hovered. */
41
+ --mjml-editor-scrollbar-hover: #3d4e75;
42
+ /* Brand colour: selection, active state, the agent's edit pulse. */
43
+ --mjml-editor-accent: #7c5cfc;
44
+ /* Accent text on a dark surface. */
45
+ --mjml-editor-accent-soft: #a99bff;
46
+ /* Accent text needing the least weight. */
47
+ --mjml-editor-accent-softer: #c9bdff;
48
+ /* Drop shadow under floating chrome. */
49
+ --mjml-editor-shadow: rgba(3, 8, 20, 0.4);
50
+ }
51
+
52
+ /*
53
+ * The Tailwind-facing names the packaged React components are classed against
54
+ * (`bg-panel`, `text-brand`, …), defined here as aliases so one vocabulary drives both
55
+ * the GrapesJS chrome and the components around it.
56
+ *
57
+ * Without this the package was not self-contained: overriding --mjml-editor-* repainted
58
+ * the GrapesJS sidebar while the header and chat panel stayed on whatever the host
59
+ * happened to define, because those components read the host's tokens. A host that
60
+ * defined none of them got an unstyled header and no warning.
61
+ *
62
+ * A host that wants these to diverge from the editor chrome can still redefine them
63
+ * after importing this file.
64
+ */
65
+ :root {
66
+ --panel: var(--mjml-editor-panel);
67
+ --panel-elevated: var(--mjml-editor-panel-elevated);
68
+ --panel-hover: var(--mjml-editor-panel-raised);
69
+ --panel-fg: var(--mjml-editor-fg);
70
+ --panel-muted-fg: var(--mjml-editor-fg-subtle);
71
+ --panel-border: var(--mjml-editor-border-strong);
72
+ --brand: var(--mjml-editor-accent);
73
+ --brand-fg: var(--mjml-editor-fg-strong);
74
+ --brand-soft: var(--mjml-editor-accent-softer);
75
+ }
76
+
77
+ /* ── Thin, theme-matched scrollbars in the dark chrome ──────────────────── */
78
+ .editor-dark,
79
+ .editor-dark * {
80
+ scrollbar-width: thin;
81
+ scrollbar-color: var(--mjml-editor-scrollbar) transparent;
82
+ }
83
+ .editor-dark ::-webkit-scrollbar,
84
+ .editor-dark::-webkit-scrollbar {
85
+ width: 10px;
86
+ height: 10px;
87
+ }
88
+ .editor-dark ::-webkit-scrollbar-track,
89
+ .editor-dark::-webkit-scrollbar-track {
90
+ background: transparent;
91
+ }
92
+ .editor-dark ::-webkit-scrollbar-thumb,
93
+ .editor-dark::-webkit-scrollbar-thumb {
94
+ background-color: var(--mjml-editor-scrollbar);
95
+ border-radius: 999px;
96
+ border: 3px solid transparent;
97
+ background-clip: content-box;
98
+ }
99
+ .editor-dark ::-webkit-scrollbar-thumb:hover,
100
+ .editor-dark::-webkit-scrollbar-thumb:hover {
101
+ background-color: var(--mjml-editor-scrollbar-hover);
102
+ background-clip: content-box;
103
+ }
104
+ .editor-dark ::-webkit-scrollbar-corner,
105
+ .editor-dark::-webkit-scrollbar-corner {
106
+ background: transparent;
107
+ }
108
+
109
+ /* ── Dark navy manager surfaces (left sidebar) ──────────────────────────── */
110
+ .editor-dark .gjs-one-bg {
111
+ background-color: var(--mjml-editor-panel); /* panel */
112
+ }
113
+ .editor-dark .gjs-two-bg {
114
+ background-color: var(--mjml-editor-panel-elevated); /* panel-elevated */
115
+ }
116
+ .editor-dark .gjs-two-color,
117
+ .editor-dark .gjs-two-color-h:hover {
118
+ color: var(--mjml-editor-neutral); /* slate-300 */
119
+ }
120
+ .editor-dark .gjs-color-main,
121
+ .editor-dark .gjs-color-active {
122
+ color: var(--mjml-editor-fg); /* slate-100 */
123
+ }
124
+
125
+ /* Accent (active/selected) — violet brand */
126
+ :root .gjs-three-bg {
127
+ background-color: var(--mjml-editor-accent);
128
+ color: var(--mjml-editor-fg-strong);
129
+ }
130
+ :root .gjs-four-color,
131
+ :root .gjs-four-color-h:hover {
132
+ color: var(--mjml-editor-accent-soft);
133
+ }
134
+
135
+ /* ── Blocks (dark navy cards, 3-column grid) ─────────────────────────────── */
136
+ .editor-dark .gjs-blocks-c {
137
+ display: grid;
138
+ grid-template-columns: repeat(3, minmax(0, 1fr));
139
+ gap: 6px;
140
+ padding: 6px 8px 10px;
141
+ }
142
+ .editor-dark .gjs-block {
143
+ width: auto;
144
+ min-width: 0;
145
+ min-height: 62px;
146
+ margin: 0;
147
+ padding: 10px 4px;
148
+ border: 1px solid var(--mjml-editor-border-strong);
149
+ border-radius: 10px;
150
+ background-color: var(--mjml-editor-panel-elevated);
151
+ box-shadow: none;
152
+ color: var(--mjml-editor-fg-muted);
153
+ transition:
154
+ border-color 0.12s ease,
155
+ box-shadow 0.12s ease,
156
+ background-color 0.12s ease;
157
+ }
158
+ .editor-dark .gjs-block:hover {
159
+ border-color: var(--mjml-editor-accent);
160
+ background-color: var(--mjml-editor-panel-raised);
161
+ box-shadow: 0 1px 10px color-mix(in srgb, var(--mjml-editor-accent) 30%, transparent);
162
+ }
163
+ .editor-dark .gjs-block__media {
164
+ display: flex;
165
+ justify-content: center;
166
+ margin-bottom: 5px;
167
+ }
168
+ .editor-dark .gjs-block svg {
169
+ width: 22px;
170
+ height: 22px;
171
+ fill: var(--mjml-editor-fg-muted);
172
+ }
173
+ .editor-dark .gjs-block-label {
174
+ font-size: 10px;
175
+ line-height: 1.2;
176
+ color: var(--mjml-editor-fg-muted);
177
+ }
178
+ .editor-dark .gjs-block-category .gjs-title,
179
+ .editor-dark .gjs-blocks-c .gjs-title {
180
+ font-size: 10px;
181
+ font-weight: 700;
182
+ text-transform: uppercase;
183
+ letter-spacing: 0.06em;
184
+ color: var(--mjml-editor-fg-faint); /* slate-500 */
185
+ padding: 10px 10px 4px;
186
+ }
187
+ /* Category open indicator — hide the default caret for a cleaner header */
188
+ .editor-dark .gjs-block-category .gjs-caret-icon {
189
+ display: none;
190
+ }
191
+
192
+ /* ── Form fields (style/traits) ──────────────────────────────────────────── */
193
+ .editor-dark .gjs-field,
194
+ .editor-dark .gjs-sm-field,
195
+ .editor-dark .gjs-clm-field {
196
+ background-color: var(--mjml-editor-panel-elevated);
197
+ border: 1px solid var(--mjml-editor-border);
198
+ border-radius: 6px;
199
+ color: var(--mjml-editor-fg);
200
+ }
201
+ .editor-dark .gjs-field input,
202
+ .editor-dark .gjs-field select,
203
+ .editor-dark .gjs-field textarea,
204
+ .editor-dark .gjs-sm-field input,
205
+ .editor-dark .gjs-clm-field input {
206
+ color: var(--mjml-editor-fg);
207
+ }
208
+ .editor-dark .gjs-field-arrow-u,
209
+ .editor-dark .gjs-field-arrow-d {
210
+ border-bottom-color: var(--mjml-editor-fg-subtle);
211
+ border-top-color: var(--mjml-editor-fg-subtle);
212
+ }
213
+
214
+ /* Unified manager typography (traits + styles) */
215
+ .editor-dark .gjs-sm-label,
216
+ .editor-dark .gjs-trt-trait .gjs-label,
217
+ .editor-dark .gjs-label {
218
+ font-size: 11px;
219
+ font-weight: 500;
220
+ line-height: 1.4;
221
+ letter-spacing: normal;
222
+ text-transform: none;
223
+ color: var(--mjml-editor-fg-subtle);
224
+ }
225
+ .editor-dark .gjs-sm-properties,
226
+ .editor-dark .gjs-traits-c {
227
+ padding: 6px 12px;
228
+ }
229
+ .editor-dark .gjs-trt-trait {
230
+ padding: 4px 0;
231
+ }
232
+ .editor-dark .gjs-sm-property {
233
+ margin-bottom: 6px;
234
+ padding: 0;
235
+ }
236
+ .editor-dark .gjs-field,
237
+ .editor-dark .gjs-sm-field {
238
+ min-height: 28px;
239
+ font-size: 12px;
240
+ }
241
+ .editor-dark .gjs-field input,
242
+ .editor-dark .gjs-field select,
243
+ .editor-dark .gjs-field textarea,
244
+ .editor-dark .gjs-sm-field input,
245
+ .editor-dark .gjs-sm-field select {
246
+ font-size: 12px;
247
+ }
248
+
249
+ /* Sector headers */
250
+ .editor-dark .gjs-sm-sector-title,
251
+ .editor-dark .gjs-trt-header {
252
+ padding: 8px 10px;
253
+ background-color: var(--mjml-editor-panel-sunken);
254
+ color: var(--mjml-editor-neutral);
255
+ border-bottom: 1px solid var(--mjml-editor-border);
256
+ font-size: 11px;
257
+ font-weight: 600;
258
+ text-transform: uppercase;
259
+ letter-spacing: 0.04em;
260
+ }
261
+ .editor-dark .gjs-sm-sector,
262
+ .editor-dark .gjs-trt-trait {
263
+ border-bottom: 1px solid var(--mjml-editor-panel-elevated);
264
+ }
265
+
266
+ /* Layers */
267
+ .editor-dark .gjs-layer-title {
268
+ color: var(--mjml-editor-neutral);
269
+ }
270
+ .editor-dark .gjs-layer.gjs-selected > .gjs-layer-item {
271
+ background-color: color-mix(in srgb, var(--mjml-editor-accent) 22%, transparent);
272
+ }
273
+
274
+ /* Selector bar (component classes) */
275
+ .editor-dark .gjs-clm-tags {
276
+ background-color: var(--mjml-editor-panel-elevated);
277
+ color: var(--mjml-editor-neutral);
278
+ }
279
+
280
+ /* ── Drop placeholder (was green) → violet ───────────────────────────────── */
281
+ :root .gjs-placeholder {
282
+ border-color: var(--mjml-editor-accent);
283
+ }
284
+ :root .gjs-placeholder.horizontal {
285
+ border-color: var(--mjml-editor-accent);
286
+ }
287
+ :root .gjs-placeholder-int {
288
+ background-color: var(--mjml-editor-accent);
289
+ border-color: var(--mjml-editor-accent);
290
+ }
291
+
292
+ /* ── Canvas backdrop stays light (React container provides bg-surface-muted) ─ */
293
+ /* overflow: visible lets the RTE bar for text near the canvas edge escape
294
+ instead of being clipped. */
295
+ :root .gjs-cv-canvas {
296
+ overflow: visible;
297
+ background-color: transparent;
298
+ }
299
+
300
+ /* Hide the native device-switcher panel (we have our own toggle in the header). */
301
+ :root .gjs-pn-devices-c {
302
+ display: none;
303
+ }
304
+
305
+ /* ── Object toolbar (context menu) — dark rounded pill ───────────────────── */
306
+ :root .gjs-toolbar {
307
+ background-color: var(--mjml-editor-panel);
308
+ border-radius: 9px;
309
+ padding: 3px;
310
+ box-shadow: 0 6px 16px var(--mjml-editor-shadow);
311
+ }
312
+ :root .gjs-toolbar-items {
313
+ display: flex;
314
+ align-items: center;
315
+ gap: 2px;
316
+ }
317
+ :root .gjs-toolbar-item {
318
+ display: inline-flex;
319
+ align-items: center;
320
+ justify-content: center;
321
+ width: 26px;
322
+ height: 26px;
323
+ padding: 0;
324
+ border-radius: 6px;
325
+ color: var(--mjml-editor-neutral);
326
+ transition:
327
+ background-color 0.12s ease,
328
+ color 0.12s ease;
329
+ }
330
+ :root .gjs-toolbar-item:hover {
331
+ background-color: color-mix(in srgb, var(--mjml-editor-fg-strong) 12%, transparent);
332
+ color: var(--mjml-editor-fg-strong);
333
+ }
334
+ :root .gjs-toolbar-item svg {
335
+ width: 15px;
336
+ height: 15px;
337
+ }
338
+ /* Accent on the "sparkles" (comment/AI) button — violet */
339
+ :root .gjs-toolbar-item[data-role="sparkles"] {
340
+ color: var(--mjml-editor-accent-soft);
341
+ }
342
+ :root .gjs-toolbar-item[data-role="sparkles"]:hover {
343
+ background-color: color-mix(in srgb, var(--mjml-editor-accent) 30%, transparent);
344
+ color: var(--mjml-editor-accent-softer);
345
+ }
346
+
347
+ /* ── RTE bar — same dark pill, with font/size/color extras ───────────────── */
348
+ :root .gjs-rte-toolbar {
349
+ z-index: 100;
350
+ background-color: var(--mjml-editor-panel);
351
+ border: none;
352
+ border-radius: 9px;
353
+ padding: 3px;
354
+ box-shadow: 0 6px 16px var(--mjml-editor-shadow);
355
+ }
356
+ :root .gjs-rte-actionbar {
357
+ display: flex;
358
+ align-items: center;
359
+ gap: 3px;
360
+ }
361
+ :root .gjs-rte-action {
362
+ display: inline-flex;
363
+ align-items: center;
364
+ justify-content: center;
365
+ flex: 0 0 auto;
366
+ width: auto;
367
+ min-width: 26px;
368
+ height: 26px;
369
+ padding: 0 4px;
370
+ border: none;
371
+ border-radius: 6px;
372
+ color: var(--mjml-editor-neutral);
373
+ transition:
374
+ background-color 0.12s ease,
375
+ color 0.12s ease;
376
+ }
377
+ :root .gjs-rte-action:hover {
378
+ background-color: color-mix(in srgb, var(--mjml-editor-fg-strong) 12%, transparent);
379
+ color: var(--mjml-editor-fg-strong);
380
+ }
381
+ :root .gjs-rte-action svg {
382
+ width: 15px;
383
+ height: 15px;
384
+ }
385
+ :root .gjs-rte-action.gjs-rte-active {
386
+ background-color: color-mix(in srgb, var(--mjml-editor-fg-strong) 18%, transparent);
387
+ color: var(--mjml-editor-fg-strong);
388
+ }
389
+ :root .gjs-rte-select {
390
+ max-width: 92px;
391
+ padding: 0 2px;
392
+ background: transparent;
393
+ color: var(--mjml-editor-fg);
394
+ border: none;
395
+ font-size: 12px;
396
+ text-overflow: ellipsis;
397
+ outline: none;
398
+ cursor: pointer;
399
+ }
400
+ :root .gjs-rte-select option {
401
+ color: var(--mjml-editor-fg-on-light);
402
+ }
403
+ :root .gjs-rte-color {
404
+ width: 18px;
405
+ height: 18px;
406
+ padding: 0;
407
+ border: none;
408
+ border-radius: 4px;
409
+ background: transparent;
410
+ cursor: pointer;
411
+ }