@elixpo/lixeditor 2.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,499 @@
1
+ /* ===== Edit page scrollbar ===== */
2
+
3
+ .edit-page {
4
+ scrollbar-width: thin;
5
+ scrollbar-color: var(--bg-elevated) transparent;
6
+ }
7
+
8
+ .edit-page::-webkit-scrollbar {
9
+ width: 8px;
10
+ }
11
+
12
+ .edit-page::-webkit-scrollbar-track {
13
+ background: transparent;
14
+ }
15
+
16
+ .edit-page::-webkit-scrollbar-thumb {
17
+ background: var(--bg-elevated);
18
+ border-radius: 4px;
19
+ }
20
+
21
+ .edit-page::-webkit-scrollbar-thumb:hover {
22
+ background: var(--border-hover);
23
+ }
24
+
25
+ /* ===== Subtle noise texture background ===== */
26
+
27
+ .editor-texture-bg {
28
+ position: relative;
29
+ background-color: var(--bg-app);
30
+ }
31
+
32
+
33
+ .editor-texture-bg > * {
34
+ position: relative;
35
+ z-index: 1;
36
+ }
37
+
38
+ /* ===== BlogEditor (BlockNote) Dark Theme ===== */
39
+
40
+ .blog-editor-wrapper .bn-editor {
41
+ background: transparent;
42
+ color: var(--text-primary);
43
+ font-family: 'Source Serif 4', Georgia, serif;
44
+ font-size: 1em;
45
+ line-height: 1.75;
46
+ padding-left: 0;
47
+ }
48
+
49
+ .blog-editor-wrapper .bn-container {
50
+ background: transparent;
51
+ border: none;
52
+ padding: 0;
53
+ }
54
+
55
+ .blog-editor-wrapper [class*="blockOuter"] {
56
+ padding-left: 0;
57
+ }
58
+
59
+ .blog-editor-wrapper .bn-block-content {
60
+ font-size: 1em;
61
+ }
62
+
63
+ /* Placeholder */
64
+ .blog-editor-wrapper .bn-inline-content[data-placeholder]::before {
65
+ color: var(--text-faint);
66
+ font-style: normal;
67
+ }
68
+
69
+ /* Headings — override BlockNote's .bn-default-styles h1 { font-size: inherit } */
70
+ .blog-editor-wrapper .bn-default-styles h1 {
71
+ font-size: 30px !important;
72
+ font-family: 'Source Serif 4', Georgia, serif;
73
+ font-weight: 700 !important;
74
+ color: var(--text-primary);
75
+ }
76
+ .blog-editor-wrapper .bn-default-styles h2 {
77
+ font-size: 24px !important;
78
+ font-family: 'Source Serif 4', Georgia, serif;
79
+ font-weight: 650 !important;
80
+ color: var(--text-primary);
81
+ }
82
+ .blog-editor-wrapper .bn-default-styles h3 {
83
+ font-size: 20px !important;
84
+ font-family: 'Source Serif 4', Georgia, serif;
85
+ font-weight: 600 !important;
86
+ color: var(--text-primary);
87
+ }
88
+
89
+ /* Inline code — purple accent, adapts to theme.
90
+ Excludes code inside code blocks so Shiki syntax highlighting isn't overridden. */
91
+ .blog-editor-wrapper code,
92
+ .blog-preview-content code {
93
+ color: #7c3aed;
94
+ background: rgba(124, 58, 237, 0.08);
95
+ border-radius: 4px;
96
+ padding: 0.15em 0.4em;
97
+ font-size: 0.82em;
98
+ font-family: 'lixCode', monospace;
99
+ -webkit-hyphens: none;
100
+ hyphens: none;
101
+ text-decoration: none !important;
102
+ -webkit-text-decoration: none !important;
103
+ -webkit-text-decorations-in-effect: none !important;
104
+ text-decoration-line: none !important;
105
+ text-decoration-style: initial !important;
106
+ text-underline-position: under;
107
+ }
108
+
109
+ /* Force hide spellcheck squiggles on all code elements */
110
+ .blog-editor-wrapper code *,
111
+ .blog-editor-wrapper [data-content-type="codeBlock"] * {
112
+ text-decoration: none !important;
113
+ -webkit-text-decoration: none !important;
114
+ -webkit-text-decorations-in-effect: none !important;
115
+ text-decoration-line: none !important;
116
+ }
117
+
118
+ [data-theme="dark"] .blog-editor-wrapper code,
119
+ [data-theme="dark"] .blog-preview-content code {
120
+ color: #c4b5fd;
121
+ background: rgba(196, 181, 253, 0.1);
122
+ }
123
+
124
+ /* Reset inline code styles inside code blocks — let Shiki/theme handle these */
125
+ .blog-editor-wrapper [data-content-type="codeBlock"] code,
126
+ .blog-preview-content pre code {
127
+ color: var(--code-text);
128
+ background: none;
129
+ padding: 0;
130
+ border-radius: 0;
131
+ }
132
+
133
+ /* Code blocks — lixCode font, no line highlights */
134
+ .blog-editor-wrapper [data-content-type="codeBlock"] code,
135
+ .blog-editor-wrapper [data-content-type="codeBlock"] pre,
136
+ .blog-editor-wrapper [data-content-type="codeBlock"] [contenteditable] {
137
+ font-family: 'lixCode', 'SF Mono', 'Fira Code', monospace !important;
138
+ font-size: 0.9em;
139
+ }
140
+
141
+ .blog-editor-wrapper [data-content-type="codeBlock"] .hljs-ln-line,
142
+ .blog-editor-wrapper [data-content-type="codeBlock"] .line-highlight,
143
+ .blog-editor-wrapper [data-content-type="codeBlock"] .bn-line-number {
144
+ background: none !important;
145
+ }
146
+
147
+ /* AI-generated blocks use named 'purple' — ensure readable text in both themes */
148
+ .blog-editor-wrapper [data-text-color="purple"] { color: var(--text-secondary) !important; }
149
+ .blog-editor-wrapper [data-background-color="purple"] { background-color: rgba(155, 123, 247, 0.06) !important; }
150
+
151
+ /* Map BlockNote block-level text color (data-text-color on block containers) */
152
+ .blog-editor-wrapper [data-text-color="#ffffff"] { color: #ffffff !important; }
153
+ .blog-editor-wrapper [data-text-color="#9ca3af"] { color: var(--text-muted) !important; }
154
+ .blog-editor-wrapper [data-text-color="#f87171"] { color: #f87171 !important; }
155
+ .blog-editor-wrapper [data-text-color="#fb923c"] { color: #fb923c !important; }
156
+ .blog-editor-wrapper [data-text-color="#fbbf24"] { color: #fbbf24 !important; }
157
+ .blog-editor-wrapper [data-text-color="#4ade80"] { color: #4ade80 !important; }
158
+ .blog-editor-wrapper [data-text-color="#60a5fa"] { color: #60a5fa !important; }
159
+ .blog-editor-wrapper [data-text-color="#a78bfa"] { color: #a78bfa !important; }
160
+ .blog-editor-wrapper [data-text-color="#f472b6"] { color: #f472b6 !important; }
161
+
162
+ /* Map BlockNote inline text color marks (data-style-type="textColor" with data-value) */
163
+ .blog-editor-wrapper [data-style-type="textColor"][data-value="#ffffff"] { color: #ffffff !important; }
164
+ .blog-editor-wrapper [data-style-type="textColor"][data-value="#9ca3af"] { color: var(--text-muted) !important; }
165
+ .blog-editor-wrapper [data-style-type="textColor"][data-value="#f87171"] { color: #f87171 !important; }
166
+ .blog-editor-wrapper [data-style-type="textColor"][data-value="#fb923c"] { color: #fb923c !important; }
167
+ .blog-editor-wrapper [data-style-type="textColor"][data-value="#fbbf24"] { color: #fbbf24 !important; }
168
+ .blog-editor-wrapper [data-style-type="textColor"][data-value="#4ade80"] { color: #4ade80 !important; }
169
+ .blog-editor-wrapper [data-style-type="textColor"][data-value="#60a5fa"] { color: #60a5fa !important; }
170
+ .blog-editor-wrapper [data-style-type="textColor"][data-value="#a78bfa"] { color: #a78bfa !important; }
171
+ .blog-editor-wrapper [data-style-type="textColor"][data-value="#f472b6"] { color: #f472b6 !important; }
172
+
173
+ /* Map BlockNote block-level background color */
174
+ .blog-editor-wrapper [data-background-color="rgba(156,163,175,0.25)"] { background-color: rgba(156,163,175,1) !important; }
175
+ .blog-editor-wrapper [data-background-color="rgba(248,113,113,0.25)"] { background-color: rgba(248,113,113,1) !important; }
176
+ .blog-editor-wrapper [data-background-color="rgba(251,146,60,0.25)"] { background-color: rgba(251,146,60,1) !important; }
177
+ .blog-editor-wrapper [data-background-color="rgba(251,191,36,0.25)"] { background-color: rgba(251,191,36,1) !important; }
178
+ .blog-editor-wrapper [data-background-color="rgba(74,222,128,0.25)"] { background-color: rgba(74,222,128,1) !important; }
179
+ .blog-editor-wrapper [data-background-color="rgba(96,165,250,0.25)"] { background-color: rgba(96,165,250,1) !important; }
180
+ .blog-editor-wrapper [data-background-color="rgba(167,139,250,0.25)"] { background-color: rgba(167,139,250,1) !important; }
181
+ .blog-editor-wrapper [data-background-color="rgba(244,114,182,0.25)"] { background-color: rgba(244,114,182,1) !important; }
182
+
183
+ /* Map BlockNote inline background color marks */
184
+ .blog-editor-wrapper [data-style-type="backgroundColor"][data-value="rgba(156,163,175,0.25)"] { background-color: rgba(156,163,175,0.25) !important; }
185
+ .blog-editor-wrapper [data-style-type="backgroundColor"][data-value="rgba(248,113,113,0.25)"] { background-color: rgba(248,113,113,0.25) !important; }
186
+ .blog-editor-wrapper [data-style-type="backgroundColor"][data-value="rgba(251,146,60,0.25)"] { background-color: rgba(251,146,60,0.25) !important; }
187
+ .blog-editor-wrapper [data-style-type="backgroundColor"][data-value="rgba(251,191,36,0.25)"] { background-color: rgba(251,191,36,0.25) !important; }
188
+ .blog-editor-wrapper [data-style-type="backgroundColor"][data-value="rgba(74,222,128,0.25)"] { background-color: rgba(74,222,128,0.25) !important; }
189
+ .blog-editor-wrapper [data-style-type="backgroundColor"][data-value="rgba(96,165,250,0.25)"] { background-color: rgba(96,165,250,0.25) !important; }
190
+ .blog-editor-wrapper [data-style-type="backgroundColor"][data-value="rgba(167,139,250,0.25)"] { background-color: rgba(167,139,250,0.25) !important; }
191
+ .blog-editor-wrapper [data-style-type="backgroundColor"][data-value="rgba(244,114,182,0.25)"] { background-color: rgba(244,114,182,0.25) !important; }
192
+
193
+ /* Cover gradient blur placeholder */
194
+ .cover-gradient-blur {
195
+ background: linear-gradient(
196
+ 135deg,
197
+ rgba(155, 123, 247, 0.4) 0%,
198
+ rgba(96, 165, 250, 0.35) 25%,
199
+ rgba(244, 114, 182, 0.3) 50%,
200
+ rgba(52, 211, 153, 0.3) 75%,
201
+ rgba(251, 191, 36, 0.3) 100%
202
+ );
203
+ filter: blur(40px) saturate(1.5);
204
+ }
205
+
206
+ /* Cover banner slide-in animation */
207
+ @keyframes coverBannerIn {
208
+ from {
209
+ opacity: 0;
210
+ transform: scaleY(0.92);
211
+ transform-origin: top;
212
+ }
213
+ to {
214
+ opacity: 1;
215
+ transform: scaleY(1);
216
+ transform-origin: top;
217
+ }
218
+ }
219
+
220
+ .cover-banner-enter {
221
+ animation: coverBannerIn 0.35s ease-out;
222
+ }
223
+
224
+ /* Cover toolbar buttons */
225
+ .cover-toolbar-btn {
226
+ display: flex;
227
+ align-items: center;
228
+ justify-content: center;
229
+ width: 30px;
230
+ height: 30px;
231
+ border-radius: 8px;
232
+ border: none;
233
+ background: rgba(0, 0, 0, 0.4);
234
+ backdrop-filter: blur(12px);
235
+ color: rgba(255, 255, 255, 0.8);
236
+ cursor: pointer;
237
+ transition: background 0.15s, color 0.15s;
238
+ }
239
+
240
+ .cover-toolbar-btn:hover {
241
+ background: rgba(0, 0, 0, 0.6);
242
+ color: white;
243
+ }
244
+
245
+ .cover-toolbar-btn-danger:hover {
246
+ background: rgba(239, 68, 68, 0.5);
247
+ color: #fca5a5;
248
+ }
249
+
250
+ /* Glassmorphic emoji picker wrapper */
251
+ .emoji-picker-glass {
252
+ background: rgba(14, 18, 27, 0.7);
253
+ backdrop-filter: blur(20px) saturate(1.4);
254
+ -webkit-backdrop-filter: blur(20px) saturate(1.4);
255
+ border: 1px solid rgba(255, 255, 255, 0.08);
256
+ border-radius: 14px;
257
+ box-shadow: 0 12px 48px rgba(0, 0, 0, 0.5);
258
+ overflow: hidden;
259
+ }
260
+
261
+ /* Side menu (+ / drag handle) — lavender glassmorphic */
262
+ .blog-editor-wrapper .bn-side-menu {
263
+ background: rgba(196, 181, 253, 0.06);
264
+ backdrop-filter: blur(12px);
265
+ -webkit-backdrop-filter: blur(12px);
266
+ border: 1px solid rgba(196, 181, 253, 0.15);
267
+ border-radius: 8px;
268
+ margin-right: 16px;
269
+ height: 28px !important;
270
+ max-height: 28px !important;
271
+ min-height: 28px !important;
272
+ align-items: center;
273
+ align-self: flex-start !important;
274
+ overflow: hidden;
275
+ transition: border-color 0.2s ease, background 0.2s ease;
276
+ }
277
+
278
+ .blog-editor-wrapper .bn-side-menu:hover {
279
+ background: rgba(196, 181, 253, 0.1);
280
+ border-color: rgba(196, 181, 253, 0.25);
281
+ }
282
+
283
+ .blog-editor-wrapper .bn-side-menu button {
284
+ color: rgba(196, 181, 253, 0.5);
285
+ transition: color 0.15s ease;
286
+ }
287
+
288
+ .blog-editor-wrapper .bn-side-menu button:hover {
289
+ color: #c4b5fd;
290
+ }
291
+
292
+ .blog-editor-wrapper .bn-drag-handle {
293
+ color: rgba(196, 181, 253, 0.4);
294
+ }
295
+
296
+ .blog-editor-wrapper .bn-drag-handle:hover {
297
+ color: #c4b5fd;
298
+ }
299
+
300
+ /* Selection highlight */
301
+ .blog-editor-wrapper ::selection {
302
+ background: rgba(123, 168, 240, 0.3);
303
+ }
304
+
305
+ /* ===== Editor links — distinct styling ===== */
306
+ .blog-editor-wrapper .bn-editor a,
307
+ .blog-editor-wrapper .bn-block-content a {
308
+ color: #7ba8f0 !important;
309
+ text-decoration: none !important;
310
+ border-bottom: 1px solid rgba(123, 168, 240, 0.3);
311
+ padding-bottom: 1px;
312
+ cursor: text;
313
+ pointer-events: auto;
314
+ transition: color 0.15s, border-color 0.15s, background 0.15s;
315
+ }
316
+
317
+ .blog-editor-wrapper .bn-editor a:hover,
318
+ .blog-editor-wrapper .bn-block-content a:hover {
319
+ color: #9dc0ff !important;
320
+ border-bottom-color: rgba(157, 192, 255, 0.5);
321
+ background: rgba(123, 168, 240, 0.06);
322
+ }
323
+
324
+ /* Ctrl/Cmd held — links become clickable, show pointer cursor */
325
+ .blog-editor-wrapper.ctrl-held .bn-editor a,
326
+ .blog-editor-wrapper.ctrl-held .bn-block-content a {
327
+ cursor: pointer;
328
+ text-decoration: underline !important;
329
+ border-bottom: none;
330
+ }
331
+
332
+ /* ===== Link Preview Tooltip ===== */
333
+
334
+ .link-preview-tooltip {
335
+ position: fixed;
336
+ z-index: 1000;
337
+ width: 320px;
338
+ border-radius: 12px;
339
+ overflow: hidden;
340
+ background: var(--bg-surface);
341
+ border: 1px solid var(--border-default);
342
+ box-shadow: 0 12px 40px rgba(0, 0, 0, 0.15), 0 0 0 1px rgba(0, 0, 0, 0.04);
343
+ animation: linkPreviewIn 0.18s cubic-bezier(0.16, 1, 0.3, 1);
344
+ pointer-events: auto;
345
+ }
346
+
347
+ [data-theme="dark"] .link-preview-tooltip {
348
+ box-shadow: 0 12px 40px rgba(0, 0, 0, 0.4), 0 0 0 1px rgba(255, 255, 255, 0.04);
349
+ }
350
+
351
+ @keyframes linkPreviewIn {
352
+ from { opacity: 0; transform: translateY(4px) scale(0.97); }
353
+ to { opacity: 1; transform: translateY(0) scale(1); }
354
+ }
355
+
356
+ .link-preview-card {
357
+ display: block;
358
+ text-decoration: none !important;
359
+ border: none !important;
360
+ color: inherit;
361
+ background: none !important;
362
+ }
363
+
364
+ .link-preview-card:hover {
365
+ background: none !important;
366
+ border: none !important;
367
+ }
368
+
369
+ .link-preview-image {
370
+ width: 100%;
371
+ height: 140px;
372
+ overflow: hidden;
373
+ background: var(--bg-elevated);
374
+ }
375
+
376
+ .link-preview-image img {
377
+ width: 100%;
378
+ height: 100%;
379
+ object-fit: cover;
380
+ display: block;
381
+ }
382
+
383
+ .link-preview-body {
384
+ padding: 12px 14px;
385
+ }
386
+
387
+ .link-preview-title {
388
+ font-size: 13px;
389
+ font-weight: 600;
390
+ color: var(--text-primary);
391
+ line-height: 1.4;
392
+ margin-bottom: 4px;
393
+ display: -webkit-box;
394
+ -webkit-line-clamp: 2;
395
+ -webkit-box-orient: vertical;
396
+ overflow: hidden;
397
+ }
398
+
399
+ .link-preview-desc {
400
+ font-size: 12px;
401
+ color: var(--text-muted);
402
+ line-height: 1.45;
403
+ margin-bottom: 8px;
404
+ display: -webkit-box;
405
+ -webkit-line-clamp: 2;
406
+ -webkit-box-orient: vertical;
407
+ overflow: hidden;
408
+ }
409
+
410
+ .link-preview-domain {
411
+ display: flex;
412
+ align-items: center;
413
+ gap: 6px;
414
+ font-size: 11px;
415
+ color: var(--text-faint);
416
+ }
417
+
418
+ .link-preview-favicon {
419
+ width: 14px;
420
+ height: 14px;
421
+ border-radius: 3px;
422
+ flex-shrink: 0;
423
+ }
424
+
425
+ .link-preview-loading {
426
+ padding: 14px;
427
+ }
428
+
429
+ .link-preview-skeleton {
430
+ background: var(--bg-elevated);
431
+ border-radius: 4px;
432
+ animation: skeletonPulse 1.2s ease-in-out infinite;
433
+ }
434
+
435
+ @keyframes skeletonPulse {
436
+ 0%, 100% { opacity: 0.4; }
437
+ 50% { opacity: 0.8; }
438
+ }
439
+
440
+ /* ===== Dark scrollbar (used in emoji picker, editor dropdowns) ===== */
441
+
442
+ .dark-scrollbar::-webkit-scrollbar {
443
+ width: 6px;
444
+ }
445
+
446
+ .dark-scrollbar::-webkit-scrollbar-track {
447
+ background: transparent;
448
+ }
449
+
450
+ .dark-scrollbar::-webkit-scrollbar-thumb {
451
+ background: var(--bg-elevated);
452
+ border-radius: 3px;
453
+ }
454
+
455
+ .dark-scrollbar::-webkit-scrollbar-thumb:hover {
456
+ background: var(--border-hover);
457
+ }
458
+
459
+ /* Firefox */
460
+ .dark-scrollbar {
461
+ scrollbar-width: thin;
462
+ scrollbar-color: var(--bg-elevated) transparent;
463
+ }
464
+
465
+ /* ===== Editor Confirm Modal ===== */
466
+
467
+ .editor-confirm-overlay {
468
+ background: rgba(0, 0, 0, 0.45);
469
+ backdrop-filter: blur(4px);
470
+ animation: confirmOverlayIn 0.15s ease-out;
471
+ }
472
+
473
+ @keyframes confirmOverlayIn {
474
+ from { opacity: 0; }
475
+ to { opacity: 1; }
476
+ }
477
+
478
+ .editor-confirm-dialog {
479
+ background: var(--bg-app);
480
+ border: 1px solid var(--border-default);
481
+ box-shadow: 0 20px 60px rgba(0, 0, 0, 0.25), 0 0 0 1px rgba(0, 0, 0, 0.05);
482
+ animation: confirmDialogIn 0.2s cubic-bezier(0.16, 1, 0.3, 1);
483
+ }
484
+
485
+ @keyframes confirmDialogIn {
486
+ from { opacity: 0; transform: scale(0.95) translateY(8px); }
487
+ to { opacity: 1; transform: scale(1) translateY(0); }
488
+ }
489
+
490
+ .editor-confirm-cancel {
491
+ color: var(--text-body);
492
+ background: var(--bg-surface);
493
+ border: 1px solid var(--border-default);
494
+ }
495
+
496
+ .editor-confirm-cancel:hover {
497
+ background: var(--bg-hover);
498
+ border-color: var(--border-hover);
499
+ }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * @elixpo/lixeditor styles
3
+ * Import in your app: import '@elixpo/lixeditor/styles';
4
+ */
5
+
6
+ @import './variables.css';
7
+ @import './editor.css';
8
+ @import './blocks.css';
9
+ @import './menus.css';
10
+ @import './preview.css';
11
+ @import './blog-image.css';