noteloom 0.3.2 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. package/README.md +344 -53
  2. package/bin/noteloom.mjs +139 -0
  3. package/dist/canvas.cjs +2 -0
  4. package/dist/canvas.cjs.map +1 -0
  5. package/dist/canvas.d.ts +2 -0
  6. package/dist/canvas.js +5 -0
  7. package/dist/canvas.js.map +1 -0
  8. package/dist/collab.cjs +2 -0
  9. package/dist/collab.cjs.map +1 -0
  10. package/dist/collab.d.ts +19 -0
  11. package/dist/collab.js +379 -0
  12. package/dist/collab.js.map +1 -0
  13. package/dist/comments.cjs +2 -0
  14. package/dist/comments.cjs.map +1 -0
  15. package/dist/comments.d.ts +17 -0
  16. package/dist/comments.js +19 -0
  17. package/dist/comments.js.map +1 -0
  18. package/dist/index.cjs +2 -0
  19. package/dist/index.cjs.map +1 -0
  20. package/dist/index.d.ts +392 -32
  21. package/dist/index.js +3983 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/persistence.cjs +2 -0
  24. package/dist/persistence.cjs.map +1 -0
  25. package/dist/persistence.d.ts +11 -0
  26. package/dist/persistence.js +12 -0
  27. package/dist/persistence.js.map +1 -0
  28. package/dist/shared/CommentAvatar-TKqsM8vG.js +53 -0
  29. package/dist/shared/CommentAvatar-TKqsM8vG.js.map +1 -0
  30. package/dist/shared/CommentAvatar-V457IgoQ.cjs +2 -0
  31. package/dist/shared/CommentAvatar-V457IgoQ.cjs.map +1 -0
  32. package/dist/shared/CommentThreadCard-CAJ3oPdr.cjs +2 -0
  33. package/dist/shared/CommentThreadCard-CAJ3oPdr.cjs.map +1 -0
  34. package/dist/shared/CommentThreadCard-Cxf8GwHJ.js +213 -0
  35. package/dist/shared/CommentThreadCard-Cxf8GwHJ.js.map +1 -0
  36. package/dist/shared/CommentsPanel-BwVVyMOC.js +76 -0
  37. package/dist/shared/CommentsPanel-BwVVyMOC.js.map +1 -0
  38. package/dist/shared/CommentsPanel-CES4uzye.cjs +2 -0
  39. package/dist/shared/CommentsPanel-CES4uzye.cjs.map +1 -0
  40. package/dist/shared/VersionHistory-Bg6fufP5.js +1120 -0
  41. package/dist/shared/VersionHistory-Bg6fufP5.js.map +1 -0
  42. package/dist/shared/VersionHistory-DELa2Wbq.cjs +12 -0
  43. package/dist/shared/VersionHistory-DELa2Wbq.cjs.map +1 -0
  44. package/dist/shared/VoiceListeningIndicator-BOfVmLK0.js +338 -0
  45. package/dist/shared/VoiceListeningIndicator-BOfVmLK0.js.map +1 -0
  46. package/dist/shared/VoiceListeningIndicator-DNX8JlQM.cjs +2 -0
  47. package/dist/shared/VoiceListeningIndicator-DNX8JlQM.cjs.map +1 -0
  48. package/dist/shared/fieldRegistry-BoYyW3GH.cjs +2 -0
  49. package/dist/shared/fieldRegistry-BoYyW3GH.cjs.map +1 -0
  50. package/dist/shared/fieldRegistry-PjJWXFoB.js +223 -0
  51. package/dist/shared/fieldRegistry-PjJWXFoB.js.map +1 -0
  52. package/dist/shared/icons-C1_s0jKK.js +4269 -0
  53. package/dist/shared/icons-C1_s0jKK.js.map +1 -0
  54. package/dist/shared/icons-DtCsXuU6.cjs +3531 -0
  55. package/dist/shared/icons-DtCsXuU6.cjs.map +1 -0
  56. package/dist/shared/index-B9jyyL8u.js +2145 -0
  57. package/dist/shared/index-B9jyyL8u.js.map +1 -0
  58. package/dist/shared/index-D9WEXpYM.cjs +2 -0
  59. package/dist/shared/index-D9WEXpYM.cjs.map +1 -0
  60. package/dist/shared/indexedDbPersistence-BKlGPFTP.js +112 -0
  61. package/dist/shared/indexedDbPersistence-BKlGPFTP.js.map +1 -0
  62. package/dist/shared/indexedDbPersistence-BWJ1h5Vp.cjs +2 -0
  63. package/dist/shared/indexedDbPersistence-BWJ1h5Vp.cjs.map +1 -0
  64. package/dist/shared/leafBlockFactory-A9eUhSe-.js +335 -0
  65. package/dist/shared/leafBlockFactory-A9eUhSe-.js.map +1 -0
  66. package/dist/shared/leafBlockFactory-Dp382eP8.cjs +2 -0
  67. package/dist/shared/leafBlockFactory-Dp382eP8.cjs.map +1 -0
  68. package/dist/shared/serialize-DWEfk0vU.cjs +3 -0
  69. package/dist/shared/serialize-DWEfk0vU.cjs.map +1 -0
  70. package/dist/shared/serialize-T9Odwx24.js +86 -0
  71. package/dist/shared/serialize-T9Odwx24.js.map +1 -0
  72. package/dist/shared/starter-kit-CY5wzYDf.js +4980 -0
  73. package/dist/shared/starter-kit-CY5wzYDf.js.map +1 -0
  74. package/dist/shared/starter-kit-lPN-NpJ5.cjs +27 -0
  75. package/dist/shared/starter-kit-lPN-NpJ5.cjs.map +1 -0
  76. package/dist/shared/usePopoverEdgeClamp-CDG26jBM.cjs +2 -0
  77. package/dist/shared/usePopoverEdgeClamp-CDG26jBM.cjs.map +1 -0
  78. package/dist/shared/usePopoverEdgeClamp-gmFm0CnI.js +109 -0
  79. package/dist/shared/usePopoverEdgeClamp-gmFm0CnI.js.map +1 -0
  80. package/dist/shared/useServiceWorkerUpdate-BduabXv6.js +94 -0
  81. package/dist/shared/useServiceWorkerUpdate-BduabXv6.js.map +1 -0
  82. package/dist/shared/useServiceWorkerUpdate-DQboGesi.cjs +2 -0
  83. package/dist/shared/useServiceWorkerUpdate-DQboGesi.cjs.map +1 -0
  84. package/dist/starter-kit.cjs +2 -0
  85. package/dist/starter-kit.cjs.map +1 -0
  86. package/dist/starter-kit.d.ts +9 -0
  87. package/dist/starter-kit.js +10 -0
  88. package/dist/starter-kit.js.map +1 -0
  89. package/dist/style.css +3529 -3200
  90. package/dist/versions.cjs +2 -0
  91. package/dist/versions.cjs.map +1 -0
  92. package/dist/versions.d.ts +11 -0
  93. package/dist/versions.js +13 -0
  94. package/dist/versions.js.map +1 -0
  95. package/dist/voice.cjs +2 -0
  96. package/dist/voice.cjs.map +1 -0
  97. package/dist/voice.d.ts +7 -0
  98. package/dist/voice.js +8 -0
  99. package/dist/voice.js.map +1 -0
  100. package/package.json +159 -92
  101. package/dist/noteloom.cjs +0 -3209
  102. package/dist/noteloom.cjs.map +0 -1
  103. package/dist/noteloom.es.js +0 -14622
  104. package/dist/noteloom.es.js.map +0 -1
