@kerebron/extension-menu 0.5.2 → 0.5.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,973 @@
1
+ /* Base menu and toolbar styles - Google Docs style with overflow */
2
+ .kb-menu {
3
+ margin: 0;
4
+ line-height: 1;
5
+ font-size: 14px;
6
+ font-family:
7
+ -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue',
8
+ Arial, sans-serif;
9
+ position: sticky;
10
+ top: 0;
11
+ display: flex;
12
+ flex-wrap: nowrap;
13
+ align-items: center;
14
+ gap: 0;
15
+ padding: 4px 8px;
16
+ background: #f9f9f9;
17
+ border-bottom: 1px solid #dadce0;
18
+ z-index: var(--kb-z-dropdown, 1000);
19
+ overflow: visible;
20
+ }
21
+
22
+ /* Content host - main toolbar items */
23
+ .kb-menu__content {
24
+ display: flex;
25
+ flex: 1;
26
+ align-items: center;
27
+ gap: 0;
28
+ overflow: hidden;
29
+ }
30
+
31
+ /* Overflow toggle button (3-dot menu) */
32
+ .kb-overflow-toggle {
33
+ display: none; /* shown by JS when needed */
34
+ min-width: 30px;
35
+ min-height: 30px;
36
+ padding: 6px;
37
+ border: none;
38
+ background: transparent;
39
+ color: #3c4043;
40
+ cursor: pointer;
41
+ border-radius: 2px;
42
+ margin-left: 4px;
43
+ flex-shrink: 0;
44
+ }
45
+
46
+ .kb-overflow-toggle:hover {
47
+ background: rgba(60, 64, 67, 0.08);
48
+ }
49
+
50
+ .kb-overflow-toggle svg {
51
+ width: 20px;
52
+ height: 20px;
53
+ fill: currentColor;
54
+ }
55
+
56
+ /* Overflow row - second row for overflowed items */
57
+ .kb-menu__overflow-row {
58
+ display: none;
59
+ flex-wrap: wrap;
60
+ gap: 4px;
61
+ padding: 8px;
62
+ background: #f9f9f9;
63
+ border-bottom: 1px solid #dadce0;
64
+ }
65
+
66
+ .kb-menu--overflow-open .kb-menu__overflow-row {
67
+ display: flex;
68
+ position: absolute;
69
+ }
70
+
71
+ /* When narrow, show overflow toggle */
72
+ .kb-menu--narrow .kb-overflow-toggle {
73
+ display: inline-flex;
74
+ }
75
+
76
+ /* Mobile: bottom-anchored toolbar */
77
+ @media (max-width: 767px) {
78
+ .kb-menu {
79
+ position: fixed;
80
+ bottom: 0;
81
+ left: 0;
82
+ right: 0;
83
+ top: auto;
84
+ border-bottom: none;
85
+ border-top: 1px solid #dadce0;
86
+ box-shadow: 0 -2px 8px rgba(0, 0, 0, 0.1);
87
+ backdrop-filter: blur(10px);
88
+ background: rgba(249, 249, 249, 0.95);
89
+ padding: 8px;
90
+ }
91
+
92
+ .kb-menu__overflow-row {
93
+ position: fixed;
94
+ bottom: 60px;
95
+ left: 0;
96
+ right: 0;
97
+ border-top: 1px solid #dadce0;
98
+ border-bottom: none;
99
+ box-shadow: 0 -2px 8px rgba(0, 0, 0, 0.1);
100
+ }
101
+
102
+ /* Add bottom padding to editor content to prevent overlap */
103
+ .kb-component,
104
+ .ProseMirror {
105
+ padding-bottom: 60px !important;
106
+ }
107
+
108
+ .kb-overflow-toggle {
109
+ min-width: 44px;
110
+ min-height: 44px;
111
+ padding: 10px;
112
+ }
113
+ }
114
+
115
+ /* Tablet and desktop: top toolbar */
116
+ @media (min-width: 768px) {
117
+ .kb-menu {
118
+ position: relative;
119
+ border-radius: var(--kb-radius-md) var(--kb-radius-md) 0 0;
120
+ }
121
+ }
122
+
123
+ .kb-menu {
124
+ background-color: var(--kb-color-surface);
125
+ z-index: 10000;
126
+ }
127
+
128
+ /* Toolbar items */
129
+ .kb-menu__button {
130
+ border-radius: var(--kb-radius-sm);
131
+
132
+ min-width: var(--kb-touch-target-comfortable);
133
+ min-height: var(--kb-touch-target-comfortable);
134
+
135
+ border: none;
136
+ background: transparent;
137
+ color: var(--kb-color-text);
138
+ cursor: pointer;
139
+ transition: all 0.2s ease;
140
+ font-size: var(--kb-text-sm);
141
+ flex-shrink: 0;
142
+ }
143
+
144
+ .kb-menu__button:hover {
145
+ background: var(--kb-color-hover);
146
+ border-color: var(--kb-color-border);
147
+ }
148
+
149
+ .kb-menu__button:focus {
150
+ outline: 2px solid var(--kb-color-primary);
151
+ outline-offset: 2px;
152
+ }
153
+
154
+ .kb-menu__button--active {
155
+ background: var(--kb-color-primary);
156
+ color: white;
157
+ border-color: var(--kb-color-primary);
158
+ border-radius: var(--kb-radius-sm);
159
+ }
160
+
161
+ .kb-menu__button--pressed {
162
+ background: var(--kb-color-active);
163
+ transform: scale(0.95);
164
+ transition: transform 0.1s ease;
165
+ }
166
+
167
+ .kb-menu__button--disabled {
168
+ opacity: 0.4;
169
+ cursor: not-allowed;
170
+ }
171
+
172
+ .kb-menu__button--disabled:hover {
173
+ background: transparent;
174
+ border-color: transparent;
175
+ }
176
+
177
+ /* Icon styling */
178
+ .kb-dropdown__item svg,
179
+ .kb-menu__button svg {
180
+ fill: currentColor;
181
+ height: 1em;
182
+ width: 1em;
183
+ }
184
+
185
+ .kb-dropdown__item svg,
186
+ .kb-menu__button span,
187
+ .kb-menu__button svg {
188
+ vertical-align: middle;
189
+ }
190
+
191
+ /* Hide text labels in toolbar buttons - show icons only */
192
+ .kb-menu__button span {
193
+ display: none;
194
+ }
195
+
196
+ /* Hide text labels in dropdown buttons - show icons only */
197
+ .kb-dropdown__label-text {
198
+ display: none;
199
+ }
200
+
201
+ /* Separator */
202
+ .kb-menu__separator {
203
+ width: 1px;
204
+ height: var(--kb-space-lg);
205
+ background: var(--kb-color-border);
206
+ margin: 0 var(--kb-space-xs);
207
+ flex-shrink: 0;
208
+ }
209
+
210
+ /* Dropdown menu */
211
+ .kb-dropdown {
212
+ position: relative;
213
+ padding: 1px 0 1px var(--kb-space-sm);
214
+ display: inline-block;
215
+ }
216
+
217
+ .kb-dropdown__label {
218
+ min-width: var(--kb-touch-target-comfortable);
219
+ min-height: var(--kb-touch-target-comfortable);
220
+
221
+ border: none;
222
+ background: none;
223
+ font-size: var(--kb-text-sm);
224
+ align-items: center;
225
+ padding-right: var(--kb-space-lg);
226
+ white-space: nowrap;
227
+ cursor: pointer;
228
+ }
229
+
230
+ .kb-dropdown__label:focus {
231
+ outline: 2px solid var(--kb-color-primary);
232
+ outline-offset: -2px;
233
+ }
234
+
235
+ .kb-dropdown__label--active {
236
+ background: var(--kb-color-active);
237
+ color: var(--kb-color-primary);
238
+ }
239
+
240
+ .kb-dropdown__label:after {
241
+ content: '';
242
+ border-left: 4px solid transparent;
243
+ border-right: 4px solid transparent;
244
+ border-top: 4px solid currentColor;
245
+ opacity: 0.6;
246
+ position: absolute;
247
+ right: var(--kb-space-sm);
248
+ top: calc(50% - 2px);
249
+ }
250
+
251
+ .kb-dropdown__menu {
252
+ position: fixed;
253
+ /*min-width: 200px;*/
254
+ min-width: 6em;
255
+ background: var(--kb-color-surface);
256
+ border: 1px solid var(--kb-color-border);
257
+ border-radius: var(--kb-radius-md);
258
+ box-shadow: var(--kb-shadow-lg);
259
+ z-index: var(--kb-z-dropdown);
260
+ padding: var(--kb-space-xs);
261
+ margin-top: var(--kb-space-xs);
262
+ opacity: 0;
263
+ visibility: hidden;
264
+ transform: translateY(-4px);
265
+ transition: all 0.2s ease;
266
+ white-space: nowrap;
267
+ }
268
+
269
+ .kb-dropdown--open .kb-dropdown__menu {
270
+ opacity: 1;
271
+ visibility: visible;
272
+ transform: translateY(0);
273
+ }
274
+
275
+ .kb-dropdown__item {
276
+ display: flex;
277
+ padding: var(--kb-space-sm) var(--kb-space-md);
278
+ border: none;
279
+ background: none;
280
+ text-align: left;
281
+ cursor: pointer;
282
+ border-radius: var(--kb-radius-sm);
283
+ color: var(--kb-color-text);
284
+ font-size: var(--kb-text-sm);
285
+ min-height: var(--kb-touch-target-comfortable);
286
+ align-items: center;
287
+ transition: background-color 0.2s ease;
288
+ }
289
+
290
+ .kb-dropdown__item:hover {
291
+ background: var(--kb-color-hover);
292
+ }
293
+
294
+ .kb-dropdown__item:focus {
295
+ outline: 2px solid var(--kb-color-primary);
296
+ outline-offset: -2px;
297
+ }
298
+
299
+ .kb-dropdown__item--active {
300
+ background: var(--kb-color-active);
301
+ color: var(--kb-color-primary);
302
+ }
303
+
304
+ /* Accessibility: High contrast mode support */
305
+ @media (prefers-contrast: more) {
306
+ .kb-dropdown__item,
307
+ .kb-dropdown__item:focus {
308
+ outline-width: 3px;
309
+ }
310
+ }
311
+
312
+ /* Mobile: full-screen dropdown */
313
+ @media (max-width: 767px) {
314
+ .kb-dropdown__menu,
315
+ .kb-dropdown__menu--mobile {
316
+ position: fixed;
317
+ top: auto;
318
+ bottom: calc(var(--kb-touch-target-comfortable) + var(--kb-space-md) * 2);
319
+ left: var(--kb-space-sm);
320
+ right: var(--kb-space-sm);
321
+ min-width: auto;
322
+ border-radius: var(--kb-radius-lg);
323
+ max-height: 50vh;
324
+ overflow-y: auto;
325
+ padding: var(--kb-space-md);
326
+ backdrop-filter: blur(10px);
327
+ background: rgba(255, 255, 255, 0.95);
328
+ }
329
+
330
+ .kb-dropdown__item {
331
+ padding: var(--kb-space-md);
332
+ min-height: var(--kb-touch-target-comfortable);
333
+ }
334
+ }
335
+
336
+ /* Submenu support */
337
+ .kb-submenu {
338
+ position: relative;
339
+ margin-right: var(--kb-space-sm);
340
+ }
341
+
342
+ .kb-submenu__label {
343
+ position: relative;
344
+ padding-right: var(--kb-space-lg);
345
+ }
346
+
347
+ .kb-submenu__label:after {
348
+ content: '';
349
+ border-top: 4px solid transparent;
350
+ border-bottom: 4px solid transparent;
351
+ border-left: 4px solid currentColor;
352
+ opacity: 0.6;
353
+ position: absolute;
354
+ right: var(--kb-space-sm);
355
+ top: calc(50% - 4px);
356
+ }
357
+
358
+ .kb-submenu__content {
359
+ position: absolute;
360
+ left: 100%;
361
+ top: var(--kb-space-xs);
362
+ /*min-width: 160px;*/
363
+ min-width: 4em;
364
+ background: var(--kb-color-surface);
365
+ border: 1px solid var(--kb-color-border);
366
+ border-radius: var(--kb-radius-md);
367
+ box-shadow: var(--kb-shadow-lg);
368
+ z-index: calc(var(--kb-z-dropdown) + 1);
369
+ padding: var(--kb-space-xs);
370
+ opacity: 0;
371
+ visibility: hidden;
372
+ transform: translateX(-4px);
373
+ transition: all 0.2s ease;
374
+ }
375
+
376
+ .kb-submenu:hover .kb-submenu__content,
377
+ .kb-submenu--open .kb-submenu__content {
378
+ opacity: 1;
379
+ visibility: visible;
380
+ transform: translateX(0);
381
+ }
382
+
383
+ /* Mobile: no submenus, flatten structure */
384
+ @media (max-width: 767px) {
385
+ .kb-submenu__content {
386
+ display: none;
387
+ }
388
+ }
389
+
390
+ /* Tooltip for button labels */
391
+ .kb-tooltip {
392
+ position: absolute;
393
+ bottom: 100%;
394
+ left: 50%;
395
+ transform: translateX(-50%);
396
+ background: var(--kb-color-text);
397
+ color: var(--kb-color-surface);
398
+ padding: var(--kb-space-xs) var(--kb-space-sm);
399
+ border-radius: var(--kb-radius-sm);
400
+ font-size: var(--kb-text-xs);
401
+ white-space: nowrap;
402
+ opacity: 0;
403
+ visibility: hidden;
404
+ transition: all 0.2s ease;
405
+ margin-bottom: var(--kb-space-xs);
406
+ z-index: var(--kb-z-tooltip);
407
+ }
408
+
409
+ .kb-tooltip:after {
410
+ content: '';
411
+ position: absolute;
412
+ top: 100%;
413
+ left: 50%;
414
+ transform: translateX(-50%);
415
+ border-left: 4px solid transparent;
416
+ border-right: 4px solid transparent;
417
+ border-top: 4px solid var(--kb-color-text);
418
+ }
419
+
420
+ .kb-menu__button:hover .kb-tooltip {
421
+ opacity: 1;
422
+ visibility: visible;
423
+ }
424
+
425
+ /* Mobile: no tooltips on touch devices */
426
+ @media (max-width: 767px) {
427
+ .kb-tooltip {
428
+ display: none;
429
+ }
430
+ }
431
+
432
+ /* Accessibility improvements */
433
+ @media (prefers-reduced-motion: reduce) {
434
+ .kb-menu__button,
435
+ .kb-dropdown__menu,
436
+ .kb-submenu__content,
437
+ .kb-tooltip {
438
+ transition: none;
439
+ }
440
+ }
441
+
442
+ .kb-icon {
443
+ min-width: var(--kb-touch-target-comfortable);
444
+ min-height: var(--kb-touch-target-comfortable);
445
+
446
+ display: inline-block;
447
+ line-height: var(--kb-touch-target-comfortable);
448
+ vertical-align: middle;
449
+ }
450
+
451
+ /* Prompt/dialog styles with mobile optimization */
452
+ .kb-prompt {
453
+ background: var(--kb-color-surface);
454
+ padding: var(--kb-space-lg) var(--kb-space-xl);
455
+ border: 1px solid var(--kb-color-border);
456
+ position: fixed;
457
+ border-radius: var(--kb-radius-lg);
458
+ z-index: var(--kb-z-modal);
459
+ box-shadow: var(--kb-shadow-lg);
460
+ top: 50%;
461
+ left: 50%;
462
+ transform: translate(-50%, -50%);
463
+ min-width: 320px;
464
+ max-width: 90vw;
465
+ }
466
+
467
+ .kb-prompt form {
468
+ display: flex;
469
+ flex-direction: column;
470
+ gap: var(--kb-space-md);
471
+ }
472
+
473
+ .kb-prompt form > div {
474
+ display: flex;
475
+ flex-direction: column;
476
+ }
477
+
478
+ .kb-prompt-backdrop {
479
+ position: fixed;
480
+ top: 0;
481
+ left: 0;
482
+ right: 0;
483
+ bottom: 0;
484
+ z-index: 1299;
485
+ }
486
+
487
+ /* Buttons container - override the column direction for field divs */
488
+ .kb-prompt form > div.kb-prompt__buttons {
489
+ flex-direction: row;
490
+ flex-wrap: nowrap;
491
+ justify-content: space-between;
492
+ margin-top: var(--kb-space-sm);
493
+ gap: var(--kb-space-sm);
494
+ }
495
+
496
+ .kb-prompt h5 {
497
+ margin: 0;
498
+ font-weight: 600;
499
+ font-size: var(--kb-text-lg);
500
+ color: var(--kb-color-text);
501
+ }
502
+
503
+ .kb-prompt input[type='text'],
504
+ .kb-prompt textarea {
505
+ background: var(--kb-color-surface-elevated);
506
+ border: 1px solid var(--kb-color-border);
507
+ border-radius: var(--kb-radius-sm);
508
+ padding: var(--kb-space-sm) var(--kb-space-md);
509
+ font-size: var(--kb-text-base);
510
+ color: var(--kb-color-text);
511
+ width: 100%;
512
+ box-sizing: border-box;
513
+ outline: none;
514
+ }
515
+
516
+ .kb-prompt input[type='text']:focus,
517
+ .kb-prompt textarea:focus {
518
+ border-color: var(--kb-color-primary);
519
+ box-shadow: 0 0 0 3px var(--kb-color-focus);
520
+ }
521
+
522
+ .kb-prompt--close {
523
+ position: absolute;
524
+ right: var(--kb-space-sm);
525
+ top: var(--kb-space-sm);
526
+ color: var(--kb-color-text-muted);
527
+ border: none;
528
+ background: transparent;
529
+ padding: var(--kb-space-xs);
530
+ cursor: pointer;
531
+ border-radius: var(--kb-radius-sm);
532
+ width: var(--kb-space-lg);
533
+ height: var(--kb-space-lg);
534
+ display: flex;
535
+ align-items: center;
536
+ justify-content: center;
537
+ }
538
+
539
+ .kb-prompt--close:hover {
540
+ background: var(--kb-color-hover);
541
+ color: var(--kb-color-text);
542
+ }
543
+
544
+ .kb-prompt--close:after {
545
+ content: '✕';
546
+ font-size: var(--kb-text-sm);
547
+ }
548
+
549
+ .kb-invalid {
550
+ background: #fef2f2;
551
+ border: 1px solid #fecaca;
552
+ color: #991b1b;
553
+ border-radius: var(--kb-radius-sm);
554
+ padding: var(--kb-space-sm) var(--kb-space-md);
555
+ position: absolute;
556
+ min-width: 10em;
557
+ font-size: var(--kb-text-sm);
558
+ }
559
+
560
+ .kb-prompt__buttons {
561
+ margin-top: var(--kb-space-sm);
562
+ display: flex;
563
+ flex-direction: row;
564
+ flex-wrap: nowrap;
565
+ gap: var(--kb-space-sm);
566
+ justify-content: space-between;
567
+ }
568
+
569
+ .kb-prompt__buttons button {
570
+ padding: var(--kb-space-xs) var(--kb-space-md);
571
+ border: 1px solid var(--kb-color-border);
572
+ border-radius: var(--kb-radius-sm);
573
+ background: var(--kb-color-surface);
574
+ color: var(--kb-color-text);
575
+ cursor: pointer;
576
+ font-size: var(--kb-text-sm);
577
+ font-weight: 500;
578
+ min-height: auto;
579
+ width: auto;
580
+ flex: 0 0 auto;
581
+ transition: background-color 0.15s ease, border-color 0.15s ease;
582
+ }
583
+
584
+ /* OK button (submit) comes first in DOM, push Cancel to the end visually */
585
+ .kb-prompt__buttons button[type='submit'] {
586
+ order: 2;
587
+ }
588
+
589
+ .kb-prompt__buttons button[type='button'] {
590
+ order: 1;
591
+ }
592
+
593
+ .kb-prompt__buttons button:hover {
594
+ background: var(--kb-color-hover);
595
+ }
596
+
597
+ .kb-prompt__buttons button[type='submit'] {
598
+ background: var(--kb-color-primary);
599
+ color: white;
600
+ border-color: var(--kb-color-primary);
601
+ }
602
+
603
+ .kb-prompt__buttons button[type='submit']:hover {
604
+ background: var(--kb-color-primary-hover);
605
+ }
606
+
607
+ /* File field styles for image upload */
608
+ .kb-prompt__file-field {
609
+ display: flex;
610
+ flex-direction: column;
611
+ gap: var(--kb-space-xs);
612
+ }
613
+
614
+ .kb-prompt__file-label {
615
+ font-size: var(--kb-text-sm);
616
+ color: var(--kb-color-text-muted);
617
+ font-weight: 500;
618
+ }
619
+
620
+ .kb-prompt__file-input {
621
+ background: var(--kb-color-surface-elevated);
622
+ border: 1px solid var(--kb-color-border);
623
+ border-radius: var(--kb-radius-sm);
624
+ padding: var(--kb-space-sm) var(--kb-space-md);
625
+ font-size: var(--kb-text-sm);
626
+ color: var(--kb-color-text);
627
+ width: 100%;
628
+ box-sizing: border-box;
629
+ cursor: pointer;
630
+ }
631
+
632
+ .kb-prompt__file-input::file-selector-button {
633
+ background: var(--kb-color-primary);
634
+ color: white;
635
+ border: none;
636
+ border-radius: var(--kb-radius-sm);
637
+ padding: var(--kb-space-xs) var(--kb-space-md);
638
+ margin-right: var(--kb-space-md);
639
+ cursor: pointer;
640
+ font-size: var(--kb-text-sm);
641
+ font-weight: 500;
642
+ transition: background-color 0.15s ease;
643
+ }
644
+
645
+ .kb-prompt__file-input::file-selector-button:hover {
646
+ background: var(--kb-color-primary-hover);
647
+ }
648
+
649
+ .kb-prompt__file-input:focus {
650
+ border-color: var(--kb-color-primary);
651
+ box-shadow: 0 0 0 3px var(--kb-color-focus);
652
+ outline: none;
653
+ }
654
+
655
+ .kb-prompt__file-name {
656
+ font-size: var(--kb-text-xs);
657
+ color: var(--kb-color-text-muted);
658
+ font-style: italic;
659
+ }
660
+
661
+ /* Prompt/Dialog mobile optimization */
662
+ @media (max-width: 767px) {
663
+ .kb-editor-prompt {
664
+ position: fixed;
665
+ bottom: var(--kb-space-md);
666
+ left: var(--kb-space-md);
667
+ right: var(--kb-space-md);
668
+ top: auto;
669
+ transform: none;
670
+ max-width: none;
671
+ border-radius: var(--kb-radius-lg);
672
+ padding: var(--kb-space-lg);
673
+ }
674
+
675
+ .kb-editor-prompt input[type='text'],
676
+ .kb-editor-prompt textarea {
677
+ min-height: var(--kb-touch-target-min);
678
+ padding: var(--kb-space-sm);
679
+ font-size: var(--kb-text-base);
680
+ border: 1px solid var(--kb-color-border);
681
+ border-radius: var(--kb-radius-sm);
682
+ background: var(--kb-color-surface);
683
+ color: var(--kb-color-text);
684
+ }
685
+
686
+ .kb-editor-prompt-buttons {
687
+ display: flex;
688
+ gap: var(--kb-space-sm);
689
+ margin-top: var(--kb-space-md);
690
+ }
691
+
692
+ .kb-editor-prompt-buttons button {
693
+ flex: 1;
694
+ min-height: var(--kb-touch-target-comfortable);
695
+ padding: var(--kb-space-sm) var(--kb-space-md);
696
+ border: 1px solid var(--kb-color-border);
697
+ border-radius: var(--kb-radius-sm);
698
+ background: var(--kb-color-surface);
699
+ color: var(--kb-color-text);
700
+ font-size: var(--kb-text-base);
701
+ cursor: pointer;
702
+ }
703
+
704
+ .kb-editor-prompt-buttons button[type='submit'] {
705
+ background: var(--kb-color-primary);
706
+ color: white;
707
+ border-color: var(--kb-color-primary);
708
+ }
709
+ }
710
+
711
+ /* ===========================
712
+ Google-Docs–style toolbar for kb-menu
713
+ (main look + overflow behavior)
714
+ =========================== */
715
+
716
+ :root {
717
+ --kb-bg: #fff;
718
+ --kb-fg: #1f1f1f;
719
+ --kb-subtle: #5f6368;
720
+ --kb-border: #e0e0e0;
721
+ --kb-hover: #f1f3f4;
722
+ --kb-active: #e8f0fe;
723
+ --kb-focus: #1a73e8;
724
+ --kb-shadow: 0 1px 2px rgba(0, 0, 0, 0.06), 0 2px 8px rgba(0, 0, 0, 0.08);
725
+
726
+ --kb-height: 48px;
727
+ --kb-btn-h: 34px;
728
+ --kb-radius: 10px;
729
+
730
+ --kb-gap: 8px;
731
+ --kb-icon: 20px;
732
+ --kb-font: 13px;
733
+ }
734
+
735
+ /* Keep light toolbar even for dark pages (like Google Docs) */
736
+ @media (prefers-color-scheme: dark) {
737
+ :root {
738
+ --kb-bg: #ffffff;
739
+ --kb-fg: #1f1f1f;
740
+ --kb-subtle: #5f6368;
741
+ --kb-border: #e6e7e8;
742
+ --kb-hover: #f3f4f5;
743
+ --kb-active: #e8f0fe;
744
+ }
745
+ }
746
+
747
+ /* Wrapper around toolbar + editor (plugin inserts this) */
748
+ .kb-menu__wrapper {
749
+ z-index: 50;
750
+ padding: 8px 12px; /* spacing around the pill */
751
+ background: transparent;
752
+ }
753
+
754
+ /* The toolbar element */
755
+ .kb-menu {
756
+ background: var(--kb-bg);
757
+ border: 1px solid var(--kb-border);
758
+ border-radius: var(--kb-radius);
759
+ box-shadow: var(--kb-shadow);
760
+
761
+ min-height: var(--kb-height);
762
+ display: flex;
763
+ align-items: center;
764
+ gap: var(--kb-gap);
765
+ padding: 0 8px;
766
+
767
+ container-type: inline-size;
768
+ }
769
+
770
+ /* Spacer used when floating */
771
+ .kb-menu__spacer {
772
+ height: var(--kb-height);
773
+ }
774
+
775
+ /* Items and separators from renderGrouped */
776
+ .kb-menu__item {
777
+ display: inline-flex;
778
+ align-items: center;
779
+ }
780
+ .kb-menu__separator {
781
+ width: 1px;
782
+ height: 22px;
783
+ background: var(--kb-border);
784
+ flex: 0 0 auto;
785
+ margin: 0 2px;
786
+ }
787
+
788
+ /* Buttons */
789
+ .kb-menu__button {
790
+ height: var(--kb-btn-h);
791
+ min-width: 34px;
792
+ display: inline-flex;
793
+ align-items: center;
794
+ justify-content: center;
795
+ gap: 6px;
796
+ padding: 6px 10px;
797
+ border-radius: 8px;
798
+ border: 1px solid transparent;
799
+ background: transparent;
800
+ color: var(--kb-fg);
801
+ font:
802
+ 500 var(--kb-font)/1.2 system-ui,
803
+ -apple-system,
804
+ 'Segoe UI',
805
+ Roboto,
806
+ Arial;
807
+ cursor: pointer;
808
+ user-select: none;
809
+ white-space: nowrap;
810
+ }
811
+ .kb-menu__button svg,
812
+ .kb-menu__button .kb-icon {
813
+ width: var(--kb-icon);
814
+ height: var(--kb-icon);
815
+ fill: currentColor;
816
+ }
817
+ .kb-menu__button:hover {
818
+ background: var(--kb-hover);
819
+ }
820
+ .kb-menu__button:focus-visible {
821
+ outline: 2px solid var(--kb-focus);
822
+ outline-offset: 2px;
823
+ background: var(--kb-hover);
824
+ }
825
+ .kb-menu__button--active,
826
+ .kb-menu__button[aria-pressed='true'] {
827
+ background: var(--kb-active);
828
+ border-color: #d2e3fc;
829
+ }
830
+ .kb-menu__button--disabled,
831
+ .kb-menu__button[aria-disabled='true'] {
832
+ opacity: 0.5;
833
+ cursor: default;
834
+ pointer-events: none;
835
+ }
836
+ .kb-menu__button--icon-only > span {
837
+ display: none;
838
+ }
839
+
840
+ /* Dropdowns */
841
+ .kb-dropdown {
842
+ position: relative;
843
+ display: inline-flex;
844
+ align-items: center;
845
+ }
846
+ .kb-dropdown__label {
847
+ height: var(--kb-btn-h);
848
+ display: inline-flex;
849
+ align-items: center;
850
+ gap: 6px;
851
+ padding: 6px 10px;
852
+ border-radius: 8px;
853
+ border: 1px solid transparent;
854
+ background: transparent;
855
+ color: var(--kb-fg);
856
+ font:
857
+ 500 var(--kb-font)/1.2 system-ui,
858
+ -apple-system,
859
+ 'Segoe UI',
860
+ Roboto,
861
+ Arial;
862
+ cursor: pointer;
863
+ }
864
+ .kb-dropdown__label:hover {
865
+ background: var(--kb-hover);
866
+ }
867
+ .kb-dropdown--open .kb-dropdown__label {
868
+ background: var(--kb-active);
869
+ border-color: #d2e3fc;
870
+ }
871
+ .kb-dropdown__menu {
872
+ position: absolute;
873
+ top: calc(100% + 6px);
874
+ left: 0;
875
+ min-width: 240px;
876
+ max-height: 60vh;
877
+ overflow: auto;
878
+ background: var(--kb-bg);
879
+ color: var(--kb-fg);
880
+ border: 1px solid var(--kb-border);
881
+ border-radius: 10px;
882
+ box-shadow: var(--kb-shadow);
883
+ padding: 6px;
884
+ display: grid;
885
+ gap: 2px;
886
+ z-index: 100;
887
+ }
888
+ .kb-dropdown__item {
889
+ display: contents;
890
+ }
891
+ .kb-dropdown__item .kb-menu__button {
892
+ justify-content: flex-start;
893
+ width: 100%;
894
+ border-radius: 8px;
895
+ }
896
+
897
+ /* Submenus */
898
+ .kb-submenu {
899
+ position: relative;
900
+ display: inline-flex;
901
+ align-items: center;
902
+ }
903
+ .kb-submenu__label {
904
+ height: var(--kb-btn-h);
905
+ display: inline-flex;
906
+ align-items: center;
907
+ gap: 6px;
908
+ padding: 6px 10px;
909
+ border-radius: 8px;
910
+ }
911
+ .kb-submenu__label:hover {
912
+ background: var(--kb-hover);
913
+ }
914
+ .kb-submenu__content {
915
+ position: absolute;
916
+ top: calc(100% + 6px);
917
+ left: 0;
918
+ min-width: 220px;
919
+ max-height: 60vh;
920
+ overflow: auto;
921
+ background: var(--kb-bg);
922
+ border: 1px solid var(--kb-border);
923
+ border-radius: 10px;
924
+ box-shadow: var(--kb-shadow);
925
+ padding: 6px;
926
+ display: none;
927
+ z-index: 100;
928
+ }
929
+ .kb-submenu--open .kb-submenu__content {
930
+ display: block;
931
+ }
932
+
933
+ /* --------- Overflow behavior --------- */
934
+
935
+ /* Hidden until narrow AND there is overflow (JS toggles display) */
936
+ .kb-overflow-toggle {
937
+ display: none;
938
+ }
939
+
940
+ /* Second row container (hidden until toggled open) */
941
+ .kb-menu__overflow-row {
942
+ display: none;
943
+ margin: 6px 12px 0; /* align with wrapper padding */
944
+ padding: 6px;
945
+ background: var(--kb-bg);
946
+ border: 1px solid var(--kb-border);
947
+ border-radius: 10px;
948
+ box-shadow: var(--kb-shadow);
949
+ gap: 6px;
950
+ align-items: center;
951
+ flex-wrap: wrap;
952
+ }
953
+
954
+ /* When narrow, show 3-dots (JS may still hide if empty) */
955
+ .kb-menu--narrow .kb-overflow-toggle {
956
+ display: inline-flex;
957
+ }
958
+
959
+ /* When toggled open, show the overflow row */
960
+ .kb-menu--overflow-open .kb-menu__overflow-row {
961
+ display: flex;
962
+ }
963
+
964
+ /* On very small/mobile, put overflow row ABOVE the main bar */
965
+ @media (max-width: 600px) {
966
+ .kb-menu__wrapper {
967
+ display: flex;
968
+ flex-direction: column;
969
+ }
970
+ .kb-menu--overflow-open .kb-menu__overflow-row {
971
+ order: -1;
972
+ }
973
+ }