@matops/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.
package/dist/style.css ADDED
@@ -0,0 +1,4710 @@
1
+ /* ─────────────────────────────────────────────────────────────────────
2
+ @matops/editor — Main Stylesheet Entry Point
3
+ Import order matters: variables → layout → typography → components
4
+ ───────────────────────────────────────────────────────────────────── */
5
+
6
+ /* ─────────────────────────────────────────────────────────────────────
7
+ @matops/editor — Shared Keyframe Animations
8
+ ───────────────────────────────────────────────────────────────────── */
9
+
10
+ @keyframes mat-pop-in {
11
+ from {
12
+ opacity: 0;
13
+ transform: scale(0.92) translateY(4px);
14
+ }
15
+ to {
16
+ opacity: 1;
17
+ transform: scale(1) translateY(0);
18
+ }
19
+ }
20
+
21
+ @keyframes mat-fade-in {
22
+ from { opacity: 0; }
23
+ to { opacity: 1; }
24
+ }
25
+
26
+ @keyframes mat-slide-down {
27
+ from {
28
+ opacity: 0;
29
+ transform: translateY(-8px);
30
+ }
31
+ to {
32
+ opacity: 1;
33
+ transform: translateY(0);
34
+ }
35
+ }
36
+
37
+ @keyframes mat-spin {
38
+ to { transform: rotate(360deg); }
39
+ }
40
+
41
+ /* ─────────────────────────────────────────────────────────────────────
42
+ @matops/editor — Base Stylesheet
43
+ Theme variables are defined on .matops-editor--light / --dark (scoped)
44
+ AND mirrored on :root as light defaults.
45
+
46
+ WHY :root? position:fixed elements (modals, tooltips) escape their DOM
47
+ parent's CSS cascade and lose scoped variables. :root ensures they always
48
+ have a resolved value. The scoped class overrides :root when inside the
49
+ editor container, so there is no global style pollution beyond the variables.
50
+ ───────────────────────────────────────────────────────────────────── */
51
+
52
+ /* ── Root Defaults (light theme — ensures fixed-position elements work) */
53
+
54
+ :root {
55
+ --mat-editor-bg: #ffffff;
56
+ --mat-editor-surface: #f8f9fa;
57
+ --mat-editor-border: #e2e4e9;
58
+ --mat-editor-border-focus: #6366f1;
59
+ --mat-editor-text: #111827;
60
+ --mat-editor-text-muted: #6b7280;
61
+ --mat-editor-text-placeholder: #9ca3af;
62
+ --mat-editor-accent: #6366f1;
63
+ --mat-editor-accent-hover: #4f46e5;
64
+ --mat-editor-accent-subtle: #eef2ff;
65
+ --mat-editor-toolbar-bg: #ffffff;
66
+ --mat-editor-toolbar-border: #e2e4e9;
67
+ --mat-editor-btn-hover: #f3f4f6;
68
+ --mat-editor-btn-active: #e0e7ff;
69
+ --mat-editor-btn-active-text: #4f46e5;
70
+ --mat-editor-code-bg: #f1f5f9;
71
+ --mat-editor-code-text: #0f172a;
72
+ --mat-editor-blockquote-border: #6366f1;
73
+ --mat-editor-blockquote-bg: #eef2ff;
74
+ --mat-editor-table-border: #e2e4e9;
75
+ --mat-editor-table-header-bg: #f8f9fa;
76
+ --mat-editor-selection: #c7d2fe;
77
+ --mat-editor-shadow:
78
+ 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
79
+ --mat-editor-shadow-lg:
80
+ 0 10px 25px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
81
+ --mat-editor-radius: 8px;
82
+ --mat-editor-radius-sm: 4px;
83
+ --mat-editor-font: "Inter var", "Inter", system-ui, -apple-system, sans-serif;
84
+ --mat-editor-font-mono:
85
+ "JetBrains Mono", "Fira Code", "Cascadia Code", monospace;
86
+ }
87
+
88
+ /* ── Light Theme Variables ────────────────────────────────────────── */
89
+
90
+ .matops-editor--light {
91
+ --mat-editor-bg: #ffffff;
92
+ --mat-editor-surface: #f8f9fa;
93
+ --mat-editor-border: #e2e4e9;
94
+ --mat-editor-border-focus: #6366f1;
95
+ --mat-editor-text: #111827;
96
+ --mat-editor-text-muted: #6b7280;
97
+ --mat-editor-text-placeholder: #9ca3af;
98
+ --mat-editor-accent: #6366f1;
99
+ --mat-editor-accent-hover: #4f46e5;
100
+ --mat-editor-accent-subtle: #eef2ff;
101
+ --mat-editor-toolbar-bg: #ffffff;
102
+ --mat-editor-toolbar-border: #e2e4e9;
103
+ --mat-editor-btn-hover: #f3f4f6;
104
+ --mat-editor-btn-active: #e0e7ff;
105
+ --mat-editor-btn-active-text: #4f46e5;
106
+ --mat-editor-code-bg: #f1f5f9;
107
+ --mat-editor-code-text: #0f172a;
108
+ --mat-editor-blockquote-border: #6366f1;
109
+ --mat-editor-blockquote-bg: #eef2ff;
110
+ --mat-editor-table-border: #e2e4e9;
111
+ --mat-editor-table-header-bg: #f8f9fa;
112
+ --mat-editor-selection: #c7d2fe;
113
+ --mat-editor-ring: #6366f1;
114
+ --mat-editor-shadow:
115
+ 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
116
+ --mat-editor-shadow-lg:
117
+ 0 10px 25px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
118
+ --mat-editor-radius: 8px;
119
+ --mat-editor-radius-sm: 4px;
120
+ --mat-editor-font: "Inter var", "Inter", system-ui, -apple-system, sans-serif;
121
+ --mat-editor-font-mono:
122
+ "JetBrains Mono", "Fira Code", "Cascadia Code", monospace;
123
+ }
124
+
125
+ /* ── Dark Theme Variables ─────────────────────────────────────────── */
126
+
127
+ .matops-editor--dark {
128
+ --mat-editor-bg: #0f1117;
129
+ --mat-editor-surface: #1a1d27;
130
+ --mat-editor-border: #2d3148;
131
+ --mat-editor-border-focus: #818cf8;
132
+ --mat-editor-text: #f1f5f9;
133
+ --mat-editor-text-muted: #94a3b8;
134
+ --mat-editor-text-placeholder: #475569;
135
+ --mat-editor-accent: #818cf8;
136
+ --mat-editor-accent-hover: #6366f1;
137
+ --mat-editor-accent-subtle: #1e1b4b;
138
+ --mat-editor-toolbar-bg: #1a1d27;
139
+ --mat-editor-toolbar-border: #2d3148;
140
+ --mat-editor-btn-hover: #252840;
141
+ --mat-editor-btn-active: #312e81;
142
+ --mat-editor-btn-active-text: #a5b4fc;
143
+ --mat-editor-code-bg: #1e293b;
144
+ --mat-editor-code-text: #e2e8f0;
145
+ --mat-editor-blockquote-border: #818cf8;
146
+ --mat-editor-blockquote-bg: #1e1b4b;
147
+ --mat-editor-table-border: #2d3148;
148
+ --mat-editor-table-header-bg: #252840;
149
+ --mat-editor-selection: #312e81;
150
+ --mat-editor-ring: #818cf8;
151
+ --mat-editor-shadow:
152
+ 0 1px 3px 0 rgb(0 0 0 / 0.4), 0 1px 2px -1px rgb(0 0 0 / 0.4);
153
+ --mat-editor-shadow-lg:
154
+ 0 10px 25px -3px rgb(0 0 0 / 0.5), 0 4px 6px -4px rgb(0 0 0 / 0.4);
155
+ --mat-editor-radius: 8px;
156
+ --mat-editor-radius-sm: 4px;
157
+ --mat-editor-font: "Inter var", "Inter", system-ui, -apple-system, sans-serif;
158
+ --mat-editor-font-mono:
159
+ "JetBrains Mono", "Fira Code", "Cascadia Code", monospace;
160
+ }
161
+
162
+ /* ─────────────────────────────────────────────────────────────────────
163
+ @matops/editor — Layout — Structure
164
+ Header · Body · Scroll-inner · Viewer · Footer · Content-width variants
165
+ ───────────────────────────────────────────────────────────────────── */
166
+
167
+ /* ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
168
+ LAYOUT — Header / Body / Footer (no shell wrapper)
169
+ All three are direct children of EditorProvider.
170
+ Each carries the theme class so CSS variables resolve independently.
171
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ */
172
+
173
+ /* ── HEADER — Toolbar, pinned to top ───────────────────────────────── */
174
+
175
+ .matops-editor__header {
176
+ position: sticky;
177
+ top: 0;
178
+ z-index: 20;
179
+ flex-shrink: 0;
180
+ background-color: var(--mat-editor-toolbar-bg);
181
+ border-bottom: 1px solid var(--mat-editor-toolbar-border);
182
+ backdrop-filter: blur(8px);
183
+ }
184
+
185
+ /* Toolbar inside header no longer needs its own sticky/radius */
186
+
187
+ .matops-editor__header .matops-editor__toolbar {
188
+ position: static;
189
+ border-bottom: none;
190
+ border-radius: 0;
191
+ backdrop-filter: none;
192
+ }
193
+
194
+ .matops-editor__header .matops-editor__toolbar-wrapper {
195
+ border-bottom: none;
196
+ }
197
+
198
+ /* ── BODY — Card shell, clips border-radius only ────────────────────── */
199
+
200
+ [data-matops-editor].matops-editor__body {
201
+ flex: 1 1 0%;
202
+ min-height: 0;
203
+ display: flex;
204
+ flex-direction: column;
205
+ background-color: var(--mat-editor-bg);
206
+ color: var(--mat-editor-text);
207
+ font-family: var(--mat-editor-font);
208
+ /* ── Card border ── */
209
+ border: 1.5px solid var(--mat-editor-border);
210
+ border-radius: 14px;
211
+ margin-block: 10px;
212
+ box-shadow: 0 1px 6px 0 rgb(0 0 0 / 0.06);
213
+ /* overflow:hidden clips children to the rounded corners of the card.
214
+ Scrolling happens on the inner .matops-editor__scroll-inner wrapper,
215
+ NOT here — so this does not block the user from scrolling. */
216
+ overflow: hidden;
217
+ }
218
+
219
+ /* ── SCROLL INNER — the scrollable viewport inside the card ───────────
220
+ Uses overflow-y:auto so it scrolls. Its children (the 3 panels) are
221
+ laid out as normal BLOCK flow — NOT flex children. This means they
222
+ stack naturally top-to-bottom and the scroll-inner grows to fit all
223
+ of them, so the attachments panel always sits below the body content
224
+ no matter how long the document is. */
225
+
226
+ [data-matops-editor].matops-editor__body .matops-editor__scroll-inner {
227
+ flex: 1 1 0%;
228
+ min-height: 0;
229
+ overflow-y: auto;
230
+ overflow-x: hidden;
231
+ /* block layout — children stack naturally, no flex height competition */
232
+ display: block;
233
+ }
234
+
235
+ /* ── PANEL 1: Page header — cover image, title, separator ──────────── */
236
+
237
+ [data-matops-editor].matops-editor__body .matops-editor__page-header {
238
+ display: flex;
239
+ flex-direction: column;
240
+ }
241
+
242
+ /* Title wrap inside the page-header: remove top padding — cover image is
243
+ directly above and provides visual separation already. */
244
+
245
+ [data-matops-editor].matops-editor__body
246
+ .matops-editor__page-header
247
+ .mat-page-title-wrap {
248
+ padding-top: 0.5rem;
249
+ }
250
+
251
+ /* Separator inside page-header: remove extra bottom padding — ProseMirror
252
+ body starts immediately below with its own top padding. */
253
+
254
+ [data-matops-editor].matops-editor__body
255
+ .matops-editor__page-header
256
+ .mat-title-separator {
257
+ padding-bottom: 0;
258
+ }
259
+
260
+ /* ── PANEL 2: Body panel — ProseMirror canvas ─────────────────────────
261
+ min-height ensures the editor is always at least 400px tall even when
262
+ the document is empty, so there's always room to click and type. */
263
+
264
+ [data-matops-editor].matops-editor__body .matops-editor__body-panel {
265
+ min-height: 400px;
266
+ display: flex;
267
+ flex-direction: column;
268
+ }
269
+
270
+ /* ── PANEL 3: Attachments panel ───────────────────────────────────────
271
+ Flows naturally below the body panel in block layout. No positioning
272
+ tricks needed — block stacking handles this correctly. */
273
+
274
+ [data-matops-editor].matops-editor__body .matops-editor__attachments-panel {
275
+ /* intentionally empty — block flow is all that's needed */
276
+ }
277
+
278
+ /* Content wrapper fills the body panel */
279
+
280
+ [data-matops-editor].matops-editor__body .matops-editor__content {
281
+ flex: 1 1 auto;
282
+ display: flex;
283
+ flex-direction: column;
284
+ }
285
+
286
+ /* ProseMirror fills the body panel */
287
+
288
+ [data-matops-editor].matops-editor__body .ProseMirror {
289
+ flex: 1 1 auto;
290
+ min-height: 280px;
291
+ /* 14px top: the separator's own bottom padding is zeroed so the separator
292
+ icon itself acts as the visual divider. This 14px is the breathing room
293
+ between the separator and the first content block.
294
+ When there's no page-header at all, the :not(:has(*)) rule below raises
295
+ this to 20px since there's no separator providing visual context. */
296
+ padding: 14px 28px 28px;
297
+ outline: none;
298
+ background: transparent;
299
+ display: flex;
300
+ flex-direction: column;
301
+ }
302
+
303
+ /* When the page-header panel is empty (all features disabled — no cover, title,
304
+ or separator rendered), restore top padding so ProseMirror content doesn't
305
+ start flush against the card edge.
306
+ :has(*) checks whether the page-header div has ANY rendered child element.
307
+ If it has no children, the adjacent sibling's ProseMirror gets top padding. */
308
+
309
+ [data-matops-editor].matops-editor__body
310
+ .matops-editor__page-header:not(:has(*))
311
+ + .matops-editor__body-panel
312
+ .ProseMirror {
313
+ padding-top: 20px;
314
+ }
315
+
316
+ /* Same rule for the viewer — when page-header panel is empty */
317
+
318
+ [data-matops-editor].matops-editor__viewer
319
+ .matops-editor__page-header:not(:has(*))
320
+ + .matops-editor__body-panel
321
+ .ProseMirror {
322
+ padding-top: 20px;
323
+ }
324
+
325
+ /* Legacy: Attachments NodeViewWrapper (kept for old-format docs). */
326
+
327
+ [data-matops-editor].matops-editor__body
328
+ .ProseMirror
329
+ > [data-node-view-wrapper]:has(.mat-attachments) {
330
+ margin-top: auto;
331
+ flex-shrink: 0;
332
+ }
333
+
334
+ /* ── VIEWER — Read-only render, card + sibling footer ───────────────── */
335
+
336
+ /*
337
+ * The viewer renders identical HTML structure to the editor:
338
+ * matops-editor__viewer
339
+ * └── matops-editor__scroll-inner ← same scroll rules as editor
340
+ * ├── matops-editor__page-header ← same panel rules as editor
341
+ * ├── matops-editor__body-panel ← same panel rules as editor
342
+ * └── matops-editor__attachments-panel
343
+ * Body uses class="ProseMirror" so all typography/spacing is inherited.
344
+ * No panel overrides needed — editor rules apply directly.
345
+ */
346
+
347
+ .matops-editor__viewer-wrap {
348
+ display: flex;
349
+ flex-direction: column;
350
+ flex: 1 1 0%;
351
+ min-height: 0;
352
+ margin-block: 10px;
353
+ }
354
+
355
+ /* Viewer card — same layout as matops-editor__body but with its own border/shadow */
356
+
357
+ [data-matops-editor].matops-editor__viewer {
358
+ flex: 1 1 0%;
359
+ min-height: 0;
360
+ display: flex;
361
+ flex-direction: column;
362
+ background-color: var(--mat-editor-bg);
363
+ color: var(--mat-editor-text);
364
+ font-family: var(--mat-editor-font);
365
+ border: 1.5px solid var(--mat-editor-border);
366
+ border-radius: 14px;
367
+ box-shadow: 0 1px 6px 0 rgb(0 0 0 / 0.06);
368
+ overflow: hidden;
369
+ }
370
+
371
+ /* ── Viewer stat bar — flat bar mirroring the toolbar style ─────────── */
372
+
373
+ .matops-editor__viewer-footer {
374
+ flex-shrink: 0;
375
+ background-color: var(--mat-editor-toolbar-bg);
376
+ border-top: 1px solid var(--mat-editor-toolbar-border);
377
+ backdrop-filter: blur(8px);
378
+ }
379
+
380
+ .matops-editor__viewer-footer .mat-count-bar {
381
+ border: none;
382
+ border-radius: 0;
383
+ background: transparent;
384
+ }
385
+
386
+ /* ── Preview toggle button ─────────────────────────────────────────── */
387
+
388
+ .mat-preview-toggle {
389
+ display: inline-flex;
390
+ align-items: center;
391
+ gap: 5px;
392
+ padding: 4px 10px;
393
+ border-radius: 20px;
394
+ border: 1.5px solid var(--mat-editor-border);
395
+ background: var(--mat-editor-surface);
396
+ color: var(--mat-editor-text-muted);
397
+ font-size: 11px;
398
+ font-weight: 600;
399
+ cursor: pointer;
400
+ transition:
401
+ background 0.15s ease,
402
+ border-color 0.15s ease,
403
+ color 0.15s ease;
404
+ white-space: nowrap;
405
+ letter-spacing: 0.02em;
406
+ }
407
+
408
+ .mat-preview-toggle:hover {
409
+ background: var(--mat-editor-btn-hover);
410
+ border-color: var(--mat-editor-ring, #6366f1);
411
+ color: var(--mat-editor-text);
412
+ }
413
+
414
+ .mat-preview-toggle--active {
415
+ background: var(--mat-editor-ring, #6366f1);
416
+ border-color: var(--mat-editor-ring, #6366f1);
417
+ color: #fff;
418
+ }
419
+
420
+ .mat-preview-toggle--active:hover {
421
+ background: #4f46e5;
422
+ border-color: #4f46e5;
423
+ color: #fff;
424
+ }
425
+
426
+ /* ── In-editor preview panel — fills the body card ──────────────────── */
427
+
428
+ /* Scrolling is delegated to the viewer's matops-editor__scroll-inner */
429
+
430
+ .matops-editor__preview-panel {
431
+ flex: 1 1 0%;
432
+ min-height: 0;
433
+ display: flex;
434
+ flex-direction: column;
435
+ overflow: hidden;
436
+ }
437
+
438
+ .matops-editor__preview-panel .matops-editor__viewer-wrap {
439
+ flex: 1 1 0%;
440
+ min-height: 0;
441
+ margin: 0;
442
+ /* Override all content-width constraints — viewer is inside the body card,
443
+ it must fill it 100% with no side margins or max-width */
444
+ max-width: none !important;
445
+ width: 100% !important;
446
+ margin-inline: 0 !important;
447
+ }
448
+
449
+ /* Inside preview the viewer card IS the body card — strip double border/shadow */
450
+
451
+ .matops-editor__preview-panel [data-matops-editor].matops-editor__viewer {
452
+ border: none;
453
+ border-radius: 0;
454
+ box-shadow: none;
455
+ }
456
+
457
+ .matops-editor__preview-panel .matops-editor__viewer-footer {
458
+ border-top: 1px solid var(--mat-editor-toolbar-border);
459
+ background-color: var(--mat-editor-toolbar-bg);
460
+ backdrop-filter: blur(8px);
461
+ }
462
+
463
+ /* ── FOOTER — CountBar, mirrors the header bar exactly ─────────────── */
464
+
465
+ .matops-editor__footer {
466
+ position: sticky;
467
+ bottom: 0;
468
+ z-index: 20;
469
+ flex-shrink: 0;
470
+ background-color: var(--mat-editor-toolbar-bg);
471
+ border-top: 1px solid var(--mat-editor-toolbar-border);
472
+ backdrop-filter: blur(8px);
473
+ }
474
+
475
+ .matops-editor__footer .mat-count-bar {
476
+ border: none;
477
+ border-radius: 0;
478
+ background: transparent;
479
+ }
480
+
481
+ /* ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
482
+ CONTENT WIDTH VARIANTS
483
+ All three modes keep a minimum 12px breathing room on the sides.
484
+
485
+ "full" — fills container, 12px sides from the base margin.
486
+ "normal" — max 820px, centered, min 12px per side via width calc.
487
+ "compact" — max 640px, centered, min 12px per side via width calc.
488
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ */
489
+
490
+ /* normal — centered, comfortable writing width, guaranteed side spacing */
491
+
492
+ [data-matops-editor].matops-editor__body[data-content-width="normal"],
493
+ .matops-editor__viewer-wrap[data-content-width="normal"] {
494
+ max-width: 820px;
495
+ width: calc(100% - 24px); /* 12px each side minimum */
496
+ margin-inline: auto;
497
+ }
498
+
499
+ /* compact — narrow column, guaranteed side spacing */
500
+
501
+ [data-matops-editor].matops-editor__body[data-content-width="compact"],
502
+ .matops-editor__viewer-wrap[data-content-width="compact"] {
503
+ max-width: 640px;
504
+ width: calc(100% - 24px); /* 12px each side minimum */
505
+ margin-inline: auto;
506
+ }
507
+
508
+ /* full — no width constraint; base margin: 10px 12px provides the sides */
509
+
510
+ [data-matops-editor].matops-editor__body[data-content-width="full"],
511
+ .matops-editor__viewer-wrap[data-content-width="full"] {
512
+ max-width: none;
513
+ width: calc(100% - 24px); /* keep consistent 12px each side */
514
+ margin-inline: auto;
515
+ }
516
+
517
+ /* Responsive: below 900px, normal releases max-width but keeps side spacing */
518
+
519
+ @media (max-width: 900px) {
520
+ [data-matops-editor].matops-editor__body[data-content-width="normal"],
521
+ .matops-editor__viewer-wrap[data-content-width="normal"] {
522
+ max-width: 100%;
523
+ width: calc(100% - 24px);
524
+ }
525
+ }
526
+
527
+ /* Responsive: below 700px, compact releases max-width but keeps side spacing */
528
+
529
+ @media (max-width: 700px) {
530
+ [data-matops-editor].matops-editor__body[data-content-width="compact"],
531
+ .matops-editor__viewer-wrap[data-content-width="compact"] {
532
+ max-width: 100%;
533
+ width: calc(100% - 24px);
534
+ }
535
+ }
536
+
537
+ /* ── [data-matops-editor] base (body inherits this) ────────────────── */
538
+
539
+ [data-matops-editor] {
540
+ display: flex;
541
+ flex-direction: column;
542
+ width: 100%;
543
+ background-color: var(--mat-editor-bg);
544
+ color: var(--mat-editor-text);
545
+ font-family: var(--mat-editor-font);
546
+ border-radius: 0;
547
+ transition:
548
+ background-color 0.2s ease,
549
+ color 0.2s ease;
550
+ }
551
+
552
+ /* ─────────────────────────────────────────────────────────────────────
553
+ @matops/editor — Typography — ProseMirror Content
554
+ Headings · Paragraphs · Blockquote · Code · Lists · HR · Links · Images · Tables · Collab cursors
555
+ ───────────────────────────────────────────────────────────────────── */
556
+
557
+ /* ── ProseMirror Content Area ─────────────────────────────────────── */
558
+
559
+ /* Padding here covers the standalone viewer path.
560
+ The editor body overrides padding via the more-specific
561
+ [data-matops-editor].matops-editor__body .ProseMirror rule above. */
562
+
563
+ [data-matops-editor] .ProseMirror {
564
+ padding: 20px 28px 28px;
565
+ min-height: 300px;
566
+ outline: none;
567
+ caret-color: var(--mat-editor-accent);
568
+ font-size: 1rem;
569
+ line-height: 1.65;
570
+ color: var(--mat-editor-text);
571
+ }
572
+
573
+ [data-matops-editor] .ProseMirror:focus {
574
+ outline: none;
575
+ }
576
+
577
+ /* Selection */
578
+
579
+ [data-matops-editor] .ProseMirror ::selection {
580
+ background: var(--mat-editor-selection);
581
+ }
582
+
583
+ /* ── Placeholder ──────────────────────────────────────────────────── */
584
+
585
+ [data-matops-editor] .ProseMirror p.is-editor-empty:first-child::before {
586
+ color: var(--mat-editor-text-placeholder);
587
+ content: attr(data-placeholder);
588
+ float: left;
589
+ height: 0;
590
+ pointer-events: none;
591
+ }
592
+
593
+ /* ── Typography ───────────────────────────────────────────────────── */
594
+
595
+ /*
596
+ SPACING MODEL — ProseMirror uses display:flex + flex-direction:column,
597
+ which means margins do NOT collapse between siblings. If both a heading's
598
+ margin-top and the preceding element's margin-bottom are set, they ADD
599
+ together and create oversized gaps.
600
+
601
+ Rule: headings carry margin-bottom only (spacing to their own content below).
602
+ Pre-heading breathing room is added via the adjacent-sibling combinator
603
+ (* + hN) so it only fires when something actually precedes the heading.
604
+ First-child and last-child suppressions keep the edges clean.
605
+ */
606
+
607
+ /* Base heading styles — bottom margin only, no top margin */
608
+
609
+ [data-matops-editor] .ProseMirror h1 {
610
+ font-size: 2rem;
611
+ font-weight: 700;
612
+ line-height: 1.3;
613
+ margin: 0 0 0.5rem;
614
+ color: var(--mat-editor-text);
615
+ letter-spacing: -0.025em;
616
+ }
617
+
618
+ [data-matops-editor] .ProseMirror h2 {
619
+ font-size: 1.5rem;
620
+ font-weight: 650;
621
+ line-height: 1.4;
622
+ margin: 0 0 0.4rem;
623
+ color: var(--mat-editor-text);
624
+ letter-spacing: -0.015em;
625
+ }
626
+
627
+ [data-matops-editor] .ProseMirror h3 {
628
+ font-size: 1.25rem;
629
+ font-weight: 600;
630
+ line-height: 1.5;
631
+ margin: 0 0 0.375rem;
632
+ color: var(--mat-editor-text);
633
+ }
634
+
635
+ [data-matops-editor] .ProseMirror h4 {
636
+ font-size: 1.1rem;
637
+ font-weight: 600;
638
+ line-height: 1.5;
639
+ margin: 0 0 0.35rem;
640
+ color: var(--mat-editor-text);
641
+ }
642
+
643
+ [data-matops-editor] .ProseMirror h5 {
644
+ font-size: 1rem;
645
+ font-weight: 600;
646
+ line-height: 1.5;
647
+ margin: 0 0 0.3rem;
648
+ color: var(--mat-editor-text);
649
+ text-transform: uppercase;
650
+ letter-spacing: 0.04em;
651
+ }
652
+
653
+ [data-matops-editor] .ProseMirror h6 {
654
+ font-size: 0.875rem;
655
+ font-weight: 600;
656
+ line-height: 1.5;
657
+ margin: 0 0 0.3rem;
658
+ color: var(--mat-editor-text-muted);
659
+ text-transform: uppercase;
660
+ letter-spacing: 0.06em;
661
+ }
662
+
663
+ /* Pre-heading breathing room — only applied when a heading follows a sibling.
664
+ This fires INSTEAD of a margin-top on the heading itself, so the gap is
665
+ exactly this value (not added on top of a previous element's margin-bottom). */
666
+
667
+ [data-matops-editor] .ProseMirror * + h1 {
668
+ margin-top: 1.75rem;
669
+ }
670
+
671
+ [data-matops-editor] .ProseMirror * + h2 {
672
+ margin-top: 1.5rem;
673
+ }
674
+
675
+ [data-matops-editor] .ProseMirror * + h3 {
676
+ margin-top: 1.25rem;
677
+ }
678
+
679
+ [data-matops-editor] .ProseMirror * + h4 {
680
+ margin-top: 1rem;
681
+ }
682
+
683
+ [data-matops-editor] .ProseMirror * + h5 {
684
+ margin-top: 0.875rem;
685
+ }
686
+
687
+ [data-matops-editor] .ProseMirror * + h6 {
688
+ margin-top: 0.875rem;
689
+ }
690
+
691
+ /* Paragraphs — only bottom margin; top is always 0 */
692
+
693
+ [data-matops-editor] .ProseMirror p {
694
+ margin: 0 0 0.5rem;
695
+ }
696
+
697
+ /* No leading gap on the very first block — heading or paragraph */
698
+
699
+ [data-matops-editor] .ProseMirror > :first-child {
700
+ margin-top: 0 !important;
701
+ }
702
+
703
+ /* No trailing gap on the very last block */
704
+
705
+ [data-matops-editor] .ProseMirror > :last-child {
706
+ margin-bottom: 0 !important;
707
+ }
708
+
709
+ [data-matops-editor] .ProseMirror strong {
710
+ font-weight: 700;
711
+ }
712
+
713
+ [data-matops-editor] .ProseMirror em {
714
+ font-style: italic;
715
+ }
716
+
717
+ [data-matops-editor] .ProseMirror u {
718
+ text-decoration: underline;
719
+ text-underline-offset: 2px;
720
+ }
721
+
722
+ [data-matops-editor] .ProseMirror s {
723
+ text-decoration: line-through;
724
+ }
725
+
726
+ /* ── Blockquote ───────────────────────────────────────────────────── */
727
+
728
+ [data-matops-editor] .ProseMirror blockquote {
729
+ position: relative;
730
+ background: var(--mat-editor-blockquote-bg, #f9f9f9);
731
+ border-radius: var(--mat-editor-radius-md, 10px);
732
+ padding: 1rem 1.25rem 1rem 2.75rem;
733
+ margin: 0 0 0.5rem;
734
+ color: var(--mat-editor-text-muted, #555);
735
+ font-style: italic;
736
+ font-size: 1.05rem;
737
+ line-height: 1.65;
738
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
739
+ border-left: 4px solid var(--mat-editor-blockquote-border, #888);
740
+ transition:
741
+ transform 0.3s ease,
742
+ box-shadow 0.3s ease;
743
+ }
744
+
745
+ [data-matops-editor] .ProseMirror * + blockquote {
746
+ margin-top: 1rem;
747
+ }
748
+
749
+ /* Decorative opening quote */
750
+
751
+ [data-matops-editor] .ProseMirror blockquote::before {
752
+ content: "❝";
753
+ position: absolute;
754
+ left: 0.35rem;
755
+ top: 0.25rem;
756
+ font-size: 2rem;
757
+ color: var(--mat-editor-blockquote-border, #888);
758
+ font-weight: bold;
759
+ line-height: 1;
760
+ transform: rotate(-5deg);
761
+ opacity: 0.7;
762
+ }
763
+
764
+ /* Decorative ending quote */
765
+
766
+ [data-matops-editor] .ProseMirror blockquote::after {
767
+ content: "❞";
768
+ position: absolute;
769
+ right: 0.75rem;
770
+ bottom: 0rem;
771
+ font-size: 2rem;
772
+ color: var(--mat-editor-blockquote-border, #888);
773
+ font-weight: bold;
774
+ line-height: 1;
775
+ transform: rotate(5deg);
776
+ opacity: 0.7;
777
+ }
778
+
779
+ /* Hover effect */
780
+
781
+ [data-matops-editor] .ProseMirror blockquote:hover {
782
+ transform: translateY(-2px);
783
+ box-shadow: 0 6px 16px rgba(0, 0, 0, 0.07);
784
+ }
785
+
786
+ /* ── Code ─────────────────────────────────────────────────────────── */
787
+
788
+ [data-matops-editor] .ProseMirror code {
789
+ background: var(--mat-editor-code-bg);
790
+ color: var(--mat-editor-code-text);
791
+ font-family: var(--mat-editor-font-mono);
792
+ font-size: 0.875em;
793
+ padding: 0.15em 0.4em;
794
+ border-radius: var(--mat-editor-radius-sm);
795
+ }
796
+
797
+ [data-matops-editor] .ProseMirror pre {
798
+ background: var(--mat-editor-code-bg);
799
+ color: var(--mat-editor-code-text);
800
+ font-family: var(--mat-editor-font-mono);
801
+ font-size: 0.875rem;
802
+ padding: 1rem 1.25rem;
803
+ border-radius: var(--mat-editor-radius);
804
+ overflow-x: auto;
805
+ margin: 0 0 0.5rem;
806
+ tab-size: 2;
807
+ }
808
+
809
+ [data-matops-editor] .ProseMirror * + pre {
810
+ margin-top: 0.75rem;
811
+ }
812
+
813
+ [data-matops-editor] .ProseMirror pre code {
814
+ background: none;
815
+ padding: 0;
816
+ font-size: inherit;
817
+ }
818
+
819
+ /* ── Lists ────────────────────────────────────────────────────────── */
820
+
821
+ [data-matops-editor] .ProseMirror ul,
822
+ [data-matops-editor] .ProseMirror ol {
823
+ padding-left: 1.5rem;
824
+ margin: 0 0 0.5rem;
825
+ }
826
+
827
+ [data-matops-editor] .ProseMirror * + ul,
828
+ [data-matops-editor] .ProseMirror * + ol {
829
+ margin-top: 0.25rem;
830
+ }
831
+
832
+ [data-matops-editor] .ProseMirror li {
833
+ margin-bottom: 0.2rem;
834
+ }
835
+
836
+ /* Task list */
837
+
838
+ [data-matops-editor] .ProseMirror ul[data-type="taskList"] {
839
+ padding-left: 0;
840
+ list-style: none;
841
+ }
842
+
843
+ [data-matops-editor] .ProseMirror ul[data-type="taskList"] li {
844
+ display: flex;
845
+ align-items: flex-start;
846
+ gap: 0.5rem;
847
+ }
848
+
849
+ [data-matops-editor] .ProseMirror ul[data-type="taskList"] li > label {
850
+ flex: 0 0 auto;
851
+ cursor: pointer;
852
+ margin-top: 0.2rem;
853
+ }
854
+
855
+ [data-matops-editor] .ProseMirror ul[data-type="taskList"] li > div {
856
+ flex: 1;
857
+ }
858
+
859
+ [data-matops-editor]
860
+ .ProseMirror
861
+ ul[data-type="taskList"]
862
+ li[data-checked="true"]
863
+ > div {
864
+ text-decoration: line-through;
865
+ color: var(--mat-editor-text-muted);
866
+ }
867
+
868
+ /* ── Horizontal Rule ──────────────────────────────────────────────── */
869
+
870
+ [data-matops-editor] .ProseMirror hr {
871
+ border: none;
872
+ border-top: 2px solid var(--mat-editor-border);
873
+ margin: 0 0 0.5rem;
874
+ }
875
+
876
+ [data-matops-editor] .ProseMirror * + hr {
877
+ margin-top: 1.25rem;
878
+ }
879
+
880
+ /* ── Links ────────────────────────────────────────────────────────── */
881
+
882
+ [data-matops-editor] .ProseMirror a.matops-editor__link {
883
+ color: var(--mat-editor-accent);
884
+ text-decoration: underline;
885
+ text-underline-offset: 2px;
886
+ cursor: pointer;
887
+ transition: color 0.15s ease;
888
+ }
889
+
890
+ [data-matops-editor] .ProseMirror a.matops-editor__link:hover {
891
+ color: var(--mat-editor-accent-hover);
892
+ }
893
+
894
+ /* ── Images ───────────────────────────────────────────────────────── */
895
+
896
+ [data-matops-editor] .ProseMirror img {
897
+ max-width: 100%;
898
+ height: auto;
899
+ border-radius: var(--mat-editor-radius);
900
+ display: block;
901
+ margin: 0 0 0.5rem;
902
+ }
903
+
904
+ [data-matops-editor] .ProseMirror * + img {
905
+ margin-top: 0.75rem;
906
+ }
907
+
908
+ /* Keep the class-specific selector for backwards compat */
909
+
910
+ [data-matops-editor] .ProseMirror img.matops-editor__image {
911
+ max-width: 100%;
912
+ height: auto;
913
+ border-radius: var(--mat-editor-radius);
914
+ display: block;
915
+ margin: 0 0 0.5rem;
916
+ }
917
+
918
+ [data-matops-editor] .ProseMirror * + img.matops-editor__image {
919
+ margin-top: 0.75rem;
920
+ }
921
+
922
+ [data-matops-editor]
923
+ .ProseMirror
924
+ img.matops-editor__image.ProseMirror-selectednode {
925
+ outline: 3px solid var(--mat-editor-accent);
926
+ outline-offset: 2px;
927
+ }
928
+
929
+ /* ── Tables ───────────────────────────────────────────────────────── */
930
+
931
+ [data-matops-editor] .ProseMirror table {
932
+ border-collapse: collapse;
933
+ width: 100%;
934
+ margin: 0 0 0.5rem;
935
+ overflow: hidden;
936
+ border-radius: var(--mat-editor-radius);
937
+ }
938
+
939
+ [data-matops-editor] .ProseMirror * + table {
940
+ margin-top: 0.75rem;
941
+ }
942
+
943
+ [data-matops-editor] .ProseMirror table td,
944
+ [data-matops-editor] .ProseMirror table th {
945
+ border: 1px solid var(--mat-editor-table-border);
946
+ padding: 0.5rem 0.75rem;
947
+ vertical-align: top;
948
+ min-width: 100px;
949
+ }
950
+
951
+ [data-matops-editor] .ProseMirror table th {
952
+ background: var(--mat-editor-table-header-bg);
953
+ font-weight: 600;
954
+ text-align: left;
955
+ }
956
+
957
+ [data-matops-editor] .ProseMirror table .selectedCell {
958
+ background: var(--mat-editor-accent-subtle);
959
+ }
960
+
961
+ [data-matops-editor] .ProseMirror table .column-resize-handle {
962
+ background-color: var(--mat-editor-accent);
963
+ bottom: -2px;
964
+ pointer-events: none;
965
+ position: absolute;
966
+ right: -2px;
967
+ top: 0;
968
+ width: 4px;
969
+ }
970
+
971
+ /* ── Collaboration Cursors ────────────────────────────────────────── */
972
+
973
+ [data-matops-editor] .ProseMirror .collaboration-cursor__caret {
974
+ border-left: 2px solid;
975
+ border-right: 2px solid;
976
+ margin-left: -1px;
977
+ margin-right: -1px;
978
+ pointer-events: none;
979
+ position: relative;
980
+ word-break: normal;
981
+ }
982
+
983
+ [data-matops-editor] .ProseMirror .collaboration-cursor__label {
984
+ border-radius: 2px 2px 2px 0;
985
+ color: #fff;
986
+ font-size: 0.75rem;
987
+ font-weight: 600;
988
+ left: -1px;
989
+ line-height: normal;
990
+ padding: 0.1rem 0.4rem;
991
+ position: absolute;
992
+ top: -1.4em;
993
+ user-select: none;
994
+ white-space: nowrap;
995
+ }
996
+
997
+ /* ─────────────────────────────────────────────────────────────────────
998
+ @matops/editor — Toolbar
999
+ Toolbar bar · Buttons · Divider · Wrapper · Right actions · Style-picker · Width-picker
1000
+ ───────────────────────────────────────────────────────────────────── */
1001
+
1002
+ /* ── Toolbar ──────────────────────────────────────────────────────────── */
1003
+
1004
+ /* ── Toolbar ──────────────────────────────────────────────────────── */
1005
+
1006
+ .matops-editor__toolbar {
1007
+ display: flex;
1008
+ align-items: center;
1009
+ flex-wrap: wrap;
1010
+ gap: 0.25rem;
1011
+ padding: 0.5rem 0.75rem;
1012
+ background: var(--mat-editor-toolbar-bg);
1013
+ border-bottom: 1px solid var(--mat-editor-toolbar-border);
1014
+ border-radius: 0;
1015
+ /* sticky behaviour is now owned by .matops-editor__header */
1016
+ position: static;
1017
+ z-index: auto;
1018
+ backdrop-filter: none;
1019
+ }
1020
+
1021
+ .matops-editor__toolbar-btn {
1022
+ display: inline-flex;
1023
+ align-items: center;
1024
+ justify-content: center;
1025
+ width: 2rem;
1026
+ height: 2rem;
1027
+ padding: 0;
1028
+ border: none;
1029
+ border-radius: var(--mat-editor-radius-sm);
1030
+ background: transparent;
1031
+ color: var(--mat-editor-text-muted);
1032
+ cursor: pointer;
1033
+ transition:
1034
+ background 0.15s ease,
1035
+ color 0.15s ease;
1036
+ font-size: 0.875rem;
1037
+ font-weight: 600;
1038
+ }
1039
+
1040
+ .matops-editor__toolbar-btn:hover:not(:disabled) {
1041
+ background: var(--mat-editor-btn-hover);
1042
+ color: var(--mat-editor-text);
1043
+ }
1044
+
1045
+ .matops-editor__toolbar-btn.is-active {
1046
+ background: var(--mat-editor-btn-active);
1047
+ color: var(--mat-editor-btn-active-text);
1048
+ }
1049
+
1050
+ .matops-editor__toolbar-btn:disabled {
1051
+ opacity: 0.35;
1052
+ cursor: not-allowed;
1053
+ }
1054
+
1055
+ .matops-editor__toolbar-divider {
1056
+ width: 1px;
1057
+ height: 1.5rem;
1058
+ background: var(--mat-editor-border);
1059
+ margin: 0 0.25rem;
1060
+ flex-shrink: 0;
1061
+ }
1062
+
1063
+ /* ── Toolbar Wrapper & Right Actions ──────────────────────────────────── */
1064
+
1065
+ /* ── Toolbar wrapper with right-side actions ─────────────────────── */
1066
+
1067
+ .matops-editor__toolbar-wrapper {
1068
+ display: flex;
1069
+ align-items: center;
1070
+ border-bottom: 1px solid var(--mat-editor-border);
1071
+ }
1072
+
1073
+ .matops-editor__toolbar-wrapper .matops-editor__toolbar {
1074
+ flex: 1;
1075
+ border-bottom: none;
1076
+ }
1077
+
1078
+ .mat-toolbar-right {
1079
+ display: flex;
1080
+ align-items: center;
1081
+ gap: 2px;
1082
+ padding: 0 8px;
1083
+ border-left: 1px solid var(--mat-editor-border);
1084
+ height: 100%;
1085
+ flex-shrink: 0;
1086
+ }
1087
+
1088
+ .mat-toolbar-action {
1089
+ display: inline-flex;
1090
+ align-items: center;
1091
+ justify-content: center;
1092
+ width: 28px;
1093
+ height: 28px;
1094
+ border: none;
1095
+ border-radius: 6px;
1096
+ background: transparent;
1097
+ color: var(--mat-editor-text-muted);
1098
+ cursor: pointer;
1099
+ transition:
1100
+ background 0.1s,
1101
+ color 0.1s;
1102
+ }
1103
+
1104
+ .mat-toolbar-action:hover {
1105
+ background: var(--mat-editor-btn-hover);
1106
+ color: var(--mat-editor-text);
1107
+ }
1108
+
1109
+ .mat-toolbar-sep {
1110
+ display: inline-block;
1111
+ width: 1px;
1112
+ height: 18px;
1113
+ background: var(--mat-editor-border);
1114
+ margin: 0 4px;
1115
+ flex-shrink: 0;
1116
+ align-self: center;
1117
+ }
1118
+
1119
+ /* ── Content Width Picker ────────────────────────────────────────── */
1120
+
1121
+ .mat-width-picker {
1122
+ display: inline-flex;
1123
+ align-items: center;
1124
+ gap: 1px;
1125
+ padding: 2px 3px;
1126
+ background: var(--mat-editor-surface);
1127
+ border: 1px solid var(--mat-editor-border);
1128
+ border-radius: 6px;
1129
+ margin-right: 4px;
1130
+ }
1131
+
1132
+ .mat-width-picker__btn {
1133
+ display: inline-flex;
1134
+ align-items: center;
1135
+ justify-content: center;
1136
+ width: 24px;
1137
+ height: 22px;
1138
+ border: none;
1139
+ border-radius: 4px;
1140
+ background: transparent;
1141
+ color: var(--mat-editor-text-muted);
1142
+ cursor: pointer;
1143
+ font-size: 12px;
1144
+ line-height: 1;
1145
+ transition:
1146
+ background 0.1s,
1147
+ color 0.1s;
1148
+ }
1149
+
1150
+ .mat-width-picker__btn:hover {
1151
+ background: var(--mat-editor-btn-hover);
1152
+ color: var(--mat-editor-text);
1153
+ }
1154
+
1155
+ .mat-width-picker__btn.is-active {
1156
+ background: var(--mat-editor-btn-active);
1157
+ color: var(--mat-editor-btn-active-text);
1158
+ }
1159
+
1160
+ /* ── Text Style Picker ─────────────────────────────────────────────────── */
1161
+
1162
+ /* ── Text Style Picker Dropdown ──────────────────────────────────── */
1163
+
1164
+ .mat-style-picker {
1165
+ display: inline-flex;
1166
+ align-items: center;
1167
+ }
1168
+
1169
+ .mat-style-picker__trigger {
1170
+ display: inline-flex;
1171
+ align-items: center;
1172
+ gap: 5px;
1173
+ padding: 4px 8px;
1174
+ height: 30px;
1175
+ min-width: 108px;
1176
+ border-radius: 6px;
1177
+ border: 1px solid var(--mat-editor-border);
1178
+ background: var(--mat-editor-surface);
1179
+ color: var(--mat-editor-text);
1180
+ font-size: 12px;
1181
+ font-weight: 500;
1182
+ cursor: pointer;
1183
+ transition:
1184
+ background 0.12s,
1185
+ border-color 0.12s;
1186
+ white-space: nowrap;
1187
+ }
1188
+
1189
+ .mat-style-picker__trigger:hover {
1190
+ background: var(--mat-editor-btn-hover);
1191
+ border-color: var(--mat-editor-accent);
1192
+ }
1193
+
1194
+ .mat-style-picker__label {
1195
+ flex: 1;
1196
+ text-align: left;
1197
+ overflow: hidden;
1198
+ text-overflow: ellipsis;
1199
+ }
1200
+
1201
+ .mat-style-picker__menu {
1202
+ min-width: 160px;
1203
+ padding: 4px;
1204
+ border-radius: 8px;
1205
+ border: 1px solid var(--mat-editor-border);
1206
+ background: var(--mat-editor-bg);
1207
+ box-shadow: var(--mat-editor-shadow-lg);
1208
+ display: flex;
1209
+ flex-direction: column;
1210
+ gap: 1px;
1211
+ }
1212
+
1213
+ .mat-style-picker__item {
1214
+ display: block;
1215
+ width: 100%;
1216
+ padding: 6px 10px;
1217
+ border: none;
1218
+ border-radius: 5px;
1219
+ background: transparent;
1220
+ color: var(--mat-editor-text);
1221
+ font-size: 13px;
1222
+ text-align: left;
1223
+ cursor: pointer;
1224
+ transition: background 0.1s;
1225
+ }
1226
+
1227
+ .mat-style-picker__item:hover {
1228
+ background: var(--mat-editor-surface);
1229
+ }
1230
+
1231
+ .mat-style-picker__item.is-active {
1232
+ background: var(--mat-editor-accent-subtle);
1233
+ color: var(--mat-editor-accent);
1234
+ font-weight: 600;
1235
+ }
1236
+
1237
+ /* Different font sizes per style to preview the hierarchy */
1238
+
1239
+ .mat-style-picker__item[data-style="paragraph"] {
1240
+ font-size: 13px;
1241
+ }
1242
+
1243
+ .mat-style-picker__item[data-style="h1"] {
1244
+ font-size: 18px;
1245
+ font-weight: 700;
1246
+ }
1247
+
1248
+ .mat-style-picker__item[data-style="h2"] {
1249
+ font-size: 16px;
1250
+ font-weight: 700;
1251
+ }
1252
+
1253
+ .mat-style-picker__item[data-style="h3"] {
1254
+ font-size: 14px;
1255
+ font-weight: 600;
1256
+ }
1257
+
1258
+ .mat-style-picker__item[data-style="h4"] {
1259
+ font-size: 13px;
1260
+ font-weight: 600;
1261
+ }
1262
+
1263
+ .mat-style-picker__item[data-style="h5"] {
1264
+ font-size: 12px;
1265
+ font-weight: 600;
1266
+ text-transform: uppercase;
1267
+ letter-spacing: 0.04em;
1268
+ }
1269
+
1270
+ .mat-style-picker__item[data-style="h6"] {
1271
+ font-size: 11px;
1272
+ font-weight: 600;
1273
+ text-transform: uppercase;
1274
+ letter-spacing: 0.06em;
1275
+ color: var(--mat-editor-text-muted);
1276
+ }
1277
+
1278
+ /* ── Command grid popup — grouped sections ───────────────────────── */
1279
+
1280
+ .mat-cmd-popup__body {
1281
+ overflow-y: auto;
1282
+ padding: 8px 12px 12px;
1283
+ scrollbar-width: thin;
1284
+ }
1285
+
1286
+ .mat-cmd-popup__section {
1287
+ margin-bottom: 16px;
1288
+ }
1289
+
1290
+ .mat-cmd-popup__section:last-child {
1291
+ margin-bottom: 0;
1292
+ }
1293
+
1294
+ .mat-cmd-popup__section-label {
1295
+ font-size: 10px;
1296
+ font-weight: 700;
1297
+ text-transform: uppercase;
1298
+ letter-spacing: 0.08em;
1299
+ color: var(--mat-editor-text-muted);
1300
+ opacity: 0.55;
1301
+ padding: 0 2px 6px;
1302
+ }
1303
+
1304
+ /* ─────────────────────────────────────────────────────────────────────
1305
+ @matops/editor — Floating Menus
1306
+ Bubble menu · Floating (+) menu · Slash command · Full command overlay · Shared menu button
1307
+ ───────────────────────────────────────────────────────────────────── */
1308
+
1309
+ /* ═══════════════════════════════════════════════════════════════════
1310
+ PHASE 1 — Bubble Menu, Floating Menu, Slash Command
1311
+ ═══════════════════════════════════════════════════════════════════ */
1312
+
1313
+ /* ── Bubble Menu ──────────────────────────────────────────────────── */
1314
+
1315
+ .mat-bubble-menu {
1316
+ display: flex;
1317
+ align-items: center;
1318
+ gap: 2px;
1319
+ padding: 4px 6px;
1320
+ border-radius: 10px;
1321
+ border: 1px solid var(--mat-editor-border);
1322
+ background: var(--mat-editor-toolbar-bg);
1323
+ box-shadow: var(--mat-editor-shadow-lg);
1324
+ backdrop-filter: blur(12px);
1325
+ animation: mat-pop-in 0.12s ease;
1326
+ min-height: 38px;
1327
+ }
1328
+
1329
+ /* ── Bubble text style trigger ───────────────── */
1330
+
1331
+ .mat-bubble-style-trigger {
1332
+ display: inline-flex;
1333
+ align-items: center;
1334
+ gap: 4px;
1335
+ padding: 3px 7px;
1336
+ height: 28px;
1337
+ border-radius: 6px;
1338
+ border: none;
1339
+ background: transparent;
1340
+ color: var(--mat-editor-text);
1341
+ font-size: 12px;
1342
+ font-weight: 600;
1343
+ cursor: pointer;
1344
+ white-space: nowrap;
1345
+ transition: background 0.1s;
1346
+ }
1347
+
1348
+ .mat-bubble-style-trigger:hover {
1349
+ background: var(--mat-editor-btn-hover);
1350
+ }
1351
+
1352
+ /* ── Bubble text style dropdown ──────────────── */
1353
+
1354
+ .mat-bubble-style-menu {
1355
+ position: fixed;
1356
+ z-index: 9999;
1357
+ min-width: 140px;
1358
+ padding: 4px;
1359
+ border-radius: 9px;
1360
+ border: 1px solid var(--mat-editor-border);
1361
+ background: var(--mat-editor-bg);
1362
+ box-shadow: var(--mat-editor-shadow-lg);
1363
+ display: flex;
1364
+ flex-direction: column;
1365
+ gap: 1px;
1366
+ }
1367
+
1368
+ .mat-bubble-style-item {
1369
+ display: block;
1370
+ width: 100%;
1371
+ padding: 5px 9px;
1372
+ border: none;
1373
+ border-radius: 5px;
1374
+ background: transparent;
1375
+ color: var(--mat-editor-text);
1376
+ font-size: 12px;
1377
+ text-align: left;
1378
+ cursor: pointer;
1379
+ transition: background 0.1s;
1380
+ }
1381
+
1382
+ .mat-bubble-style-item:hover {
1383
+ background: var(--mat-editor-surface);
1384
+ }
1385
+
1386
+ .mat-bubble-style-item.is-active {
1387
+ background: var(--mat-editor-accent-subtle);
1388
+ color: var(--mat-editor-accent);
1389
+ font-weight: 600;
1390
+ }
1391
+
1392
+ .mat-bubble-style-item[data-style="h1"] {
1393
+ font-size: 17px;
1394
+ font-weight: 700;
1395
+ }
1396
+
1397
+ .mat-bubble-style-item[data-style="h2"] {
1398
+ font-size: 15px;
1399
+ font-weight: 700;
1400
+ }
1401
+
1402
+ .mat-bubble-style-item[data-style="h3"] {
1403
+ font-size: 13px;
1404
+ font-weight: 600;
1405
+ }
1406
+
1407
+ .mat-bubble-style-item[data-style="h4"] {
1408
+ font-size: 12px;
1409
+ font-weight: 600;
1410
+ }
1411
+
1412
+ .mat-bubble-style-item[data-style="h5"] {
1413
+ font-size: 11px;
1414
+ font-weight: 600;
1415
+ text-transform: uppercase;
1416
+ letter-spacing: 0.04em;
1417
+ }
1418
+
1419
+ .mat-bubble-style-item[data-style="h6"] {
1420
+ font-size: 10px;
1421
+ font-weight: 600;
1422
+ text-transform: uppercase;
1423
+ letter-spacing: 0.06em;
1424
+ color: var(--mat-editor-text-muted);
1425
+ }
1426
+
1427
+ /* ── Bubble inline link editor ───────────────── */
1428
+
1429
+ .mat-bubble-link-editor {
1430
+ display: flex;
1431
+ align-items: center;
1432
+ gap: 5px;
1433
+ padding: 2px 4px;
1434
+ animation: mat-pop-in 0.12s ease;
1435
+ }
1436
+
1437
+ .mat-bubble-link-input {
1438
+ width: 220px;
1439
+ background: var(--mat-editor-surface);
1440
+ border: 1px solid var(--mat-editor-border);
1441
+ border-radius: 6px;
1442
+ padding: 4px 8px;
1443
+ font-size: 12px;
1444
+ color: var(--mat-editor-text);
1445
+ font-family: var(--mat-editor-font);
1446
+ outline: none;
1447
+ transition: border-color 0.15s;
1448
+ }
1449
+
1450
+ .mat-bubble-link-input:focus {
1451
+ border-color: var(--mat-editor-accent);
1452
+ }
1453
+
1454
+ .mat-bubble-link-input::placeholder {
1455
+ color: var(--mat-editor-text-muted);
1456
+ opacity: 0.6;
1457
+ }
1458
+
1459
+ .mat-bubble-link-apply,
1460
+ .mat-bubble-link-remove {
1461
+ width: 26px;
1462
+ height: 26px;
1463
+ display: flex;
1464
+ align-items: center;
1465
+ justify-content: center;
1466
+ border: none;
1467
+ border-radius: 6px;
1468
+ cursor: pointer;
1469
+ transition:
1470
+ background 0.1s,
1471
+ color 0.1s;
1472
+ flex-shrink: 0;
1473
+ }
1474
+
1475
+ .mat-bubble-link-apply {
1476
+ background: var(--mat-editor-accent);
1477
+ color: white;
1478
+ }
1479
+
1480
+ .mat-bubble-link-apply:hover {
1481
+ background: var(--mat-editor-accent-hover, var(--mat-editor-accent));
1482
+ filter: brightness(1.1);
1483
+ }
1484
+
1485
+ .mat-bubble-link-remove {
1486
+ background: transparent;
1487
+ color: var(--mat-editor-text-muted);
1488
+ }
1489
+
1490
+ .mat-bubble-link-remove:hover {
1491
+ background: #fef2f2;
1492
+ color: #dc2626;
1493
+ }
1494
+
1495
+ .matops-editor--dark .mat-bubble-link-remove:hover {
1496
+ background: #2d1515;
1497
+ color: #f87171;
1498
+ }
1499
+
1500
+ /* ── Shared Menu Button (used by all floating menus) ──────────────── */
1501
+
1502
+ /**
1503
+ * .mat-menu-btn — unified button primitive for all editor menus.
1504
+ * Used by: BubbleMenu, FloatingMenu, TableMenu, ImageBubbleMenu, LinkEditPopover.
1505
+ * Previously each menu had its own copy (.mat-bubble-btn, .mat-float-btn, etc.)
1506
+ *
1507
+ * State classes: .is-active .is-disabled .is-danger
1508
+ */
1509
+
1510
+ .mat-menu-btn {
1511
+ display: inline-flex;
1512
+ align-items: center;
1513
+ justify-content: center;
1514
+ width: 28px;
1515
+ height: 28px;
1516
+ border: none;
1517
+ border-radius: 6px;
1518
+ background: transparent;
1519
+ color: var(--mat-editor-text-muted);
1520
+ cursor: pointer;
1521
+ transition:
1522
+ background 0.1s ease,
1523
+ color 0.1s ease;
1524
+ font-size: 0.75rem;
1525
+ font-weight: 700;
1526
+ flex-shrink: 0;
1527
+ }
1528
+
1529
+ .mat-menu-btn:hover:not(:disabled) {
1530
+ background: var(--mat-editor-btn-hover);
1531
+ color: var(--mat-editor-text);
1532
+ }
1533
+
1534
+ .mat-menu-btn.is-active {
1535
+ background: var(--mat-editor-btn-active);
1536
+ color: var(--mat-editor-btn-active-text);
1537
+ }
1538
+
1539
+ .mat-menu-btn.is-disabled,
1540
+ .mat-menu-btn:disabled {
1541
+ opacity: 0.35;
1542
+ cursor: not-allowed;
1543
+ pointer-events: none;
1544
+ }
1545
+
1546
+ .mat-menu-btn.is-danger:hover:not(:disabled) {
1547
+ background: #fef2f2;
1548
+ color: #dc2626;
1549
+ }
1550
+
1551
+ .matops-editor--dark .mat-menu-btn.is-danger:hover:not(:disabled) {
1552
+ background: #2d1515;
1553
+ color: #f87171;
1554
+ }
1555
+
1556
+ /* Legacy aliases — kept for backward compat with existing CSS classes */
1557
+
1558
+ .mat-bubble-btn {
1559
+ display: inline-flex;
1560
+ align-items: center;
1561
+ justify-content: center;
1562
+ width: 28px;
1563
+ height: 28px;
1564
+ border: none;
1565
+ border-radius: 6px;
1566
+ background: transparent;
1567
+ color: var(--mat-editor-text-muted);
1568
+ cursor: pointer;
1569
+ transition:
1570
+ background 0.1s ease,
1571
+ color 0.1s ease;
1572
+ font-size: 0.75rem;
1573
+ font-weight: 700;
1574
+ }
1575
+
1576
+ .mat-bubble-btn:hover {
1577
+ background: var(--mat-editor-btn-hover);
1578
+ color: var(--mat-editor-text);
1579
+ }
1580
+
1581
+ .mat-bubble-btn.is-active {
1582
+ background: var(--mat-editor-btn-active);
1583
+ color: var(--mat-editor-btn-active-text);
1584
+ }
1585
+
1586
+ /* ── Shared Menu Divider ──────────────────────────────────────────── */
1587
+
1588
+ /**
1589
+ * .mat-menu-divider — vertical separator for button groups in all menus.
1590
+ */
1591
+
1592
+ .mat-menu-divider,
1593
+ .mat-bubble-divider {
1594
+ width: 1px;
1595
+ height: 18px;
1596
+ background: var(--mat-editor-border);
1597
+ margin: 0 2px;
1598
+ flex-shrink: 0;
1599
+ }
1600
+
1601
+ /* ── Floating Menu ────────────────────────────────────────────────── */
1602
+
1603
+ /* ── Floating Menu — compact "+" trigger ─────────────────────────── */
1604
+
1605
+ .mat-float-wrap {
1606
+ display: flex;
1607
+ align-items: center;
1608
+ gap: 4px;
1609
+ }
1610
+
1611
+ .mat-float-trigger {
1612
+ width: 24px;
1613
+ height: 24px;
1614
+ display: flex;
1615
+ align-items: center;
1616
+ justify-content: center;
1617
+ border-radius: 6px;
1618
+ border: 1.5px dashed var(--mat-editor-border);
1619
+ background: transparent;
1620
+ color: var(--mat-editor-text-muted);
1621
+ cursor: pointer;
1622
+ transition:
1623
+ background 0.12s,
1624
+ border-color 0.12s,
1625
+ color 0.12s;
1626
+ flex-shrink: 0;
1627
+ }
1628
+
1629
+ .mat-float-trigger:hover,
1630
+ .mat-float-wrap--open .mat-float-trigger {
1631
+ background: var(--mat-editor-accent-subtle);
1632
+ border-color: var(--mat-editor-accent);
1633
+ border-style: solid;
1634
+ color: var(--mat-editor-accent);
1635
+ }
1636
+
1637
+ /* Expanded icon strip */
1638
+
1639
+ .mat-float-strip {
1640
+ display: flex;
1641
+ align-items: center;
1642
+ gap: 2px;
1643
+ padding: 3px 5px;
1644
+ border-radius: 8px;
1645
+ border: 1px solid var(--mat-editor-border);
1646
+ background: var(--mat-editor-toolbar-bg);
1647
+ box-shadow: var(--mat-editor-shadow-lg);
1648
+ backdrop-filter: blur(12px);
1649
+ animation: mat-pop-in 0.12s ease;
1650
+ }
1651
+
1652
+ .mat-float-icon-btn {
1653
+ width: 28px;
1654
+ height: 28px;
1655
+ display: flex;
1656
+ align-items: center;
1657
+ justify-content: center;
1658
+ border: none;
1659
+ border-radius: 5px;
1660
+ background: transparent;
1661
+ color: var(--mat-editor-text-muted);
1662
+ cursor: pointer;
1663
+ transition:
1664
+ background 0.1s,
1665
+ color 0.1s;
1666
+ }
1667
+
1668
+ .mat-float-icon-btn:hover {
1669
+ background: var(--mat-editor-btn-hover);
1670
+ color: var(--mat-editor-text);
1671
+ }
1672
+
1673
+ .mat-float-icon-btn__glyph {
1674
+ font-size: 11px;
1675
+ font-weight: 700;
1676
+ font-family: var(--mat-editor-font-mono);
1677
+ line-height: 1;
1678
+ pointer-events: none;
1679
+ }
1680
+
1681
+ /* ── Slash Command Menu ───────────────────────────────────────────── */
1682
+
1683
+ .mat-slash-menu {
1684
+ position: fixed;
1685
+ z-index: 9999;
1686
+ min-width: 240px;
1687
+ max-height: min(360px, 80vh);
1688
+ overflow-y: auto;
1689
+ border-radius: 12px;
1690
+ border: 1px solid var(--mat-editor-border);
1691
+ background: var(--mat-editor-toolbar-bg);
1692
+ box-shadow: var(--mat-editor-shadow-lg);
1693
+ padding: 6px;
1694
+ animation: mat-pop-in 0.15s ease;
1695
+ }
1696
+
1697
+ .mat-slash-header {
1698
+ font-size: 10px;
1699
+ font-weight: 700;
1700
+ text-transform: uppercase;
1701
+ letter-spacing: 0.08em;
1702
+ color: var(--mat-editor-text-muted);
1703
+ padding: 4px 8px 6px;
1704
+ opacity: 0.6;
1705
+ }
1706
+
1707
+ .mat-slash-empty {
1708
+ padding: 10px 12px;
1709
+ font-size: 12px;
1710
+ color: var(--mat-editor-text-muted);
1711
+ text-align: center;
1712
+ opacity: 0.7;
1713
+ }
1714
+
1715
+ .mat-slash-item {
1716
+ display: flex;
1717
+ align-items: center;
1718
+ gap: 10px;
1719
+ width: 100%;
1720
+ padding: 7px 10px;
1721
+ border: none;
1722
+ border-radius: 8px;
1723
+ background: transparent;
1724
+ color: var(--mat-editor-text);
1725
+ cursor: pointer;
1726
+ transition: background 0.1s ease;
1727
+ text-align: left;
1728
+ }
1729
+
1730
+ .mat-slash-item:hover,
1731
+ .mat-slash-item.is-selected {
1732
+ background: var(--mat-editor-btn-hover);
1733
+ }
1734
+
1735
+ .mat-slash-item.is-selected {
1736
+ background: var(--mat-editor-accent-subtle);
1737
+ }
1738
+
1739
+ .mat-slash-icon {
1740
+ width: 32px;
1741
+ height: 32px;
1742
+ flex-shrink: 0;
1743
+ border-radius: 7px;
1744
+ border: 1px solid var(--mat-editor-border);
1745
+ background: var(--mat-editor-surface);
1746
+ display: flex;
1747
+ align-items: center;
1748
+ justify-content: center;
1749
+ font-size: 11px;
1750
+ font-weight: 700;
1751
+ font-family: var(--mat-editor-font-mono);
1752
+ color: var(--mat-editor-text-muted);
1753
+ }
1754
+
1755
+ .mat-slash-item.is-selected .mat-slash-icon {
1756
+ background: var(--mat-editor-accent);
1757
+ border-color: var(--mat-editor-accent);
1758
+ color: white;
1759
+ }
1760
+
1761
+ .mat-slash-text {
1762
+ display: flex;
1763
+ flex-direction: column;
1764
+ gap: 1px;
1765
+ min-width: 0;
1766
+ }
1767
+
1768
+ .mat-slash-title {
1769
+ font-size: 13px;
1770
+ font-weight: 600;
1771
+ line-height: 1.3;
1772
+ }
1773
+
1774
+ .mat-slash-desc {
1775
+ font-size: 11px;
1776
+ color: var(--mat-editor-text-muted);
1777
+ opacity: 0.7;
1778
+ line-height: 1.3;
1779
+ }
1780
+
1781
+ /* ── "More options" row ──────────────────────── */
1782
+
1783
+ .mat-slash-more {
1784
+ display: flex;
1785
+ align-items: center;
1786
+ gap: 7px;
1787
+ width: 100%;
1788
+ padding: 7px 10px;
1789
+ border: none;
1790
+ border-top: 1px solid var(--mat-editor-border);
1791
+ border-radius: 0 0 8px 8px;
1792
+ margin-top: 2px;
1793
+ background: transparent;
1794
+ color: var(--mat-editor-text-muted);
1795
+ font-size: 12px;
1796
+ font-weight: 600;
1797
+ cursor: pointer;
1798
+ transition:
1799
+ background 0.1s,
1800
+ color 0.1s;
1801
+ text-align: left;
1802
+ }
1803
+
1804
+ .mat-slash-more:hover,
1805
+ .mat-slash-more.is-selected {
1806
+ background: var(--mat-editor-btn-hover);
1807
+ color: var(--mat-editor-text);
1808
+ }
1809
+
1810
+ .mat-slash-more__count {
1811
+ margin-left: auto;
1812
+ font-size: 10px;
1813
+ font-weight: 500;
1814
+ opacity: 0.5;
1815
+ }
1816
+
1817
+ /* ── Full command grid overlay ───────────────── */
1818
+
1819
+ .mat-cmd-overlay {
1820
+ position: fixed;
1821
+ inset: 0;
1822
+ z-index: 10000;
1823
+ background: rgba(0, 0, 0, 0.4);
1824
+ backdrop-filter: blur(2px);
1825
+ display: flex;
1826
+ align-items: center;
1827
+ justify-content: center;
1828
+ animation: mat-fade-in 0.15s ease;
1829
+ }
1830
+
1831
+ .mat-cmd-popup {
1832
+ width: min(560px, 92vw);
1833
+ max-height: min(560px, 85vh);
1834
+ border-radius: 14px;
1835
+ border: 1px solid var(--mat-editor-border);
1836
+ background: var(--mat-editor-bg);
1837
+ box-shadow: 0 24px 60px rgba(0, 0, 0, 0.3);
1838
+ display: flex;
1839
+ flex-direction: column;
1840
+ overflow: hidden;
1841
+ animation: mat-pop-in 0.18s ease;
1842
+ }
1843
+
1844
+ .mat-cmd-popup__header {
1845
+ display: flex;
1846
+ align-items: center;
1847
+ gap: 8px;
1848
+ padding: 12px 14px;
1849
+ border-bottom: 1px solid var(--mat-editor-border);
1850
+ flex-shrink: 0;
1851
+ }
1852
+
1853
+ .mat-cmd-popup__search {
1854
+ flex: 1;
1855
+ background: transparent;
1856
+ border: none;
1857
+ outline: none;
1858
+ font-size: 14px;
1859
+ color: var(--mat-editor-text);
1860
+ font-family: var(--mat-editor-font);
1861
+ }
1862
+
1863
+ .mat-cmd-popup__search::placeholder {
1864
+ color: var(--mat-editor-text-muted);
1865
+ opacity: 0.6;
1866
+ }
1867
+
1868
+ .mat-cmd-popup__close {
1869
+ width: 28px;
1870
+ height: 28px;
1871
+ border: none;
1872
+ border-radius: 6px;
1873
+ background: transparent;
1874
+ color: var(--mat-editor-text-muted);
1875
+ cursor: pointer;
1876
+ display: flex;
1877
+ align-items: center;
1878
+ justify-content: center;
1879
+ transition:
1880
+ background 0.1s,
1881
+ color 0.1s;
1882
+ flex-shrink: 0;
1883
+ }
1884
+
1885
+ .mat-cmd-popup__close:hover {
1886
+ background: var(--mat-editor-btn-hover);
1887
+ color: var(--mat-editor-text);
1888
+ }
1889
+
1890
+ .mat-cmd-popup__grid {
1891
+ display: grid;
1892
+ grid-template-columns: repeat(auto-fill, minmax(110px, 1fr));
1893
+ gap: 4px;
1894
+ }
1895
+
1896
+ .mat-cmd-popup__item {
1897
+ display: flex;
1898
+ flex-direction: column;
1899
+ align-items: center;
1900
+ gap: 6px;
1901
+ padding: 14px 8px 10px;
1902
+ border: 1px solid transparent;
1903
+ border-radius: 10px;
1904
+ background: transparent;
1905
+ cursor: pointer;
1906
+ text-align: center;
1907
+ transition:
1908
+ background 0.12s,
1909
+ border-color 0.12s;
1910
+ }
1911
+
1912
+ .mat-cmd-popup__item:hover {
1913
+ background: var(--mat-editor-surface);
1914
+ border-color: var(--mat-editor-border);
1915
+ }
1916
+
1917
+ .mat-cmd-popup__icon {
1918
+ width: 40px;
1919
+ height: 40px;
1920
+ border-radius: 9px;
1921
+ border: 1px solid var(--mat-editor-border);
1922
+ background: var(--mat-editor-surface);
1923
+ display: flex;
1924
+ align-items: center;
1925
+ justify-content: center;
1926
+ font-size: 14px;
1927
+ font-weight: 700;
1928
+ font-family: var(--mat-editor-font-mono);
1929
+ color: var(--mat-editor-text-muted);
1930
+ transition:
1931
+ background 0.12s,
1932
+ color 0.12s;
1933
+ }
1934
+
1935
+ .mat-cmd-popup__item:hover .mat-cmd-popup__icon {
1936
+ background: var(--mat-editor-accent);
1937
+ border-color: var(--mat-editor-accent);
1938
+ color: white;
1939
+ }
1940
+
1941
+ .mat-cmd-popup__title {
1942
+ font-size: 12px;
1943
+ font-weight: 600;
1944
+ color: var(--mat-editor-text);
1945
+ line-height: 1.2;
1946
+ }
1947
+
1948
+ .mat-cmd-popup__desc {
1949
+ font-size: 10px;
1950
+ color: var(--mat-editor-text-muted);
1951
+ opacity: 0.65;
1952
+ line-height: 1.3;
1953
+ }
1954
+
1955
+ .mat-cmd-popup__empty {
1956
+ padding: 40px 20px;
1957
+ text-align: center;
1958
+ font-size: 13px;
1959
+ color: var(--mat-editor-text-muted);
1960
+ opacity: 0.7;
1961
+ }
1962
+
1963
+ /* ─────────────────────────────────────────────────────────────────────
1964
+ @matops/editor — Table UI
1965
+ Context menu · Row/Column handles · Extend buttons · Grid picker
1966
+ ───────────────────────────────────────────────────────────────────── */
1967
+
1968
+ /* ═══════════════════════════════════════════════════════════════════
1969
+ 1. TABLE CONTEXT MENU (BubbleMenu — shown above active table)
1970
+ ═══════════════════════════════════════════════════════════════════ */
1971
+
1972
+ .mat-table-menu {
1973
+ display: flex;
1974
+ align-items: stretch;
1975
+ gap: 1px;
1976
+ padding: 6px 8px;
1977
+ border-radius: 12px;
1978
+ border: 1px solid var(--mat-editor-border);
1979
+ background: var(--mat-editor-toolbar-bg);
1980
+ box-shadow: var(--mat-editor-shadow-lg);
1981
+ backdrop-filter: blur(12px);
1982
+ animation: mat-pop-in 0.12s ease;
1983
+ user-select: none;
1984
+ }
1985
+
1986
+ .mat-table-divider {
1987
+ width: 1px;
1988
+ background: var(--mat-editor-border);
1989
+ margin: 0 6px;
1990
+ align-self: stretch;
1991
+ flex-shrink: 0;
1992
+ }
1993
+
1994
+ .mat-table-section {
1995
+ display: flex;
1996
+ flex-direction: column;
1997
+ align-items: center;
1998
+ gap: 4px;
1999
+ min-width: 0;
2000
+ }
2001
+
2002
+ .mat-table-section__label {
2003
+ font-size: 9px;
2004
+ font-weight: 700;
2005
+ text-transform: uppercase;
2006
+ letter-spacing: 0.08em;
2007
+ color: var(--mat-editor-text-muted);
2008
+ opacity: 0.5;
2009
+ white-space: nowrap;
2010
+ }
2011
+
2012
+ .mat-table-section__actions {
2013
+ display: flex;
2014
+ align-items: center;
2015
+ gap: 2px;
2016
+ }
2017
+
2018
+ .mat-table-btn {
2019
+ display: inline-flex;
2020
+ flex-direction: column;
2021
+ align-items: center;
2022
+ justify-content: center;
2023
+ gap: 3px;
2024
+ padding: 6px 8px;
2025
+ min-width: 44px;
2026
+ border: 1px solid transparent;
2027
+ border-radius: 7px;
2028
+ background: transparent;
2029
+ color: var(--mat-editor-text-muted);
2030
+ cursor: pointer;
2031
+ transition: all 0.12s ease;
2032
+ font-size: 12px;
2033
+ }
2034
+
2035
+ .mat-table-btn:hover:not(.is-disabled) {
2036
+ background: var(--mat-editor-btn-hover);
2037
+ color: var(--mat-editor-text);
2038
+ border-color: var(--mat-editor-border);
2039
+ }
2040
+
2041
+ .mat-table-btn.is-active {
2042
+ background: var(--mat-editor-btn-active);
2043
+ color: var(--mat-editor-btn-active-text);
2044
+ border-color: var(--mat-editor-border);
2045
+ }
2046
+
2047
+ .mat-table-btn.is-danger:hover:not(.is-disabled) {
2048
+ background: #fef2f2;
2049
+ color: #dc2626;
2050
+ border-color: #fecaca;
2051
+ }
2052
+
2053
+ .matops-editor--dark .mat-table-btn.is-danger:hover:not(.is-disabled) {
2054
+ background: #2d1515;
2055
+ color: #f87171;
2056
+ border-color: #7f1d1d;
2057
+ }
2058
+
2059
+ .mat-table-btn.is-disabled {
2060
+ opacity: 0.3;
2061
+ cursor: not-allowed;
2062
+ }
2063
+
2064
+ .mat-table-btn__icon {
2065
+ display: flex;
2066
+ align-items: center;
2067
+ justify-content: center;
2068
+ flex-shrink: 0;
2069
+ }
2070
+
2071
+ .mat-table-btn__label {
2072
+ font-size: 9px;
2073
+ font-weight: 600;
2074
+ letter-spacing: 0.02em;
2075
+ opacity: 0.8;
2076
+ white-space: nowrap;
2077
+ }
2078
+
2079
+ /* ═══════════════════════════════════════════════════════════════════
2080
+ 2. TABLE HANDLES (Row handle left · Column handle above)
2081
+ ═══════════════════════════════════════════════════════════════════ */
2082
+
2083
+ .mat-table-handle {
2084
+ display: inline-flex;
2085
+ flex-direction: column;
2086
+ align-items: center;
2087
+ }
2088
+
2089
+ .mat-th-btn {
2090
+ display: inline-flex;
2091
+ align-items: center;
2092
+ justify-content: center;
2093
+ width: 22px;
2094
+ height: 22px;
2095
+ border: 1px solid var(--mat-editor-border);
2096
+ border-radius: 5px;
2097
+ background: var(--mat-editor-toolbar-bg);
2098
+ color: var(--mat-editor-text-muted);
2099
+ cursor: pointer;
2100
+ box-shadow: var(--mat-editor-shadow);
2101
+ transition: background 0.12s ease, color 0.12s ease, border-color 0.12s ease;
2102
+ }
2103
+
2104
+ .mat-th-btn:hover,
2105
+ .mat-th-btn.is-open {
2106
+ background: var(--mat-editor-btn-hover);
2107
+ color: var(--mat-editor-text);
2108
+ border-color: var(--mat-editor-border-focus);
2109
+ }
2110
+
2111
+ .mat-th-menu {
2112
+ position: absolute;
2113
+ top: calc(100% + 4px);
2114
+ left: 0;
2115
+ min-width: 170px;
2116
+ padding: 4px;
2117
+ border-radius: 10px;
2118
+ border: 1px solid var(--mat-editor-border);
2119
+ background: var(--mat-editor-toolbar-bg);
2120
+ box-shadow: var(--mat-editor-shadow-lg);
2121
+ backdrop-filter: blur(12px);
2122
+ animation: mat-pop-in 0.12s ease;
2123
+ z-index: 10000;
2124
+ }
2125
+
2126
+ .mat-th-item {
2127
+ display: flex;
2128
+ align-items: center;
2129
+ gap: 8px;
2130
+ width: 100%;
2131
+ padding: 6px 10px;
2132
+ border: none;
2133
+ border-radius: 6px;
2134
+ background: transparent;
2135
+ color: var(--mat-editor-text);
2136
+ font-size: 13px;
2137
+ font-family: var(--mat-editor-font);
2138
+ cursor: pointer;
2139
+ text-align: left;
2140
+ transition: background 0.1s ease;
2141
+ }
2142
+
2143
+ .mat-th-item:hover:not(.is-disabled) {
2144
+ background: var(--mat-editor-btn-hover);
2145
+ }
2146
+
2147
+ .mat-th-item.is-danger { color: #dc2626; }
2148
+
2149
+ .matops-editor--dark .mat-th-item.is-danger { color: #f87171; }
2150
+
2151
+ .mat-th-item.is-danger:hover:not(.is-disabled) { background: #fef2f2; }
2152
+
2153
+ .matops-editor--dark .mat-th-item.is-danger:hover:not(.is-disabled) { background: #2d1515; }
2154
+
2155
+ .mat-th-item.is-disabled { opacity: 0.35; cursor: not-allowed; }
2156
+
2157
+ .mat-th-item__icon {
2158
+ display: flex;
2159
+ align-items: center;
2160
+ justify-content: center;
2161
+ width: 16px;
2162
+ flex-shrink: 0;
2163
+ color: var(--mat-editor-text-muted);
2164
+ }
2165
+
2166
+ .mat-th-item.is-danger .mat-th-item__icon { color: inherit; }
2167
+
2168
+ .mat-th-item__label { flex: 1; white-space: nowrap; }
2169
+
2170
+ .mat-th-divider {
2171
+ height: 1px;
2172
+ background: var(--mat-editor-border);
2173
+ margin: 3px 6px;
2174
+ }
2175
+
2176
+ /* ═══════════════════════════════════════════════════════════════════
2177
+ 3. TABLE EXTEND BUTTONS ("+" at bottom / right of active table)
2178
+ ═══════════════════════════════════════════════════════════════════ */
2179
+
2180
+ .mat-table-extend-btn {
2181
+ display: inline-flex;
2182
+ align-items: center;
2183
+ justify-content: center;
2184
+ border-radius: 50%;
2185
+ border: 1.5px dashed var(--mat-editor-border);
2186
+ background: var(--mat-editor-toolbar-bg);
2187
+ color: var(--mat-editor-text-muted);
2188
+ cursor: pointer;
2189
+ box-shadow: var(--mat-editor-shadow);
2190
+ transition: background 0.12s ease, color 0.12s ease, border-color 0.12s ease, transform 0.12s ease;
2191
+ }
2192
+
2193
+ .mat-table-extend-btn:hover {
2194
+ background: var(--mat-editor-accent-subtle);
2195
+ color: var(--mat-editor-accent);
2196
+ border-color: var(--mat-editor-accent);
2197
+ border-style: solid;
2198
+ transform: scale(1.12);
2199
+ }
2200
+
2201
+ /* ═══════════════════════════════════════════════════════════════════
2202
+ 4. TABLE GRID PICKER (toolbar dropdown for choosing dimensions)
2203
+ ═══════════════════════════════════════════════════════════════════ */
2204
+
2205
+ .mat-table-trigger-wrap {
2206
+ position: relative;
2207
+ display: inline-flex;
2208
+ }
2209
+
2210
+ .mat-table-picker {
2211
+ position: absolute;
2212
+ top: calc(100% + 6px);
2213
+ left: 0;
2214
+ padding: 10px;
2215
+ border-radius: 12px;
2216
+ border: 1px solid var(--mat-editor-border);
2217
+ background: var(--mat-editor-toolbar-bg);
2218
+ box-shadow: var(--mat-editor-shadow-lg);
2219
+ backdrop-filter: blur(12px);
2220
+ animation: mat-pop-in 0.12s ease;
2221
+ z-index: 1000;
2222
+ user-select: none;
2223
+ }
2224
+
2225
+ .mat-table-picker__label {
2226
+ font-size: 12px;
2227
+ font-weight: 600;
2228
+ color: var(--mat-editor-text);
2229
+ text-align: center;
2230
+ margin-bottom: 8px;
2231
+ min-height: 18px;
2232
+ letter-spacing: 0.02em;
2233
+ }
2234
+
2235
+ .mat-table-picker__grid {
2236
+ display: grid;
2237
+ grid-template-columns: repeat(8, 20px);
2238
+ grid-template-rows: repeat(8, 20px);
2239
+ gap: 3px;
2240
+ }
2241
+
2242
+ .mat-table-picker__cell {
2243
+ width: 20px;
2244
+ height: 20px;
2245
+ border-radius: 4px;
2246
+ border: 1.5px solid var(--mat-editor-border);
2247
+ background: transparent;
2248
+ cursor: pointer;
2249
+ transition: background 0.08s ease, border-color 0.08s ease;
2250
+ }
2251
+
2252
+ .mat-table-picker__cell.is-highlighted {
2253
+ background: var(--mat-editor-accent-subtle);
2254
+ border-color: var(--mat-editor-accent);
2255
+ }
2256
+
2257
+ /* ─────────────────────────────────────────────────────────────────────
2258
+ @matops/editor — Utilities
2259
+ Character count bar · Image drag-over · Link popover
2260
+ ───────────────────────────────────────────────────────────────────── */
2261
+
2262
+ /* ── Character Count Bar ──────────────────────────────────────────── */
2263
+
2264
+ .mat-count-bar {
2265
+ display: flex;
2266
+ flex-direction: column;
2267
+ background: var(--mat-editor-surface);
2268
+ border-radius: 0;
2269
+ }
2270
+
2271
+ .mat-count-stats {
2272
+ display: flex;
2273
+ align-items: center;
2274
+ gap: 2px;
2275
+ padding: 6px 16px;
2276
+ flex-wrap: wrap;
2277
+ }
2278
+
2279
+ .mat-count-stat {
2280
+ display: flex;
2281
+ align-items: baseline;
2282
+ gap: 3px;
2283
+ padding: 2px 6px;
2284
+ }
2285
+
2286
+ .mat-count-value {
2287
+ font-size: 11px;
2288
+ font-weight: 700;
2289
+ color: var(--mat-editor-text);
2290
+ font-variant-numeric: tabular-nums;
2291
+ font-family: var(--mat-editor-font-mono);
2292
+ }
2293
+
2294
+ .mat-count-label {
2295
+ font-size: 10px;
2296
+ color: var(--mat-editor-text-muted);
2297
+ opacity: 0.6;
2298
+ }
2299
+
2300
+ .mat-count-sep {
2301
+ width: 3px;
2302
+ height: 3px;
2303
+ border-radius: 50%;
2304
+ background: var(--mat-editor-border);
2305
+ flex-shrink: 0;
2306
+ margin: 0 2px;
2307
+ }
2308
+
2309
+ .mat-count-limit {
2310
+ font-size: 11px;
2311
+ font-weight: 600;
2312
+ color: var(--mat-editor-text-muted);
2313
+ font-family: var(--mat-editor-font-mono);
2314
+ padding: 2px 8px;
2315
+ border-radius: 20px;
2316
+ background: var(--mat-editor-btn-hover);
2317
+ }
2318
+
2319
+ .mat-count-limit.over {
2320
+ color: #dc2626;
2321
+ background: #fef2f2;
2322
+ }
2323
+
2324
+ .matops-editor--dark .mat-count-limit.over {
2325
+ color: #f87171;
2326
+ background: #2d1515;
2327
+ }
2328
+
2329
+ .mat-count-progress-track {
2330
+ height: 2px;
2331
+ background: var(--mat-editor-border);
2332
+ border-radius: 0 0 var(--mat-editor-radius) var(--mat-editor-radius);
2333
+ overflow: hidden;
2334
+ }
2335
+
2336
+ .mat-count-progress-fill {
2337
+ height: 100%;
2338
+ background: var(--mat-editor-accent);
2339
+ border-radius: inherit;
2340
+ transition:
2341
+ width 0.3s ease,
2342
+ background 0.3s ease;
2343
+ }
2344
+
2345
+ .mat-count-progress-fill.over {
2346
+ background: #dc2626;
2347
+ }
2348
+
2349
+ /* ── Image Upload — Drag Over State ──────────────────────────────── */
2350
+
2351
+ [data-matops-editor].mat-drag-over .matops-editor__content {
2352
+ outline: 2px dashed var(--mat-editor-accent);
2353
+ outline-offset: -4px;
2354
+ background: var(--mat-editor-accent-subtle);
2355
+ border-radius: 0 0 var(--mat-editor-radius) var(--mat-editor-radius);
2356
+ }
2357
+
2358
+ /* ═══════════════════════════════════════════════════════════════════
2359
+ PHASE 3 — Link Popover, Image Menu, Keyboard Shortcuts Modal
2360
+ ═══════════════════════════════════════════════════════════════════ */
2361
+
2362
+ /* ── Link Popover ────────────────────────────────────────────────── */
2363
+
2364
+ .mat-link-popover {
2365
+ min-width: 280px;
2366
+ padding: 8px;
2367
+ border-radius: 10px;
2368
+ border: 1px solid var(--mat-editor-border);
2369
+ background: var(--mat-editor-toolbar-bg);
2370
+ box-shadow: var(--mat-editor-shadow-lg);
2371
+ backdrop-filter: blur(12px);
2372
+ animation: mat-pop-in 0.12s ease;
2373
+ }
2374
+
2375
+ .mat-link-preview-row,
2376
+ .mat-link-edit-row {
2377
+ display: flex;
2378
+ align-items: center;
2379
+ gap: 6px;
2380
+ }
2381
+
2382
+ .mat-link-url {
2383
+ flex: 1;
2384
+ font-size: 12px;
2385
+ color: var(--mat-editor-accent);
2386
+ font-family: var(--mat-editor-font-mono);
2387
+ overflow: hidden;
2388
+ text-overflow: ellipsis;
2389
+ white-space: nowrap;
2390
+ padding: 4px 6px;
2391
+ }
2392
+
2393
+ .mat-link-actions {
2394
+ display: flex;
2395
+ align-items: center;
2396
+ gap: 2px;
2397
+ flex-shrink: 0;
2398
+ }
2399
+
2400
+ .mat-link-sep {
2401
+ width: 1px;
2402
+ height: 16px;
2403
+ background: var(--mat-editor-border);
2404
+ margin: 0 2px;
2405
+ }
2406
+
2407
+ .mat-link-btn {
2408
+ display: inline-flex;
2409
+ align-items: center;
2410
+ justify-content: center;
2411
+ width: 28px;
2412
+ height: 28px;
2413
+ border: none;
2414
+ border-radius: 6px;
2415
+ background: transparent;
2416
+ color: var(--mat-editor-text-muted);
2417
+ cursor: pointer;
2418
+ transition:
2419
+ background 0.1s,
2420
+ color 0.1s;
2421
+ }
2422
+
2423
+ .mat-link-btn:hover {
2424
+ background: var(--mat-editor-btn-hover);
2425
+ color: var(--mat-editor-text);
2426
+ }
2427
+
2428
+ .mat-link-btn.danger:hover {
2429
+ background: #fef2f2;
2430
+ color: #dc2626;
2431
+ }
2432
+
2433
+ .matops-editor--dark .mat-link-btn.danger:hover {
2434
+ background: #2d1515;
2435
+ color: #f87171;
2436
+ }
2437
+
2438
+ .mat-link-btn.primary {
2439
+ background: var(--mat-editor-accent);
2440
+ color: white;
2441
+ width: auto;
2442
+ padding: 0 10px;
2443
+ border-radius: 6px;
2444
+ font-size: 12px;
2445
+ font-weight: 600;
2446
+ }
2447
+
2448
+ .mat-link-input {
2449
+ flex: 1;
2450
+ height: 30px;
2451
+ padding: 0 8px;
2452
+ border: 1px solid var(--mat-editor-border);
2453
+ border-radius: 6px;
2454
+ background: var(--mat-editor-surface);
2455
+ color: var(--mat-editor-text);
2456
+ font-size: 12px;
2457
+ font-family: var(--mat-editor-font-mono);
2458
+ outline: none;
2459
+ }
2460
+
2461
+ .mat-link-input:focus {
2462
+ border-color: var(--mat-editor-accent);
2463
+ }
2464
+
2465
+ /* ─────────────────────────────────────────────────────────────────────
2466
+ @matops/editor — Modal System
2467
+ Modal overlay + panel · Keyboard shortcuts modal
2468
+ ───────────────────────────────────────────────────────────────────── */
2469
+
2470
+ /* ── Modal Base ──────────────────────────────────────────────────── */
2471
+
2472
+ .mat-modal-overlay {
2473
+ position: fixed;
2474
+ inset: 0;
2475
+ z-index: 10000;
2476
+ background: rgba(0, 0, 0, 0.6);
2477
+ display: flex;
2478
+ align-items: center;
2479
+ justify-content: center;
2480
+ animation: mat-fade-in 0.15s ease;
2481
+ }
2482
+
2483
+ .mat-modal {
2484
+ width: 520px;
2485
+ max-width: 95vw;
2486
+ max-height: 80vh;
2487
+ overflow-y: auto;
2488
+ border-radius: 14px;
2489
+ border: 1px solid var(--mat-editor-border);
2490
+ /* Fully opaque — modals must never show content bleeding through */
2491
+ background: var(--mat-editor-bg);
2492
+ box-shadow:
2493
+ 0 8px 16px rgba(0, 0, 0, 0.12),
2494
+ 0 32px 80px rgba(0, 0, 0, 0.28);
2495
+ animation: mat-pop-in 0.18s ease;
2496
+ }
2497
+
2498
+ /* Dark theme: slightly lighter surface so the modal lifts off the page */
2499
+
2500
+ .matops-editor--dark .mat-modal {
2501
+ background: var(--mat-editor-surface);
2502
+ box-shadow:
2503
+ 0 8px 16px rgba(0, 0, 0, 0.4),
2504
+ 0 32px 80px rgba(0, 0, 0, 0.6);
2505
+ }
2506
+
2507
+ .mat-modal-header {
2508
+ display: flex;
2509
+ align-items: center;
2510
+ justify-content: space-between;
2511
+ padding: 16px 20px;
2512
+ border-bottom: 1px solid var(--mat-editor-border);
2513
+ }
2514
+
2515
+ .mat-modal-title {
2516
+ font-size: 15px;
2517
+ font-weight: 700;
2518
+ color: var(--mat-editor-text);
2519
+ }
2520
+
2521
+ .mat-modal-close {
2522
+ width: 28px;
2523
+ height: 28px;
2524
+ border: none;
2525
+ border-radius: 6px;
2526
+ background: transparent;
2527
+ color: var(--mat-editor-text-muted);
2528
+ cursor: pointer;
2529
+ font-size: 14px;
2530
+ transition: background 0.1s;
2531
+ }
2532
+
2533
+ .mat-modal-close:hover {
2534
+ background: var(--mat-editor-btn-hover);
2535
+ }
2536
+
2537
+ .mat-modal-body {
2538
+ padding: 12px 20px 20px;
2539
+ }
2540
+
2541
+ /* ── Keyboard Shortcuts ──────────────────────────────────────────── */
2542
+
2543
+ .mat-shortcut-group {
2544
+ margin-bottom: 20px;
2545
+ }
2546
+
2547
+ .mat-shortcut-group__label {
2548
+ font-size: 10px;
2549
+ font-weight: 700;
2550
+ text-transform: uppercase;
2551
+ letter-spacing: 0.08em;
2552
+ color: var(--mat-editor-text-muted);
2553
+ opacity: 0.6;
2554
+ margin-bottom: 6px;
2555
+ }
2556
+
2557
+ .mat-shortcut-row {
2558
+ display: flex;
2559
+ align-items: center;
2560
+ justify-content: space-between;
2561
+ padding: 6px 0;
2562
+ border-bottom: 1px solid var(--mat-editor-border);
2563
+ }
2564
+
2565
+ .mat-shortcut-row:last-child {
2566
+ border-bottom: none;
2567
+ }
2568
+
2569
+ .mat-shortcut-desc {
2570
+ font-size: 13px;
2571
+ color: var(--mat-editor-text);
2572
+ }
2573
+
2574
+ .mat-shortcut-keys {
2575
+ display: flex;
2576
+ align-items: center;
2577
+ gap: 3px;
2578
+ flex-shrink: 0;
2579
+ }
2580
+
2581
+ .mat-shortcut-plus {
2582
+ font-size: 10px;
2583
+ color: var(--mat-editor-text-muted);
2584
+ margin: 0 1px;
2585
+ }
2586
+
2587
+ .mat-kbd {
2588
+ display: inline-flex;
2589
+ align-items: center;
2590
+ justify-content: center;
2591
+ min-width: 24px;
2592
+ height: 22px;
2593
+ padding: 0 6px;
2594
+ border-radius: 4px;
2595
+ border: 1px solid var(--mat-editor-border);
2596
+ background: var(--mat-editor-surface);
2597
+ font-size: 11px;
2598
+ font-family: var(--mat-editor-font-mono);
2599
+ font-weight: 600;
2600
+ color: var(--mat-editor-text);
2601
+ box-shadow: 0 1px 0 var(--mat-editor-border);
2602
+ }
2603
+
2604
+ /* ─────────────────────────────────────────────────────────────────────
2605
+ @matops/editor — Panels
2606
+ Find & Replace · Export panel · Search highlights
2607
+ ───────────────────────────────────────────────────────────────────── */
2608
+
2609
+ /* ── Find & Replace Panel ────────────────────────────────────────── */
2610
+
2611
+ .mat-find-panel {
2612
+ border-bottom: 1px solid var(--mat-editor-border);
2613
+ background: var(--mat-editor-surface);
2614
+ padding: 8px 12px;
2615
+ display: flex;
2616
+ flex-direction: column;
2617
+ gap: 6px;
2618
+ animation: mat-slide-down 0.15s ease;
2619
+ }
2620
+
2621
+ .mat-find-header {
2622
+ display: flex;
2623
+ align-items: center;
2624
+ justify-content: space-between;
2625
+ }
2626
+
2627
+ .mat-find-title {
2628
+ font-size: 11px;
2629
+ font-weight: 700;
2630
+ text-transform: uppercase;
2631
+ letter-spacing: 0.06em;
2632
+ color: var(--mat-editor-text-muted);
2633
+ opacity: 0.7;
2634
+ }
2635
+
2636
+ .mat-find-header-actions {
2637
+ display: flex;
2638
+ align-items: center;
2639
+ gap: 6px;
2640
+ }
2641
+
2642
+ .mat-find-toggle {
2643
+ font-size: 11px;
2644
+ color: var(--mat-editor-accent);
2645
+ background: none;
2646
+ border: none;
2647
+ cursor: pointer;
2648
+ padding: 2px 4px;
2649
+ }
2650
+
2651
+ .mat-find-close {
2652
+ width: 22px;
2653
+ height: 22px;
2654
+ border: none;
2655
+ border-radius: 4px;
2656
+ background: transparent;
2657
+ color: var(--mat-editor-text-muted);
2658
+ cursor: pointer;
2659
+ font-size: 12px;
2660
+ transition: background 0.1s;
2661
+ }
2662
+
2663
+ .mat-find-close:hover {
2664
+ background: var(--mat-editor-btn-hover);
2665
+ }
2666
+
2667
+ .mat-find-row {
2668
+ display: flex;
2669
+ align-items: center;
2670
+ gap: 6px;
2671
+ }
2672
+
2673
+ .mat-find-input-wrap {
2674
+ flex: 1;
2675
+ position: relative;
2676
+ display: flex;
2677
+ align-items: center;
2678
+ }
2679
+
2680
+ .mat-find-input {
2681
+ width: 100%;
2682
+ height: 30px;
2683
+ padding: 0 8px;
2684
+ padding-right: 80px;
2685
+ border: 1px solid var(--mat-editor-border);
2686
+ border-radius: 6px;
2687
+ background: var(--mat-editor-bg);
2688
+ color: var(--mat-editor-text);
2689
+ font-size: 13px;
2690
+ outline: none;
2691
+ transition: border-color 0.15s;
2692
+ }
2693
+
2694
+ .mat-find-input:focus {
2695
+ border-color: var(--mat-editor-accent);
2696
+ }
2697
+
2698
+ .mat-find-count {
2699
+ position: absolute;
2700
+ right: 8px;
2701
+ font-size: 11px;
2702
+ color: var(--mat-editor-text-muted);
2703
+ opacity: 0.7;
2704
+ pointer-events: none;
2705
+ font-family: var(--mat-editor-font-mono);
2706
+ white-space: nowrap;
2707
+ }
2708
+
2709
+ .mat-find-btn-icon {
2710
+ height: 30px;
2711
+ min-width: 30px;
2712
+ padding: 0 6px;
2713
+ border: 1px solid var(--mat-editor-border);
2714
+ border-radius: 6px;
2715
+ background: var(--mat-editor-surface);
2716
+ color: var(--mat-editor-text-muted);
2717
+ font-size: 12px;
2718
+ font-weight: 600;
2719
+ cursor: pointer;
2720
+ transition: all 0.1s;
2721
+ flex-shrink: 0;
2722
+ }
2723
+
2724
+ .mat-find-btn-icon:hover:not(:disabled) {
2725
+ background: var(--mat-editor-btn-hover);
2726
+ color: var(--mat-editor-text);
2727
+ }
2728
+
2729
+ .mat-find-btn-icon.active {
2730
+ background: var(--mat-editor-accent-subtle);
2731
+ color: var(--mat-editor-accent);
2732
+ border-color: var(--mat-editor-accent);
2733
+ }
2734
+
2735
+ .mat-find-btn-icon:disabled {
2736
+ opacity: 0.3;
2737
+ cursor: not-allowed;
2738
+ }
2739
+
2740
+ .mat-find-btn {
2741
+ height: 30px;
2742
+ padding: 0 12px;
2743
+ border: 1px solid var(--mat-editor-border);
2744
+ border-radius: 6px;
2745
+ background: var(--mat-editor-surface);
2746
+ color: var(--mat-editor-text);
2747
+ font-size: 12px;
2748
+ font-weight: 600;
2749
+ cursor: pointer;
2750
+ transition: all 0.1s;
2751
+ flex-shrink: 0;
2752
+ }
2753
+
2754
+ .mat-find-btn:hover:not(:disabled) {
2755
+ background: var(--mat-editor-btn-hover);
2756
+ }
2757
+
2758
+ .mat-find-btn:disabled {
2759
+ opacity: 0.3;
2760
+ cursor: not-allowed;
2761
+ }
2762
+
2763
+ /* Search highlights inside ProseMirror */
2764
+
2765
+ .mat-search-highlight {
2766
+ background: rgba(253, 224, 71, 0.45);
2767
+ border-radius: 2px;
2768
+ }
2769
+
2770
+ .mat-search-current {
2771
+ background: rgba(249, 115, 22, 0.55);
2772
+ border-radius: 2px;
2773
+ }
2774
+
2775
+ /* ── Export Panel ────────────────────────────────────────────────── */
2776
+
2777
+ .mat-export-modal {
2778
+ width: 640px;
2779
+ }
2780
+
2781
+ .mat-export-tabs {
2782
+ display: grid;
2783
+ grid-template-columns: repeat(4, 1fr);
2784
+ gap: 6px;
2785
+ padding: 12px 20px;
2786
+ border-bottom: 1px solid var(--mat-editor-border);
2787
+ }
2788
+
2789
+ .mat-export-tab {
2790
+ display: flex;
2791
+ flex-direction: column;
2792
+ align-items: center;
2793
+ gap: 2px;
2794
+ padding: 8px 6px;
2795
+ border: 1px solid var(--mat-editor-border);
2796
+ border-radius: 8px;
2797
+ background: transparent;
2798
+ cursor: pointer;
2799
+ transition: all 0.15s;
2800
+ }
2801
+
2802
+ .mat-export-tab:hover {
2803
+ background: var(--mat-editor-btn-hover);
2804
+ }
2805
+
2806
+ .mat-export-tab.active {
2807
+ background: var(--mat-editor-accent-subtle);
2808
+ border-color: var(--mat-editor-accent);
2809
+ }
2810
+
2811
+ .mat-export-tab__label {
2812
+ font-size: 13px;
2813
+ font-weight: 700;
2814
+ color: var(--mat-editor-text);
2815
+ }
2816
+
2817
+ .mat-export-tab__desc {
2818
+ font-size: 10px;
2819
+ color: var(--mat-editor-text-muted);
2820
+ opacity: 0.7;
2821
+ text-align: center;
2822
+ line-height: 1.3;
2823
+ }
2824
+
2825
+ .mat-export-preview {
2826
+ height: 240px;
2827
+ overflow: auto;
2828
+ margin: 0 20px;
2829
+ border: 1px solid var(--mat-editor-border);
2830
+ border-radius: 8px;
2831
+ background: var(--mat-editor-surface);
2832
+ }
2833
+
2834
+ .mat-export-code {
2835
+ margin: 0;
2836
+ padding: 12px 16px;
2837
+ font-size: 11px;
2838
+ font-family: var(--mat-editor-font-mono);
2839
+ color: var(--mat-editor-text);
2840
+ white-space: pre-wrap;
2841
+ word-break: break-all;
2842
+ line-height: 1.6;
2843
+ }
2844
+
2845
+ .mat-export-actions {
2846
+ display: flex;
2847
+ align-items: center;
2848
+ gap: 8px;
2849
+ padding: 12px 20px 20px;
2850
+ }
2851
+
2852
+ .mat-export-btn {
2853
+ height: 36px;
2854
+ padding: 0 16px;
2855
+ border: 1px solid var(--mat-editor-border);
2856
+ border-radius: 8px;
2857
+ background: var(--mat-editor-surface);
2858
+ color: var(--mat-editor-text);
2859
+ font-size: 13px;
2860
+ font-weight: 600;
2861
+ cursor: pointer;
2862
+ transition: all 0.1s;
2863
+ }
2864
+
2865
+ .mat-export-btn:hover {
2866
+ background: var(--mat-editor-btn-hover);
2867
+ }
2868
+
2869
+ .mat-export-btn.primary {
2870
+ background: var(--mat-editor-accent);
2871
+ color: white;
2872
+ border-color: var(--mat-editor-accent);
2873
+ }
2874
+
2875
+ /* ─────────────────────────────────────────────────────────────────────
2876
+ @matops/editor — Page Header
2877
+ Cover image · Title node · Title separator · Separator icon edit mode
2878
+ ───────────────────────────────────────────────────────────────────── */
2879
+
2880
+ /* ═══════════════════════════════════════════════════════════════════
2881
+ PAGE HEADER — cover-image + title node styles
2882
+ Edit mode: ReactNodeView components (CoverImageView, TitleView)
2883
+ Read mode: generateHTML output (div[data-type] / h1[data-type])
2884
+ ═══════════════════════════════════════════════════════════════════ */
2885
+
2886
+ /* ─────────────────────────────────────────────────────────────────
2887
+ COVER IMAGE — base container
2888
+ ───────────────────────────────────────────────────────────────── */
2889
+
2890
+ .mat-cover {
2891
+ position: relative;
2892
+ width: 100%;
2893
+ overflow: hidden;
2894
+ /* Fluid aspect ratio — height always = width ÷ 5.25.
2895
+ Both cover and separator icon are derived from this single ratio,
2896
+ so their visual relationship is identical at every screen size.
2897
+ max-height caps very wide viewports; min-height keeps it usable on
2898
+ the narrowest phones (≤ 360 px). */
2899
+ aspect-ratio: 21 / 4;
2900
+ height: auto;
2901
+ max-height: 200px;
2902
+ min-height: 90px;
2903
+ }
2904
+
2905
+ /* ── Filled cover image ──────────────────────────────────────────── */
2906
+
2907
+ .mat-cover__img {
2908
+ width: 100%;
2909
+ height: 100%;
2910
+ object-fit: cover;
2911
+ object-position: center 40%;
2912
+ display: block;
2913
+ transition: transform 0.4s ease;
2914
+ }
2915
+
2916
+ .mat-cover--hovered .mat-cover__img {
2917
+ transform: scale(1.01);
2918
+ }
2919
+
2920
+ /* Gradient scrim so action buttons are readable */
2921
+
2922
+ .mat-cover--has-image::after {
2923
+ content: "";
2924
+ position: absolute;
2925
+ inset: 0;
2926
+ background: linear-gradient(
2927
+ to bottom,
2928
+ transparent 50%,
2929
+ rgba(0, 0, 0, 0.35) 100%
2930
+ );
2931
+ pointer-events: none;
2932
+ }
2933
+
2934
+ /* ── Empty cover — dot-grid placeholder ─────────────────────────── */
2935
+
2936
+ .mat-cover--empty {
2937
+ background-color: var(--mat-editor-surface);
2938
+ background-image: radial-gradient(
2939
+ circle,
2940
+ var(--mat-editor-border) 1.2px,
2941
+ transparent 1.2px
2942
+ );
2943
+ background-size: 22px 22px;
2944
+ cursor: pointer;
2945
+ transition:
2946
+ background-color 0.2s ease,
2947
+ background-image 0.2s ease;
2948
+ }
2949
+
2950
+ .matops-editor--dark .mat-cover--empty {
2951
+ background-color: #0d0f18;
2952
+ background-image: radial-gradient(circle, #252840 1.2px, transparent 1.2px);
2953
+ }
2954
+
2955
+ .mat-cover--empty:hover {
2956
+ background-color: var(--mat-editor-accent-subtle);
2957
+ background-image: radial-gradient(
2958
+ circle,
2959
+ var(--mat-editor-accent) 1.2px,
2960
+ transparent 1.2px
2961
+ );
2962
+ }
2963
+
2964
+ .mat-cover--dragging {
2965
+ background-color: var(--mat-editor-accent-subtle);
2966
+ background-image: radial-gradient(
2967
+ circle,
2968
+ var(--mat-editor-accent) 1.2px,
2969
+ transparent 1.2px
2970
+ );
2971
+ outline: 2px dashed var(--mat-editor-accent);
2972
+ outline-offset: -4px;
2973
+ }
2974
+
2975
+ /* ── Empty inner — centered "Add cover" button ───────────────────── */
2976
+
2977
+ .mat-cover__empty-inner {
2978
+ position: absolute;
2979
+ inset: 0;
2980
+ display: flex;
2981
+ align-items: center;
2982
+ justify-content: center;
2983
+ opacity: 0;
2984
+ transition: opacity 0.18s ease;
2985
+ pointer-events: none;
2986
+ }
2987
+
2988
+ .mat-cover__empty-inner--visible {
2989
+ opacity: 1;
2990
+ pointer-events: auto;
2991
+ }
2992
+
2993
+ .mat-cover__add-btn {
2994
+ display: inline-flex;
2995
+ align-items: center;
2996
+ gap: 7px;
2997
+ padding: 9px 18px;
2998
+ border-radius: 8px;
2999
+ border: 1px solid var(--mat-editor-border);
3000
+ background: var(--mat-editor-bg);
3001
+ color: var(--mat-editor-text-muted);
3002
+ font-size: 12px;
3003
+ font-weight: 600;
3004
+ cursor: pointer;
3005
+ transition:
3006
+ background 0.15s,
3007
+ border-color 0.15s,
3008
+ color 0.15s,
3009
+ box-shadow 0.15s;
3010
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
3011
+ white-space: nowrap;
3012
+ }
3013
+
3014
+ .mat-cover__add-btn:hover {
3015
+ border-color: var(--mat-editor-accent);
3016
+ color: var(--mat-editor-accent);
3017
+ box-shadow: 0 4px 16px rgba(99, 102, 241, 0.18);
3018
+ }
3019
+
3020
+ /* ── Drop hint pill (dragging over empty area) ───────────────────── */
3021
+
3022
+ .mat-cover__drop-hint {
3023
+ display: inline-flex;
3024
+ align-items: center;
3025
+ gap: 8px;
3026
+ padding: 10px 20px;
3027
+ border-radius: 10px;
3028
+ border: 2px dashed var(--mat-editor-accent);
3029
+ background: var(--mat-editor-accent-subtle);
3030
+ color: var(--mat-editor-accent);
3031
+ font-size: 13px;
3032
+ font-weight: 700;
3033
+ pointer-events: none;
3034
+ }
3035
+
3036
+ /* ── Cover actions (change / remove — on filled image hover) ─────── */
3037
+
3038
+ .mat-cover__actions {
3039
+ position: absolute;
3040
+ bottom: 14px;
3041
+ right: 16px;
3042
+ display: flex;
3043
+ gap: 6px;
3044
+ z-index: 2;
3045
+ opacity: 0;
3046
+ transform: translateY(4px);
3047
+ transition:
3048
+ opacity 0.18s ease,
3049
+ transform 0.18s ease;
3050
+ }
3051
+
3052
+ .mat-cover__actions--visible {
3053
+ opacity: 1;
3054
+ transform: translateY(0);
3055
+ }
3056
+
3057
+ .mat-cover__btn {
3058
+ display: inline-flex;
3059
+ align-items: center;
3060
+ gap: 5px;
3061
+ padding: 5px 10px;
3062
+ border-radius: 6px;
3063
+ border: 1px solid rgba(255, 255, 255, 0.25);
3064
+ background: rgba(0, 0, 0, 0.55);
3065
+ backdrop-filter: blur(8px);
3066
+ color: rgba(255, 255, 255, 0.9);
3067
+ font-size: 11px;
3068
+ font-weight: 600;
3069
+ cursor: pointer;
3070
+ transition:
3071
+ background 0.15s,
3072
+ border-color 0.15s;
3073
+ white-space: nowrap;
3074
+ }
3075
+
3076
+ .mat-cover__btn:hover {
3077
+ background: rgba(0, 0, 0, 0.75);
3078
+ border-color: rgba(255, 255, 255, 0.4);
3079
+ }
3080
+
3081
+ .mat-cover__btn--danger:hover {
3082
+ background: rgba(180, 30, 30, 0.75);
3083
+ border-color: rgba(255, 100, 100, 0.5);
3084
+ }
3085
+
3086
+ /* ── Full-cover drop overlay (dragging over filled image) ────────── */
3087
+
3088
+ .mat-cover__drop-overlay {
3089
+ position: absolute;
3090
+ inset: 0;
3091
+ display: flex;
3092
+ align-items: center;
3093
+ justify-content: center;
3094
+ gap: 8px;
3095
+ background: rgba(99, 102, 241, 0.18);
3096
+ border: 2px dashed var(--mat-editor-accent);
3097
+ font-size: 13px;
3098
+ font-weight: 700;
3099
+ color: var(--mat-editor-accent);
3100
+ backdrop-filter: blur(4px);
3101
+ z-index: 10;
3102
+ pointer-events: none;
3103
+ }
3104
+
3105
+ /* ── Upload spinner ──────────────────────────────────────────────── */
3106
+
3107
+ .mat-cover__spinner {
3108
+ display: inline-block;
3109
+ width: 12px;
3110
+ height: 12px;
3111
+ border: 2px solid rgba(255, 255, 255, 0.3);
3112
+ border-top-color: white;
3113
+ border-radius: 50%;
3114
+ animation: mat-spin 0.6s linear infinite;
3115
+ }
3116
+
3117
+ .mat-cover__spinner--muted {
3118
+ border-color: var(--mat-editor-border);
3119
+ border-top-color: var(--mat-editor-accent);
3120
+ }
3121
+
3122
+ /* ── Viewer: cover rendered by generateHTML (legacy fallback only) ── */
3123
+
3124
+ [data-matops-editor] div[data-type="cover-image"],
3125
+ .matops-editor__viewer-content div[data-type="cover-image"] {
3126
+ width: 100%;
3127
+ overflow: hidden;
3128
+ /* Matches .mat-cover so viewer and editor renders are identical */
3129
+ aspect-ratio: 21 / 4;
3130
+ height: auto;
3131
+ max-height: 200px;
3132
+ min-height: 90px;
3133
+ display: block;
3134
+ position: relative;
3135
+ }
3136
+
3137
+ [data-matops-editor] div[data-type="cover-image"] img,
3138
+ .matops-editor__viewer-content div[data-type="cover-image"] img {
3139
+ width: 100%;
3140
+ height: 100%;
3141
+ object-fit: cover;
3142
+ display: block;
3143
+ margin: 0;
3144
+ border-radius: 0;
3145
+ }
3146
+
3147
+ /* ─────────────────────────────────────────────────────────────────
3148
+ TITLE NODE
3149
+ ───────────────────────────────────────────────────────────────── */
3150
+
3151
+ /* NodeView wrapper */
3152
+
3153
+ .mat-page-title-wrap {
3154
+ padding: 1rem 2rem 0.5rem;
3155
+ width: 100%;
3156
+ }
3157
+
3158
+ /* Relative container for placeholder overlay */
3159
+
3160
+ .mat-page-title-editable-wrap {
3161
+ position: relative;
3162
+ width: 100%;
3163
+ }
3164
+
3165
+ /* Shared title typography */
3166
+
3167
+ .mat-page-title {
3168
+ display: block;
3169
+ width: 100%;
3170
+ font-size: 2.5rem;
3171
+ font-weight: 800;
3172
+ line-height: 1.2;
3173
+ letter-spacing: -0.03em;
3174
+ color: var(--mat-editor-text);
3175
+ font-family: var(--mat-editor-font);
3176
+ margin: 0;
3177
+ padding: 0;
3178
+ }
3179
+
3180
+ .mat-page-title--editable {
3181
+ background: transparent;
3182
+ outline: none;
3183
+ min-height: 1.2em;
3184
+ word-break: break-word;
3185
+ caret-color: var(--mat-editor-accent);
3186
+ }
3187
+
3188
+ /* Ghost placeholder (shown over the editable div when empty) */
3189
+
3190
+ .mat-page-title__placeholder {
3191
+ position: absolute;
3192
+ top: 0;
3193
+ left: 0;
3194
+ font-size: 2.5rem;
3195
+ font-weight: 800;
3196
+ line-height: 1.2;
3197
+ letter-spacing: -0.03em;
3198
+ color: var(--mat-editor-text-placeholder);
3199
+ font-family: var(--mat-editor-font);
3200
+ pointer-events: none;
3201
+ user-select: none;
3202
+ white-space: nowrap;
3203
+ overflow: hidden;
3204
+ text-overflow: ellipsis;
3205
+ max-width: 100%;
3206
+ }
3207
+
3208
+ .mat-page-title--readonly {
3209
+ margin: 0;
3210
+ padding: 0;
3211
+ }
3212
+
3213
+ /* ── Viewer: title rendered by generateHTML (legacy fallback only) ── */
3214
+
3215
+ [data-matops-editor] .ProseMirror h1[data-type="title"],
3216
+ .matops-editor__viewer-content h1[data-type="title"] {
3217
+ font-size: 2.5rem;
3218
+ font-weight: 800;
3219
+ line-height: 1.2;
3220
+ letter-spacing: -0.03em;
3221
+ margin: 0 0 0.5rem;
3222
+ padding: 1rem 2rem 0;
3223
+ }
3224
+
3225
+ /* ─────────────────────────────────────────────────────────────────
3226
+ TITLE → BODY SEPARATOR
3227
+ A short centred rule with a document icon in the middle.
3228
+ Replaces the old full-width .mat-page-header__separator line.
3229
+ ───────────────────────────────────────────────────────────────── */
3230
+
3231
+ .mat-title-separator {
3232
+ display: flex;
3233
+ align-items: center;
3234
+ justify-content: center;
3235
+ gap: 10px;
3236
+ padding: 0.5rem 2rem 0.75rem;
3237
+ width: 100%;
3238
+ box-sizing: border-box;
3239
+ }
3240
+
3241
+ .mat-title-separator__line {
3242
+ /* clamp mirrors the cover's 21:4 scaling:
3243
+ 72px (desktop) ÷ 200px (cover height) ≈ 36% → 36% of ~20.95vw ≈ 7.5vw */
3244
+ width: clamp(40px, 7.5vw, 72px);
3245
+ height: 1px;
3246
+ background: var(--mat-editor-border);
3247
+ flex-shrink: 0;
3248
+ }
3249
+
3250
+ .mat-title-separator__icon {
3251
+ display: flex;
3252
+ align-items: center;
3253
+ justify-content: center;
3254
+ /* clamp mirrors the cover's 21:4 scaling:
3255
+ 22px (desktop) ÷ 200px (cover height) ≈ 11% → 11% of ~20.95vw ≈ 2.3vw.
3256
+ min 14px preserves tap-target usability on the smallest phones. */
3257
+ width: clamp(14px, 2.3vw, 22px);
3258
+ height: clamp(14px, 2.3vw, 22px);
3259
+ border-radius: 50%;
3260
+ border: 1px solid var(--mat-editor-border);
3261
+ background: var(--mat-editor-bg);
3262
+ color: var(--mat-editor-text-muted);
3263
+ flex-shrink: 0;
3264
+ transition:
3265
+ border-color 0.2s,
3266
+ color 0.2s;
3267
+ }
3268
+
3269
+ /* Subtle glow on focus-within the title */
3270
+
3271
+ .mat-page-title-wrap:focus-within
3272
+ ~ .mat-title-separator
3273
+ .mat-title-separator__line {
3274
+ background: var(--mat-editor-accent);
3275
+ opacity: 0.35;
3276
+ }
3277
+
3278
+ .mat-page-title-wrap:focus-within
3279
+ ~ .mat-title-separator
3280
+ .mat-title-separator__icon {
3281
+ border-color: var(--mat-editor-accent);
3282
+ color: var(--mat-editor-accent);
3283
+ }
3284
+
3285
+ /* ── Separator icon: uploaded image in badge ─────────────────────── */
3286
+
3287
+ .mat-separator-icon__img {
3288
+ /* When no crop: fills the badge circle */
3289
+ width: 100%;
3290
+ height: 100%;
3291
+ object-fit: cover;
3292
+ border-radius: 50%;
3293
+ display: block;
3294
+ }
3295
+
3296
+ /* Badge with an uploaded image — needs overflow:hidden + position:relative for the crop to clip */
3297
+
3298
+ .mat-title-separator__icon--img {
3299
+ overflow: hidden;
3300
+ padding: 0;
3301
+ position: relative; /* required so position:absolute crop img stays inside the badge */
3302
+ }
3303
+
3304
+ /* ── Editable badge states (SeparatorIconView edit mode) ─────────── */
3305
+
3306
+ .mat-title-separator__icon--editable {
3307
+ cursor: default;
3308
+ transition: border-color 0.15s;
3309
+ }
3310
+
3311
+ .mat-title-separator--dragging .mat-title-separator__icon--editable {
3312
+ border-color: var(--mat-editor-accent);
3313
+ box-shadow: 0 0 0 3px var(--mat-editor-accent-subtle);
3314
+ background: var(--mat-editor-accent-subtle);
3315
+ }
3316
+
3317
+ .mat-title-separator__icon-inner {
3318
+ display: flex;
3319
+ align-items: center;
3320
+ justify-content: center;
3321
+ width: 100%;
3322
+ height: 100%;
3323
+ }
3324
+
3325
+ /* ── Edit mode separator wrapper ─────────────────────────────────── */
3326
+
3327
+ .mat-title-separator--editable {
3328
+ flex-wrap: wrap;
3329
+ row-gap: 0;
3330
+ position: relative;
3331
+ padding-bottom: 0; /* action bar sits below via its own margin */
3332
+ }
3333
+
3334
+ /* ── Always-visible action bar ───────────────────────────────────── */
3335
+
3336
+ /* Sits below the ──── [icon] ──── line, always rendered in edit mode */
3337
+
3338
+ .mat-sep-action-bar {
3339
+ display: flex;
3340
+ align-items: center;
3341
+ gap: 6px;
3342
+ width: 100%;
3343
+ justify-content: center;
3344
+ margin-top: 6px;
3345
+ flex-basis: 100%;
3346
+ }
3347
+
3348
+ /* Upload pill — shown when no icon image is set */
3349
+
3350
+ .mat-sep-action-bar__upload-pill {
3351
+ display: inline-flex;
3352
+ align-items: center;
3353
+ gap: 5px;
3354
+ padding: 3px 10px;
3355
+ border-radius: 20px;
3356
+ border: 1px dashed var(--mat-editor-border);
3357
+ background: transparent;
3358
+ color: var(--mat-editor-text-placeholder);
3359
+ font-size: 11px;
3360
+ font-weight: 500;
3361
+ cursor: pointer;
3362
+ transition:
3363
+ border-color 0.15s,
3364
+ color 0.15s,
3365
+ background 0.15s;
3366
+ font-family: var(--mat-editor-font);
3367
+ line-height: 1;
3368
+ }
3369
+
3370
+ .mat-sep-action-bar__upload-pill:hover {
3371
+ border-color: var(--mat-editor-accent);
3372
+ color: var(--mat-editor-accent);
3373
+ border-style: solid;
3374
+ }
3375
+
3376
+ /* Label shown when image is set — thumbnail + "Custom icon" text */
3377
+
3378
+ .mat-sep-action-bar__label {
3379
+ display: inline-flex;
3380
+ align-items: center;
3381
+ gap: 5px;
3382
+ font-size: 11px;
3383
+ color: var(--mat-editor-text-muted);
3384
+ font-family: var(--mat-editor-font);
3385
+ }
3386
+
3387
+ .mat-sep-action-bar__thumb {
3388
+ width: 14px;
3389
+ height: 14px;
3390
+ border-radius: 50%;
3391
+ object-fit: cover;
3392
+ border: 1px solid var(--mat-editor-border);
3393
+ }
3394
+
3395
+ /* Change / Remove buttons — shown when image is set */
3396
+
3397
+ .mat-sep-action-bar__btn {
3398
+ display: inline-flex;
3399
+ align-items: center;
3400
+ padding: 2px 8px;
3401
+ border-radius: 4px;
3402
+ border: 1px solid var(--mat-editor-border);
3403
+ background: transparent;
3404
+ color: var(--mat-editor-text-muted);
3405
+ font-size: 11px;
3406
+ font-weight: 500;
3407
+ cursor: pointer;
3408
+ font-family: var(--mat-editor-font);
3409
+ line-height: 1.4;
3410
+ transition:
3411
+ border-color 0.12s,
3412
+ color 0.12s;
3413
+ }
3414
+
3415
+ .mat-sep-action-bar__btn:hover {
3416
+ border-color: var(--mat-editor-accent);
3417
+ color: var(--mat-editor-accent);
3418
+ }
3419
+
3420
+ .mat-sep-action-bar__btn--danger:hover {
3421
+ border-color: #e53e3e;
3422
+ color: #e53e3e;
3423
+ }
3424
+
3425
+ /* ── Drag-and-drop overlay ───────────────────────────────────────── */
3426
+
3427
+ .mat-sep-drop-overlay {
3428
+ position: absolute;
3429
+ inset: 0;
3430
+ display: flex;
3431
+ align-items: center;
3432
+ justify-content: center;
3433
+ background: var(--mat-editor-accent-subtle);
3434
+ border: 2px dashed var(--mat-editor-accent);
3435
+ border-radius: 6px;
3436
+ color: var(--mat-editor-accent);
3437
+ font-size: 12px;
3438
+ font-weight: 600;
3439
+ pointer-events: none;
3440
+ z-index: 5;
3441
+ }
3442
+
3443
+ /* ─────────────────────────────────────────────────────────────────────
3444
+ @matops/editor — Crop Modal
3445
+ Full-screen crop UI with canvas, scrim, handles, grid, and footer actions
3446
+ ───────────────────────────────────────────────────────────────────── */
3447
+
3448
+ /* ═══════════════════════════════════════════════════════════════════
3449
+ CROP MODAL
3450
+ Full-screen backdrop + centred modal with drag-to-crop UI.
3451
+ ═══════════════════════════════════════════════════════════════════ */
3452
+
3453
+ /* Backdrop */
3454
+
3455
+ .mat-crop-backdrop {
3456
+ position: fixed;
3457
+ inset: 0;
3458
+ background: rgba(0, 0, 0, 0.72);
3459
+ display: flex;
3460
+ align-items: center;
3461
+ justify-content: center;
3462
+ z-index: 9999;
3463
+ backdrop-filter: blur(3px);
3464
+ }
3465
+
3466
+ /* Modal panel */
3467
+
3468
+ .mat-crop-modal {
3469
+ background: var(--mat-editor-bg);
3470
+ border-radius: 14px;
3471
+ box-shadow:
3472
+ 0 24px 64px rgba(0, 0, 0, 0.5),
3473
+ 0 0 0 1px rgba(255, 255, 255, 0.06);
3474
+ display: flex;
3475
+ flex-direction: column;
3476
+ width: min(660px, 95vw);
3477
+ overflow: visible; /* handles must not be clipped */
3478
+ user-select: none;
3479
+ }
3480
+
3481
+ /* Header */
3482
+
3483
+ .mat-crop-modal__header {
3484
+ display: flex;
3485
+ align-items: center;
3486
+ justify-content: space-between;
3487
+ padding: 14px 18px 12px;
3488
+ border-bottom: 1px solid var(--mat-editor-border);
3489
+ flex-shrink: 0;
3490
+ }
3491
+
3492
+ .mat-crop-modal__title {
3493
+ font-size: 14px;
3494
+ font-weight: 700;
3495
+ color: var(--mat-editor-text);
3496
+ font-family: var(--mat-editor-font);
3497
+ display: flex;
3498
+ align-items: center;
3499
+ gap: 8px;
3500
+ }
3501
+
3502
+ .mat-crop-modal__aspect-badge {
3503
+ display: inline-flex;
3504
+ align-items: center;
3505
+ padding: 2px 7px;
3506
+ border-radius: 4px;
3507
+ background: var(--mat-editor-accent-subtle);
3508
+ color: var(--mat-editor-accent);
3509
+ font-size: 10px;
3510
+ font-weight: 700;
3511
+ letter-spacing: 0.05em;
3512
+ }
3513
+
3514
+ .mat-crop-modal__close {
3515
+ display: flex;
3516
+ align-items: center;
3517
+ justify-content: center;
3518
+ width: 28px;
3519
+ height: 28px;
3520
+ border-radius: 7px;
3521
+ border: 1px solid transparent;
3522
+ background: transparent;
3523
+ color: var(--mat-editor-text-muted);
3524
+ cursor: pointer;
3525
+ transition:
3526
+ background 0.12s,
3527
+ border-color 0.12s,
3528
+ color 0.12s;
3529
+ }
3530
+
3531
+ .mat-crop-modal__close:hover {
3532
+ background: var(--mat-editor-surface);
3533
+ border-color: var(--mat-editor-border);
3534
+ color: var(--mat-editor-text);
3535
+ }
3536
+
3537
+ /* Body — holds the image + crop overlay */
3538
+
3539
+ .mat-crop-modal__body {
3540
+ padding: 14px 18px 10px;
3541
+ display: flex;
3542
+ align-items: center;
3543
+ justify-content: center;
3544
+ overflow: visible;
3545
+ }
3546
+
3547
+ /* Fixed-size canvas — always CANVAS_W × CANVAS_H px.
3548
+ The image is absolutely positioned inside it (fit-to-bounds scaled).
3549
+ overflow: visible so handles at the edge are never clipped. */
3550
+
3551
+ .mat-crop-canvas {
3552
+ position: relative;
3553
+ /* width + height are set via inline style from CropModal.tsx (responsive) */
3554
+ max-width: 100%;
3555
+ margin: 0 auto;
3556
+ cursor: crosshair;
3557
+ background: #0a0a0f;
3558
+ border-radius: 6px;
3559
+ overflow: visible;
3560
+ flex-shrink: 0;
3561
+ }
3562
+
3563
+ .mat-crop-canvas__img {
3564
+ display: block;
3565
+ border-radius: 4px;
3566
+ pointer-events: none;
3567
+ user-select: none;
3568
+ }
3569
+
3570
+ /* SVG scrim — covers the whole canvas, has a transparent window over the crop */
3571
+
3572
+ .mat-crop-scrim {
3573
+ position: absolute;
3574
+ top: 0;
3575
+ left: 0;
3576
+ pointer-events: none;
3577
+ border-radius: 6px;
3578
+ }
3579
+
3580
+ /* Crop selection rect */
3581
+
3582
+ .mat-crop-rect {
3583
+ position: absolute;
3584
+ border: 2px solid rgba(255, 255, 255, 0.95);
3585
+ box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.35);
3586
+ cursor: move;
3587
+ box-sizing: border-box;
3588
+ border-radius: 2px;
3589
+ }
3590
+
3591
+ /* Rule-of-thirds grid lines inside the crop rect */
3592
+
3593
+ .mat-crop-rect__grid {
3594
+ position: absolute;
3595
+ inset: 0;
3596
+ pointer-events: none;
3597
+ }
3598
+
3599
+ .mat-crop-rect__grid-v {
3600
+ position: absolute;
3601
+ top: 0;
3602
+ bottom: 0;
3603
+ width: 1px;
3604
+ background: rgba(255, 255, 255, 0.25);
3605
+ }
3606
+
3607
+ .mat-crop-rect__grid-h {
3608
+ position: absolute;
3609
+ left: 0;
3610
+ right: 0;
3611
+ height: 1px;
3612
+ background: rgba(255, 255, 255, 0.25);
3613
+ }
3614
+
3615
+ /* Resize handles */
3616
+
3617
+ .mat-crop__handle {
3618
+ position: absolute;
3619
+ width: 10px;
3620
+ height: 10px;
3621
+ background: #fff;
3622
+ border: 2px solid var(--mat-editor-accent);
3623
+ border-radius: 2px;
3624
+ box-shadow: 0 1px 4px rgba(0, 0, 0, 0.4);
3625
+ z-index: 2;
3626
+ }
3627
+
3628
+ /* Dimensions tooltip */
3629
+
3630
+ .mat-crop-dims {
3631
+ position: absolute;
3632
+ background: rgba(0, 0, 0, 0.72);
3633
+ color: #fff;
3634
+ font-size: 10px;
3635
+ font-weight: 600;
3636
+ padding: 2px 6px;
3637
+ border-radius: 4px;
3638
+ pointer-events: none;
3639
+ white-space: nowrap;
3640
+ font-family: var(--mat-editor-font);
3641
+ z-index: 3;
3642
+ }
3643
+
3644
+ /* Footer */
3645
+
3646
+ .mat-crop-modal__footer {
3647
+ display: flex;
3648
+ align-items: center;
3649
+ justify-content: flex-end;
3650
+ gap: 8px;
3651
+ padding: 12px 18px 14px;
3652
+ border-top: 1px solid var(--mat-editor-border);
3653
+ flex-shrink: 0;
3654
+ }
3655
+
3656
+ .mat-crop-modal__btn {
3657
+ display: inline-flex;
3658
+ align-items: center;
3659
+ gap: 6px;
3660
+ padding: 7px 16px;
3661
+ border-radius: 8px;
3662
+ font-size: 13px;
3663
+ font-weight: 600;
3664
+ cursor: pointer;
3665
+ font-family: var(--mat-editor-font);
3666
+ transition:
3667
+ background 0.15s,
3668
+ border-color 0.15s,
3669
+ color 0.15s,
3670
+ box-shadow 0.15s;
3671
+ }
3672
+
3673
+ .mat-crop-modal__btn--ghost {
3674
+ border: 1px solid var(--mat-editor-border);
3675
+ background: transparent;
3676
+ color: var(--mat-editor-text-muted);
3677
+ }
3678
+
3679
+ .mat-crop-modal__btn--ghost:hover {
3680
+ background: var(--mat-editor-surface);
3681
+ color: var(--mat-editor-text);
3682
+ }
3683
+
3684
+ .mat-crop-modal__btn--primary {
3685
+ border: 1px solid var(--mat-editor-accent);
3686
+ background: var(--mat-editor-accent);
3687
+ color: #fff;
3688
+ box-shadow: 0 2px 8px rgba(99, 102, 241, 0.28);
3689
+ }
3690
+
3691
+ .mat-crop-modal__btn--primary:hover {
3692
+ background: var(--mat-editor-accent-dark, #4f46e5);
3693
+ box-shadow: 0 4px 16px rgba(99, 102, 241, 0.4);
3694
+ }
3695
+
3696
+ .mat-crop-modal__btn--primary:disabled {
3697
+ opacity: 0.45;
3698
+ cursor: not-allowed;
3699
+ }
3700
+
3701
+ /* Dark theme overrides for the modal */
3702
+
3703
+ .matops-editor--dark .mat-crop-modal {
3704
+ background: #0f111a;
3705
+ }
3706
+
3707
+ /* ─────────────────────────────────────────────────────────────────────
3708
+ @matops/editor — Attachments Section
3709
+ Attachment list · Empty state · Add button · Drop overlay · Dark theme · Responsive
3710
+ ───────────────────────────────────────────────────────────────────── */
3711
+
3712
+ /* ════════════════════════════════════════════════════════════════════
3713
+ ATTACHMENTS SECTION
3714
+ Mirrors the visual weight of the page-header area at the document end.
3715
+ ════════════════════════════════════════════════════════════════════ */
3716
+
3717
+ .mat-attachments {
3718
+ margin: 0;
3719
+ padding: 0 1.5rem 1.25rem;
3720
+ font-family: inherit;
3721
+ }
3722
+
3723
+ /* ── Header row ─────────────────────────────────────────────────────── */
3724
+
3725
+ .mat-attachments__header {
3726
+ display: flex;
3727
+ align-items: center;
3728
+ justify-content: space-between;
3729
+ gap: 0.75rem;
3730
+ margin-bottom: 0.75rem;
3731
+ }
3732
+
3733
+ .mat-attachments__heading-row {
3734
+ display: flex;
3735
+ align-items: center;
3736
+ gap: 0.5rem;
3737
+ }
3738
+
3739
+ .mat-attachments__heading-icon {
3740
+ color: var(--mat-editor-muted, #888);
3741
+ flex-shrink: 0;
3742
+ }
3743
+
3744
+ .mat-attachments__heading {
3745
+ margin: 0;
3746
+ font-size: 0.8rem;
3747
+ font-weight: 600;
3748
+ letter-spacing: 0.04em;
3749
+ text-transform: uppercase;
3750
+ color: var(--mat-editor-muted, #888);
3751
+ }
3752
+
3753
+ .mat-attachments__count {
3754
+ display: inline-flex;
3755
+ align-items: center;
3756
+ justify-content: center;
3757
+ min-width: 18px;
3758
+ height: 18px;
3759
+ padding: 0 5px;
3760
+ border-radius: 9px;
3761
+ background: var(--mat-editor-accent, #4f46e5);
3762
+ color: #fff;
3763
+ font-size: 10px;
3764
+ font-weight: 700;
3765
+ line-height: 1;
3766
+ }
3767
+
3768
+ /* ── Add button ──────────────────────────────────────────────────────── */
3769
+
3770
+ .mat-attachments__add-btn {
3771
+ display: inline-flex;
3772
+ align-items: center;
3773
+ gap: 5px;
3774
+ padding: 5px 10px;
3775
+ border-radius: 5px;
3776
+ border: 1px solid var(--mat-editor-border, rgba(0, 0, 0, 0.12));
3777
+ background: var(--mat-editor-surface, #fff);
3778
+ color: var(--mat-editor-text, #222);
3779
+ font-size: 12px;
3780
+ font-weight: 500;
3781
+ cursor: pointer;
3782
+ transition:
3783
+ background 0.15s,
3784
+ border-color 0.15s;
3785
+ white-space: nowrap;
3786
+ }
3787
+
3788
+ .mat-attachments__add-btn:hover:not(:disabled) {
3789
+ background: var(--mat-editor-hover, rgba(0, 0, 0, 0.04));
3790
+ border-color: var(--mat-editor-accent, #4f46e5);
3791
+ color: var(--mat-editor-accent, #4f46e5);
3792
+ }
3793
+
3794
+ .mat-attachments__add-btn:disabled {
3795
+ opacity: 0.5;
3796
+ cursor: not-allowed;
3797
+ }
3798
+
3799
+ /* ── Empty state ─────────────────────────────────────────────────────── */
3800
+
3801
+ .mat-attachments__empty {
3802
+ display: flex;
3803
+ flex-direction: column;
3804
+ align-items: center;
3805
+ gap: 0.5rem;
3806
+ padding: 1.5rem 1rem;
3807
+ border: 1.5px dashed var(--mat-editor-border, rgba(0, 0, 0, 0.12));
3808
+ border-radius: 8px;
3809
+ text-align: center;
3810
+ }
3811
+
3812
+ .mat-attachments--dragging .mat-attachments__empty {
3813
+ border-color: var(--mat-editor-accent, #4f46e5);
3814
+ background: rgba(79, 70, 229, 0.04);
3815
+ }
3816
+
3817
+ .mat-attachments__empty-icon {
3818
+ color: var(--mat-editor-muted, #bbb);
3819
+ }
3820
+
3821
+ .mat-attachments__empty-text {
3822
+ margin: 0;
3823
+ font-size: 13px;
3824
+ color: var(--mat-editor-muted, #999);
3825
+ }
3826
+
3827
+ /* ── File list ───────────────────────────────────────────────────────── */
3828
+
3829
+ .mat-attachments__list {
3830
+ list-style: none;
3831
+ margin: 0;
3832
+ padding: 0;
3833
+ display: flex;
3834
+ flex-direction: column;
3835
+ gap: 2px;
3836
+ }
3837
+
3838
+ .mat-attachment-item {
3839
+ display: flex;
3840
+ align-items: center;
3841
+ gap: 8px;
3842
+ padding: 7px 8px;
3843
+ border-radius: 6px;
3844
+ transition: background 0.12s;
3845
+ }
3846
+
3847
+ .mat-attachment-item:hover {
3848
+ background: var(--mat-editor-hover, rgba(0, 0, 0, 0.04));
3849
+ }
3850
+
3851
+ .mat-attachment-item--uploading {
3852
+ opacity: 0.6;
3853
+ }
3854
+
3855
+ .mat-attachment-item__icon {
3856
+ display: flex;
3857
+ align-items: center;
3858
+ justify-content: center;
3859
+ width: 28px;
3860
+ height: 28px;
3861
+ border-radius: 5px;
3862
+ background: var(--mat-editor-code-bg, rgba(0, 0, 0, 0.05));
3863
+ color: var(--mat-editor-muted, #666);
3864
+ flex-shrink: 0;
3865
+ }
3866
+
3867
+ .mat-attachment-item__name {
3868
+ flex: 1;
3869
+ min-width: 0;
3870
+ font-size: 13px;
3871
+ font-weight: 500;
3872
+ color: var(--mat-editor-text, #222);
3873
+ white-space: nowrap;
3874
+ overflow: hidden;
3875
+ text-overflow: ellipsis;
3876
+ }
3877
+
3878
+ .mat-attachment-item__name--link {
3879
+ color: var(--mat-editor-text, #222);
3880
+ text-decoration: none;
3881
+ }
3882
+
3883
+ .mat-attachment-item__name--link:hover {
3884
+ color: var(--mat-editor-accent, #4f46e5);
3885
+ text-decoration: underline;
3886
+ }
3887
+
3888
+ .mat-attachment-item__meta {
3889
+ font-size: 11px;
3890
+ color: var(--mat-editor-muted, #999);
3891
+ white-space: nowrap;
3892
+ flex-shrink: 0;
3893
+ }
3894
+
3895
+ .mat-attachment-item__remove {
3896
+ display: flex;
3897
+ align-items: center;
3898
+ justify-content: center;
3899
+ width: 22px;
3900
+ height: 22px;
3901
+ border-radius: 4px;
3902
+ border: none;
3903
+ background: transparent;
3904
+ color: var(--mat-editor-muted, #aaa);
3905
+ cursor: pointer;
3906
+ opacity: 0;
3907
+ transition:
3908
+ opacity 0.12s,
3909
+ background 0.12s,
3910
+ color 0.12s;
3911
+ flex-shrink: 0;
3912
+ }
3913
+
3914
+ .mat-attachment-item:hover .mat-attachment-item__remove {
3915
+ opacity: 1;
3916
+ }
3917
+
3918
+ .mat-attachment-item__remove:hover {
3919
+ background: rgba(220, 40, 40, 0.1);
3920
+ color: #dc2626;
3921
+ }
3922
+
3923
+ /* ── Read-only variant (viewer) ──────────────────────────────────────── */
3924
+
3925
+ .mat-attachments .mat-attachment-item__link {
3926
+ display: flex;
3927
+ align-items: center;
3928
+ gap: 8px;
3929
+ width: 100%;
3930
+ padding: 7px 8px;
3931
+ border-radius: 6px;
3932
+ color: inherit;
3933
+ text-decoration: none;
3934
+ transition: background 0.12s;
3935
+ }
3936
+
3937
+ .mat-attachments .mat-attachment-item__link:hover {
3938
+ background: var(--mat-editor-hover, rgba(0, 0, 0, 0.04));
3939
+ }
3940
+
3941
+ /* ── Drop overlay ────────────────────────────────────────────────────── */
3942
+
3943
+ .mat-attachments__drop-overlay {
3944
+ position: absolute;
3945
+ inset: 0;
3946
+ display: flex;
3947
+ flex-direction: column;
3948
+ align-items: center;
3949
+ justify-content: center;
3950
+ gap: 8px;
3951
+ background: rgba(79, 70, 229, 0.08);
3952
+ border: 2px dashed var(--mat-editor-accent, #4f46e5);
3953
+ border-radius: 8px;
3954
+ color: var(--mat-editor-accent, #4f46e5);
3955
+ font-size: 13px;
3956
+ font-weight: 500;
3957
+ pointer-events: none;
3958
+ z-index: 10;
3959
+ }
3960
+
3961
+ .mat-attachments--editable {
3962
+ position: relative;
3963
+ }
3964
+
3965
+ /* ── Spinner ──────────────────────────────────────────────────────────── */
3966
+
3967
+ .mat-attachments__spinner {
3968
+ display: inline-block;
3969
+ width: 12px;
3970
+ height: 12px;
3971
+ border: 2px solid rgba(0, 0, 0, 0.15);
3972
+ border-top-color: var(--mat-editor-accent, #4f46e5);
3973
+ border-radius: 50%;
3974
+ animation: mat-spin 0.7s linear infinite;
3975
+ }
3976
+
3977
+ .mat-attachments__spinner--sm {
3978
+ width: 10px;
3979
+ height: 10px;
3980
+ }
3981
+
3982
+ /* ── Dark theme overrides ────────────────────────────────────────────── */
3983
+
3984
+ .matops-editor--dark .mat-attachments {
3985
+ border-top-color: rgba(255, 255, 255, 0.1);
3986
+ }
3987
+
3988
+ .matops-editor--dark .mat-attachments__empty {
3989
+ border-color: rgba(255, 255, 255, 0.12);
3990
+ }
3991
+
3992
+ .matops-editor--dark .mat-attachments--dragging .mat-attachments__empty {
3993
+ border-color: var(--mat-editor-accent, #818cf8);
3994
+ background: rgba(129, 140, 248, 0.08);
3995
+ }
3996
+
3997
+ .matops-editor--dark .mat-attachments__add-btn {
3998
+ background: rgba(255, 255, 255, 0.04);
3999
+ border-color: rgba(255, 255, 255, 0.12);
4000
+ color: rgba(255, 255, 255, 0.85);
4001
+ }
4002
+
4003
+ .matops-editor--dark .mat-attachments__add-btn:hover:not(:disabled) {
4004
+ background: rgba(255, 255, 255, 0.07);
4005
+ border-color: var(--mat-editor-accent, #818cf8);
4006
+ color: var(--mat-editor-accent, #818cf8);
4007
+ }
4008
+
4009
+ .matops-editor--dark .mat-attachment-item:hover {
4010
+ background: rgba(255, 255, 255, 0.05);
4011
+ }
4012
+
4013
+ .matops-editor--dark .mat-attachment-item__icon {
4014
+ background: rgba(255, 255, 255, 0.08);
4015
+ color: rgba(255, 255, 255, 0.5);
4016
+ }
4017
+
4018
+ .matops-editor--dark .mat-attachment-item__name {
4019
+ color: rgba(255, 255, 255, 0.85);
4020
+ }
4021
+
4022
+ .matops-editor--dark .mat-attachment-item__name--link:hover {
4023
+ color: var(--mat-editor-accent, #818cf8);
4024
+ }
4025
+
4026
+ .matops-editor--dark .mat-attachment-item__remove:hover {
4027
+ background: rgba(248, 113, 113, 0.15);
4028
+ color: #f87171;
4029
+ }
4030
+
4031
+ .matops-editor--dark .mat-attachments__spinner {
4032
+ border-color: rgba(255, 255, 255, 0.15);
4033
+ border-top-color: var(--mat-editor-accent, #818cf8);
4034
+ }
4035
+
4036
+ /* ── Responsive ──────────────────────────────────────────────────────── */
4037
+
4038
+ @media (max-width: 768px) {
4039
+ .mat-attachments {
4040
+ padding: 0.875rem 1.25rem 1rem;
4041
+ }
4042
+ .mat-attachments__add-btn {
4043
+ padding: 4px 8px;
4044
+ font-size: 11px;
4045
+ }
4046
+ }
4047
+
4048
+ @media (max-width: 480px) {
4049
+ .mat-attachments {
4050
+ padding: 0.75rem 0.875rem 0.875rem;
4051
+ }
4052
+ .mat-attachment-item__meta {
4053
+ display: none; /* save space on very small screens */
4054
+ }
4055
+ }
4056
+
4057
+ @media (hover: none) {
4058
+ /* Always show the remove button on touch devices */
4059
+ .mat-attachment-item__remove {
4060
+ opacity: 1;
4061
+ }
4062
+ }
4063
+
4064
+ /* ─────────────────────────────────────────────────────────────────────
4065
+ @matops/editor — Responsive — Breakpoints
4066
+ ≤1024px · ≤768px · ≤480px · ≤360px · viewer mirrors · touch devices
4067
+ ───────────────────────────────────────────────────────────────────── */
4068
+
4069
+ /* ═══════════════════════════════════════════════════════════════════
4070
+ RESPONSIVE — Package-level breakpoints
4071
+ All selectors are scoped to [data-matops-editor] or .mat-* / .matops-*
4072
+ so they never leak outside the editor component tree.
4073
+
4074
+ Breakpoints:
4075
+ ≤ 1024px — small laptop / large tablet (landscape)
4076
+ ≤ 768px — tablet (portrait) / large phone (landscape)
4077
+ ≤ 480px — phone (portrait)
4078
+ ≤ 360px — small phone
4079
+ ═══════════════════════════════════════════════════════════════════ */
4080
+
4081
+ /* ── Small laptop / large tablet landscape (≤ 1024 px) ──────────── */
4082
+
4083
+ @media (max-width: 1024px) {
4084
+ /* Toolbar: allow wrap but tighter padding */
4085
+ .matops-editor__toolbar {
4086
+ padding: 0.4rem 0.625rem;
4087
+ gap: 0.2rem;
4088
+ }
4089
+
4090
+ .matops-editor__toolbar-btn {
4091
+ width: 1.875rem;
4092
+ height: 1.875rem;
4093
+ }
4094
+
4095
+ /* Crop modal: constrain to viewport when viewport is 1024px */
4096
+ .mat-crop-modal {
4097
+ width: min(660px, 96vw);
4098
+ }
4099
+
4100
+ /* Export modal: slight width reduction */
4101
+ .mat-export-modal {
4102
+ width: min(600px, 94vw);
4103
+ }
4104
+ }
4105
+
4106
+ /* ── Tablet portrait / large phone landscape (≤ 768 px) ─────────── */
4107
+
4108
+ @media (max-width: 768px) {
4109
+ /* ── Toolbar ─────────────────────────────────────────────────── */
4110
+ /* Single scrollable row — no wrapping, no overflow into content */
4111
+ .matops-editor__toolbar {
4112
+ flex-wrap: nowrap;
4113
+ overflow-x: auto;
4114
+ overflow-y: hidden;
4115
+ scrollbar-width: none;
4116
+ -ms-overflow-style: none;
4117
+ padding: 0.375rem 0.5rem;
4118
+ gap: 0.125rem;
4119
+ }
4120
+ .matops-editor__toolbar::-webkit-scrollbar {
4121
+ display: none;
4122
+ }
4123
+
4124
+ .matops-editor__toolbar-btn {
4125
+ width: 1.75rem;
4126
+ height: 1.75rem;
4127
+ flex-shrink: 0;
4128
+ }
4129
+
4130
+ .matops-editor__toolbar-divider {
4131
+ margin: 0 0.125rem;
4132
+ }
4133
+
4134
+ /* Toolbar right — tighten up the action icons */
4135
+ .mat-toolbar-right {
4136
+ padding: 0 6px;
4137
+ gap: 2px;
4138
+ }
4139
+ .mat-toolbar-action {
4140
+ width: 26px;
4141
+ height: 26px;
4142
+ }
4143
+
4144
+ /* Style-picker: shorter minimum width */
4145
+ .mat-style-picker__trigger {
4146
+ min-width: 80px;
4147
+ font-size: 11px;
4148
+ }
4149
+
4150
+ /* ── Content area ────────────────────────────────────────────── */
4151
+ /* Body editor: keep body-specific top (14px) — only shrink sides and bottom */
4152
+ [data-matops-editor].matops-editor__body .ProseMirror {
4153
+ padding: 14px 1.25rem 1.5rem;
4154
+ font-size: 0.9375rem;
4155
+ }
4156
+ /* Viewer / read-only: reduce top to match reduced separator bottom on mobile */
4157
+ [data-matops-editor][data-readonly="true"] .ProseMirror,
4158
+ .matops-editor__viewer .ProseMirror {
4159
+ padding: 0.75rem 1.25rem 1.5rem;
4160
+ font-size: 0.9375rem;
4161
+ }
4162
+
4163
+ /* ── Page header ─────────────────────────────────────────────── */
4164
+ .mat-page-title-wrap {
4165
+ padding: 0.75rem 1.25rem 0.375rem;
4166
+ }
4167
+ .mat-page-title {
4168
+ font-size: 2rem;
4169
+ }
4170
+ /* .mat-cover height: aspect-ratio: 21/4 handles this — no override needed */
4171
+
4172
+ /* ── Headings ────────────────────────────────────────────────── */
4173
+ [data-matops-editor] .ProseMirror h1 {
4174
+ font-size: 1.75rem;
4175
+ }
4176
+ [data-matops-editor] .ProseMirror h2 {
4177
+ font-size: 1.375rem;
4178
+ }
4179
+ [data-matops-editor] .ProseMirror h3 {
4180
+ font-size: 1.15rem;
4181
+ }
4182
+
4183
+ /* ── Tables ──────────────────────────────────────────────────── */
4184
+ /* Make tables scrollable horizontally rather than overflowing */
4185
+ [data-matops-editor] .ProseMirror table {
4186
+ display: block;
4187
+ overflow-x: auto;
4188
+ -webkit-overflow-scrolling: touch;
4189
+ white-space: nowrap;
4190
+ }
4191
+ [data-matops-editor] .ProseMirror table td,
4192
+ [data-matops-editor] .ProseMirror table th {
4193
+ white-space: normal;
4194
+ min-width: 80px;
4195
+ }
4196
+
4197
+ /* ── Bubble menu ─────────────────────────────────────────────── */
4198
+ .mat-bubble-menu {
4199
+ gap: 1px;
4200
+ padding: 3px 4px;
4201
+ }
4202
+ .mat-bubble-link-input {
4203
+ width: 170px;
4204
+ }
4205
+
4206
+ /* ── Floating menu ───────────────────────────────────────────── */
4207
+ .mat-float-trigger {
4208
+ width: 22px;
4209
+ height: 22px;
4210
+ }
4211
+
4212
+ /* ── Slash menu ──────────────────────────────────────────────── */
4213
+ .mat-slash-menu {
4214
+ max-width: calc(100vw - 24px);
4215
+ }
4216
+
4217
+ /* ── Table context menu ──────────────────────────────────────── */
4218
+ .mat-table-menu {
4219
+ max-width: calc(100vw - 24px);
4220
+ overflow-x: auto;
4221
+ scrollbar-width: none;
4222
+ }
4223
+ .mat-table-menu::-webkit-scrollbar {
4224
+ display: none;
4225
+ }
4226
+
4227
+ /* ── Modals ──────────────────────────────────────────────────── */
4228
+ .mat-modal {
4229
+ width: calc(100vw - 24px);
4230
+ border-radius: 10px;
4231
+ }
4232
+ .mat-export-modal {
4233
+ width: calc(100vw - 24px);
4234
+ }
4235
+ .mat-export-tabs {
4236
+ grid-template-columns: repeat(2, 1fr);
4237
+ }
4238
+ .mat-cmd-popup {
4239
+ width: calc(100vw - 24px);
4240
+ }
4241
+ .mat-cmd-popup__grid {
4242
+ grid-template-columns: repeat(auto-fill, minmax(90px, 1fr));
4243
+ }
4244
+
4245
+ /* Crop modal: body padding tighter, allow canvas to breathe */
4246
+ .mat-crop-modal {
4247
+ width: min(660px, 96vw);
4248
+ }
4249
+ .mat-crop-modal__body {
4250
+ padding: 10px 12px 8px;
4251
+ }
4252
+
4253
+ /* ── Link popover ────────────────────────────────────────────── */
4254
+ .mat-link-popover {
4255
+ min-width: 220px;
4256
+ max-width: calc(100vw - 24px);
4257
+ }
4258
+
4259
+ /* ── Count bar ───────────────────────────────────────────────── */
4260
+ .mat-count-stats {
4261
+ padding: 5px 12px;
4262
+ gap: 0;
4263
+ }
4264
+ .mat-count-stat {
4265
+ padding: 2px 4px;
4266
+ }
4267
+
4268
+ /* ── Find & Replace ──────────────────────────────────────────── */
4269
+ .mat-find-row {
4270
+ flex-wrap: wrap;
4271
+ gap: 4px;
4272
+ }
4273
+ .mat-find-input-wrap {
4274
+ min-width: 0;
4275
+ }
4276
+ }
4277
+
4278
+ /* ── Phone portrait (≤ 480 px) ───────────────────────────────────── */
4279
+
4280
+ @media (max-width: 480px) {
4281
+ /* ── Content ─────────────────────────────────────────────────── */
4282
+ /* Body editor: preserve intentional 14px top, reduce sides and bottom */
4283
+ [data-matops-editor].matops-editor__body .ProseMirror {
4284
+ padding: 14px 0.875rem 1rem;
4285
+ font-size: 0.9rem;
4286
+ line-height: 1.65;
4287
+ }
4288
+ /* Viewer / read-only */
4289
+ [data-matops-editor][data-readonly="true"] .ProseMirror,
4290
+ .matops-editor__viewer .ProseMirror {
4291
+ padding: 0.5rem 0.875rem 1rem;
4292
+ font-size: 0.9rem;
4293
+ line-height: 1.65;
4294
+ }
4295
+
4296
+ /* ── Page header ─────────────────────────────────────────────── */
4297
+ .mat-page-title-wrap {
4298
+ padding: 0.5rem 0.875rem 0.25rem;
4299
+ }
4300
+ .mat-page-title {
4301
+ font-size: 1.625rem;
4302
+ letter-spacing: -0.02em;
4303
+ }
4304
+ /* .mat-cover height: aspect-ratio: 21/4 handles this — no override needed */
4305
+
4306
+ /* ── Headings ────────────────────────────────────────────────── */
4307
+ [data-matops-editor] .ProseMirror h1 {
4308
+ font-size: 1.5rem;
4309
+ }
4310
+ [data-matops-editor] .ProseMirror h2 {
4311
+ font-size: 1.25rem;
4312
+ }
4313
+ [data-matops-editor] .ProseMirror h3 {
4314
+ font-size: 1.1rem;
4315
+ }
4316
+
4317
+ /* ── Code blocks: horizontal scroll on narrow screens ───────── */
4318
+ [data-matops-editor] .ProseMirror pre {
4319
+ padding: 0.75rem 1rem;
4320
+ font-size: 0.8125rem;
4321
+ overflow-x: auto;
4322
+ -webkit-overflow-scrolling: touch;
4323
+ }
4324
+
4325
+ /* ── Bubble menu ─────────────────────────────────────────────── */
4326
+ .mat-bubble-menu {
4327
+ padding: 2px 3px;
4328
+ gap: 1px;
4329
+ min-height: 32px;
4330
+ }
4331
+ .mat-menu-btn,
4332
+ .mat-bubble-btn {
4333
+ width: 24px;
4334
+ height: 24px;
4335
+ }
4336
+ .mat-bubble-link-input {
4337
+ width: 130px;
4338
+ }
4339
+
4340
+ /* ── Bubble style picker dropdown ────────────────────────────── */
4341
+ .mat-bubble-style-trigger {
4342
+ padding: 2px 5px;
4343
+ font-size: 11px;
4344
+ }
4345
+
4346
+ /* ── Toolbar actions ─────────────────────────────────────────── */
4347
+ .mat-toolbar-right {
4348
+ padding: 0 4px;
4349
+ gap: 1px;
4350
+ }
4351
+ .mat-toolbar-action {
4352
+ width: 24px;
4353
+ height: 24px;
4354
+ }
4355
+
4356
+ /* ── Style picker ────────────────────────────────────────────── */
4357
+ .mat-style-picker__trigger {
4358
+ min-width: 68px;
4359
+ padding: 3px 6px;
4360
+ height: 26px;
4361
+ }
4362
+
4363
+ /* ── Slash menu ──────────────────────────────────────────────── */
4364
+ .mat-slash-menu {
4365
+ min-width: 200px;
4366
+ max-width: calc(100vw - 16px);
4367
+ }
4368
+ .mat-slash-item {
4369
+ padding: 5px 8px;
4370
+ gap: 8px;
4371
+ }
4372
+ .mat-slash-icon {
4373
+ width: 26px;
4374
+ height: 26px;
4375
+ }
4376
+ .mat-slash-title {
4377
+ font-size: 12px;
4378
+ }
4379
+ .mat-slash-desc {
4380
+ font-size: 10px;
4381
+ }
4382
+
4383
+ /* ── Modals ──────────────────────────────────────────────────── */
4384
+ .mat-modal {
4385
+ width: calc(100vw - 16px);
4386
+ max-height: 85vh;
4387
+ }
4388
+ .mat-modal-header {
4389
+ padding: 12px 14px;
4390
+ }
4391
+ .mat-modal-body {
4392
+ padding: 10px 14px 16px;
4393
+ }
4394
+
4395
+ /* ── Crop modal ──────────────────────────────────────────────── */
4396
+ .mat-crop-modal {
4397
+ width: calc(100vw - 16px);
4398
+ }
4399
+ .mat-crop-modal__header {
4400
+ padding: 10px 14px;
4401
+ }
4402
+ .mat-crop-modal__body {
4403
+ padding: 8px 8px 6px;
4404
+ }
4405
+ .mat-crop-modal__footer {
4406
+ padding: 8px 14px 12px;
4407
+ gap: 6px;
4408
+ }
4409
+ .mat-crop-modal__btn {
4410
+ padding: 6px 12px;
4411
+ font-size: 12px;
4412
+ }
4413
+
4414
+ /* ── Command grid popup ──────────────────────────────────────── */
4415
+ .mat-cmd-popup {
4416
+ width: calc(100vw - 16px);
4417
+ }
4418
+ .mat-cmd-popup__grid {
4419
+ grid-template-columns: repeat(auto-fill, minmax(80px, 1fr));
4420
+ gap: 3px;
4421
+ }
4422
+ .mat-cmd-popup__item {
4423
+ padding: 10px 6px 8px;
4424
+ }
4425
+ .mat-cmd-popup__icon {
4426
+ width: 34px;
4427
+ height: 34px;
4428
+ }
4429
+
4430
+ /* ── Export modal ────────────────────────────────────────────── */
4431
+ .mat-export-modal {
4432
+ width: calc(100vw - 16px);
4433
+ }
4434
+ .mat-export-tabs {
4435
+ grid-template-columns: repeat(2, 1fr);
4436
+ padding: 8px 12px;
4437
+ }
4438
+ .mat-export-preview {
4439
+ height: 160px;
4440
+ margin: 0 12px;
4441
+ }
4442
+ .mat-export-actions {
4443
+ padding: 8px 12px 14px;
4444
+ flex-wrap: wrap;
4445
+ }
4446
+ .mat-export-btn {
4447
+ flex: 1 1 auto;
4448
+ text-align: center;
4449
+ }
4450
+
4451
+ /* ── Count bar compact ───────────────────────────────────────── */
4452
+ .mat-count-stats {
4453
+ padding: 3px 10px;
4454
+ }
4455
+ .mat-count-stat {
4456
+ padding: 1px 3px;
4457
+ }
4458
+ .mat-count-value {
4459
+ font-size: 10px;
4460
+ }
4461
+ .mat-count-label {
4462
+ font-size: 9px;
4463
+ }
4464
+
4465
+ /* ── Find & Replace panel ────────────────────────────────────── */
4466
+ .mat-find-panel {
4467
+ padding: 6px 8px;
4468
+ gap: 4px;
4469
+ }
4470
+ .mat-find-input {
4471
+ font-size: 12px;
4472
+ height: 27px;
4473
+ }
4474
+ .mat-find-row {
4475
+ flex-wrap: wrap;
4476
+ gap: 4px;
4477
+ }
4478
+ /* Replace row: full-width on mobile */
4479
+ .mat-find-row .mat-find-btn {
4480
+ flex: 1 1 auto;
4481
+ text-align: center;
4482
+ }
4483
+
4484
+ /* ── Table context menu ──────────────────────────────────────── */
4485
+ .mat-table-menu {
4486
+ padding: 4px 6px;
4487
+ }
4488
+ .mat-table-btn {
4489
+ padding: 4px 6px;
4490
+ min-width: 36px;
4491
+ }
4492
+ .mat-table-btn__label {
4493
+ display: none;
4494
+ } /* icon-only on mobile */
4495
+
4496
+ /* ── Link popover ────────────────────────────────────────────── */
4497
+ .mat-link-popover {
4498
+ min-width: 0;
4499
+ width: calc(100vw - 24px);
4500
+ }
4501
+ .mat-link-input {
4502
+ font-size: 11px;
4503
+ }
4504
+ }
4505
+
4506
+ /* ── Small phone (≤ 360 px) ──────────────────────────────────────── */
4507
+
4508
+ @media (max-width: 360px) {
4509
+ /* Content: tightest padding */
4510
+ [data-matops-editor] .ProseMirror {
4511
+ padding: 0.375rem 0.625rem 0.875rem;
4512
+ font-size: 0.875rem;
4513
+ }
4514
+
4515
+ /* Page header */
4516
+ .mat-page-title-wrap {
4517
+ padding: 0.375rem 0.625rem 0.2rem;
4518
+ }
4519
+ .mat-page-title {
4520
+ font-size: 1.5rem;
4521
+ }
4522
+ /* .mat-cover: aspect-ratio: 21/4 + min-height: 90px handles narrow phones */
4523
+
4524
+ /* Headings */
4525
+ [data-matops-editor] .ProseMirror h1 {
4526
+ font-size: 1.375rem;
4527
+ }
4528
+ [data-matops-editor] .ProseMirror h2 {
4529
+ font-size: 1.2rem;
4530
+ }
4531
+
4532
+ /* Toolbar: absolute minimum */
4533
+ .matops-editor__toolbar-btn {
4534
+ width: 1.625rem;
4535
+ height: 1.625rem;
4536
+ }
4537
+ .mat-style-picker__trigger {
4538
+ min-width: 58px;
4539
+ padding: 2px 5px;
4540
+ height: 24px;
4541
+ font-size: 10px;
4542
+ }
4543
+ .mat-toolbar-action {
4544
+ width: 22px;
4545
+ height: 22px;
4546
+ }
4547
+
4548
+ /* Bubble menu */
4549
+ .mat-menu-btn,
4550
+ .mat-bubble-btn {
4551
+ width: 22px;
4552
+ height: 22px;
4553
+ }
4554
+ .mat-bubble-menu {
4555
+ padding: 1px 2px;
4556
+ }
4557
+
4558
+ /* Export tabs: single column */
4559
+ .mat-export-tabs {
4560
+ grid-template-columns: repeat(2, 1fr);
4561
+ }
4562
+ }
4563
+
4564
+ /* ── Viewer responsive (mirrors editor) ──────────────────────────── */
4565
+
4566
+ @media (max-width: 768px) {
4567
+ [data-matops-editor][data-readonly="true"] .ProseMirror,
4568
+ .matops-editor__viewer .ProseMirror {
4569
+ padding: 0.75rem 1.25rem 1.5rem;
4570
+ font-size: 0.9375rem;
4571
+ }
4572
+ .matops-editor__viewer .mat-page-title-wrap,
4573
+ [data-matops-editor][data-readonly="true"] .mat-page-title-wrap {
4574
+ padding: 0.75rem 1.25rem 0.375rem;
4575
+ }
4576
+ }
4577
+
4578
+ @media (max-width: 480px) {
4579
+ [data-matops-editor][data-readonly="true"] .ProseMirror,
4580
+ .matops-editor__viewer .ProseMirror {
4581
+ padding: 0.5rem 0.875rem 1rem;
4582
+ font-size: 0.9rem;
4583
+ }
4584
+ .matops-editor__viewer .mat-page-title-wrap,
4585
+ [data-matops-editor][data-readonly="true"] .mat-page-title-wrap {
4586
+ padding: 0.5rem 0.875rem 0.25rem;
4587
+ }
4588
+ }
4589
+
4590
+ /* ── Touch device improvements (hover states not needed) ──────────── */
4591
+
4592
+ @media (hover: none) and (pointer: coarse) {
4593
+ /* Larger tap targets for touch users */
4594
+ .matops-editor__toolbar-btn {
4595
+ min-width: 2rem;
4596
+ min-height: 2rem;
4597
+ }
4598
+ .mat-menu-btn,
4599
+ .mat-bubble-btn {
4600
+ min-width: 28px;
4601
+ min-height: 28px;
4602
+ }
4603
+
4604
+ /* Always show cover actions on touch (no hover) */
4605
+ .mat-cover__actions {
4606
+ opacity: 1;
4607
+ transform: translateY(0);
4608
+ }
4609
+
4610
+ /* Remove hover-only transforms */
4611
+ .mat-cover--hovered .mat-cover__img {
4612
+ transform: none;
4613
+ }
4614
+
4615
+ /* Crop handles: larger touch targets */
4616
+ .mat-crop__handle {
4617
+ width: 16px !important;
4618
+ height: 16px !important;
4619
+ border-width: 2.5px;
4620
+ }
4621
+
4622
+ /* Floating menu trigger: larger */
4623
+ .mat-float-trigger {
4624
+ width: 28px;
4625
+ height: 28px;
4626
+ }
4627
+ }
4628
+
4629
+ /* NOTE: .mat-cover and div[data-type="cover-image"] use aspect-ratio: 21/4
4630
+ so their height scales proportionally with width at every viewport size.
4631
+ .mat-title-separator__icon and __line use clamp() + vw units derived from
4632
+ the same 21:4 ratio — so the visual relationship between cover and separator
4633
+ icon is identical at every screen size with zero per-breakpoint overrides. */
4634
+
4635
+ @media (max-width: 768px) {
4636
+ .mat-page-title-wrap {
4637
+ padding: 0.75rem 1.25rem 0.375rem;
4638
+ }
4639
+ .mat-page-title {
4640
+ font-size: 2rem;
4641
+ }
4642
+ .mat-page-title__placeholder {
4643
+ font-size: 2rem;
4644
+ }
4645
+ .mat-title-separator {
4646
+ padding: 0.375rem 1.25rem 0.625rem;
4647
+ }
4648
+
4649
+ [data-matops-editor] h1[data-type="title"] {
4650
+ font-size: 2rem;
4651
+ padding: 0.75rem 1.25rem 0;
4652
+ }
4653
+
4654
+ /* Cover action buttons: always visible on touch devices */
4655
+ @media (hover: none) {
4656
+ .mat-cover__actions {
4657
+ opacity: 1;
4658
+ transform: translateY(0);
4659
+ }
4660
+ .mat-cover__btn {
4661
+ font-size: 10px;
4662
+ padding: 4px 8px;
4663
+ }
4664
+ }
4665
+ }
4666
+
4667
+ @media (max-width: 480px) {
4668
+ .mat-page-title-wrap {
4669
+ padding: 0.5rem 0.875rem 0.25rem;
4670
+ }
4671
+ .mat-page-title {
4672
+ font-size: 1.625rem;
4673
+ letter-spacing: -0.02em;
4674
+ }
4675
+ .mat-page-title__placeholder {
4676
+ font-size: 1.625rem;
4677
+ }
4678
+ .mat-title-separator {
4679
+ padding: 0.25rem 0.875rem 0.5rem;
4680
+ gap: 8px;
4681
+ }
4682
+
4683
+ [data-matops-editor] h1[data-type="title"] {
4684
+ font-size: 1.625rem;
4685
+ padding: 0.5rem 0.875rem 0;
4686
+ }
4687
+
4688
+ .mat-cover__btn {
4689
+ font-size: 10px;
4690
+ padding: 4px 8px;
4691
+ gap: 4px;
4692
+ }
4693
+ }
4694
+
4695
+ @media (max-width: 360px) {
4696
+ .mat-page-title {
4697
+ font-size: 1.5rem;
4698
+ }
4699
+ .mat-page-title__placeholder {
4700
+ font-size: 1.5rem;
4701
+ }
4702
+ .mat-page-title-wrap {
4703
+ padding: 0.375rem 0.625rem 0.2rem;
4704
+ }
4705
+
4706
+ [data-matops-editor] h1[data-type="title"] {
4707
+ font-size: 1.5rem;
4708
+ padding: 0.375rem 0.625rem 0;
4709
+ }
4710
+ }