@@ -0,0 +1,4269 @@
1
+ import { jsx as e, jsxs as r } from "react/jsx-runtime";
2
+ import { useEffect as q, useState as c, useCallback as b, useRef as K, useMemo as W, useContext as $, createContext as G } from "react";
3
+ const Q = `/*
4
+ * noteloom's default theme — minimal, clean, modern SaaS-adjacent.
5
+ *
6
+ * Ships as plain CSS custom properties on :root (not scoped to a wrapper
7
+ * element) deliberately: several of this package's own pieces — Select's
8
+ * popover, SlashMenu, FloatingToolbar, the table header menu, the block
9
+ * gutter/range menus, Modal — are portaled to document.body, so they are
10
+ * NOT DOM descendants of whatever element renders the editor itself.
11
+ * Scoping variables to a wrapper class would silently fail to reach any
12
+ * of those. \`--noteloom-*\` is a distinctive enough prefix that defining
13
+ * these on :root won't collide with a host app's own custom properties.
14
+ *
15
+ * This file is auto-injected at runtime by <EditorProvider> (see
16
+ * react/injectDefaultStyles.js) — you do NOT need to import this
17
+ * yourself. It's still published standalone at \`noteloom/style.css\` for:
18
+ * - passing \`theme="none"\` to <EditorProvider> and importing this
19
+ * explicitly instead (e.g. to control load order, or for SSR/CSP
20
+ * setups where runtime <style> injection isn't allowed)
21
+ * - copying as a starting point for your own from-scratch theme
22
+ *
23
+ * Retheme by overriding these variables in your own CSS (after the
24
+ * default theme loads) — every rule below reads from them, nothing is
25
+ * hardcoded. Override individual \`.be-*\` classes too, same as any other
26
+ * library's default styles.
27
+ */
28
+
29
+ :root {
30
+ --noteloom-font: -apple-system, BlinkMacSystemFont, 'Segoe UI', Inter, sans-serif;
31
+ --noteloom-text: #0f172a;
32
+ --noteloom-text-muted: #64748b;
33
+ --noteloom-text-faint: #94a3b8;
34
+ --noteloom-bg: #ffffff;
35
+ --noteloom-bg-subtle: #f8fafc;
36
+ --noteloom-bg-hover: #f1f5f9;
37
+ --noteloom-border: #e2e8f0;
38
+ --noteloom-accent: #6366f1;
39
+ --noteloom-accent-text: #ffffff;
40
+ --noteloom-accent-soft: rgba(99, 102, 241, 0.1);
41
+ --noteloom-accent-soft-hover: rgba(99, 102, 241, 0.16);
42
+ --noteloom-danger: #dc2626;
43
+ --noteloom-danger-soft: #fef2f2;
44
+ --noteloom-radius-sm: 6px;
45
+ --noteloom-radius-md: 8px;
46
+ --noteloom-radius-lg: 12px;
47
+ --noteloom-radius-xl: 16px;
48
+ --noteloom-shadow: 0 12px 24px -8px rgba(15, 23, 42, 0.12), 0 4px 8px -4px rgba(15, 23, 42, 0.06);
49
+ --noteloom-code-bg: #0f172a;
50
+ --noteloom-code-text: #e2e8f0;
51
+ }
52
+
53
+ @media (prefers-color-scheme: dark) {
54
+ :root {
55
+ --noteloom-text: #f1f5f9;
56
+ --noteloom-text-muted: #94a3b8;
57
+ --noteloom-text-faint: #64748b;
58
+ --noteloom-bg: #1c1932;
59
+ --noteloom-bg-subtle: rgba(255, 255, 255, 0.03);
60
+ --noteloom-bg-hover: rgba(255, 255, 255, 0.06);
61
+ --noteloom-border: rgba(255, 255, 255, 0.1);
62
+ --noteloom-accent-soft: rgba(99, 102, 241, 0.18);
63
+ --noteloom-accent-soft-hover: rgba(99, 102, 241, 0.26);
64
+ --noteloom-danger-soft: rgba(220, 38, 38, 0.15);
65
+ --noteloom-code-bg: #13111f;
66
+ }
67
+ }
68
+
69
+ /* Explicit overrides win either direction — a host toggling dark mode via
70
+ a class rather than the OS setting can set [data-theme="dark"/"light"]
71
+ on any ancestor (e.g. <html>), overriding the media query above. */
72
+ [data-theme='dark'] {
73
+ --noteloom-text: #f1f5f9;
74
+ --noteloom-text-muted: #94a3b8;
75
+ --noteloom-text-faint: #64748b;
76
+ --noteloom-bg: #1c1932;
77
+ --noteloom-bg-subtle: rgba(255, 255, 255, 0.03);
78
+ --noteloom-bg-hover: rgba(255, 255, 255, 0.06);
79
+ --noteloom-border: rgba(255, 255, 255, 0.1);
80
+ --noteloom-accent-soft: rgba(99, 102, 241, 0.18);
81
+ --noteloom-accent-soft-hover: rgba(99, 102, 241, 0.26);
82
+ --noteloom-danger-soft: rgba(220, 38, 38, 0.15);
83
+ --noteloom-code-bg: #13111f;
84
+ }
85
+
86
+ [data-theme='light'] {
87
+ --noteloom-text: #0f172a;
88
+ --noteloom-text-muted: #64748b;
89
+ --noteloom-text-faint: #94a3b8;
90
+ --noteloom-bg: #ffffff;
91
+ --noteloom-bg-subtle: #f8fafc;
92
+ --noteloom-bg-hover: #f1f5f9;
93
+ --noteloom-border: #e2e8f0;
94
+ --noteloom-accent-soft: rgba(99, 102, 241, 0.1);
95
+ --noteloom-accent-soft-hover: rgba(99, 102, 241, 0.16);
96
+ --noteloom-danger-soft: #fef2f2;
97
+ --noteloom-code-bg: #0f172a;
98
+ }
99
+
100
+ .be-root {
101
+ font-family: var(--noteloom-font);
102
+ color: var(--noteloom-text);
103
+ }
104
+
105
+ .be-editable {
106
+ /* Block-level and full-width so the whole line (including the blank
107
+ trailing space after short text, and an empty line's full height) is
108
+ part of the actual contentEditable hit-test box. Left inline/sized to
109
+ content, a click on that blank area lands on the non-editable wrapper
110
+ div instead of this element: the browser's native "nothing focused
111
+ yet" resolution still finds it on a first click, but re-clicking the
112
+ same dead-zone point while this element already holds the selection
113
+ collapses/clears it instead, since there's nothing here to re-anchor
114
+ the caret onto. */
115
+ display: block;
116
+ width: 100%;
117
+ min-height: 1em;
118
+ outline: none;
119
+ }
120
+
121
+ /* A run with marks.commentIds set (see src/comments/commentMarks.js) --
122
+ presence/absence only, no per-comment value to vary the color by.
123
+ cursor: pointer hints that it opens CommentPopover on click. */
124
+ .be-comment-highlight {
125
+ background: rgba(234, 179, 8, 0.2);
126
+ border-bottom: 2px solid rgba(234, 179, 8, 0.6);
127
+ cursor: pointer;
128
+ }
129
+
130
+ /* Echoes a hover from the panel/popover back onto the actual text -- see useHoveredComment. */
131
+ .be-comment-highlight-active {
132
+ background: rgba(234, 179, 8, 0.4);
133
+ }
134
+
135
+ /* --- basic leaf blocks --- */
136
+
137
+ .be-paragraph {
138
+ position: relative;
139
+ margin: 0.25rem 0;
140
+ line-height: 1.6;
141
+ outline: none;
142
+ }
143
+
144
+ .be-heading {
145
+ position: relative;
146
+ font-weight: 600;
147
+ margin: 1.25rem 0 0.25rem;
148
+ outline: none;
149
+ letter-spacing: -0.01em;
150
+ }
151
+
152
+ /* Explicit per-level sizing, each in its own overridable class — without
153
+ this, h1/h2/h3 only differ via the browser's own UA-stylesheet defaults
154
+ (inconsistent across browsers, and not something a host can target
155
+ independently without fighting tag-selector specificity). Override just
156
+ one level with \`.be-heading-1 { font-size: ...; }\` in your own CSS, same
157
+ as any other .be-* class. */
158
+ .be-heading-1 {
159
+ font-size: 1.9em;
160
+ }
161
+
162
+ .be-heading-2 {
163
+ font-size: 1.5em;
164
+ }
165
+
166
+ .be-heading-3 {
167
+ font-size: 1.2em;
168
+ }
169
+
170
+ .be-divider {
171
+ border: none;
172
+ border-top: 1px solid var(--noteloom-border);
173
+ margin: 1.5em 0;
174
+ cursor: default;
175
+ }
176
+
177
+ .be-blockquote {
178
+ position: relative;
179
+ margin: 0.5em 0;
180
+ padding-left: 0.9em;
181
+ border-left: 3px solid var(--noteloom-border);
182
+ color: var(--noteloom-text-muted);
183
+ outline: none;
184
+ }
185
+
186
+ .be-blockquote[dir='rtl'] {
187
+ padding-left: 0;
188
+ padding-right: 0.9em;
189
+ border-left: none;
190
+ border-right: 3px solid var(--noteloom-border);
191
+ }
192
+
193
+ /* --- callout --- */
194
+
195
+ .be-callout {
196
+ position: relative;
197
+ display: flex;
198
+ gap: 0.7em;
199
+ align-items: flex-start;
200
+ background: var(--noteloom-bg-subtle);
201
+ border-radius: var(--noteloom-radius-lg);
202
+ padding: 0.9em 1em;
203
+ margin: 0.5em 0;
204
+ }
205
+
206
+ .be-callout[data-color='gray'] {
207
+ background: rgba(148, 163, 184, 0.16);
208
+ }
209
+ .be-callout[data-color='blue'] {
210
+ background: rgba(99, 102, 241, 0.12);
211
+ }
212
+ .be-callout[data-color='green'] {
213
+ background: rgba(34, 197, 94, 0.14);
214
+ }
215
+ .be-callout[data-color='yellow'] {
216
+ background: rgba(234, 179, 8, 0.16);
217
+ }
218
+ .be-callout[data-color='orange'] {
219
+ background: rgba(249, 115, 22, 0.14);
220
+ }
221
+ .be-callout[data-color='red'] {
222
+ background: rgba(239, 68, 68, 0.13);
223
+ }
224
+ .be-callout[data-color='purple'] {
225
+ background: rgba(168, 85, 247, 0.13);
226
+ }
227
+ .be-callout[data-color='pink'] {
228
+ background: rgba(236, 72, 153, 0.13);
229
+ }
230
+
231
+ .be-callout-icon-wrap {
232
+ flex: none;
233
+ }
234
+
235
+ .be-callout-icon-input,
236
+ .be-callout-icon {
237
+ width: 2em;
238
+ height: 2em;
239
+ border: none;
240
+ background: var(--noteloom-bg);
241
+ border-radius: var(--noteloom-radius-md);
242
+ box-shadow: 0 1px 2px rgba(15, 23, 42, 0.08);
243
+ font-size: 1.15em;
244
+ display: flex;
245
+ align-items: center;
246
+ justify-content: center;
247
+ padding: 0;
248
+ cursor: pointer;
249
+ }
250
+
251
+ .be-callout-icon-input {
252
+ outline: none;
253
+ text-align: center;
254
+ cursor: text;
255
+ }
256
+
257
+ .be-callout-content {
258
+ flex: 1;
259
+ min-width: 0;
260
+ padding-right: 1.6em; /* keeps text from running under the color-swatch trigger */
261
+ }
262
+
263
+ /* First child reads as the card's title; every child after it is the
264
+ description — see CalloutBlock.jsx's comment for why this is a CSS
265
+ convention over the content, not a separate title/description field. */
266
+ .be-callout-content > :first-child {
267
+ font-weight: 600;
268
+ }
269
+
270
+ .be-callout-content > :not(:first-child) {
271
+ color: var(--noteloom-text-muted);
272
+ font-size: 0.92em;
273
+ }
274
+
275
+ .be-callout-color-wrap {
276
+ position: absolute;
277
+ top: 0.6em;
278
+ right: 0.6em;
279
+ }
280
+
281
+ .be-callout-color-trigger {
282
+ border: none;
283
+ background: none;
284
+ padding: 3px;
285
+ border-radius: var(--noteloom-radius-sm);
286
+ cursor: pointer;
287
+ display: flex;
288
+ }
289
+
290
+ .be-callout-color-trigger:hover {
291
+ background: rgba(15, 23, 42, 0.06);
292
+ }
293
+
294
+ .be-callout-color-dot {
295
+ width: 12px;
296
+ height: 12px;
297
+ border-radius: 50%;
298
+ border: 1px solid rgba(15, 23, 42, 0.12);
299
+ }
300
+
301
+ .be-callout-color-dot-gray {
302
+ background: #94a3b8;
303
+ }
304
+ .be-callout-color-dot-blue {
305
+ background: #6366f1;
306
+ }
307
+ .be-callout-color-dot-green {
308
+ background: #22c55e;
309
+ }
310
+ .be-callout-color-dot-yellow {
311
+ background: #eab308;
312
+ }
313
+ .be-callout-color-dot-orange {
314
+ background: #f97316;
315
+ }
316
+ .be-callout-color-dot-red {
317
+ background: #ef4444;
318
+ }
319
+ .be-callout-color-dot-purple {
320
+ background: #a855f7;
321
+ }
322
+ .be-callout-color-dot-pink {
323
+ background: #ec4899;
324
+ }
325
+
326
+ .be-callout-color-picker {
327
+ position: absolute;
328
+ top: 100%;
329
+ right: 0;
330
+ margin-top: 4px;
331
+ z-index: 1000;
332
+ display: grid;
333
+ grid-template-columns: repeat(4, 1fr);
334
+ gap: 4px;
335
+ padding: 6px;
336
+ background: var(--noteloom-bg);
337
+ border: 1px solid var(--noteloom-border);
338
+ border-radius: var(--noteloom-radius-md);
339
+ box-shadow: var(--noteloom-shadow);
340
+ }
341
+
342
+ .be-callout-color-option {
343
+ width: 22px;
344
+ height: 22px;
345
+ border-radius: 50%;
346
+ border: 2px solid transparent;
347
+ cursor: pointer;
348
+ padding: 0;
349
+ }
350
+
351
+ .be-callout-color-option-gray {
352
+ background: #94a3b8;
353
+ }
354
+ .be-callout-color-option-blue {
355
+ background: #6366f1;
356
+ }
357
+ .be-callout-color-option-green {
358
+ background: #22c55e;
359
+ }
360
+ .be-callout-color-option-yellow {
361
+ background: #eab308;
362
+ }
363
+ .be-callout-color-option-orange {
364
+ background: #f97316;
365
+ }
366
+ .be-callout-color-option-red {
367
+ background: #ef4444;
368
+ }
369
+ .be-callout-color-option-purple {
370
+ background: #a855f7;
371
+ }
372
+ .be-callout-color-option-pink {
373
+ background: #ec4899;
374
+ }
375
+
376
+ .be-callout-color-option-active {
377
+ border-color: var(--noteloom-text);
378
+ }
379
+
380
+ /* --- code block --- */
381
+
382
+ .be-code-block {
383
+ margin: 0.6em 0;
384
+ border-radius: var(--noteloom-radius-lg);
385
+ overflow: hidden;
386
+ background: var(--noteloom-code-bg);
387
+ color: var(--noteloom-code-text);
388
+ }
389
+
390
+ .be-code-block-header {
391
+ display: flex;
392
+ align-items: center;
393
+ justify-content: flex-end;
394
+ gap: 4px;
395
+ padding: 6px 10px;
396
+ background: rgba(255, 255, 255, 0.04);
397
+ }
398
+
399
+ .be-code-block-delete {
400
+ appearance: none;
401
+ -webkit-appearance: none;
402
+ border: none;
403
+ outline: none;
404
+ background: transparent;
405
+ box-shadow: none;
406
+ color: var(--noteloom-text-faint);
407
+ width: 24px;
408
+ height: 24px;
409
+ margin: 0;
410
+ padding: 0;
411
+ display: flex;
412
+ align-items: center;
413
+ justify-content: center;
414
+ border-radius: var(--noteloom-radius-sm);
415
+ cursor: pointer;
416
+ }
417
+
418
+ .be-code-block-delete:hover {
419
+ background: rgba(255, 255, 255, 0.1);
420
+ color: #fca5a5;
421
+ }
422
+
423
+ .be-code-block-language {
424
+ background: transparent;
425
+ color: var(--noteloom-text-faint);
426
+ border: none;
427
+ font-size: 0.8rem;
428
+ cursor: pointer;
429
+ }
430
+
431
+ .be-code-block-pre {
432
+ margin: 0;
433
+ padding: 0.9em 1em;
434
+ overflow-x: auto;
435
+ font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace;
436
+ font-size: 0.88rem;
437
+ outline: none;
438
+ }
439
+
440
+ .be-code-block-pre code {
441
+ position: relative;
442
+ display: block;
443
+ }
444
+
445
+ .be-code-block-body {
446
+ display: flex;
447
+ align-items: stretch;
448
+ }
449
+
450
+ .be-code-block-gutter {
451
+ flex-shrink: 0;
452
+ display: flex;
453
+ flex-direction: column;
454
+ padding: 0.9em 0.6em 0.9em 1em;
455
+ font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace;
456
+ font-size: 0.88rem;
457
+ line-height: 1.5;
458
+ color: var(--noteloom-text-faint);
459
+ text-align: right;
460
+ user-select: none;
461
+ border-right: 1px solid rgba(255, 255, 255, 0.08);
462
+ }
463
+
464
+ .be-code-block-body .be-code-block-pre {
465
+ flex: 1;
466
+ min-width: 0;
467
+ line-height: 1.5;
468
+ }
469
+
470
+ /* --- list items (bulleted / numbered / to-do / toggle) --- */
471
+
472
+ .be-list-item {
473
+ margin: 0.1rem 0;
474
+ }
475
+
476
+ .be-list-item-row {
477
+ display: flex;
478
+ align-items: flex-start;
479
+ gap: 0.4em;
480
+ }
481
+
482
+ .be-list-checkbox {
483
+ margin-top: 0.3em;
484
+ width: 16px;
485
+ height: 16px;
486
+ flex: none;
487
+ accent-color: var(--noteloom-accent);
488
+ cursor: pointer;
489
+ }
490
+
491
+ .be-list-toggle-marker {
492
+ border: none;
493
+ background: none;
494
+ cursor: pointer;
495
+ padding: 2px;
496
+ margin-top: 0.1em;
497
+ color: var(--noteloom-text-faint);
498
+ display: flex;
499
+ align-items: center;
500
+ justify-content: center;
501
+ height: 30px;
502
+ width: 30px;
503
+ border-radius: var(--noteloom-radius-sm);
504
+ }
505
+
506
+ .be-list-toggle-marker:hover {
507
+ background: var(--noteloom-bg-hover);
508
+ color: var(--noteloom-text-muted);
509
+ }
510
+
511
+ .be-list-marker {
512
+ min-width: 1.2em;
513
+ margin-top: 0.1em;
514
+ text-align: center;
515
+ color: var(--noteloom-text-faint);
516
+ user-select: none;
517
+ flex: none;
518
+ }
519
+
520
+ .be-list-item-title {
521
+ position: relative;
522
+ flex: 1;
523
+ min-width: 0;
524
+ outline: none;
525
+ line-height: 1.6;
526
+ }
527
+
528
+ .be-list-item-children {
529
+ margin-left: 2.1em;
530
+ }
531
+
532
+ /* --- toggle heading --- */
533
+
534
+ .be-toggle-heading {
535
+ margin: 1.25rem 0 0.25rem;
536
+ }
537
+
538
+ .be-toggle-heading-row {
539
+ display: flex;
540
+ align-items: center;
541
+ gap: 0.15em;
542
+ }
543
+
544
+ .be-toggle-heading-marker {
545
+ border: none;
546
+ background: none;
547
+ cursor: pointer;
548
+ color: var(--noteloom-text-faint);
549
+ display: flex;
550
+ align-items: center;
551
+ justify-content: center;
552
+ width: 30px;
553
+ height: 30px;
554
+ border-radius: var(--noteloom-radius-sm);
555
+ }
556
+
557
+ .be-toggle-heading-marker:hover {
558
+ background: var(--noteloom-bg-hover);
559
+ color: var(--noteloom-text-muted);
560
+ }
561
+
562
+ .be-toggle-heading-title {
563
+ flex: 1;
564
+ min-width: 0;
565
+ }
566
+
567
+ .be-toggle-heading-children {
568
+ margin-left: 2.1em;
569
+ }
570
+
571
+ /* --- layout (multi-column) --- */
572
+
573
+ .be-layout {
574
+ margin: 0.6em 0;
575
+ }
576
+
577
+ .be-layout-column {
578
+ flex: 1;
579
+ min-width: 0;
580
+ }
581
+
582
+ /* --- button block --- */
583
+
584
+ .be-button-block {
585
+ margin: 0.6em 0;
586
+ }
587
+
588
+ .be-button-block-pill {
589
+ display: inline-flex;
590
+ align-items: center;
591
+ gap: 0.4em;
592
+ border-radius: var(--noteloom-radius-md);
593
+ padding: 0.5em 1em;
594
+ color: var(--noteloom-accent-text);
595
+ }
596
+
597
+ .be-button-block-label {
598
+ position: relative;
599
+ outline: none;
600
+ min-width: 2em;
601
+ }
602
+
603
+ /* --- generic empty-state placeholder for editable leaf content ---
604
+ Note: this can't use :empty — an "empty" run still holds a zero-width
605
+ space text node (see EMPTY_RUN_PLACEHOLDER) inside its host span, so the
606
+ wrapper element is never actually childless. data-empty (kept in sync by
607
+ EditableBlockContent's syncEmptyAttr against the *logical* run content,
608
+ not the DOM) is the real signal. */
609
+
610
+ [data-placeholder][data-empty]:focus-within::before {
611
+ content: attr(data-placeholder);
612
+ position: absolute;
613
+ color: var(--noteloom-text-faint);
614
+ font-weight: 400;
615
+ font-style: normal;
616
+ opacity: 0.85;
617
+ pointer-events: none;
618
+ }
619
+
620
+ .be-button-block-open,
621
+ .be-button-block-settings {
622
+ flex: none;
623
+ border: none;
624
+ background: rgba(255, 255, 255, 0.16);
625
+ color: inherit;
626
+ border-radius: var(--noteloom-radius-sm);
627
+ width: 24px;
628
+ height: 24px;
629
+ display: flex;
630
+ align-items: center;
631
+ justify-content: center;
632
+ cursor: pointer;
633
+ }
634
+
635
+ .be-button-block-open:disabled {
636
+ opacity: 0.5;
637
+ cursor: not-allowed;
638
+ }
639
+
640
+ .be-button-block-open:hover:not(:disabled),
641
+ .be-button-block-settings:hover {
642
+ background: rgba(255, 255, 255, 0.28);
643
+ }
644
+
645
+ /* --- embed (image/video/audio/file) --- */
646
+
647
+ .be-embed {
648
+ margin: 0.6em 0;
649
+ }
650
+
651
+ .be-embed-preview {
652
+ position: relative;
653
+ display: flex;
654
+ }
655
+
656
+ .be-embed-align-left {
657
+ justify-content: flex-start;
658
+ }
659
+
660
+ .be-embed-align-center {
661
+ justify-content: center;
662
+ }
663
+
664
+ .be-embed-align-right {
665
+ justify-content: flex-end;
666
+ }
667
+
668
+ .be-embed-frame {
669
+ position: relative;
670
+ max-width: 100%;
671
+ overflow: visible;
672
+ border-radius: var(--noteloom-radius-lg);
673
+ }
674
+
675
+ .be-embed-image,
676
+ .be-embed-video {
677
+ border: 1px solid var(--noteloom-border);
678
+ }
679
+
680
+ .be-embed-image,
681
+ .be-embed-video {
682
+ max-width: 100%;
683
+ display: block;
684
+ border-radius: var(--noteloom-radius-lg);
685
+ }
686
+
687
+ .be-embed-audio {
688
+ width: 100%;
689
+ }
690
+
691
+ .be-embed-oembed {
692
+ width: 100%;
693
+ aspect-ratio: 16 / 9;
694
+ display: block;
695
+ border: 1px solid var(--noteloom-border);
696
+ border-radius: var(--noteloom-radius-lg);
697
+ }
698
+
699
+ .be-embed-file-link {
700
+ display: flex;
701
+ align-items: center;
702
+ gap: 0.5em;
703
+ padding: 0.75em 1em;
704
+ border: 1px solid var(--noteloom-border);
705
+ border-radius: var(--noteloom-radius-xl);
706
+ text-decoration: none;
707
+ color: var(--noteloom-accent);
708
+ font-weight: 500;
709
+ font-size: 0.9rem;
710
+ }
711
+
712
+ .be-embed-file-link:hover {
713
+ background: var(--noteloom-bg-subtle);
714
+ }
715
+
716
+ .be-embed-toolbar {
717
+ position: absolute;
718
+ top: 8px;
719
+ right: 8px;
720
+ z-index: 2;
721
+ display: flex;
722
+ align-items: center;
723
+ gap: 2px;
724
+ padding: 3px;
725
+ background: rgba(15, 23, 42, 0.72);
726
+ border-radius: var(--noteloom-radius-md);
727
+ opacity: 0;
728
+ transition: opacity 0.12s ease;
729
+ }
730
+
731
+ .be-embed-preview:hover .be-embed-toolbar,
732
+ .be-embed-toolbar:focus-within {
733
+ opacity: 1;
734
+ }
735
+
736
+ .be-embed-toolbar-btn {
737
+ border: none;
738
+ background: transparent;
739
+ width: 24px;
740
+ height: 24px;
741
+ display: flex;
742
+ align-items: center;
743
+ justify-content: center;
744
+ color: rgba(255, 255, 255, 0.8);
745
+ border-radius: var(--noteloom-radius-sm);
746
+ cursor: pointer;
747
+ }
748
+
749
+ .be-embed-toolbar-btn:hover {
750
+ background: rgba(255, 255, 255, 0.16);
751
+ color: #fff;
752
+ }
753
+
754
+ .be-embed-toolbar-btn-active {
755
+ background: var(--noteloom-accent);
756
+ color: #fff;
757
+ }
758
+
759
+ .be-embed-alt-text-btn {
760
+ width: auto;
761
+ padding: 0 8px;
762
+ font-size: 0.75rem;
763
+ }
764
+
765
+ .be-embed-remove {
766
+ border: none;
767
+ background: transparent;
768
+ border-radius: var(--noteloom-radius-sm);
769
+ padding: 0 8px;
770
+ height: 24px;
771
+ color: rgba(255, 255, 255, 0.8);
772
+ font-size: 0.75rem;
773
+ cursor: pointer;
774
+ }
775
+
776
+ .be-embed-remove:hover {
777
+ background: rgba(255, 255, 255, 0.16);
778
+ color: #fff;
779
+ }
780
+
781
+ .be-embed-resize-handle {
782
+ position: absolute;
783
+ bottom: 4px;
784
+ right: 4px;
785
+ width: 12px;
786
+ height: 12px;
787
+ cursor: nwse-resize;
788
+ border-radius: 2px;
789
+ border: 1px solid #fff;
790
+ background: var(--noteloom-accent);
791
+ }
792
+
793
+ .be-embed-dropzone {
794
+ border: 1.5px dashed var(--noteloom-border);
795
+ border-radius: var(--noteloom-radius-xl);
796
+ padding: 2.2em;
797
+ display: flex;
798
+ flex-direction: column;
799
+ align-items: center;
800
+ gap: 0.6em;
801
+ text-align: center;
802
+ color: var(--noteloom-text-muted);
803
+ }
804
+
805
+ .be-embed-dropzone-active {
806
+ border-color: var(--noteloom-accent);
807
+ background: var(--noteloom-accent-soft);
808
+ color: var(--noteloom-accent);
809
+ }
810
+
811
+ .be-embed-upload-btn {
812
+ background: var(--noteloom-accent);
813
+ color: var(--noteloom-accent-text);
814
+ border-radius: var(--noteloom-radius-md);
815
+ padding: 0.5em 1.1em;
816
+ cursor: pointer;
817
+ font-size: 0.85rem;
818
+ font-weight: 500;
819
+ }
820
+
821
+ .be-embed-upload-btn input {
822
+ display: none;
823
+ }
824
+
825
+ .be-embed-dropzone-hint {
826
+ font-size: 0.8rem;
827
+ color: var(--noteloom-text-faint);
828
+ }
829
+
830
+ .be-embed-url-row {
831
+ display: flex;
832
+ gap: 6px;
833
+ width: 100%;
834
+ max-width: 360px;
835
+ }
836
+
837
+ .be-embed-url-input {
838
+ flex: 1;
839
+ min-width: 0;
840
+ border: 1px solid var(--noteloom-border);
841
+ border-radius: var(--noteloom-radius-md);
842
+ padding: 0.45em 0.7em;
843
+ background: transparent;
844
+ color: inherit;
845
+ font: inherit;
846
+ font-size: 0.85rem;
847
+ outline: none;
848
+ }
849
+
850
+ .be-embed-url-input:focus {
851
+ border-color: var(--noteloom-accent);
852
+ }
853
+
854
+ .be-embed-url-commit {
855
+ border: none;
856
+ background: var(--noteloom-accent);
857
+ color: var(--noteloom-accent-text);
858
+ border-radius: var(--noteloom-radius-md);
859
+ padding: 0.45em 0.9em;
860
+ cursor: pointer;
861
+ font-size: 0.85rem;
862
+ font-weight: 500;
863
+ }
864
+
865
+ .be-embed-uploading {
866
+ font-size: 0.85rem;
867
+ color: var(--noteloom-text-muted);
868
+ }
869
+
870
+ .be-embed-upload-error {
871
+ display: flex;
872
+ align-items: center;
873
+ gap: 8px;
874
+ width: 100%;
875
+ max-width: 360px;
876
+ background: var(--noteloom-danger-soft);
877
+ color: var(--noteloom-danger);
878
+ border-radius: var(--noteloom-radius-md);
879
+ padding: 0.5em 0.7em;
880
+ font-size: 0.8rem;
881
+ text-align: left;
882
+ }
883
+
884
+ .be-embed-upload-error button {
885
+ margin-left: auto;
886
+ border: none;
887
+ background: transparent;
888
+ color: inherit;
889
+ cursor: pointer;
890
+ font-size: 1rem;
891
+ line-height: 1;
892
+ padding: 0 2px;
893
+ }
894
+
895
+ /* --- canvas (freehand drawing) --- */
896
+
897
+ .be-canvas {
898
+ position: relative;
899
+ display: inline-block;
900
+ margin: 0.6em 0;
901
+ line-height: 0; /* avoids extra inline-block whitespace gap below the <svg> */
902
+ }
903
+
904
+ .be-canvas-surface {
905
+ display: block;
906
+ border: 1px solid var(--noteloom-border);
907
+ border-radius: var(--noteloom-radius-lg);
908
+ background: var(--noteloom-bg);
909
+ max-width: 100%;
910
+ touch-action: none; /* the surface owns its own pointer gestures (drawing/panning), not the browser's default scroll/zoom */
911
+ }
912
+
913
+ .be-canvas-toolbar {
914
+ position: absolute;
915
+ top: 8px;
916
+ right: 8px;
917
+ z-index: 2;
918
+ display: flex;
919
+ flex-wrap: wrap;
920
+ justify-content: flex-end;
921
+ max-width: calc(100% - 16px);
922
+ align-items: center;
923
+ gap: 2px;
924
+ padding: 3px;
925
+ background: rgba(15, 23, 42, 0.72);
926
+ border-radius: var(--noteloom-radius-md);
927
+ opacity: 0;
928
+ transition: opacity 0.12s ease;
929
+ }
930
+
931
+ .be-canvas:hover .be-canvas-toolbar,
932
+ .be-canvas-toolbar:focus-within {
933
+ opacity: 1;
934
+ }
935
+
936
+ .be-canvas-toolbar-btn {
937
+ border: none;
938
+ background: transparent;
939
+ width: 28px;
940
+ height: 24px;
941
+ display: flex;
942
+ align-items: center;
943
+ justify-content: center;
944
+ color: rgba(255, 255, 255, 0.8);
945
+ border-radius: var(--noteloom-radius-sm);
946
+ cursor: pointer;
947
+ }
948
+
949
+ .be-canvas-toolbar-btn:hover {
950
+ background: rgba(255, 255, 255, 0.16);
951
+ color: #fff;
952
+ }
953
+
954
+ .be-canvas-toolbar-btn-active {
955
+ background: var(--noteloom-accent);
956
+ color: #fff;
957
+ }
958
+
959
+ .be-canvas-toolbar-btn:disabled {
960
+ opacity: 0.4;
961
+ cursor: default;
962
+ }
963
+
964
+ .be-canvas-toolbar-btn:disabled:hover {
965
+ background: transparent;
966
+ }
967
+
968
+ .be-canvas-zoom-label {
969
+ border: none;
970
+ background: transparent;
971
+ color: rgba(255, 255, 255, 0.8);
972
+ font-size: 0.75rem;
973
+ min-width: 2.8em;
974
+ padding: 0 2px;
975
+ cursor: pointer;
976
+ border-radius: var(--noteloom-radius-sm);
977
+ }
978
+
979
+ .be-canvas-zoom-label:hover {
980
+ background: rgba(255, 255, 255, 0.16);
981
+ color: #fff;
982
+ }
983
+
984
+ .be-canvas-toolbar-divider {
985
+ width: 1px;
986
+ height: 16px;
987
+ background: rgba(255, 255, 255, 0.24);
988
+ margin: 0 2px;
989
+ }
990
+
991
+ .be-canvas-toolbar-swatch {
992
+ border: 2px solid transparent;
993
+ width: 18px;
994
+ height: 18px;
995
+ border-radius: 50%;
996
+ cursor: pointer;
997
+ padding: 0;
998
+ }
999
+
1000
+ .be-canvas-toolbar-swatch-active {
1001
+ border-color: #fff;
1002
+ }
1003
+
1004
+ .be-canvas-picker-wrap {
1005
+ position: relative;
1006
+ }
1007
+
1008
+ .be-canvas-picker {
1009
+ position: absolute;
1010
+ top: 100%;
1011
+ right: 0;
1012
+ margin-top: 8px;
1013
+ display: flex;
1014
+ align-items: center;
1015
+ gap: 6px;
1016
+ padding: 8px;
1017
+ background: rgba(15, 23, 42, 0.92);
1018
+ border-radius: var(--noteloom-radius-md);
1019
+ z-index: 3;
1020
+ }
1021
+
1022
+ .be-canvas-shape-picker {
1023
+ flex-wrap: wrap;
1024
+ max-width: 132px;
1025
+ }
1026
+
1027
+ .be-canvas-color-trigger-dot {
1028
+ display: block;
1029
+ width: 14px;
1030
+ height: 14px;
1031
+ border-radius: 50%;
1032
+ border: 1px solid rgba(255, 255, 255, 0.6);
1033
+ }
1034
+
1035
+ .be-canvas-fill-trigger-dot {
1036
+ display: block;
1037
+ width: 14px;
1038
+ height: 14px;
1039
+ border-radius: 50%;
1040
+ border: 1px solid rgba(255, 255, 255, 0.6);
1041
+ }
1042
+
1043
+ .be-canvas-fill-trigger-dot-none,
1044
+ .be-canvas-fill-swatch-none {
1045
+ background: repeating-conic-gradient(rgba(255, 255, 255, 0.5) 0% 25%, transparent 0% 50%) 50% /
1046
+ 8px 8px;
1047
+ }
1048
+
1049
+ .be-canvas-custom-swatch {
1050
+ width: 18px;
1051
+ height: 18px;
1052
+ border-radius: 50%;
1053
+ overflow: hidden;
1054
+ border: 1px dashed rgba(255, 255, 255, 0.6);
1055
+ display: inline-flex;
1056
+ cursor: pointer;
1057
+ flex-shrink: 0;
1058
+ }
1059
+
1060
+ .be-canvas-custom-swatch input[type='color'] {
1061
+ width: 150%;
1062
+ height: 150%;
1063
+ margin: -25%;
1064
+ border: none;
1065
+ padding: 0;
1066
+ cursor: pointer;
1067
+ background: none;
1068
+ }
1069
+
1070
+ /* Live size-preview popover: dot grows/shrinks together with the slider as it's dragged. */
1071
+ .be-canvas-size-picker {
1072
+ min-width: 160px;
1073
+ }
1074
+
1075
+ .be-canvas-size-trigger-dot {
1076
+ display: block;
1077
+ border-radius: 50%;
1078
+ background: #fff;
1079
+ }
1080
+
1081
+ .be-canvas-size-preview {
1082
+ flex-shrink: 0;
1083
+ width: 44px;
1084
+ height: 44px;
1085
+ display: flex;
1086
+ align-items: center;
1087
+ justify-content: center;
1088
+ }
1089
+
1090
+ .be-canvas-size-preview-dot {
1091
+ display: block;
1092
+ border-radius: 50%;
1093
+ background: #fff;
1094
+ }
1095
+
1096
+ .be-canvas-size-slider {
1097
+ flex: 1;
1098
+ min-width: 80px;
1099
+ }
1100
+
1101
+ .be-canvas-font-size-trigger {
1102
+ display: block;
1103
+ font-size: 13px;
1104
+ font-weight: 600;
1105
+ line-height: 1;
1106
+ color: rgba(255, 255, 255, 0.85);
1107
+ }
1108
+
1109
+ .be-canvas-font-size-preview-letter {
1110
+ display: block;
1111
+ line-height: 1;
1112
+ color: #fff;
1113
+ font-weight: 600;
1114
+ }
1115
+
1116
+ .be-canvas-size-value {
1117
+ flex-shrink: 0;
1118
+ min-width: 2.5em;
1119
+ text-align: right;
1120
+ font-size: 0.8rem;
1121
+ color: rgba(255, 255, 255, 0.85);
1122
+ }
1123
+
1124
+ .be-canvas[data-tool='eraser'] .be-canvas-surface {
1125
+ cursor: cell;
1126
+ }
1127
+
1128
+ .be-canvas[data-tool='select'] .be-canvas-surface {
1129
+ cursor: default;
1130
+ }
1131
+
1132
+ .be-canvas-selection-box {
1133
+ stroke: var(--noteloom-accent);
1134
+ stroke-width: 1.5;
1135
+ stroke-dasharray: 6 4;
1136
+ vector-effect: non-scaling-stroke;
1137
+ pointer-events: none;
1138
+ }
1139
+
1140
+ .be-canvas-selection-handle {
1141
+ fill: #fff;
1142
+ stroke: var(--noteloom-accent);
1143
+ stroke-width: 1.5;
1144
+ vector-effect: non-scaling-stroke;
1145
+ pointer-events: none;
1146
+ }
1147
+
1148
+ .be-canvas-rotate-handle {
1149
+ fill: var(--noteloom-accent);
1150
+ stroke: #fff;
1151
+ stroke-width: 1.5;
1152
+ vector-effect: non-scaling-stroke;
1153
+ pointer-events: none;
1154
+ }
1155
+
1156
+ .be-canvas-marquee {
1157
+ fill: color-mix(in srgb, var(--noteloom-accent) 12%, transparent);
1158
+ stroke: var(--noteloom-accent);
1159
+ stroke-width: 1.5;
1160
+ stroke-dasharray: 6 4;
1161
+ vector-effect: non-scaling-stroke;
1162
+ pointer-events: none;
1163
+ }
1164
+
1165
+ .be-canvas-grid-background {
1166
+ pointer-events: none;
1167
+ }
1168
+
1169
+ .be-canvas-grid-dot {
1170
+ fill: rgba(255, 255, 255, 0.18);
1171
+ }
1172
+
1173
+ .be-canvas-text-editor {
1174
+ width: 100%;
1175
+ height: 100%;
1176
+ margin: 0;
1177
+ padding: 0;
1178
+ border: 1px dashed var(--noteloom-accent);
1179
+ outline: none;
1180
+ background: transparent;
1181
+ resize: none;
1182
+ overflow: hidden;
1183
+ line-height: 1.3;
1184
+ font-family: inherit;
1185
+ white-space: pre-wrap;
1186
+ word-break: break-word;
1187
+ }
1188
+
1189
+ .be-canvas-resize-handle {
1190
+ position: absolute;
1191
+ bottom: 4px;
1192
+ right: 4px;
1193
+ width: 12px;
1194
+ height: 12px;
1195
+ cursor: nwse-resize;
1196
+ border-radius: 2px;
1197
+ border: 1px solid #fff;
1198
+ background: var(--noteloom-accent);
1199
+ }
1200
+
1201
+ /* --- table --- */
1202
+
1203
+ .be-table-scroll {
1204
+ max-width: 100%;
1205
+ overflow-x: auto;
1206
+ }
1207
+
1208
+ .be-table-wrapper {
1209
+ margin: 0.9em 0;
1210
+ overflow-x: auto;
1211
+ border: 1px solid var(--noteloom-border);
1212
+ border-radius: var(--noteloom-radius-lg);
1213
+ width: max-content;
1214
+ }
1215
+
1216
+ .be-table {
1217
+ border-collapse: collapse;
1218
+ table-layout: fixed;
1219
+ /* Deliberately no width:100% — combined with table-layout:fixed and each
1220
+ column's own <col> width, that would make the browser redistribute
1221
+ leftover space proportionally across columns, fighting individual
1222
+ column resize (see be-table-col-resize-handle). */
1223
+ }
1224
+
1225
+ .be-table-header-row {
1226
+ background: var(--noteloom-bg-subtle);
1227
+ }
1228
+
1229
+ .be-table-header-cell {
1230
+ position: relative;
1231
+ border-bottom: 1px solid var(--noteloom-border);
1232
+ border-right: 1px solid var(--noteloom-border);
1233
+ padding: 6px 10px;
1234
+ }
1235
+
1236
+ .be-table-header-label {
1237
+ display: block;
1238
+ width: 100%;
1239
+ border: none;
1240
+ background: none;
1241
+ font: inherit;
1242
+ font-weight: 600;
1243
+ font-size: 0.78rem;
1244
+ color: var(--noteloom-text-muted);
1245
+ outline: none;
1246
+ overflow: hidden;
1247
+ text-overflow: ellipsis;
1248
+ white-space: nowrap;
1249
+ padding: 2px 0;
1250
+ }
1251
+
1252
+ .be-table-header-menu-trigger {
1253
+ position: absolute;
1254
+ right: 4px;
1255
+ top: 50%;
1256
+ transform: translateY(-50%);
1257
+ visibility: hidden;
1258
+ border: none;
1259
+ background: transparent;
1260
+ border-radius: var(--noteloom-radius-sm);
1261
+ padding: 2px;
1262
+ color: var(--noteloom-text-faint);
1263
+ cursor: pointer;
1264
+ }
1265
+
1266
+ .be-table-header-cell:hover .be-table-header-menu-trigger {
1267
+ visibility: visible;
1268
+ }
1269
+
1270
+ .be-table-header-menu-trigger:hover {
1271
+ background: var(--noteloom-bg-hover);
1272
+ }
1273
+
1274
+ .be-table-col-resize-handle {
1275
+ position: absolute;
1276
+ top: 0;
1277
+ right: -3px;
1278
+ width: 6px;
1279
+ height: 100%;
1280
+ cursor: col-resize;
1281
+ z-index: 1;
1282
+ }
1283
+
1284
+ .be-table-col-resize-handle:hover,
1285
+ .be-table-col-resize-handle:active {
1286
+ background: var(--noteloom-accent-soft-hover);
1287
+ }
1288
+
1289
+ .be-table-header-spacer {
1290
+ border-bottom: 1px solid var(--noteloom-border);
1291
+ }
1292
+
1293
+ .be-table-header-spacer-col {
1294
+ width: 32px;
1295
+ }
1296
+
1297
+ .be-table-header-menu {
1298
+ z-index: 1000;
1299
+ width: 224px;
1300
+ border-radius: var(--noteloom-radius-lg);
1301
+ border: 1px solid var(--noteloom-border);
1302
+ background: var(--noteloom-bg);
1303
+ padding: 4px;
1304
+ font-size: 0.88rem;
1305
+ box-shadow: var(--noteloom-shadow);
1306
+ }
1307
+
1308
+ .be-table-header-menu-options {
1309
+ z-index: 1000;
1310
+ padding: 4px;
1311
+ font-size: 0.88rem;
1312
+ border-bottom: 1px solid var(--noteloom-border);
1313
+ margin-bottom: 4px;
1314
+ }
1315
+
1316
+ .be-table-header-menu-field-type {
1317
+ display: flex;
1318
+ flex-direction: column;
1319
+ gap: 4px;
1320
+ padding: 4px;
1321
+ border-bottom: 1px solid var(--noteloom-border);
1322
+ margin-bottom: 4px;
1323
+ }
1324
+
1325
+ .be-table-header-menu-field-type .be-select {
1326
+ width: 100%;
1327
+ }
1328
+
1329
+ .be-table-header-menu-field-type .be-select-trigger {
1330
+ width: 100%;
1331
+ }
1332
+
1333
+ .be-table-header-menu-type {
1334
+ display: flex;
1335
+ flex-direction: row;
1336
+ justify-content: space-between;
1337
+ padding: 6px;
1338
+ border-bottom: 1px solid var(--noteloom-border);
1339
+ margin-bottom: 4px;
1340
+ }
1341
+
1342
+ .be-table-header-type-select {
1343
+ width: 100%;
1344
+ border: 1px solid var(--noteloom-border);
1345
+ border-radius: var(--noteloom-radius-sm);
1346
+ padding: 6px 8px;
1347
+ background: transparent;
1348
+ color: inherit;
1349
+ font: inherit;
1350
+ font-size: 0.85rem;
1351
+ }
1352
+
1353
+ .be-table-header-menu-item {
1354
+ display: flex;
1355
+ align-items: center;
1356
+ gap: 8px;
1357
+ width: 100%;
1358
+ text-align: left;
1359
+ border: none;
1360
+ border-radius: var(--noteloom-radius-sm);
1361
+ background: transparent;
1362
+ padding: 6px 10px;
1363
+ font: inherit;
1364
+ font-size: 0.88rem;
1365
+ color: var(--noteloom-text);
1366
+ cursor: pointer;
1367
+ }
1368
+
1369
+ .be-table-header-menu-item:hover {
1370
+ background: var(--noteloom-bg-hover);
1371
+ }
1372
+
1373
+ .be-table-header-menu-item-danger {
1374
+ color: var(--noteloom-danger);
1375
+ }
1376
+
1377
+ .be-table-header-menu-sort {
1378
+ display: flex;
1379
+ flex-direction: column;
1380
+ border-bottom: 1px solid var(--noteloom-border);
1381
+ margin-bottom: 4px;
1382
+ padding-bottom: 4px;
1383
+ }
1384
+
1385
+ .be-table-header-menu-filter {
1386
+ display: flex;
1387
+ flex-direction: column;
1388
+ gap: 4px;
1389
+ padding: 6px;
1390
+ border-bottom: 1px solid var(--noteloom-border);
1391
+ margin-bottom: 4px;
1392
+ font-size: 0.8rem;
1393
+ color: var(--noteloom-text-muted);
1394
+ }
1395
+
1396
+ .be-table-header-menu-filter-input {
1397
+ border: 1px solid var(--noteloom-border);
1398
+ border-radius: var(--noteloom-radius-sm);
1399
+ padding: 6px 8px;
1400
+ font: inherit;
1401
+ font-size: 0.85rem;
1402
+ color: var(--noteloom-text);
1403
+ background: transparent;
1404
+ }
1405
+
1406
+ .be-table-header-menu-filter-input:focus {
1407
+ outline: none;
1408
+ border-color: var(--noteloom-accent);
1409
+ }
1410
+
1411
+ .be-table-footer-row {
1412
+ border-top: 1px solid var(--noteloom-border);
1413
+ }
1414
+
1415
+ .be-table-footer-cell {
1416
+ padding: 6px 10px;
1417
+ font-size: 0.82rem;
1418
+ color: var(--noteloom-text-muted);
1419
+ white-space: nowrap;
1420
+ }
1421
+
1422
+ .be-table-footer-label {
1423
+ font-weight: 600;
1424
+ margin-right: 4px;
1425
+ }
1426
+
1427
+ .be-table-footer-spacer {
1428
+ padding: 0;
1429
+ }
1430
+
1431
+ .be-table-header-menu-item-danger:hover {
1432
+ background: var(--noteloom-danger-soft);
1433
+ }
1434
+
1435
+ .be-table-header-menu-options-label {
1436
+ font-size: 0.68rem;
1437
+ text-transform: uppercase;
1438
+ letter-spacing: 0.04em;
1439
+ font-weight: 600;
1440
+ color: var(--noteloom-text-faint);
1441
+ padding: 6px 8px 2px;
1442
+ }
1443
+
1444
+ .be-table-header-menu-option-row {
1445
+ display: flex;
1446
+ align-items: center;
1447
+ gap: 6px;
1448
+ padding: 2px 4px;
1449
+ }
1450
+
1451
+ .be-table-header-menu-option-swatch {
1452
+ width: 14px;
1453
+ height: 14px;
1454
+ border-radius: 50%;
1455
+ flex: none;
1456
+ }
1457
+
1458
+ .be-table-header-menu-option-input {
1459
+ flex: 1;
1460
+ min-width: 0;
1461
+ border: none;
1462
+ background: transparent;
1463
+ color: inherit;
1464
+ font: inherit;
1465
+ font-size: 0.85rem;
1466
+ padding: 4px 6px;
1467
+ border-radius: var(--noteloom-radius-sm);
1468
+ outline: none;
1469
+ }
1470
+
1471
+ .be-table-header-menu-option-input:focus {
1472
+ background: var(--noteloom-bg-hover);
1473
+ }
1474
+
1475
+ .be-table-header-menu-option-remove,
1476
+ .be-table-header-menu-option-add {
1477
+ flex: none;
1478
+ border: none;
1479
+ background: transparent;
1480
+ color: var(--noteloom-text-faint);
1481
+ cursor: pointer;
1482
+ padding: 3px;
1483
+ display: flex;
1484
+ align-items: center;
1485
+ justify-content: center;
1486
+ border-radius: var(--noteloom-radius-sm);
1487
+ }
1488
+
1489
+ .be-table-header-menu-option-remove:hover {
1490
+ background: var(--noteloom-danger-soft);
1491
+ color: var(--noteloom-danger);
1492
+ }
1493
+
1494
+ .be-table-header-menu-option-add {
1495
+ color: var(--noteloom-text-muted);
1496
+ }
1497
+
1498
+ .be-table-header-menu-option-add:hover {
1499
+ background: var(--noteloom-bg-hover);
1500
+ }
1501
+
1502
+ .be-table-row:hover {
1503
+ background: var(--noteloom-bg-subtle);
1504
+ }
1505
+
1506
+ .be-table-cell {
1507
+ border-bottom: 1px solid var(--noteloom-border);
1508
+ border-right: 1px solid var(--noteloom-border);
1509
+ padding: 6px 10px;
1510
+ vertical-align: top;
1511
+ outline: none;
1512
+ font-size: 0.92rem;
1513
+ /* table-layout: fixed already keeps the COLUMN width from growing to fit
1514
+ content — this is what stops a long unbroken string (a URL, one giant
1515
+ word) from visually overflowing past that fixed width instead of
1516
+ wrapping onto a new line within the cell. */
1517
+ max-width: 0;
1518
+ overflow-wrap: anywhere;
1519
+ word-break: break-word;
1520
+ }
1521
+
1522
+ .be-table-cell:focus-within {
1523
+ box-shadow: inset 0 0 0 2px var(--noteloom-accent);
1524
+ border-radius: 2px;
1525
+ }
1526
+
1527
+ .be-table-row-actions {
1528
+ width: 32px;
1529
+ text-align: center;
1530
+ vertical-align: middle;
1531
+ border: none;
1532
+ background: transparent;
1533
+ padding: 0;
1534
+ }
1535
+
1536
+ .be-table-delete-row {
1537
+ visibility: hidden;
1538
+ border: none;
1539
+ background: transparent;
1540
+ color: var(--noteloom-text-faint);
1541
+ cursor: pointer;
1542
+ width: 24px;
1543
+ height: 24px;
1544
+ display: inline-flex;
1545
+ align-items: center;
1546
+ justify-content: center;
1547
+ border-radius: var(--noteloom-radius-sm);
1548
+ }
1549
+
1550
+ tr.be-table-row:hover .be-table-delete-row {
1551
+ visibility: visible;
1552
+ }
1553
+
1554
+ .be-table-delete-row:hover {
1555
+ background: var(--noteloom-danger-soft);
1556
+ color: var(--noteloom-danger);
1557
+ }
1558
+
1559
+ .be-table-add-row {
1560
+ display: block;
1561
+ width: 100%;
1562
+ border: none;
1563
+ background: transparent;
1564
+ text-align: left;
1565
+ padding: 8px 12px;
1566
+ color: var(--noteloom-text-faint);
1567
+ cursor: pointer;
1568
+ font: inherit;
1569
+ font-size: 0.85rem;
1570
+ font-weight: 500;
1571
+ }
1572
+
1573
+ .be-table-add-row:hover {
1574
+ background: var(--noteloom-bg-subtle);
1575
+ color: var(--noteloom-accent);
1576
+ }
1577
+
1578
+ .be-inline-table-select {
1579
+ display: block;
1580
+ }
1581
+
1582
+ .be-inline-table-select .be-select {
1583
+ width: 100%;
1584
+ }
1585
+
1586
+ .be-inline-table-select .be-select .be-select-tag {
1587
+ width: -webkit-fill-available;
1588
+ }
1589
+
1590
+ .be-inline-table-select .be-select-trigger {
1591
+ display: flex;
1592
+ width: 100%;
1593
+ min-width: 0;
1594
+ min-height: 0;
1595
+ border: none;
1596
+ border-radius: var(--noteloom-radius-sm);
1597
+ background: transparent;
1598
+ padding: 0;
1599
+ font: inherit;
1600
+ font-size: 0.92rem;
1601
+ }
1602
+
1603
+ .be-inline-table-select .be-select-trigger:hover,
1604
+ .be-inline-table-select .be-select-trigger[aria-expanded='true'] {
1605
+ background: var(--noteloom-bg-hover);
1606
+ box-shadow: none;
1607
+ }
1608
+
1609
+ /* --- per-block hover gutter (+ / drag-handle / menu) --- */
1610
+
1611
+ .be-block-row {
1612
+ position: relative;
1613
+ }
1614
+
1615
+ .be-block-row-hidden {
1616
+ opacity: 0.4;
1617
+ }
1618
+
1619
+ .be-block-gutter {
1620
+ position: absolute;
1621
+ left: -56px;
1622
+ top: 0.15em;
1623
+ display: flex;
1624
+ gap: 2px;
1625
+ opacity: 0;
1626
+ transition: opacity 0.1s ease;
1627
+ user-select: none; /* it's a drag handle (see useBlockRangeDrag) — never let its own space become selectable text */
1628
+ }
1629
+
1630
+ /* \`left\`/\`right\` are physical, not logical, properties — unlike the list
1631
+ marker's flexbox position (which flips for free via dir inheritance),
1632
+ this absolute offset needs an explicit RTL override to sit on the
1633
+ correct side of the block. */
1634
+ [dir='rtl'] .be-block-gutter {
1635
+ left: auto;
1636
+ right: -56px;
1637
+ }
1638
+
1639
+ .be-block-row:hover .be-block-gutter,
1640
+ .be-block-gutter-active {
1641
+ opacity: 1;
1642
+ }
1643
+
1644
+ .be-block-gutter-btn {
1645
+ display: flex;
1646
+ align-items: center;
1647
+ justify-content: center;
1648
+ width: 24px;
1649
+ height: 24px;
1650
+ border: none;
1651
+ border-radius: var(--noteloom-radius-sm);
1652
+ background: transparent;
1653
+ color: var(--noteloom-text-faint);
1654
+ cursor: pointer;
1655
+ transition:
1656
+ background-color 0.12s ease,
1657
+ color 0.12s ease;
1658
+ }
1659
+
1660
+ /* Touch: no hover state exists to reveal the gutter at all, and its
1661
+ desktop position (left: -56px, sitting in the page's own side margin)
1662
+ would be off-screen on a narrow phone/tablet viewport regardless — so
1663
+ rather than force it into the row itself, its two actions (Add block,
1664
+ block options menu) live inside MobileActionBar instead (see
1665
+ MobileActionBar.jsx), pinned above the keyboard where they're always
1666
+ reachable. \`.be-touch-input\` is set by useCoarsePointer.js, based on
1667
+ real pointerdown activity, not just a static device-capability guess —
1668
+ see that file for why a plain \`pointer: coarse\` media query alone isn't
1669
+ enough (touchscreen laptops, etc.). */
1670
+ .be-touch-input .be-block-gutter {
1671
+ display: none;
1672
+ }
1673
+
1674
+ .be-block-gutter-btn:hover,
1675
+ .be-block-gutter-btn[aria-expanded='true'] {
1676
+ background: var(--noteloom-bg-hover);
1677
+ color: var(--noteloom-text);
1678
+ }
1679
+
1680
+ .be-block-gutter-menu,
1681
+ .be-block-range-menu {
1682
+ z-index: 1000;
1683
+ min-width: 200px;
1684
+ background: var(--noteloom-bg);
1685
+ border: 1px solid var(--noteloom-border);
1686
+ border-radius: var(--noteloom-radius-lg);
1687
+ box-shadow: var(--noteloom-shadow);
1688
+ padding: 4px;
1689
+ }
1690
+
1691
+ .be-block-gutter-menu-item,
1692
+ .be-block-range-menu-item {
1693
+ display: flex;
1694
+ align-items: center;
1695
+ gap: 8px;
1696
+ width: 100%;
1697
+ text-align: left;
1698
+ border: none;
1699
+ border-radius: var(--noteloom-radius-sm);
1700
+ background: transparent;
1701
+ padding: 7px 10px;
1702
+ font: inherit;
1703
+ font-size: 0.88rem;
1704
+ color: var(--noteloom-text);
1705
+ cursor: pointer;
1706
+ }
1707
+
1708
+ .be-block-gutter-menu-item:hover,
1709
+ .be-block-range-menu-item:hover {
1710
+ background: var(--noteloom-bg-hover);
1711
+ }
1712
+
1713
+ .be-block-gutter-menu-item-danger,
1714
+ .be-block-range-menu-item-danger {
1715
+ color: var(--noteloom-danger);
1716
+ }
1717
+
1718
+ .be-block-gutter-menu-item-danger:hover,
1719
+ .be-block-range-menu-item-danger:hover {
1720
+ background: var(--noteloom-danger-soft);
1721
+ }
1722
+
1723
+ /* --- drag-in-the-margin block range selection --- */
1724
+
1725
+ .be-block-row-range-selected {
1726
+ background: var(--noteloom-accent-soft);
1727
+ border-radius: var(--noteloom-radius-md);
1728
+ margin: 0 -8px;
1729
+ padding: 0 8px;
1730
+ }
1731
+
1732
+ .be-block-range-dragging,
1733
+ .be-block-range-dragging * {
1734
+ user-select: none !important;
1735
+ }
1736
+
1737
+ /* --- whole-document select-all / single non-editable block selected --- */
1738
+
1739
+ .be-surface--all-selected .be-block-row-content > [data-block-id] {
1740
+ background: var(--noteloom-accent-soft);
1741
+ border-radius: var(--noteloom-radius-sm);
1742
+ }
1743
+
1744
+ .be-block-selected {
1745
+ outline: 2px solid var(--noteloom-accent);
1746
+ outline-offset: 2px;
1747
+ border-radius: var(--noteloom-radius-sm);
1748
+ }
1749
+
1750
+ /* --- document export (view source) --- */
1751
+
1752
+ .be-export-trigger {
1753
+ display: inline-flex;
1754
+ align-items: center;
1755
+ gap: 6px;
1756
+ border: 1px solid var(--noteloom-border);
1757
+ background: var(--noteloom-bg);
1758
+ color: var(--noteloom-text-muted);
1759
+ border-radius: var(--noteloom-radius-sm);
1760
+ padding: 5px 10px;
1761
+ font-size: 0.85rem;
1762
+ cursor: pointer;
1763
+ }
1764
+
1765
+ .be-export-trigger:hover {
1766
+ background: var(--noteloom-bg-hover);
1767
+ color: var(--noteloom-text);
1768
+ }
1769
+
1770
+ .be-export-tabs {
1771
+ display: flex;
1772
+ gap: 4px;
1773
+ margin-bottom: 10px;
1774
+ border-bottom: 1px solid var(--noteloom-border);
1775
+ }
1776
+
1777
+ .be-export-tab {
1778
+ border: none;
1779
+ background: transparent;
1780
+ color: var(--noteloom-text-muted);
1781
+ padding: 6px 10px;
1782
+ margin-bottom: -1px;
1783
+ border-bottom: 2px solid transparent;
1784
+ font-size: 0.85rem;
1785
+ font-weight: 500;
1786
+ cursor: pointer;
1787
+ }
1788
+
1789
+ .be-export-tab:hover {
1790
+ color: var(--noteloom-text);
1791
+ }
1792
+
1793
+ .be-export-tab-active {
1794
+ color: var(--noteloom-accent);
1795
+ border-bottom-color: var(--noteloom-accent);
1796
+ }
1797
+
1798
+ .be-export-pre {
1799
+ max-height: 50vh;
1800
+ overflow: auto;
1801
+ margin: 0;
1802
+ padding: 0.9em 1em;
1803
+ border-radius: var(--noteloom-radius-md);
1804
+ background: var(--noteloom-code-bg);
1805
+ color: var(--noteloom-code-text);
1806
+ font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace;
1807
+ font-size: 0.8rem;
1808
+ line-height: 1.5;
1809
+ white-space: pre-wrap;
1810
+ overflow-wrap: anywhere;
1811
+ }
1812
+
1813
+ /* --- trailing click-to-continue space --- */
1814
+
1815
+ .be-trailing-space {
1816
+ cursor: text;
1817
+ width: 100%;
1818
+ min-height: 180px;
1819
+ }
1820
+
1821
+ /* --- modal (button editor, field type editor) --- */
1822
+
1823
+ .be-modal-overlay {
1824
+ position: fixed;
1825
+ inset: 0;
1826
+ background: rgba(15, 23, 42, 0.45);
1827
+ display: flex;
1828
+ align-items: center;
1829
+ justify-content: center;
1830
+ z-index: 2000;
1831
+ padding: 1em;
1832
+ }
1833
+
1834
+ .be-modal {
1835
+ background: var(--noteloom-bg);
1836
+ color: var(--noteloom-text);
1837
+ border-radius: var(--noteloom-radius-xl);
1838
+ border: 1px solid var(--noteloom-border);
1839
+ padding: 1.4em;
1840
+ width: 100%;
1841
+ max-width: 380px;
1842
+ max-height: 85vh;
1843
+ overflow-y: auto;
1844
+ box-shadow: var(--noteloom-shadow);
1845
+ }
1846
+
1847
+ .be-modal-large {
1848
+ max-width: 640px;
1849
+ }
1850
+
1851
+ /* Bottom sheet variant (mobile block picker) — anchored to the bottom edge
1852
+ instead of centered, rounded only on top, full page width. */
1853
+ .be-modal-overlay-sheet {
1854
+ align-items: flex-end;
1855
+ padding: 0;
1856
+ }
1857
+
1858
+ .be-modal-sheet {
1859
+ max-width: 100%;
1860
+ width: 100%;
1861
+ max-height: 70vh;
1862
+ border-radius: var(--noteloom-radius-xl) var(--noteloom-radius-xl) 0 0;
1863
+ border-bottom: none;
1864
+ padding-bottom: max(1.4em, env(safe-area-inset-bottom));
1865
+ }
1866
+
1867
+ .be-mobile-picker-list {
1868
+ display: flex;
1869
+ flex-direction: column;
1870
+ gap: 2px;
1871
+ }
1872
+
1873
+ .be-mobile-picker-item {
1874
+ display: flex;
1875
+ align-items: center;
1876
+ gap: 10px;
1877
+ width: 100%;
1878
+ border: none;
1879
+ background: transparent;
1880
+ border-radius: var(--noteloom-radius-md);
1881
+ padding: 12px 10px;
1882
+ font: inherit;
1883
+ font-size: 0.95rem;
1884
+ color: var(--noteloom-text);
1885
+ text-align: left;
1886
+ cursor: pointer;
1887
+ }
1888
+
1889
+ .be-mobile-picker-item:hover,
1890
+ .be-mobile-picker-item:active {
1891
+ background: var(--noteloom-bg-hover);
1892
+ }
1893
+
1894
+ .be-mobile-picker-item-danger {
1895
+ color: var(--noteloom-danger);
1896
+ }
1897
+
1898
+ .be-mobile-picker-item-danger:hover,
1899
+ .be-mobile-picker-item-danger:active {
1900
+ background: var(--noteloom-danger-soft);
1901
+ }
1902
+
1903
+ .be-mobile-picker-item-danger .be-mobile-picker-item-icon {
1904
+ color: var(--noteloom-danger);
1905
+ }
1906
+
1907
+ /* --- template picker (see TemplatePicker.jsx) --- */
1908
+
1909
+ .be-template-picker {
1910
+ list-style: none;
1911
+ margin: 0;
1912
+ padding: 0;
1913
+ display: flex;
1914
+ flex-direction: column;
1915
+ gap: 6px;
1916
+ }
1917
+
1918
+ .be-template-picker-empty {
1919
+ color: var(--noteloom-text-faint);
1920
+ font-size: 0.88rem;
1921
+ }
1922
+
1923
+ .be-template-card {
1924
+ display: flex;
1925
+ align-items: center;
1926
+ justify-content: space-between;
1927
+ gap: 12px;
1928
+ padding: 10px 12px;
1929
+ border: 1px solid var(--noteloom-border);
1930
+ border-radius: var(--noteloom-radius-md);
1931
+ background: var(--noteloom-bg);
1932
+ }
1933
+
1934
+ .be-template-card-body {
1935
+ display: flex;
1936
+ flex-direction: column;
1937
+ gap: 2px;
1938
+ min-width: 0;
1939
+ }
1940
+
1941
+ .be-template-card-name {
1942
+ font-weight: 600;
1943
+ font-size: 0.92rem;
1944
+ color: var(--noteloom-text);
1945
+ }
1946
+
1947
+ .be-template-card-description {
1948
+ font-size: 0.82rem;
1949
+ color: var(--noteloom-text-muted);
1950
+ }
1951
+
1952
+ .be-template-card-select {
1953
+ flex: none;
1954
+ border: 1px solid var(--noteloom-border);
1955
+ background: var(--noteloom-bg-subtle);
1956
+ color: var(--noteloom-text);
1957
+ border-radius: var(--noteloom-radius-sm);
1958
+ padding: 5px 12px;
1959
+ font-size: 0.85rem;
1960
+ font-weight: 500;
1961
+ cursor: pointer;
1962
+ }
1963
+
1964
+ .be-template-card-select:hover {
1965
+ background: var(--noteloom-bg-hover);
1966
+ }
1967
+
1968
+ /* --- mobile action bar (pinned above the on-screen keyboard) --- */
1969
+
1970
+ .be-mobile-action-bar {
1971
+ position: fixed;
1972
+ left: 0;
1973
+ right: 0;
1974
+ z-index: 1500;
1975
+ display: flex;
1976
+ align-items: center;
1977
+ gap: 2px;
1978
+ padding: 6px calc(6px + env(safe-area-inset-right)) 6px calc(6px + env(safe-area-inset-left));
1979
+ background: var(--noteloom-bg);
1980
+ border-top: 1px solid var(--noteloom-border);
1981
+ overflow-x: auto;
1982
+ }
1983
+
1984
+ .be-mobile-bar-btn {
1985
+ flex: none;
1986
+ display: flex;
1987
+ align-items: center;
1988
+ justify-content: center;
1989
+ gap: 4px;
1990
+ min-width: 40px;
1991
+ height: 40px;
1992
+ padding: 0 10px;
1993
+ border: none;
1994
+ background: transparent;
1995
+ border-radius: var(--noteloom-radius-sm);
1996
+ color: var(--noteloom-text);
1997
+ font-size: 0.85rem;
1998
+ font-weight: 500;
1999
+ cursor: pointer;
2000
+ }
2001
+
2002
+ .be-mobile-bar-btn:disabled {
2003
+ opacity: 0.4;
2004
+ }
2005
+
2006
+ .be-mobile-bar-btn-active {
2007
+ background: var(--noteloom-accent-soft);
2008
+ color: var(--noteloom-accent);
2009
+ }
2010
+
2011
+ .be-mobile-bar-spacer {
2012
+ flex: 1;
2013
+ }
2014
+
2015
+ .be-mobile-bar-select {
2016
+ flex: none;
2017
+ }
2018
+
2019
+ .be-mobile-bar-swatches {
2020
+ display: flex;
2021
+ align-items: center;
2022
+ gap: 6px;
2023
+ padding: 0 6px;
2024
+ }
2025
+
2026
+ .be-mobile-picker-item-icon {
2027
+ flex: none;
2028
+ display: flex;
2029
+ align-items: center;
2030
+ justify-content: center;
2031
+ width: 32px;
2032
+ height: 32px;
2033
+ border-radius: var(--noteloom-radius-sm);
2034
+ background: var(--noteloom-bg-subtle);
2035
+ color: var(--noteloom-text-muted);
2036
+ }
2037
+
2038
+ .be-modal-title {
2039
+ font-weight: 600;
2040
+ font-size: 1.05rem;
2041
+ margin-bottom: 1em;
2042
+ }
2043
+
2044
+ .be-modal-field {
2045
+ display: block;
2046
+ margin-bottom: 1em;
2047
+ }
2048
+
2049
+ .be-modal-field > span {
2050
+ display: block;
2051
+ font-size: 0.8rem;
2052
+ color: var(--noteloom-text-muted);
2053
+ margin-bottom: 5px;
2054
+ }
2055
+
2056
+ .be-modal-field input[type='text'],
2057
+ .be-modal-field input[type='url'] {
2058
+ width: 100%;
2059
+ box-sizing: border-box;
2060
+ border: 1px solid var(--noteloom-border);
2061
+ border-radius: var(--noteloom-radius-md);
2062
+ padding: 0.55em 0.75em;
2063
+ background: transparent;
2064
+ color: inherit;
2065
+ font: inherit;
2066
+ outline: none;
2067
+ }
2068
+
2069
+ .be-modal-field input[type='text']:focus,
2070
+ .be-modal-field input[type='url']:focus {
2071
+ border-color: var(--noteloom-accent);
2072
+ }
2073
+
2074
+ .be-modal-field select {
2075
+ width: 100%;
2076
+ box-sizing: border-box;
2077
+ border: 1px solid var(--noteloom-border);
2078
+ border-radius: var(--noteloom-radius-md);
2079
+ padding: 0.55em 0.75em;
2080
+ background: transparent;
2081
+ color: inherit;
2082
+ font: inherit;
2083
+ font-size: 0.9rem;
2084
+ }
2085
+
2086
+ .be-modal-field select:focus {
2087
+ border-color: var(--noteloom-accent);
2088
+ }
2089
+
2090
+ .be-modal-field-checkbox {
2091
+ display: flex;
2092
+ align-items: center;
2093
+ gap: 0.5em;
2094
+ }
2095
+
2096
+ .be-modal-field-checkbox > span {
2097
+ font-size: 0.85rem;
2098
+ color: var(--noteloom-text);
2099
+ }
2100
+
2101
+ .be-modal-color-row {
2102
+ display: flex;
2103
+ gap: 8px;
2104
+ flex-wrap: wrap;
2105
+ }
2106
+
2107
+ .be-modal-color-swatch {
2108
+ width: 26px;
2109
+ height: 26px;
2110
+ border-radius: 50%;
2111
+ border: 2px solid transparent;
2112
+ cursor: pointer;
2113
+ }
2114
+
2115
+ .be-modal-color-swatch-active {
2116
+ border-color: var(--noteloom-accent);
2117
+ box-shadow:
2118
+ 0 0 0 2px var(--noteloom-bg),
2119
+ 0 0 0 4px var(--noteloom-accent-soft);
2120
+ }
2121
+
2122
+ .be-modal-attr-row {
2123
+ display: flex;
2124
+ gap: 6px;
2125
+ margin-bottom: 6px;
2126
+ align-items: center;
2127
+ }
2128
+
2129
+ .be-modal-attr-row input {
2130
+ flex: 1;
2131
+ min-width: 0;
2132
+ border: 1px solid var(--noteloom-border);
2133
+ border-radius: var(--noteloom-radius-sm);
2134
+ padding: 0.4em 0.6em;
2135
+ background: transparent;
2136
+ color: inherit;
2137
+ font: inherit;
2138
+ font-size: 0.85rem;
2139
+ }
2140
+
2141
+ .be-modal-attr-remove {
2142
+ flex: none;
2143
+ border: none;
2144
+ background: none;
2145
+ color: var(--noteloom-text-faint);
2146
+ cursor: pointer;
2147
+ padding: 2px;
2148
+ border-radius: var(--noteloom-radius-sm);
2149
+ }
2150
+
2151
+ .be-modal-attr-remove:hover {
2152
+ color: var(--noteloom-danger);
2153
+ }
2154
+
2155
+ .be-modal-actions {
2156
+ display: flex;
2157
+ justify-content: flex-end;
2158
+ gap: 8px;
2159
+ margin-top: 20px;
2160
+ }
2161
+
2162
+ .be-modal-delete {
2163
+ margin-right: auto; /* pushes Cancel/Save to the right, Delete stays on its own at the left */
2164
+ }
2165
+
2166
+ .be-modal-cancel,
2167
+ .be-modal-save,
2168
+ .be-modal-delete,
2169
+ .be-export-download {
2170
+ border: none;
2171
+ border-radius: var(--noteloom-radius-md);
2172
+ padding: 7px 16px;
2173
+ font-size: 0.85rem;
2174
+ font-weight: 500;
2175
+ cursor: pointer;
2176
+ }
2177
+
2178
+ .be-export-download {
2179
+ background: var(--noteloom-bg-subtle);
2180
+ color: var(--noteloom-text);
2181
+ }
2182
+
2183
+ .be-export-download:hover {
2184
+ background: var(--noteloom-bg-hover);
2185
+ }
2186
+
2187
+ .be-modal-delete {
2188
+ background: var(--noteloom-danger-soft);
2189
+ color: var(--noteloom-danger);
2190
+ }
2191
+
2192
+ .be-modal-cancel {
2193
+ background: var(--noteloom-bg-subtle);
2194
+ color: var(--noteloom-text);
2195
+ }
2196
+
2197
+ .be-modal-cancel:hover {
2198
+ background: var(--noteloom-bg-hover);
2199
+ }
2200
+
2201
+ .be-modal-save {
2202
+ background: var(--noteloom-accent);
2203
+ color: var(--noteloom-accent-text);
2204
+ }
2205
+
2206
+ .be-modal-save:hover {
2207
+ opacity: 0.9;
2208
+ }
2209
+
2210
+ .be-modal-save:disabled {
2211
+ opacity: 0.5;
2212
+ cursor: not-allowed;
2213
+ }
2214
+
2215
+ /* --- slash ("/") / emoji (":") / mention ("@") command menu --- */
2216
+
2217
+ .be-slash-menu {
2218
+ z-index: 1000;
2219
+ width: 260px;
2220
+ max-height: 320px;
2221
+ overflow-y: auto;
2222
+ background: var(--noteloom-bg);
2223
+ border: 1px solid var(--noteloom-border);
2224
+ border-radius: var(--noteloom-radius-lg);
2225
+ box-shadow: var(--noteloom-shadow);
2226
+ padding: 6px;
2227
+ }
2228
+
2229
+ .be-slash-menu-item {
2230
+ display: flex;
2231
+ align-items: center;
2232
+ gap: 10px;
2233
+ padding: 7px 8px;
2234
+ border-radius: var(--noteloom-radius-md);
2235
+ cursor: pointer;
2236
+ font-size: 0.9rem;
2237
+ color: var(--noteloom-text);
2238
+ }
2239
+
2240
+ .be-slash-menu-item-active,
2241
+ .be-slash-menu-item:hover {
2242
+ background: var(--noteloom-accent-soft);
2243
+ }
2244
+
2245
+ .be-slash-menu-item-icon {
2246
+ flex: none;
2247
+ display: flex;
2248
+ align-items: center;
2249
+ justify-content: center;
2250
+ width: 28px;
2251
+ height: 28px;
2252
+ border-radius: var(--noteloom-radius-sm);
2253
+ border: 1px solid var(--noteloom-border);
2254
+ color: var(--noteloom-text-muted);
2255
+ }
2256
+
2257
+ .be-slash-menu-item-label {
2258
+ flex: 1;
2259
+ overflow: hidden;
2260
+ text-overflow: ellipsis;
2261
+ white-space: nowrap;
2262
+ }
2263
+
2264
+ /* --- searchable Select (inline select/date/checkbox widgets, custom field types, table column type) --- */
2265
+
2266
+ .be-select {
2267
+ display: inline-flex;
2268
+ }
2269
+
2270
+ .be-select-trigger {
2271
+ display: inline-flex;
2272
+ align-items: center;
2273
+ gap: 6px;
2274
+ min-height: 28px;
2275
+ min-width: 6em;
2276
+ border: 1px solid var(--noteloom-border);
2277
+ border-radius: var(--noteloom-radius-md);
2278
+ background: var(--noteloom-bg);
2279
+ color: var(--noteloom-text);
2280
+ font: inherit;
2281
+ font-size: 0.88rem;
2282
+ padding: 4px 8px;
2283
+ cursor: pointer;
2284
+ }
2285
+
2286
+ .be-select-trigger:hover {
2287
+ border-color: var(--noteloom-accent);
2288
+ }
2289
+
2290
+ .be-select-trigger[aria-expanded='true'] {
2291
+ border-color: var(--noteloom-accent);
2292
+ box-shadow: 0 0 0 2px var(--noteloom-accent-soft);
2293
+ }
2294
+
2295
+ .be-select-trigger-tag {
2296
+ min-width: 0;
2297
+ min-height: 0;
2298
+ border: none;
2299
+ background: transparent;
2300
+ padding: 2px;
2301
+ border-radius: var(--noteloom-radius-sm);
2302
+ outline: none;
2303
+ border: none;
2304
+ }
2305
+
2306
+ .be-select-trigger-tag:hover {
2307
+ background: var(--noteloom-bg-hover);
2308
+ }
2309
+
2310
+ .be-select-trigger-tag[aria-expanded='true'] {
2311
+ background: var(--noteloom-bg-hover);
2312
+ box-shadow: none;
2313
+ }
2314
+
2315
+ .be-select-value-placeholder {
2316
+ color: var(--noteloom-text-faint);
2317
+ }
2318
+
2319
+ .be-select-tag {
2320
+ display: inline-flex;
2321
+ flex: none;
2322
+ max-width: 100%;
2323
+ padding: 2px 9px;
2324
+ border-radius: var(--noteloom-radius-sm);
2325
+ font-size: 0.82em;
2326
+ font-weight: 500;
2327
+ line-height: 1.4;
2328
+ /* Wraps rather than truncates — a fixed-width popover (see
2329
+ .be-select-popover) or table cell (see .be-table-cell) combined with
2330
+ nowrap+ellipsis let long option text silently overflow its box
2331
+ instead of actually being clipped; wrapping sidesteps that entirely. */
2332
+ white-space: normal;
2333
+ overflow-wrap: anywhere;
2334
+ word-break: break-word;
2335
+ }
2336
+
2337
+ .be-select-value {
2338
+ flex: 1;
2339
+ text-align: left;
2340
+ overflow: hidden;
2341
+ text-overflow: ellipsis;
2342
+ white-space: nowrap;
2343
+ }
2344
+
2345
+ .be-select-chevron {
2346
+ flex: none;
2347
+ color: var(--noteloom-text-faint);
2348
+ }
2349
+
2350
+ .be-select-popover {
2351
+ z-index: 1000;
2352
+ width: 224px;
2353
+ background: var(--noteloom-bg);
2354
+ border: 1px solid var(--noteloom-border);
2355
+ border-radius: var(--noteloom-radius-lg);
2356
+ box-shadow: var(--noteloom-shadow);
2357
+ overflow: hidden;
2358
+ }
2359
+
2360
+ .be-select-search {
2361
+ display: block;
2362
+ width: 100%;
2363
+ box-sizing: border-box;
2364
+ border: none;
2365
+ border-bottom: 1px solid var(--noteloom-border);
2366
+ background: transparent;
2367
+ color: inherit;
2368
+ padding: 10px 12px;
2369
+ font: inherit;
2370
+ font-size: 0.88rem;
2371
+ outline: none;
2372
+ }
2373
+
2374
+ .be-select-options {
2375
+ max-height: 220px;
2376
+ overflow-y: auto;
2377
+ overflow-x: hidden;
2378
+ padding: 4px;
2379
+ }
2380
+
2381
+ .be-select-option {
2382
+ display: flex;
2383
+ align-items: center;
2384
+ min-width: 0;
2385
+ padding: 7px 8px;
2386
+ border-radius: var(--noteloom-radius-sm);
2387
+ cursor: pointer;
2388
+ font-size: 0.88rem;
2389
+ color: var(--noteloom-text);
2390
+ }
2391
+
2392
+ /* A tag-variant option list (colored pills — e.g. Priority/Assignee) must
2393
+ read at the exact same size/weight as a plain default-variant list
2394
+ (Diagnosis) — only the colored-chip background should differ between
2395
+ them, not the typography. .be-select-tag's own font-size/weight (sized
2396
+ down for when it's squeezed into a trigger button) would otherwise make
2397
+ tag-variant options look smaller/bolder than plain ones for no reason. */
2398
+ .be-select-option .be-select-tag {
2399
+ font-size: inherit;
2400
+ font-weight: inherit;
2401
+ line-height: inherit;
2402
+ width: -webkit-fill-available;
2403
+ }
2404
+
2405
+ .be-select-option-active {
2406
+ background: var(--noteloom-accent-soft);
2407
+ }
2408
+
2409
+ .be-select-option-selected {
2410
+ font-weight: 600;
2411
+ }
2412
+
2413
+ .be-select-option-selected:not(.be-select-option-active) {
2414
+ background: var(--noteloom-bg-subtle);
2415
+ }
2416
+
2417
+ .be-select-option-selected .be-select-tag {
2418
+ font-weight: 500;
2419
+ box-shadow: inset 0 0 0 1.5px rgba(0, 0, 0, 0.2);
2420
+ }
2421
+
2422
+ .be-select-empty {
2423
+ padding: 10px 12px;
2424
+ color: var(--noteloom-text-faint);
2425
+ font-size: 0.85rem;
2426
+ text-align: center;
2427
+ }
2428
+
2429
+ .be-select-error {
2430
+ color: var(--noteloom-danger);
2431
+ }
2432
+
2433
+ .be-select-manage-options {
2434
+ display: block;
2435
+ width: 100%;
2436
+ box-sizing: border-box;
2437
+ border: none;
2438
+ border-top: 1px solid var(--noteloom-border);
2439
+ background: transparent;
2440
+ padding: 9px 12px;
2441
+ font: inherit;
2442
+ font-size: 0.82rem;
2443
+ font-weight: 500;
2444
+ color: var(--noteloom-accent);
2445
+ text-align: left;
2446
+ cursor: pointer;
2447
+ }
2448
+
2449
+ .be-select-manage-options:hover {
2450
+ background: var(--noteloom-accent-soft);
2451
+ }
2452
+
2453
+ .be-inline-select,
2454
+ .be-inline-date,
2455
+ .be-inline-checkbox {
2456
+ display: inline-flex;
2457
+ align-items: center;
2458
+ vertical-align: middle;
2459
+ }
2460
+
2461
+ /* Inline chips sit in running text — match the surrounding line's own font
2462
+ size instead of the smaller size used for the Select component elsewhere
2463
+ (menus, table column type dropdown), where a compact UI size is right. */
2464
+ .be-inline-select .be-select-trigger {
2465
+ min-height: 0;
2466
+ font-size: 1em;
2467
+ padding: 1px 8px;
2468
+ }
2469
+
2470
+ .be-inline-select .be-select-tag {
2471
+ font-size: 0.92em;
2472
+ }
2473
+
2474
+ /* A mention reads as highlighted text sitting inline in the paragraph, not
2475
+ a bulky standalone pill/button — minimal padding, small radius, no extra
2476
+ chrome from the trigger button wrapping it. */
2477
+ .be-inline-select .be-select-trigger-mention {
2478
+ padding: 0 !important;
2479
+ border-radius: 3px;
2480
+ }
2481
+
2482
+ /* A mention chip always uses this one fixed color, not each option's own
2483
+ tag color — "@mentions are one consistent color" is the common
2484
+ convention rather than a per-person palette. */
2485
+ .be-select-tag-mention {
2486
+ background: var(--noteloom-accent-soft);
2487
+ color: var(--noteloom-accent);
2488
+ font-weight: 500;
2489
+ padding: 0 3px;
2490
+ border-radius: 3px;
2491
+ line-height: inherit;
2492
+ }
2493
+
2494
+ .be-inline-date input[type='date'] {
2495
+ border: 1px solid var(--noteloom-border);
2496
+ border-radius: var(--noteloom-radius-md);
2497
+ background: var(--noteloom-bg);
2498
+ color: inherit;
2499
+ padding: 4px 8px;
2500
+ font: inherit;
2501
+ font-size: 0.88rem;
2502
+ }
2503
+
2504
+ .be-inline-checkbox {
2505
+ gap: 6px;
2506
+ }
2507
+
2508
+ .be-inline-checkbox-input {
2509
+ flex: none;
2510
+ width: 16px;
2511
+ height: 16px;
2512
+ margin: 0;
2513
+ accent-color: var(--noteloom-accent);
2514
+ cursor: pointer;
2515
+ }
2516
+
2517
+ .be-inline-checkbox-label {
2518
+ min-width: 0;
2519
+ flex: 1;
2520
+ border: 1px solid var(--noteloom-border);
2521
+ border-radius: var(--noteloom-radius-sm);
2522
+ background: transparent;
2523
+ color: inherit;
2524
+ font: inherit;
2525
+ padding: 2px 8px;
2526
+ outline: none;
2527
+ }
2528
+
2529
+ .be-inline-checkbox-label:focus {
2530
+ border-color: var(--noteloom-accent);
2531
+ }
2532
+
2533
+ /* In a table cell (checkbox column), the browser's default text-input
2534
+ width (~170px+) is wider than most columns, forcing the input — and with
2535
+ it, the whole table — past the cell's own bounds. Constraining the
2536
+ inline-flex row to the cell's actual width lets the label's flex:1 +
2537
+ min-width:0 (above) do their job and shrink the input to fit instead. */
2538
+ .be-table-cell .be-inline-checkbox {
2539
+ display: flex;
2540
+ width: 100%;
2541
+ }
2542
+
2543
+ .be-inline-checkbox-label::placeholder {
2544
+ color: var(--noteloom-text-faint);
2545
+ }
2546
+
2547
+ /* --- floating (selection) format toolbar --- */
2548
+
2549
+ .be-floating-toolbar {
2550
+ display: flex;
2551
+ align-items: center;
2552
+ gap: 2px;
2553
+ background: var(--noteloom-text);
2554
+ border-radius: var(--noteloom-radius-md);
2555
+ padding: 4px;
2556
+ box-shadow: var(--noteloom-shadow);
2557
+ z-index: 1000;
2558
+ }
2559
+
2560
+ .be-floating-toolbar-btn {
2561
+ border: none;
2562
+ background: transparent;
2563
+ color: rgba(255, 255, 255, 0.85);
2564
+ width: 30px;
2565
+ height: 30px;
2566
+ display: flex;
2567
+ align-items: center;
2568
+ justify-content: center;
2569
+ border-radius: var(--noteloom-radius-sm);
2570
+ cursor: pointer;
2571
+ }
2572
+
2573
+ .be-floating-toolbar-btn:hover {
2574
+ background: rgba(255, 255, 255, 0.14);
2575
+ }
2576
+
2577
+ .be-floating-toolbar-btn-active {
2578
+ background: var(--noteloom-accent);
2579
+ color: #fff;
2580
+ }
2581
+
2582
+ .be-floating-toolbar-divider {
2583
+ width: 1px;
2584
+ height: 20px;
2585
+ background: rgba(255, 255, 255, 0.2);
2586
+ margin: 0 4px;
2587
+ }
2588
+
2589
+ .be-find-bar {
2590
+ position: fixed;
2591
+ top: 12px;
2592
+ right: 12px;
2593
+ z-index: 900;
2594
+ width: fit-content;
2595
+ background: var(--noteloom-bg);
2596
+ border: 1px solid var(--noteloom-border);
2597
+ border-radius: var(--noteloom-radius-md);
2598
+ box-shadow: var(--noteloom-shadow);
2599
+ padding: 6px;
2600
+ display: flex;
2601
+ flex-direction: column;
2602
+ gap: 6px;
2603
+ }
2604
+
2605
+ .be-find-bar-row {
2606
+ display: flex;
2607
+ align-items: center;
2608
+ gap: 4px;
2609
+ }
2610
+
2611
+ .be-find-bar-input {
2612
+ border: 1px solid var(--noteloom-border);
2613
+ border-radius: var(--noteloom-radius-sm);
2614
+ padding: 4px 8px;
2615
+ font-size: 0.85rem;
2616
+ color: var(--noteloom-text);
2617
+ background: var(--noteloom-bg);
2618
+ width: 180px;
2619
+ }
2620
+
2621
+ .be-find-bar-input:focus {
2622
+ outline: none;
2623
+ border-color: var(--noteloom-accent);
2624
+ }
2625
+
2626
+ .be-find-bar-count {
2627
+ font-size: 0.78rem;
2628
+ color: var(--noteloom-text-muted);
2629
+ min-width: 44px;
2630
+ text-align: center;
2631
+ }
2632
+
2633
+ .be-find-bar-toggle,
2634
+ .be-find-bar-nav,
2635
+ .be-find-bar-close,
2636
+ .be-find-bar-replace-toggle {
2637
+ border: none;
2638
+ background: transparent;
2639
+ color: var(--noteloom-text-muted);
2640
+ border-radius: var(--noteloom-radius-sm);
2641
+ width: 26px;
2642
+ height: 26px;
2643
+ display: flex;
2644
+ align-items: center;
2645
+ justify-content: center;
2646
+ cursor: pointer;
2647
+ font-size: 0.7rem;
2648
+ }
2649
+
2650
+ .be-find-bar-toggle:hover,
2651
+ .be-find-bar-nav:hover:not(:disabled),
2652
+ .be-find-bar-close:hover,
2653
+ .be-find-bar-replace-toggle:hover {
2654
+ background: var(--noteloom-bg-hover);
2655
+ }
2656
+
2657
+ .be-find-bar-nav:disabled {
2658
+ opacity: 0.4;
2659
+ cursor: default;
2660
+ }
2661
+
2662
+ .be-find-bar-toggle-active {
2663
+ background: var(--noteloom-accent-soft);
2664
+ color: var(--noteloom-accent);
2665
+ }
2666
+
2667
+ .be-find-bar-replace-toggle {
2668
+ transition: transform 0.1s ease;
2669
+ }
2670
+
2671
+ .be-find-bar-replace-toggle-open {
2672
+ transform: rotate(90deg);
2673
+ }
2674
+
2675
+ .be-find-bar-replace-btn {
2676
+ border: none;
2677
+ background: var(--noteloom-bg-subtle);
2678
+ color: var(--noteloom-text);
2679
+ border-radius: var(--noteloom-radius-sm);
2680
+ padding: 4px 10px;
2681
+ font-size: 0.8rem;
2682
+ cursor: pointer;
2683
+ }
2684
+
2685
+ .be-find-bar-replace-btn:hover:not(:disabled) {
2686
+ background: var(--noteloom-bg-hover);
2687
+ }
2688
+
2689
+ .be-find-bar-replace-btn:disabled {
2690
+ opacity: 0.4;
2691
+ cursor: default;
2692
+ }
2693
+
2694
+ /* CSS Custom Highlight API — paints match highlights purely at the
2695
+ rendering layer, never touching the contentEditable DOM tree itself
2696
+ (see useFindInDocument.js's own doc comment for why). Unsupported
2697
+ browsers (older Firefox) simply drop this whole rule; search/navigate/
2698
+ replace still work, just without the visual highlight. */
2699
+ ::highlight(be-find-match) {
2700
+ background-color: rgba(250, 204, 21, 0.4);
2701
+ }
2702
+
2703
+ ::highlight(be-find-current) {
2704
+ background-color: rgba(249, 115, 22, 0.55);
2705
+ }
2706
+
2707
+ .be-floating-toolbar-picker-wrap {
2708
+ position: relative;
2709
+ }
2710
+
2711
+ .be-floating-toolbar-picker {
2712
+ position: absolute;
2713
+ top: 100%;
2714
+ left: 0;
2715
+ margin-top: 8px;
2716
+ display: flex;
2717
+ gap: 4px;
2718
+ background: var(--noteloom-bg);
2719
+ border-radius: var(--noteloom-radius-md);
2720
+ padding: 6px;
2721
+ box-shadow: var(--noteloom-shadow);
2722
+ }
2723
+
2724
+ .be-floating-toolbar-swatch {
2725
+ width: 22px;
2726
+ height: 22px;
2727
+ border-radius: 50%;
2728
+ border: 1px solid rgba(0, 0, 0, 0.1);
2729
+ cursor: pointer;
2730
+ }
2731
+
2732
+ /* --- link hover card (edit/remove an existing link mark) --- */
2733
+
2734
+ .be-link-hover-card {
2735
+ z-index: 1000;
2736
+ display: flex;
2737
+ align-items: center;
2738
+ gap: 2px;
2739
+ max-width: 320px;
2740
+ background: var(--noteloom-bg);
2741
+ border: 1px solid var(--noteloom-border);
2742
+ border-radius: var(--noteloom-radius-md);
2743
+ padding: 5px 6px 5px 10px;
2744
+ box-shadow: var(--noteloom-shadow);
2745
+ font-size: 0.85rem;
2746
+ }
2747
+
2748
+ .be-link-hover-card-url {
2749
+ flex: 1;
2750
+ min-width: 0;
2751
+ overflow: hidden;
2752
+ text-overflow: ellipsis;
2753
+ white-space: nowrap;
2754
+ color: var(--noteloom-accent);
2755
+ text-decoration: none;
2756
+ }
2757
+
2758
+ .be-link-hover-card-url:hover {
2759
+ text-decoration: underline;
2760
+ }
2761
+
2762
+ .be-link-hover-card-btn {
2763
+ flex: none;
2764
+ width: 24px;
2765
+ height: 24px;
2766
+ border: none;
2767
+ background: transparent;
2768
+ color: var(--noteloom-text-muted);
2769
+ display: flex;
2770
+ align-items: center;
2771
+ justify-content: center;
2772
+ border-radius: var(--noteloom-radius-sm);
2773
+ cursor: pointer;
2774
+ }
2775
+
2776
+ .be-link-hover-card-btn:hover {
2777
+ background: var(--noteloom-bg-hover);
2778
+ color: var(--noteloom-text);
2779
+ }
2780
+
2781
+ /* --- comments: avatar, header, composer, thread card, click/hover popover, right-side panel --- */
2782
+
2783
+ .be-comment-avatar {
2784
+ flex: none;
2785
+ display: flex;
2786
+ align-items: center;
2787
+ justify-content: center;
2788
+ border-radius: 50%;
2789
+ color: #fff;
2790
+ font-weight: 700;
2791
+ line-height: 1;
2792
+ }
2793
+
2794
+ /* Shared by CommentPopover and FloatingToolbar's standalone composer (see
2795
+ CommentPopoverHeader.jsx) -- title on the left, an explicit close button
2796
+ on the right so dismissing doesn't rely solely on Escape/outside-click. */
2797
+ .be-comment-popover-header {
2798
+ display: flex;
2799
+ align-items: center;
2800
+ justify-content: space-between;
2801
+ gap: 8px;
2802
+ margin-bottom: 10px;
2803
+ padding-bottom: 10px;
2804
+ border-bottom: 1px solid var(--noteloom-border);
2805
+ }
2806
+
2807
+ .be-comment-popover-title {
2808
+ font-weight: 700;
2809
+ font-size: 0.9rem;
2810
+ }
2811
+
2812
+ .be-comment-popover-close {
2813
+ flex: none;
2814
+ border: none;
2815
+ background: transparent;
2816
+ color: var(--noteloom-text-muted);
2817
+ width: 22px;
2818
+ height: 22px;
2819
+ display: flex;
2820
+ align-items: center;
2821
+ justify-content: center;
2822
+ border-radius: var(--noteloom-radius-sm);
2823
+ cursor: pointer;
2824
+ }
2825
+
2826
+ .be-comment-popover-close:hover {
2827
+ background: var(--noteloom-bg-hover);
2828
+ color: var(--noteloom-text);
2829
+ }
2830
+
2831
+ /* Overrides the dark \`.be-floating-toolbar\` chrome it also carries (see
2832
+ FloatingToolbar.jsx's own comment on why that base class stays) -- a
2833
+ comment composer reads better as a light card than white text on the
2834
+ toolbar's own near-black background. */
2835
+ .be-floating-toolbar.be-floating-toolbar-comment-standalone {
2836
+ display: block;
2837
+ background: var(--noteloom-bg);
2838
+ border: 1px solid var(--noteloom-border);
2839
+ padding: 10px 12px 12px;
2840
+ width: 300px;
2841
+ }
2842
+
2843
+ .be-comment-composer {
2844
+ display: flex;
2845
+ flex-direction: column;
2846
+ gap: 10px;
2847
+ margin-top: 10px;
2848
+ }
2849
+
2850
+ .be-comment-composer-input-row {
2851
+ display: flex;
2852
+ align-items: flex-start;
2853
+ gap: 8px;
2854
+ }
2855
+
2856
+ .be-comment-composer-textarea {
2857
+ flex: 1;
2858
+ min-width: 0;
2859
+ box-sizing: border-box;
2860
+ resize: none;
2861
+ /* ~2 lines to start, grows with content (see CommentComposer's own
2862
+ resizeToContent) up to ~5 lines, then scrolls. */
2863
+ min-height: 2.8em;
2864
+ max-height: 7.2em;
2865
+ overflow-y: auto;
2866
+ padding: 8px 10px;
2867
+ font: inherit;
2868
+ font-size: 0.85rem;
2869
+ line-height: 1.4;
2870
+ color: var(--noteloom-text);
2871
+ background: var(--noteloom-bg-subtle);
2872
+ border: 1px solid var(--noteloom-border);
2873
+ border-radius: var(--noteloom-radius-md);
2874
+ }
2875
+
2876
+ .be-comment-composer-textarea:focus {
2877
+ outline: none;
2878
+ border-color: var(--noteloom-accent);
2879
+ }
2880
+
2881
+ .be-comment-composer-actions {
2882
+ display: flex;
2883
+ justify-content: flex-end;
2884
+ gap: 8px;
2885
+ }
2886
+
2887
+ .be-comment-composer-cancel,
2888
+ .be-comment-composer-submit {
2889
+ display: flex;
2890
+ align-items: center;
2891
+ gap: 6px;
2892
+ border: none;
2893
+ border-radius: var(--noteloom-radius-md);
2894
+ padding: 6px 12px;
2895
+ font-size: 0.8rem;
2896
+ font-weight: 600;
2897
+ cursor: pointer;
2898
+ }
2899
+
2900
+ .be-comment-composer-cancel {
2901
+ background: var(--noteloom-bg-hover);
2902
+ color: var(--noteloom-text-muted);
2903
+ }
2904
+
2905
+ .be-comment-composer-submit {
2906
+ background: var(--noteloom-accent);
2907
+ color: #fff;
2908
+ }
2909
+
2910
+ .be-comment-composer-submit:disabled {
2911
+ opacity: 0.4;
2912
+ cursor: not-allowed;
2913
+ }
2914
+
2915
+ .be-comment-thread {
2916
+ font-size: 0.85rem;
2917
+ }
2918
+
2919
+ .be-comment-thread + .be-comment-thread {
2920
+ margin-top: 16px;
2921
+ padding-top: 16px;
2922
+ border-top: 1px solid var(--noteloom-border);
2923
+ }
2924
+
2925
+ .be-comment-thread-resolved {
2926
+ opacity: 0.6;
2927
+ }
2928
+
2929
+ /* Echoes a hover from the highlighted text back onto this card -- see useHoveredComment. */
2930
+ .be-comment-thread-hovered {
2931
+ background: var(--noteloom-bg-hover);
2932
+ border-radius: var(--noteloom-radius-md);
2933
+ margin: -6px;
2934
+ padding: 6px;
2935
+ }
2936
+
2937
+ .be-comment-message {
2938
+ display: flex;
2939
+ align-items: flex-start;
2940
+ gap: 10px;
2941
+ }
2942
+
2943
+ .be-comment-message + .be-comment-message {
2944
+ margin-top: 10px;
2945
+ }
2946
+
2947
+ .be-comment-message-body {
2948
+ flex: 1;
2949
+ min-width: 0;
2950
+ }
2951
+
2952
+ .be-comment-message-header {
2953
+ display: flex;
2954
+ align-items: baseline;
2955
+ gap: 6px;
2956
+ }
2957
+
2958
+ .be-comment-message-author {
2959
+ font-weight: 600;
2960
+ font-size: 0.78rem;
2961
+ }
2962
+
2963
+ .be-comment-message-time {
2964
+ font-size: 0.72rem;
2965
+ color: var(--noteloom-text-muted);
2966
+ }
2967
+
2968
+ .be-comment-message-text {
2969
+ margin: 3px 0 0;
2970
+ line-height: 1.45;
2971
+ white-space: pre-wrap;
2972
+ word-break: break-word;
2973
+ }
2974
+
2975
+ /* Replies (every message after the thread's first) get a connecting
2976
+ vertical line + indent, chat-thread style -- our data model has no
2977
+ deeper nesting than "root message + flat replies", so one indent level
2978
+ is all this needs. */
2979
+ .be-comment-thread-replies {
2980
+ margin: 10px 0 0 13px;
2981
+ padding-left: 14px;
2982
+ border-left: 2px solid var(--noteloom-border);
2983
+ }
2984
+
2985
+ .be-comment-thread-actions {
2986
+ display: flex;
2987
+ align-items: center;
2988
+ gap: 4px;
2989
+ margin-top: 10px;
2990
+ opacity: 0;
2991
+ transition: opacity 0.1s ease;
2992
+ }
2993
+
2994
+ .be-comment-thread:hover .be-comment-thread-actions,
2995
+ .be-comment-thread:focus-within .be-comment-thread-actions {
2996
+ opacity: 1;
2997
+ }
2998
+
2999
+ .be-comment-thread-actions button {
3000
+ display: flex;
3001
+ align-items: center;
3002
+ gap: 4px;
3003
+ border: none;
3004
+ background: transparent;
3005
+ color: var(--noteloom-text-muted);
3006
+ font-size: 0.78rem;
3007
+ padding: 4px 8px;
3008
+ border-radius: var(--noteloom-radius-sm);
3009
+ cursor: pointer;
3010
+ }
3011
+
3012
+ .be-comment-thread-actions button:hover {
3013
+ background: var(--noteloom-bg-hover);
3014
+ color: var(--noteloom-text);
3015
+ }
3016
+
3017
+ .be-comment-thread-delete {
3018
+ margin-left: auto;
3019
+ }
3020
+
3021
+ /* --- comments: click/hover popover over existing highlighted text --- */
3022
+
3023
+ .be-comment-popover {
3024
+ z-index: 1000;
3025
+ width: 300px;
3026
+ max-width: calc(100vw - 24px);
3027
+ background: var(--noteloom-bg);
3028
+ border: 1px solid var(--noteloom-border);
3029
+ border-radius: var(--noteloom-radius-lg);
3030
+ padding: 12px 14px 14px;
3031
+ box-shadow: var(--noteloom-shadow);
3032
+ }
3033
+
3034
+ /* --- comments: opt-in right-side panel (NoteloomEditor showCommentsPanel) --- */
3035
+
3036
+ /* Deliberately no border/shadow/box background here, or on
3037
+ .be-comments-panel-item below -- comments float directly on the page
3038
+ like margin notes, not a boxed widget, matching how most other editors'
3039
+ own comment sidebars read. */
3040
+ /* No overflow/scrolling of its own on purpose -- each card's position
3041
+ already tracks the PAGE's scroll (see CommentsPanel's recompute()), so
3042
+ the panel scrolling independently would fight that: a wheel gesture over
3043
+ it needs to fall through and scroll the page, not the panel's own box,
3044
+ or cards visually detach from the text they're anchored to. Cards whose
3045
+ anchor has scrolled off-screen just go negative/beyond the viewport and
3046
+ aren't painted -- no clipping box needed for that. */
3047
+ .be-comments-panel {
3048
+ position: fixed;
3049
+ top: 80px;
3050
+ right: 24px;
3051
+ width: 320px;
3052
+ overflow: visible;
3053
+ background: transparent;
3054
+ padding: 0 12px;
3055
+ font-size: 0.85rem;
3056
+ z-index: 500;
3057
+ pointer-events: none;
3058
+ }
3059
+
3060
+ .be-comments-panel-item,
3061
+ .be-comments-panel-empty {
3062
+ pointer-events: auto;
3063
+ }
3064
+
3065
+ .be-comments-panel-empty {
3066
+ color: var(--noteloom-text-muted);
3067
+ font-size: 0.82rem;
3068
+ margin: 0;
3069
+ }
3070
+
3071
+ /* Each .be-comments-panel-item is absolutely positioned (top set inline by
3072
+ CommentsPanel, aligned with its thread's own anchored text, margin-comment
3073
+ style) inside this relatively-positioned container -- height is also set
3074
+ inline, sized to fit the lowest card. */
3075
+ .be-comments-panel-list {
3076
+ position: relative;
3077
+ }
3078
+
3079
+ .be-comments-panel-item {
3080
+ position: absolute;
3081
+ left: 0;
3082
+ right: 0;
3083
+ padding: 8px 12px;
3084
+ border-radius: var(--noteloom-radius-md);
3085
+ transition:
3086
+ top 0.15s ease,
3087
+ background-color 0.1s ease;
3088
+ }
3089
+
3090
+ .be-comments-panel-item:hover {
3091
+ background: var(--noteloom-bg-hover);
3092
+ }
3093
+
3094
+ @media (max-width: 900px) {
3095
+ .be-comments-panel {
3096
+ display: none;
3097
+ }
3098
+ }
3099
+
3100
+ /* --- version history: trigger button + drawer (VersionHistory) --- */
3101
+
3102
+ .be-version-history-trigger {
3103
+ display: inline-flex;
3104
+ align-items: center;
3105
+ gap: 6px;
3106
+ border: 1px solid var(--noteloom-border);
3107
+ background: var(--noteloom-bg);
3108
+ color: var(--noteloom-text);
3109
+ border-radius: var(--noteloom-radius-md);
3110
+ padding: 5px 10px;
3111
+ font-size: 0.85rem;
3112
+ cursor: pointer;
3113
+ }
3114
+
3115
+ .be-version-history-trigger:hover {
3116
+ background: var(--noteloom-bg-hover);
3117
+ }
3118
+
3119
+ .be-version-history-backdrop {
3120
+ position: fixed;
3121
+ inset: 0;
3122
+ background: rgba(15, 23, 42, 0.25);
3123
+ z-index: 1400;
3124
+ }
3125
+
3126
+ .be-version-history-drawer {
3127
+ position: fixed;
3128
+ top: 0;
3129
+ right: 0;
3130
+ bottom: 0;
3131
+ width: 360px;
3132
+ max-width: 100vw;
3133
+ background: var(--noteloom-bg);
3134
+ box-shadow: var(--noteloom-shadow);
3135
+ z-index: 1401;
3136
+ display: flex;
3137
+ flex-direction: column;
3138
+ }
3139
+
3140
+ .be-version-history-header {
3141
+ display: flex;
3142
+ align-items: center;
3143
+ justify-content: space-between;
3144
+ padding: 14px 16px;
3145
+ border-bottom: 1px solid var(--noteloom-border);
3146
+ font-weight: 700;
3147
+ font-size: 0.95rem;
3148
+ }
3149
+
3150
+ .be-version-history-close {
3151
+ border: none;
3152
+ background: transparent;
3153
+ color: var(--noteloom-text-muted);
3154
+ width: 24px;
3155
+ height: 24px;
3156
+ display: flex;
3157
+ align-items: center;
3158
+ justify-content: center;
3159
+ border-radius: var(--noteloom-radius-sm);
3160
+ cursor: pointer;
3161
+ }
3162
+
3163
+ .be-version-history-close:hover {
3164
+ background: var(--noteloom-bg-hover);
3165
+ color: var(--noteloom-text);
3166
+ }
3167
+
3168
+ .be-version-history-list {
3169
+ flex: 1;
3170
+ overflow-y: auto;
3171
+ padding: 8px 0;
3172
+ }
3173
+
3174
+ .be-version-history-empty {
3175
+ color: var(--noteloom-text-muted);
3176
+ font-size: 0.85rem;
3177
+ padding: 16px;
3178
+ margin: 0;
3179
+ }
3180
+
3181
+ .be-version-history-group-label {
3182
+ font-weight: 600;
3183
+ font-size: 0.78rem;
3184
+ color: var(--noteloom-text-muted);
3185
+ padding: 10px 16px 4px;
3186
+ }
3187
+
3188
+ .be-version-history-item {
3189
+ display: flex;
3190
+ align-items: center;
3191
+ gap: 10px;
3192
+ width: 100%;
3193
+ border: none;
3194
+ background: transparent;
3195
+ padding: 8px 16px;
3196
+ text-align: left;
3197
+ cursor: pointer;
3198
+ }
3199
+
3200
+ .be-version-history-item:hover {
3201
+ background: var(--noteloom-bg-hover);
3202
+ }
3203
+
3204
+ .be-version-history-item-body {
3205
+ min-width: 0;
3206
+ }
3207
+
3208
+ .be-version-history-item-author {
3209
+ font-weight: 600;
3210
+ font-size: 0.85rem;
3211
+ }
3212
+
3213
+ .be-version-history-item-meta {
3214
+ font-size: 0.78rem;
3215
+ color: var(--noteloom-text-muted);
3216
+ overflow: hidden;
3217
+ text-overflow: ellipsis;
3218
+ white-space: nowrap;
3219
+ }
3220
+
3221
+ .be-version-history-preview {
3222
+ flex: 1;
3223
+ display: flex;
3224
+ flex-direction: column;
3225
+ min-height: 0;
3226
+ }
3227
+
3228
+ .be-version-history-preview-meta {
3229
+ display: flex;
3230
+ align-items: center;
3231
+ gap: 10px;
3232
+ padding: 12px 16px;
3233
+ border-bottom: 1px solid var(--noteloom-border);
3234
+ }
3235
+
3236
+ .be-version-history-preview-author {
3237
+ font-weight: 600;
3238
+ font-size: 0.85rem;
3239
+ }
3240
+
3241
+ .be-version-history-preview-time {
3242
+ font-size: 0.78rem;
3243
+ color: var(--noteloom-text-muted);
3244
+ }
3245
+
3246
+ .be-version-history-view-toggle {
3247
+ display: flex;
3248
+ gap: 4px;
3249
+ padding: 8px 16px 0;
3250
+ }
3251
+
3252
+ .be-version-history-view-toggle button {
3253
+ border: none;
3254
+ background: transparent;
3255
+ color: var(--noteloom-text-muted);
3256
+ font-size: 0.78rem;
3257
+ font-weight: 600;
3258
+ padding: 5px 10px;
3259
+ border-radius: var(--noteloom-radius-md);
3260
+ cursor: pointer;
3261
+ }
3262
+
3263
+ .be-version-history-view-toggle button.is-active {
3264
+ background: var(--noteloom-bg-subtle);
3265
+ color: var(--noteloom-text);
3266
+ }
3267
+
3268
+ .be-version-history-diff-legend {
3269
+ display: flex;
3270
+ align-items: center;
3271
+ gap: 10px;
3272
+ padding: 10px 16px 0;
3273
+ font-size: 0.75rem;
3274
+ }
3275
+
3276
+ .be-version-history-diff-legend-note {
3277
+ color: var(--noteloom-text-muted);
3278
+ }
3279
+
3280
+ .be-version-history-preview-body {
3281
+ flex: 1;
3282
+ overflow-y: auto;
3283
+ padding: 16px;
3284
+ font-size: 0.9rem;
3285
+ line-height: 1.6;
3286
+ }
3287
+
3288
+ .be-version-history-diff-body :is(p.be-version-diff-block) {
3289
+ margin: 0 0 0.6em;
3290
+ }
3291
+
3292
+ /* Google Docs-style change highlighting: additions get a green underline/background,
3293
+ removals a struck-through red one -- self-evident at a glance, no legend required
3294
+ to understand the individual spans (the legend row above just labels the colors). */
3295
+ .be-version-diff-added {
3296
+ background: rgba(34, 197, 94, 0.18);
3297
+ color: var(--noteloom-text);
3298
+ text-decoration: underline;
3299
+ text-decoration-color: rgba(34, 197, 94, 0.6);
3300
+ border-radius: 2px;
3301
+ padding: 0 1px;
3302
+ }
3303
+
3304
+ .be-version-diff-removed {
3305
+ background: rgba(239, 68, 68, 0.14);
3306
+ color: var(--noteloom-text-muted);
3307
+ text-decoration: line-through;
3308
+ text-decoration-color: rgba(239, 68, 68, 0.6);
3309
+ border-radius: 2px;
3310
+ padding: 0 1px;
3311
+ }
3312
+
3313
+ .be-version-history-diff-legend .be-version-diff-added,
3314
+ .be-version-history-diff-legend .be-version-diff-removed {
3315
+ padding: 2px 6px;
3316
+ text-decoration: none;
3317
+ font-weight: 600;
3318
+ }
3319
+
3320
+ /* exportDocumentHTML emits plain semantic HTML (<p>/<h1-3>/<ul>/<blockquote>/...),
3321
+ not this package's own be-* block classes, so the preview needs its own
3322
+ basic typography rather than inheriting the live editor's block styling. */
3323
+ .be-version-history-preview-body :is(h1, h2, h3) {
3324
+ margin: 0.6em 0 0.3em;
3325
+ }
3326
+
3327
+ .be-version-history-preview-body p {
3328
+ margin: 0 0 0.6em;
3329
+ }
3330
+
3331
+ .be-version-history-preview-body :is(ul, ol) {
3332
+ margin: 0 0 0.6em;
3333
+ padding-left: 1.4em;
3334
+ }
3335
+
3336
+ .be-version-history-preview-body blockquote {
3337
+ margin: 0 0 0.6em;
3338
+ padding-left: 0.8em;
3339
+ border-left: 3px solid var(--noteloom-border);
3340
+ color: var(--noteloom-text-muted);
3341
+ }
3342
+
3343
+ .be-version-history-preview-body pre {
3344
+ background: var(--noteloom-bg-subtle);
3345
+ border-radius: var(--noteloom-radius-sm);
3346
+ padding: 10px;
3347
+ overflow-x: auto;
3348
+ }
3349
+
3350
+ .be-version-history-preview-actions {
3351
+ display: flex;
3352
+ justify-content: space-between;
3353
+ align-items: center;
3354
+ gap: 8px;
3355
+ padding: 12px 16px;
3356
+ border-top: 1px solid var(--noteloom-border);
3357
+ }
3358
+
3359
+ .be-version-history-preview-actions button {
3360
+ border-radius: var(--noteloom-radius-md);
3361
+ padding: 6px 12px;
3362
+ font-size: 0.82rem;
3363
+ font-weight: 600;
3364
+ cursor: pointer;
3365
+ }
3366
+
3367
+ .be-version-history-preview-actions button:first-child {
3368
+ border: 1px solid var(--noteloom-border);
3369
+ background: var(--noteloom-bg);
3370
+ color: var(--noteloom-text);
3371
+ }
3372
+
3373
+ .be-version-history-restore {
3374
+ display: flex;
3375
+ align-items: center;
3376
+ gap: 6px;
3377
+ border: none;
3378
+ background: var(--noteloom-accent);
3379
+ color: #fff;
3380
+ }
3381
+
3382
+ /* --- voice typing: caret-anchored listening/processing indicator --- */
3383
+
3384
+ .be-voice-indicator {
3385
+ z-index: 1000;
3386
+ display: flex;
3387
+ align-items: center;
3388
+ gap: 5px;
3389
+ background: var(--noteloom-bg);
3390
+ border: 1px solid var(--noteloom-border);
3391
+ border-radius: var(--noteloom-radius-md);
3392
+ padding: 4px 9px;
3393
+ box-shadow: var(--noteloom-shadow);
3394
+ font-size: 0.78rem;
3395
+ color: var(--noteloom-text-muted);
3396
+ white-space: nowrap;
3397
+ pointer-events: none;
3398
+ animation: be-voice-indicator-in 0.12s ease-out;
3399
+ }
3400
+
3401
+ @keyframes be-voice-indicator-in {
3402
+ from {
3403
+ opacity: 0;
3404
+ transform: translate(-50%, calc(-100% + 4px));
3405
+ }
3406
+ to {
3407
+ opacity: 1;
3408
+ transform: translate(-50%, -100%);
3409
+ }
3410
+ }
3411
+
3412
+ .be-voice-indicator-dot {
3413
+ width: 7px;
3414
+ height: 7px;
3415
+ border-radius: 50%;
3416
+ background: var(--noteloom-danger, #dc2626);
3417
+ flex: none;
3418
+ animation: be-voice-indicator-pulse 1.4s ease-in-out infinite;
3419
+ }
3420
+
3421
+ .be-voice-indicator-processing .be-voice-indicator-dot {
3422
+ background: var(--noteloom-accent);
3423
+ animation-duration: 0.6s;
3424
+ }
3425
+
3426
+ @keyframes be-voice-indicator-pulse {
3427
+ 0%,
3428
+ 100% {
3429
+ opacity: 1;
3430
+ box-shadow: 0 0 0 0 currentColor;
3431
+ }
3432
+ 50% {
3433
+ opacity: 0.5;
3434
+ box-shadow: 0 0 0 4px transparent;
3435
+ }
3436
+ }
3437
+
3438
+ /* --- print --- */
3439
+ /*
3440
+ * Printing (or "Save as PDF" via the browser's own print dialog — this
3441
+ * package deliberately doesn't bundle a PDF-generation library, which
3442
+ * would conflict with staying zero-runtime-dependency) always renders a
3443
+ * clean, chrome-free document: every piece of editing-only UI is hidden
3444
+ * here, regardless of whether the app happens to be in preview mode at
3445
+ * the moment of printing. \`.be-block-row-hidden\` is included on purpose —
3446
+ * a block hidden via "Hide in preview" stays in the DOM (just dimmed) in
3447
+ * edit mode, so without this rule printing while NOT toggled into preview
3448
+ * mode would print blocks the user explicitly marked as hidden. A host
3449
+ * app's own outer chrome (nav bars, its own toolbar) needs its own print
3450
+ * rules the same way — see examples/basic's own style.css for a worked
3451
+ * example, since that chrome lives outside this package entirely.
3452
+ */
3453
+ @media print {
3454
+ .be-block-gutter,
3455
+ .be-block-gutter-menu,
3456
+ .be-block-gutter-menu-item,
3457
+ .be-block-range-menu,
3458
+ .be-block-range-menu-item,
3459
+ .be-block-row-hidden,
3460
+ .be-slash-menu,
3461
+ #be-emoji-menu,
3462
+ #be-at-menu,
3463
+ .be-floating-toolbar,
3464
+ .be-link-hover-card,
3465
+ .be-comment-popover,
3466
+ .be-comments-panel,
3467
+ .be-voice-indicator,
3468
+ .be-table-header-menu-trigger,
3469
+ .be-table-header-menu,
3470
+ .be-table-col-resize-handle,
3471
+ .be-table-delete-row,
3472
+ .be-table-add-row,
3473
+ .be-embed-toolbar,
3474
+ .be-embed-remove,
3475
+ .be-embed-resize-handle,
3476
+ .be-embed-dropzone,
3477
+ .be-embed-upload-btn,
3478
+ .be-embed-url-row,
3479
+ .be-canvas-toolbar,
3480
+ .be-canvas-resize-handle,
3481
+ .be-callout-color-wrap,
3482
+ .be-modal-overlay,
3483
+ .be-mobile-action-bar,
3484
+ .be-mobile-picker-list,
3485
+ .be-export-trigger,
3486
+ .be-export-tabs,
3487
+ .be-trailing-space,
3488
+ .be-select-popover,
3489
+ .be-find-bar {
3490
+ display: none !important;
3491
+ }
3492
+
3493
+ /* .be-block-row-range-selected and .be-block-selected mark real content
3494
+ (the row/block itself, not a standalone chrome element) with a
3495
+ highlight background/outline — reset just that styling rather than
3496
+ hiding the element the way the chrome above is hidden, or printing
3497
+ mid-drag-selection would print blank space instead of the block's own
3498
+ content. */
3499
+ .be-block-row-range-selected {
3500
+ background: none !important;
3501
+ }
3502
+
3503
+ .be-block-selected {
3504
+ outline: none !important;
3505
+ }
3506
+
3507
+ /* No background colors/shadows on paper, and text that's always legible
3508
+ regardless of the screen theme the page happened to be rendered in
3509
+ (dark mode's near-white text would otherwise print as barely-there). */
3510
+ .be-editable,
3511
+ .be-paragraph,
3512
+ .be-heading,
3513
+ .be-list-item,
3514
+ .be-blockquote,
3515
+ .be-code-block,
3516
+ .be-callout,
3517
+ .be-table-cell {
3518
+ background: none !important;
3519
+ box-shadow: none !important;
3520
+ color: #000 !important;
3521
+ }
3522
+
3523
+ /* Don't split a table/code block/callout/image awkwardly across a page
3524
+ boundary when it would otherwise fit on one page. */
3525
+ .be-table,
3526
+ .be-code-block,
3527
+ .be-callout,
3528
+ .be-embed-image {
3529
+ break-inside: avoid;
3530
+ }
3531
+ }
3532
+ `, A = "noteloom-default-styles";
3533
+ function X() {
3534
+ if (typeof document > "u" || document.getElementById(A)) return;
3535
+ const n = document.createElement("style");
3536
+ n.id = A, n.textContent = Q, document.head.appendChild(n);
3537
+ }
3538
+ const L = G(null);
3539
+ function kn({
3540
+ store: n,
3541
+ registry: o,
3542
+ inlineRegistry: a = null,
3543
+ history: l = null,
3544
+ className: m,
3545
+ style: x,
3546
+ theme: f = "default",
3547
+ getBlockClassName: v,
3548
+ commentAuthorId: y,
3549
+ showLineNumbers: w = !1,
3550
+ uploadFile: k,
3551
+ maxFileSize: z,
3552
+ children: E
3553
+ }) {
3554
+ q(() => {
3555
+ f !== "none" && X();
3556
+ }, [f]);
3557
+ const [C, N] = c(!1), [I, H] = c(null), [M, F] = c([]), [S, U] = c(!1), [T, p] = c(null), _ = b(() => p("new"), []), R = b((s) => p(s), []), P = b(() => p(null), []), g = K(null), D = b(() => g.current, []), O = b((s) => {
3558
+ var j, B;
3559
+ const u = g.current;
3560
+ u !== s && (u && ((j = document.querySelector(`[data-block-id="${u}"]`)) == null || j.classList.remove("be-block-selected")), g.current = s, s && ((B = document.querySelector(`[data-block-id="${s}"]`)) == null || B.classList.add("be-block-selected")));
3561
+ }, []), V = W(
3562
+ () => ({
3563
+ store: n,
3564
+ registry: o,
3565
+ inlineRegistry: a,
3566
+ history: l,
3567
+ isWholeDocumentSelected: C,
3568
+ setIsWholeDocumentSelected: N,
3569
+ selectedBlockRange: M,
3570
+ setSelectedBlockRange: F,
3571
+ getSelectedBlockId: D,
3572
+ setSelectedBlockId: O,
3573
+ isPreviewMode: S,
3574
+ setIsPreviewMode: U,
3575
+ fieldTypeEditorTarget: T,
3576
+ openCreateFieldType: _,
3577
+ openEditFieldType: R,
3578
+ closeFieldTypeEditor: P,
3579
+ getBlockClassName: v,
3580
+ commentAuthorId: y,
3581
+ hoveredCommentId: I,
3582
+ setHoveredCommentId: H,
3583
+ showLineNumbers: w,
3584
+ uploadFile: k,
3585
+ maxFileSize: z
3586
+ }),
3587
+ [
3588
+ n,
3589
+ o,
3590
+ a,
3591
+ l,
3592
+ C,
3593
+ M,
3594
+ D,
3595
+ O,
3596
+ S,
3597
+ T,
3598
+ _,
3599
+ R,
3600
+ P,
3601
+ v,
3602
+ y,
3603
+ I,
3604
+ w,
3605
+ k,
3606
+ z
3607
+ ]
3608
+ ), Y = m || x ? /* @__PURE__ */ e("div", { className: m ? `be-root ${m}` : "be-root", style: x, children: E }) : E;
3609
+ return /* @__PURE__ */ e(L.Provider, { value: V, children: Y });
3610
+ }
3611
+ function d() {
3612
+ const n = $(L);
3613
+ if (!n)
3614
+ throw new Error("Editor hooks must be used within an <EditorProvider>");
3615
+ return n;
3616
+ }
3617
+ function zn() {
3618
+ return d().store;
3619
+ }
3620
+ function En() {
3621
+ return d().registry;
3622
+ }
3623
+ function Cn() {
3624
+ return d().inlineRegistry;
3625
+ }
3626
+ function In() {
3627
+ const { isWholeDocumentSelected: n, setIsWholeDocumentSelected: o } = d();
3628
+ return [n, o];
3629
+ }
3630
+ function Mn() {
3631
+ const { selectedBlockRange: n, setSelectedBlockRange: o } = d();
3632
+ return [n, o];
3633
+ }
3634
+ function Sn() {
3635
+ const { getSelectedBlockId: n, setSelectedBlockId: o } = d();
3636
+ return { getSelectedBlockId: n, setSelectedBlockId: o };
3637
+ }
3638
+ function Tn() {
3639
+ const { isPreviewMode: n, setIsPreviewMode: o } = d();
3640
+ return [n, o];
3641
+ }
3642
+ function _n(n, o) {
3643
+ const { getBlockClassName: a } = d(), l = o && a ? a(o) : void 0;
3644
+ return l ? `${n} ${l}` : n;
3645
+ }
3646
+ function Rn() {
3647
+ return d().commentAuthorId;
3648
+ }
3649
+ function Pn() {
3650
+ const { hoveredCommentId: n, setHoveredCommentId: o } = d();
3651
+ return [n, o];
3652
+ }
3653
+ function Dn() {
3654
+ return d().showLineNumbers;
3655
+ }
3656
+ function On() {
3657
+ const { uploadFile: n, maxFileSize: o } = d();
3658
+ return { uploadFile: n, maxFileSize: o };
3659
+ }
3660
+ function jn() {
3661
+ const { fieldTypeEditorTarget: n, openCreateFieldType: o, openEditFieldType: a, closeFieldTypeEditor: l } = d();
3662
+ return {
3663
+ target: n,
3664
+ openCreate: o,
3665
+ openEdit: a,
3666
+ close: l
3667
+ };
3668
+ }
3669
+ const i = {
3670
+ INSERT_BLOCK: "insertBlock",
3671
+ REMOVE_BLOCK: "removeBlock",
3672
+ MOVE_BLOCK: "moveBlock",
3673
+ CHANGE_BLOCK_TYPE: "changeBlockType",
3674
+ UPDATE_BLOCK_PROPS: "updateBlockProps",
3675
+ UPDATE_RUN: "updateRun",
3676
+ SET_BLOCK_CONTENT_IDS: "setBlockContentIds",
3677
+ REPLACE_RUN_SPAN: "replaceRunSpan",
3678
+ SET_BLOCK_RUNS: "setBlockRuns",
3679
+ EDIT_RUN_CHARS: "editRunChars",
3680
+ ADD_FIELD_TYPE: "addFieldType",
3681
+ UPDATE_FIELD_TYPE: "updateFieldType",
3682
+ REMOVE_FIELD_TYPE: "removeFieldType",
3683
+ ADD_COMMENT_THREAD: "addCommentThread",
3684
+ REMOVE_COMMENT_THREAD: "removeCommentThread",
3685
+ ADD_COMMENT_REPLY: "addCommentReply",
3686
+ REMOVE_COMMENT_REPLY: "removeCommentReply",
3687
+ RESOLVE_COMMENT: "resolveComment",
3688
+ ADD_PERSON: "addPerson",
3689
+ UPDATE_PERSON: "updatePerson",
3690
+ REMOVE_PERSON: "removePerson"
3691
+ };
3692
+ function J(n, o, a, l) {
3693
+ return { type: i.INSERT_BLOCK, block: n, parentId: o, index: a, subtree: l };
3694
+ }
3695
+ function Z(n) {
3696
+ return { type: i.REMOVE_BLOCK, id: n };
3697
+ }
3698
+ function nn(n, o, a) {
3699
+ return { type: i.MOVE_BLOCK, id: n, toParentId: o, toIndex: a };
3700
+ }
3701
+ function en(n, o) {
3702
+ return { type: i.UPDATE_BLOCK_PROPS, id: n, patch: o };
3703
+ }
3704
+ function on(n, o, a) {
3705
+ return { type: i.CHANGE_BLOCK_TYPE, id: n, blockType: o, props: a };
3706
+ }
3707
+ function tn(n, o) {
3708
+ return { type: i.UPDATE_RUN, id: n, patch: o };
3709
+ }
3710
+ function rn(n, o, a, l) {
3711
+ return { type: i.EDIT_RUN_CHARS, id: n, tombstoneIds: o, restoreIds: a, previousValue: l };
3712
+ }
3713
+ function an(n, o) {
3714
+ return { type: i.SET_BLOCK_CONTENT_IDS, blockId: n, contentIds: o };
3715
+ }
3716
+ function ln(n, o, a) {
3717
+ return { type: i.REPLACE_RUN_SPAN, blockId: n, oldRunIds: o, newRuns: a };
3718
+ }
3719
+ function dn(n, o) {
3720
+ return { type: i.SET_BLOCK_RUNS, blockId: n, runs: o };
3721
+ }
3722
+ function sn(n) {
3723
+ return { type: i.ADD_FIELD_TYPE, fieldType: n };
3724
+ }
3725
+ function cn(n, o) {
3726
+ return { type: i.UPDATE_FIELD_TYPE, id: n, patch: o };
3727
+ }
3728
+ function bn(n) {
3729
+ return { type: i.REMOVE_FIELD_TYPE, id: n };
3730
+ }
3731
+ function mn(n) {
3732
+ return { type: i.ADD_COMMENT_THREAD, thread: n };
3733
+ }
3734
+ function pn(n) {
3735
+ return { type: i.REMOVE_COMMENT_THREAD, commentId: n };
3736
+ }
3737
+ function gn(n, o) {
3738
+ return { type: i.ADD_COMMENT_REPLY, commentId: n, message: o };
3739
+ }
3740
+ function un(n, o) {
3741
+ return { type: i.REMOVE_COMMENT_REPLY, commentId: n, messageId: o };
3742
+ }
3743
+ function hn(n, o) {
3744
+ return { type: i.RESOLVE_COMMENT, commentId: n, resolved: o };
3745
+ }
3746
+ function xn(n) {
3747
+ return { type: i.ADD_PERSON, person: n };
3748
+ }
3749
+ function fn(n, o) {
3750
+ return { type: i.UPDATE_PERSON, id: n, patch: o };
3751
+ }
3752
+ function vn(n) {
3753
+ return { type: i.REMOVE_PERSON, id: n };
3754
+ }
3755
+ const Bn = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
3756
+ __proto__: null,
3757
+ OP: i,
3758
+ addCommentReply: gn,
3759
+ addCommentThread: mn,
3760
+ addFieldType: sn,
3761
+ addPerson: xn,
3762
+ changeBlockType: on,
3763
+ editRunChars: rn,
3764
+ insertBlock: J,
3765
+ moveBlock: nn,
3766
+ removeBlock: Z,
3767
+ removeCommentReply: un,
3768
+ removeCommentThread: pn,
3769
+ removeFieldType: bn,
3770
+ removePerson: vn,
3771
+ replaceRunSpan: ln,
3772
+ resolveComment: hn,
3773
+ setBlockContentIds: an,
3774
+ setBlockRuns: dn,
3775
+ updateBlockProps: en,
3776
+ updateFieldType: cn,
3777
+ updatePerson: fn,
3778
+ updateRun: tn
3779
+ }, Symbol.toStringTag, { value: "Module" }));
3780
+ function An() {
3781
+ return typeof crypto < "u" && typeof crypto.randomUUID == "function" ? crypto.randomUUID() : `id-${Date.now()}-${Math.random().toString(36).slice(2)}`;
3782
+ }
3783
+ function t({ children: n, size: o = 16, strokeWidth: a = 2, ...l }) {
3784
+ return /* @__PURE__ */ e(
3785
+ "svg",
3786
+ {
3787
+ width: o,
3788
+ height: o,
3789
+ viewBox: "0 0 24 24",
3790
+ fill: "none",
3791
+ stroke: "currentColor",
3792
+ strokeWidth: a,
3793
+ strokeLinecap: "round",
3794
+ strokeLinejoin: "round",
3795
+ "aria-hidden": "true",
3796
+ focusable: "false",
3797
+ ...l,
3798
+ children: n
3799
+ }
3800
+ );
3801
+ }
3802
+ function Ln(n) {
3803
+ return /* @__PURE__ */ e(t, { ...n, children: /* @__PURE__ */ e("polyline", { points: "9 18 15 12 9 6" }) });
3804
+ }
3805
+ function Nn(n) {
3806
+ return /* @__PURE__ */ e(t, { ...n, children: /* @__PURE__ */ e("polyline", { points: "6 9 12 15 18 9" }) });
3807
+ }
3808
+ function Hn(n) {
3809
+ return /* @__PURE__ */ r(t, { ...n, children: [
3810
+ /* @__PURE__ */ e("line", { x1: "18", y1: "6", x2: "6", y2: "18" }),
3811
+ /* @__PURE__ */ e("line", { x1: "6", y1: "6", x2: "18", y2: "18" })
3812
+ ] });
3813
+ }
3814
+ function Fn(n) {
3815
+ return /* @__PURE__ */ r(t, { ...n, fill: "currentColor", stroke: "none", children: [
3816
+ /* @__PURE__ */ e("circle", { cx: "5", cy: "12", r: "1.6" }),
3817
+ /* @__PURE__ */ e("circle", { cx: "12", cy: "12", r: "1.6" }),
3818
+ /* @__PURE__ */ e("circle", { cx: "19", cy: "12", r: "1.6" })
3819
+ ] });
3820
+ }
3821
+ function Un(n) {
3822
+ return /* @__PURE__ */ e(t, { ...n, children: /* @__PURE__ */ e("path", { d: "M21.44 11.05l-9.19 9.19a6 6 0 0 1-8.49-8.49l9.19-9.19a4 4 0 0 1 5.66 5.66l-9.2 9.19a2 2 0 0 1-2.83-2.83l8.49-8.48" }) });
3823
+ }
3824
+ function Vn(n) {
3825
+ return /* @__PURE__ */ r(t, { ...n, children: [
3826
+ /* @__PURE__ */ e("line", { x1: "12", y1: "5", x2: "12", y2: "19" }),
3827
+ /* @__PURE__ */ e("line", { x1: "5", y1: "12", x2: "19", y2: "12" })
3828
+ ] });
3829
+ }
3830
+ function Yn(n) {
3831
+ return /* @__PURE__ */ r(t, { ...n, children: [
3832
+ /* @__PURE__ */ e("path", { d: "M6 4h8a4 4 0 0 1 4 4 4 4 0 0 1-4 4H6z" }),
3833
+ /* @__PURE__ */ e("path", { d: "M6 12h9a4 4 0 0 1 4 4 4 4 0 0 1-4 4H6z" })
3834
+ ] });
3835
+ }
3836
+ function qn(n) {
3837
+ return /* @__PURE__ */ r(t, { ...n, children: [
3838
+ /* @__PURE__ */ e("line", { x1: "19", y1: "4", x2: "10", y2: "4" }),
3839
+ /* @__PURE__ */ e("line", { x1: "14", y1: "20", x2: "5", y2: "20" }),
3840
+ /* @__PURE__ */ e("line", { x1: "15", y1: "4", x2: "9", y2: "20" })
3841
+ ] });
3842
+ }
3843
+ function Kn(n) {
3844
+ return /* @__PURE__ */ r(t, { ...n, children: [
3845
+ /* @__PURE__ */ e("path", { d: "M6 3v7a6 6 0 0 0 12 0V3" }),
3846
+ /* @__PURE__ */ e("line", { x1: "4", y1: "21", x2: "20", y2: "21" })
3847
+ ] });
3848
+ }
3849
+ function Wn(n) {
3850
+ return /* @__PURE__ */ r(t, { ...n, children: [
3851
+ /* @__PURE__ */ e("path", { d: "M12 20h9" }),
3852
+ /* @__PURE__ */ e("path", { d: "M16.5 3.5a2.12 2.12 0 0 1 3 3L7 19l-4 1 1-4L16.5 3.5z" })
3853
+ ] });
3854
+ }
3855
+ function $n(n) {
3856
+ return /* @__PURE__ */ e(t, { ...n, children: /* @__PURE__ */ e("path", { d: "M3 17c2-4 4-4 6 0s4 4 6 0 4-4 6 0" }) });
3857
+ }
3858
+ function Gn(n) {
3859
+ return /* @__PURE__ */ r(t, { ...n, children: [
3860
+ /* @__PURE__ */ e("path", { d: "M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71" }),
3861
+ /* @__PURE__ */ e("path", { d: "M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71" })
3862
+ ] });
3863
+ }
3864
+ function Qn(n) {
3865
+ return /* @__PURE__ */ e(t, { ...n, children: /* @__PURE__ */ e("path", { d: "M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5z" }) });
3866
+ }
3867
+ function Xn(n) {
3868
+ return /* @__PURE__ */ r(t, { ...n, children: [
3869
+ /* @__PURE__ */ e("path", { d: "M3 12a9 9 0 1 0 3-6.7" }),
3870
+ /* @__PURE__ */ e("polyline", { points: "3 5 3 10 8 10" }),
3871
+ /* @__PURE__ */ e("polyline", { points: "12 7 12 12 16 14" })
3872
+ ] });
3873
+ }
3874
+ function Jn(n) {
3875
+ return /* @__PURE__ */ r(t, { ...n, children: [
3876
+ /* @__PURE__ */ e("path", { d: "M3 12a9 9 0 1 0 2.6-6.3" }),
3877
+ /* @__PURE__ */ e("polyline", { points: "3 4 3 9 8 9" })
3878
+ ] });
3879
+ }
3880
+ function Zn(n) {
3881
+ return /* @__PURE__ */ e(t, { ...n, children: /* @__PURE__ */ e("polyline", { points: "20 6 9 17 4 12" }) });
3882
+ }
3883
+ function ne(n) {
3884
+ return /* @__PURE__ */ r(t, { ...n, children: [
3885
+ /* @__PURE__ */ e("line", { x1: "22", y1: "2", x2: "11", y2: "13" }),
3886
+ /* @__PURE__ */ e("polygon", { points: "22 2 15 22 11 13 2 9 22 2" })
3887
+ ] });
3888
+ }
3889
+ function ee(n) {
3890
+ return /* @__PURE__ */ r(t, { ...n, children: [
3891
+ /* @__PURE__ */ e("path", { d: "M16 4H9a3 3 0 0 0-2.83 4" }),
3892
+ /* @__PURE__ */ e("path", { d: "M14 12a4 4 0 0 1 0 8H6" }),
3893
+ /* @__PURE__ */ e("line", { x1: "4", y1: "12", x2: "20", y2: "12" })
3894
+ ] });
3895
+ }
3896
+ function oe(n) {
3897
+ return /* @__PURE__ */ r(t, { ...n, children: [
3898
+ /* @__PURE__ */ e("line", { x1: "21", y1: "6", x2: "3", y2: "6" }),
3899
+ /* @__PURE__ */ e("line", { x1: "17", y1: "10", x2: "3", y2: "10" }),
3900
+ /* @__PURE__ */ e("line", { x1: "21", y1: "14", x2: "3", y2: "14" }),
3901
+ /* @__PURE__ */ e("line", { x1: "17", y1: "18", x2: "3", y2: "18" })
3902
+ ] });
3903
+ }
3904
+ function te(n) {
3905
+ return /* @__PURE__ */ r(t, { ...n, children: [
3906
+ /* @__PURE__ */ e("line", { x1: "21", y1: "6", x2: "3", y2: "6" }),
3907
+ /* @__PURE__ */ e("line", { x1: "18", y1: "10", x2: "6", y2: "10" }),
3908
+ /* @__PURE__ */ e("line", { x1: "21", y1: "14", x2: "3", y2: "14" }),
3909
+ /* @__PURE__ */ e("line", { x1: "18", y1: "18", x2: "6", y2: "18" })
3910
+ ] });
3911
+ }
3912
+ function re(n) {
3913
+ return /* @__PURE__ */ r(t, { ...n, children: [
3914
+ /* @__PURE__ */ e("line", { x1: "21", y1: "6", x2: "3", y2: "6" }),
3915
+ /* @__PURE__ */ e("line", { x1: "21", y1: "10", x2: "7", y2: "10" }),
3916
+ /* @__PURE__ */ e("line", { x1: "21", y1: "14", x2: "3", y2: "14" }),
3917
+ /* @__PURE__ */ e("line", { x1: "21", y1: "18", x2: "7", y2: "18" })
3918
+ ] });
3919
+ }
3920
+ function ae(n) {
3921
+ return /* @__PURE__ */ e(t, { ...n, children: [5, 12, 19].flatMap(
3922
+ (o) => [9, 15].map((a) => /* @__PURE__ */ e("circle", { cx: a, cy: o, r: "1.3", fill: "currentColor", stroke: "none" }, `${a}-${o}`))
3923
+ ) });
3924
+ }
3925
+ function ie(n) {
3926
+ return /* @__PURE__ */ r(t, { ...n, children: [
3927
+ /* @__PURE__ */ e("polyline", { points: "3 6 5 6 21 6" }),
3928
+ /* @__PURE__ */ e("path", { d: "M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2" }),
3929
+ /* @__PURE__ */ e("line", { x1: "10", y1: "11", x2: "10", y2: "17" }),
3930
+ /* @__PURE__ */ e("line", { x1: "14", y1: "11", x2: "14", y2: "17" })
3931
+ ] });
3932
+ }
3933
+ function le(n) {
3934
+ return /* @__PURE__ */ r(t, { ...n, children: [
3935
+ /* @__PURE__ */ e("rect", { x: "9", y: "9", width: "12", height: "12", rx: "2" }),
3936
+ /* @__PURE__ */ e("path", { d: "M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1" })
3937
+ ] });
3938
+ }
3939
+ function de(n) {
3940
+ return /* @__PURE__ */ r(t, { ...n, children: [
3941
+ /* @__PURE__ */ e("line", { x1: "12", y1: "19", x2: "12", y2: "5" }),
3942
+ /* @__PURE__ */ e("polyline", { points: "5 12 12 5 19 12" })
3943
+ ] });
3944
+ }
3945
+ function se(n) {
3946
+ return /* @__PURE__ */ r(t, { ...n, children: [
3947
+ /* @__PURE__ */ e("line", { x1: "12", y1: "5", x2: "12", y2: "19" }),
3948
+ /* @__PURE__ */ e("polyline", { points: "19 12 12 19 5 12" })
3949
+ ] });
3950
+ }
3951
+ function ce(n) {
3952
+ return /* @__PURE__ */ e(t, { ...n, children: /* @__PURE__ */ e("rect", { x: "4", y: "4", width: "16", height: "16", rx: "1" }) });
3953
+ }
3954
+ function be(n) {
3955
+ return /* @__PURE__ */ e(t, { ...n, children: /* @__PURE__ */ e("circle", { cx: "12", cy: "12", r: "8" }) });
3956
+ }
3957
+ function me(n) {
3958
+ return /* @__PURE__ */ r(t, { ...n, children: [
3959
+ /* @__PURE__ */ e("line", { x1: "6", y1: "18", x2: "18", y2: "6" }),
3960
+ /* @__PURE__ */ e("polyline", { points: "9 6 18 6 18 15" })
3961
+ ] });
3962
+ }
3963
+ function pe(n) {
3964
+ return /* @__PURE__ */ e(t, { ...n, children: /* @__PURE__ */ e("polygon", { points: "12 3 21 12 12 21 3 12" }) });
3965
+ }
3966
+ function ge(n) {
3967
+ return /* @__PURE__ */ e(t, { ...n, children: /* @__PURE__ */ e("polygon", { points: "12 4 20 20 4 20" }) });
3968
+ }
3969
+ function ue(n) {
3970
+ return /* @__PURE__ */ e(t, { ...n, children: /* @__PURE__ */ e("polygon", { points: "12 3 14.7 9.4 21.5 9.9 16.3 14.4 17.9 21 12 17.4 6.1 21 7.7 14.4 2.5 9.9 9.3 9.4" }) });
3971
+ }
3972
+ function he(n) {
3973
+ return /* @__PURE__ */ e(t, { ...n, children: /* @__PURE__ */ e("path", { d: "M5 3l14 8-6 2-2 6-6-16z" }) });
3974
+ }
3975
+ function xe(n) {
3976
+ return /* @__PURE__ */ r(t, { ...n, children: [
3977
+ /* @__PURE__ */ e("path", { d: "M19 20H9l-6-6a1.5 1.5 0 0 1 0-2l9-9a1.5 1.5 0 0 1 2 0l7 7a1.5 1.5 0 0 1 0 2l-7 7" }),
3978
+ /* @__PURE__ */ e("path", { d: "M6.5 12.5 13 19" })
3979
+ ] });
3980
+ }
3981
+ function fe(n) {
3982
+ return /* @__PURE__ */ r(t, { ...n, children: [
3983
+ /* @__PURE__ */ e("path", { d: "M12 3v12" }),
3984
+ /* @__PURE__ */ e("path", { d: "M7 10l5 5 5-5" }),
3985
+ /* @__PURE__ */ e("path", { d: "M4 19h16" })
3986
+ ] });
3987
+ }
3988
+ function ve(n) {
3989
+ return /* @__PURE__ */ r(t, { ...n, children: [
3990
+ /* @__PURE__ */ e("path", { d: "M6 15V9a6 6 0 0 1 12 0v6" }),
3991
+ /* @__PURE__ */ e("path", { d: "M6 15a3 3 0 0 0 6 0v-4" }),
3992
+ /* @__PURE__ */ e("path", { d: "M18 15a3 3 0 0 1-6 0v-4" }),
3993
+ /* @__PURE__ */ e("line", { x1: "3", y1: "9", x2: "6", y2: "9" }),
3994
+ /* @__PURE__ */ e("line", { x1: "3", y1: "15", x2: "6", y2: "15" }),
3995
+ /* @__PURE__ */ e("line", { x1: "18", y1: "9", x2: "21", y2: "9" }),
3996
+ /* @__PURE__ */ e("line", { x1: "18", y1: "15", x2: "21", y2: "15" })
3997
+ ] });
3998
+ }
3999
+ function ye(n) {
4000
+ return /* @__PURE__ */ r(t, { ...n, children: [
4001
+ /* @__PURE__ */ e("circle", { cx: "6", cy: "6", r: "3" }),
4002
+ /* @__PURE__ */ e("circle", { cx: "6", cy: "18", r: "3" }),
4003
+ /* @__PURE__ */ e("line", { x1: "20", y1: "4", x2: "8.12", y2: "15.88" }),
4004
+ /* @__PURE__ */ e("line", { x1: "14.47", y1: "14.48", x2: "20", y2: "20" }),
4005
+ /* @__PURE__ */ e("line", { x1: "8.12", y1: "8.12", x2: "12", y2: "12" })
4006
+ ] });
4007
+ }
4008
+ function we(n) {
4009
+ return /* @__PURE__ */ r(t, { ...n, children: [
4010
+ /* @__PURE__ */ e("line", { x1: "17", y1: "6", x2: "3", y2: "6" }),
4011
+ /* @__PURE__ */ e("line", { x1: "21", y1: "12", x2: "3", y2: "12" }),
4012
+ /* @__PURE__ */ e("line", { x1: "15", y1: "18", x2: "3", y2: "18" })
4013
+ ] });
4014
+ }
4015
+ function h({ level: n = 1, size: o = 16, ...a }) {
4016
+ return /* @__PURE__ */ e(
4017
+ "svg",
4018
+ {
4019
+ width: o,
4020
+ height: o,
4021
+ viewBox: "0 0 24 24",
4022
+ "aria-hidden": "true",
4023
+ focusable: "false",
4024
+ ...a,
4025
+ children: /* @__PURE__ */ r("text", { x: "2", y: "18", fontSize: "14", fontWeight: "700", fill: "currentColor", fontFamily: "inherit", children: [
4026
+ "H",
4027
+ n
4028
+ ] })
4029
+ }
4030
+ );
4031
+ }
4032
+ function ke(n) {
4033
+ return /* @__PURE__ */ e(h, { level: 1, ...n });
4034
+ }
4035
+ function ze(n) {
4036
+ return /* @__PURE__ */ e(h, { level: 2, ...n });
4037
+ }
4038
+ function Ee(n) {
4039
+ return /* @__PURE__ */ e(h, { level: 3, ...n });
4040
+ }
4041
+ function Ce(n) {
4042
+ return /* @__PURE__ */ r(t, { ...n, children: [
4043
+ /* @__PURE__ */ e("path", { d: "M7 7a3 3 0 0 0-3 3v3a2 2 0 0 0 2 2h2a1 1 0 0 0 1-1v-4a1 1 0 0 0-1-1H6a3 3 0 0 1 3-3z" }),
4044
+ /* @__PURE__ */ e("path", { d: "M17 7a3 3 0 0 0-3 3v3a2 2 0 0 0 2 2h2a1 1 0 0 0 1-1v-4a1 1 0 0 0-1-1h-2a3 3 0 0 1 3-3z" })
4045
+ ] });
4046
+ }
4047
+ function Ie(n) {
4048
+ return /* @__PURE__ */ r(t, { ...n, children: [
4049
+ /* @__PURE__ */ e("polyline", { points: "9 8 4 12 9 16" }),
4050
+ /* @__PURE__ */ e("polyline", { points: "15 8 20 12 15 16" })
4051
+ ] });
4052
+ }
4053
+ function Me(n) {
4054
+ return /* @__PURE__ */ e(t, { ...n, children: /* @__PURE__ */ e("line", { x1: "4", y1: "12", x2: "20", y2: "12" }) });
4055
+ }
4056
+ function Se(n) {
4057
+ return /* @__PURE__ */ r(t, { ...n, children: [
4058
+ /* @__PURE__ */ e("path", { d: "M4 5h16a1 1 0 0 1 1 1v9a1 1 0 0 1-1 1H9l-4 4v-4H4a1 1 0 0 1-1-1V6a1 1 0 0 1 1-1z" }),
4059
+ /* @__PURE__ */ e("line", { x1: "7", y1: "9", x2: "17", y2: "9" }),
4060
+ /* @__PURE__ */ e("line", { x1: "7", y1: "12.5", x2: "13", y2: "12.5" })
4061
+ ] });
4062
+ }
4063
+ function Te(n) {
4064
+ return /* @__PURE__ */ r(t, { ...n, children: [
4065
+ /* @__PURE__ */ e("rect", { x: "3", y: "8", width: "18", height: "8", rx: "3" }),
4066
+ /* @__PURE__ */ e("line", { x1: "8", y1: "12", x2: "16", y2: "12" })
4067
+ ] });
4068
+ }
4069
+ function _e(n) {
4070
+ return /* @__PURE__ */ r(t, { ...n, children: [
4071
+ /* @__PURE__ */ e("rect", { x: "3", y: "4", width: "18", height: "16", rx: "1" }),
4072
+ /* @__PURE__ */ e("line", { x1: "3", y1: "10", x2: "21", y2: "10" }),
4073
+ /* @__PURE__ */ e("line", { x1: "3", y1: "16", x2: "21", y2: "16" }),
4074
+ /* @__PURE__ */ e("line", { x1: "9", y1: "4", x2: "9", y2: "20" }),
4075
+ /* @__PURE__ */ e("line", { x1: "15", y1: "4", x2: "15", y2: "20" })
4076
+ ] });
4077
+ }
4078
+ function Re(n) {
4079
+ return /* @__PURE__ */ r(t, { ...n, children: [
4080
+ /* @__PURE__ */ e("rect", { x: "3", y: "4", width: "18", height: "16", rx: "1" }),
4081
+ /* @__PURE__ */ e("line", { x1: "9", y1: "4", x2: "9", y2: "20" }),
4082
+ /* @__PURE__ */ e("line", { x1: "15", y1: "4", x2: "15", y2: "20" })
4083
+ ] });
4084
+ }
4085
+ function Pe(n) {
4086
+ return /* @__PURE__ */ r(t, { ...n, children: [
4087
+ /* @__PURE__ */ e("circle", { cx: "4.5", cy: "6", r: "1.2", fill: "currentColor", stroke: "none" }),
4088
+ /* @__PURE__ */ e("circle", { cx: "4.5", cy: "12", r: "1.2", fill: "currentColor", stroke: "none" }),
4089
+ /* @__PURE__ */ e("circle", { cx: "4.5", cy: "18", r: "1.2", fill: "currentColor", stroke: "none" }),
4090
+ /* @__PURE__ */ e("line", { x1: "9", y1: "6", x2: "21", y2: "6" }),
4091
+ /* @__PURE__ */ e("line", { x1: "9", y1: "12", x2: "21", y2: "12" }),
4092
+ /* @__PURE__ */ e("line", { x1: "9", y1: "18", x2: "21", y2: "18" })
4093
+ ] });
4094
+ }
4095
+ function De(n) {
4096
+ return /* @__PURE__ */ r(t, { ...n, children: [
4097
+ /* @__PURE__ */ e("line", { x1: "10", y1: "6", x2: "21", y2: "6" }),
4098
+ /* @__PURE__ */ e("line", { x1: "10", y1: "12", x2: "21", y2: "12" }),
4099
+ /* @__PURE__ */ e("line", { x1: "10", y1: "18", x2: "21", y2: "18" }),
4100
+ /* @__PURE__ */ e("text", { x: "2", y: "8.5", fontSize: "7", fontWeight: "700", fill: "currentColor", stroke: "none", children: "1" }),
4101
+ /* @__PURE__ */ e("text", { x: "2", y: "14.5", fontSize: "7", fontWeight: "700", fill: "currentColor", stroke: "none", children: "2" }),
4102
+ /* @__PURE__ */ e("text", { x: "2", y: "20.5", fontSize: "7", fontWeight: "700", fill: "currentColor", stroke: "none", children: "3" })
4103
+ ] });
4104
+ }
4105
+ function Oe(n) {
4106
+ return /* @__PURE__ */ r(t, { ...n, children: [
4107
+ /* @__PURE__ */ e("rect", { x: "4", y: "4", width: "16", height: "16", rx: "3" }),
4108
+ /* @__PURE__ */ e("polyline", { points: "8 12 11 15 16 9" })
4109
+ ] });
4110
+ }
4111
+ function je(n) {
4112
+ return /* @__PURE__ */ r(t, { ...n, children: [
4113
+ /* @__PURE__ */ e("rect", { x: "3", y: "5", width: "18", height: "16", rx: "2" }),
4114
+ /* @__PURE__ */ e("line", { x1: "3", y1: "10", x2: "21", y2: "10" }),
4115
+ /* @__PURE__ */ e("line", { x1: "8", y1: "3", x2: "8", y2: "7" }),
4116
+ /* @__PURE__ */ e("line", { x1: "16", y1: "3", x2: "16", y2: "7" })
4117
+ ] });
4118
+ }
4119
+ function Be(n) {
4120
+ return /* @__PURE__ */ r(t, { ...n, children: [
4121
+ /* @__PURE__ */ e("path", { d: "M12 3h7a2 2 0 0 1 2 2v7a2 2 0 0 1-.59 1.41l-8 8a2 2 0 0 1-2.82 0l-7-7a2 2 0 0 1 0-2.82l8-8A2 2 0 0 1 12 3z" }),
4122
+ /* @__PURE__ */ e("circle", { cx: "15.5", cy: "8.5", r: "1.2", fill: "currentColor", stroke: "none" })
4123
+ ] });
4124
+ }
4125
+ function Ae(n) {
4126
+ return /* @__PURE__ */ r(t, { ...n, children: [
4127
+ /* @__PURE__ */ e("rect", { x: "3", y: "4", width: "18", height: "16", rx: "2" }),
4128
+ /* @__PURE__ */ e("circle", { cx: "9", cy: "10", r: "1.5", fill: "currentColor", stroke: "none" }),
4129
+ /* @__PURE__ */ e("path", { d: "M4 17l5-5 4 4 4-5 4 6" })
4130
+ ] });
4131
+ }
4132
+ function Le(n) {
4133
+ return /* @__PURE__ */ r(t, { ...n, children: [
4134
+ /* @__PURE__ */ e("rect", { x: "3", y: "5", width: "14", height: "14", rx: "2" }),
4135
+ /* @__PURE__ */ e("path", { d: "M17 10l4-2.5v9L17 14" })
4136
+ ] });
4137
+ }
4138
+ function Ne(n) {
4139
+ return /* @__PURE__ */ r(t, { ...n, children: [
4140
+ /* @__PURE__ */ e("path", { d: "M2 12s3.5-7 10-7 10 7 10 7-3.5 7-10 7-10-7-10-7z" }),
4141
+ /* @__PURE__ */ e("circle", { cx: "12", cy: "12", r: "3" })
4142
+ ] });
4143
+ }
4144
+ function He(n) {
4145
+ return /* @__PURE__ */ r(t, { ...n, children: [
4146
+ /* @__PURE__ */ e("path", { d: "M17.94 17.94A10.94 10.94 0 0 1 12 19c-6.5 0-10-7-10-7a18.5 18.5 0 0 1 5.06-5.94M9.9 4.24A10.94 10.94 0 0 1 12 4c6.5 0 10 7 10 7a18.5 18.5 0 0 1-2.16 3.19" }),
4147
+ /* @__PURE__ */ e("path", { d: "M14.12 14.12a3 3 0 1 1-4.24-4.24" }),
4148
+ /* @__PURE__ */ e("line", { x1: "1", y1: "1", x2: "23", y2: "23" })
4149
+ ] });
4150
+ }
4151
+ function Fe(n) {
4152
+ return /* @__PURE__ */ r(t, { ...n, children: [
4153
+ /* @__PURE__ */ e("line", { x1: "4", y1: "10", x2: "4", y2: "14" }),
4154
+ /* @__PURE__ */ e("line", { x1: "8", y1: "7", x2: "8", y2: "17" }),
4155
+ /* @__PURE__ */ e("line", { x1: "12", y1: "4", x2: "12", y2: "20" }),
4156
+ /* @__PURE__ */ e("line", { x1: "16", y1: "7", x2: "16", y2: "17" }),
4157
+ /* @__PURE__ */ e("line", { x1: "20", y1: "10", x2: "20", y2: "14" })
4158
+ ] });
4159
+ }
4160
+ function Ue(n) {
4161
+ return /* @__PURE__ */ r(t, { ...n, children: [
4162
+ /* @__PURE__ */ e("path", { d: "M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z" }),
4163
+ /* @__PURE__ */ e("path", { d: "M19 10v2a7 7 0 0 1-14 0v-2" }),
4164
+ /* @__PURE__ */ e("line", { x1: "12", y1: "19", x2: "12", y2: "23" }),
4165
+ /* @__PURE__ */ e("line", { x1: "8", y1: "23", x2: "16", y2: "23" })
4166
+ ] });
4167
+ }
4168
+ export {
4169
+ Mn as $,
4170
+ En as A,
4171
+ Cn as B,
4172
+ Qn as C,
4173
+ Xn as D,
4174
+ _n as E,
4175
+ xe as F,
4176
+ he as G,
4177
+ we as H,
4178
+ de as I,
4179
+ se as J,
4180
+ ce as K,
4181
+ be as L,
4182
+ Ue as M,
4183
+ me as N,
4184
+ i as O,
4185
+ Wn as P,
4186
+ pe as Q,
4187
+ Jn as R,
4188
+ ne as S,
4189
+ ie as T,
4190
+ ge as U,
4191
+ ue as V,
4192
+ ve as W,
4193
+ Hn as X,
4194
+ fe as Y,
4195
+ $n as Z,
4196
+ Tn as _,
4197
+ zn as a,
4198
+ le as a0,
4199
+ ye as a1,
4200
+ Ne as a2,
4201
+ He as a3,
4202
+ On as a4,
4203
+ In as a5,
4204
+ Sn as a6,
4205
+ Yn as a7,
4206
+ qn as a8,
4207
+ Kn as a9,
4208
+ Re as aA,
4209
+ Me as aB,
4210
+ Te as aC,
4211
+ te as aD,
4212
+ Un as aE,
4213
+ Fe as aF,
4214
+ Le as aG,
4215
+ Ae as aH,
4216
+ je as aI,
4217
+ ee as aa,
4218
+ Gn as ab,
4219
+ Ln as ac,
4220
+ kn as ad,
4221
+ d as ae,
4222
+ Vn as af,
4223
+ Fn as ag,
4224
+ Nn as ah,
4225
+ Ie as ai,
4226
+ Be as aj,
4227
+ jn as ak,
4228
+ X as al,
4229
+ Bn as am,
4230
+ Dn as an,
4231
+ ke as ao,
4232
+ ze as ap,
4233
+ Ee as aq,
4234
+ Pe as ar,
4235
+ De as as,
4236
+ Oe as at,
4237
+ Ce as au,
4238
+ Se as av,
4239
+ ae as aw,
4240
+ oe as ax,
4241
+ re as ay,
4242
+ _e as az,
4243
+ Pn as b,
4244
+ mn as c,
4245
+ pn as d,
4246
+ gn as e,
4247
+ hn as f,
4248
+ An as g,
4249
+ Zn as h,
4250
+ on as i,
4251
+ en as j,
4252
+ J as k,
4253
+ tn as l,
4254
+ nn as m,
4255
+ Z as n,
4256
+ dn as o,
4257
+ xn as p,
4258
+ fn as q,
4259
+ ln as r,
4260
+ an as s,
4261
+ vn as t,
4262
+ Rn as u,
4263
+ un as v,
4264
+ sn as w,
4265
+ cn as x,
4266
+ bn as y,
4267
+ rn as z
4268
+ };
4269
+ //# sourceMappingURL=icons-C1_s0jKK.js.map