@kerebron/extension-menu 0.4.27 → 0.4.28

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,1133 @@
1
+ @import 'menu.css';
2
+
3
+ /* Custom Menu - Google Docs style with customizable pinned items */
4
+
5
+ /* Wrapper */
6
+ .kb-custom-menu__wrapper {
7
+ display: flex;
8
+ flex-direction: column;
9
+ position: relative;
10
+ }
11
+
12
+ .kb-custom-menu__wrapper--resizing {
13
+ user-select: none;
14
+ cursor: ns-resize;
15
+ }
16
+
17
+ /* Editor container with resize */
18
+ .kb-custom-menu__editor-container {
19
+ position: relative;
20
+ overflow: auto;
21
+ display: flex;
22
+ flex-direction: column;
23
+ }
24
+
25
+ /* Resize handle */
26
+ .kb-custom-menu__resize-handle {
27
+ position: absolute;
28
+ bottom: 0;
29
+ left: 0;
30
+ right: 0;
31
+ height: 12px;
32
+ cursor: ns-resize;
33
+ display: flex;
34
+ align-items: center;
35
+ justify-content: center;
36
+ z-index: 1;
37
+ transition: background-color 0.2s ease;
38
+ }
39
+
40
+ .kb-custom-menu__resize-handle:hover {
41
+ background: rgba(60, 64, 67, 0.06);
42
+ }
43
+
44
+ .kb-custom-menu__resize-handle-bar {
45
+ width: 48px;
46
+ height: var(--kb-space-xs);
47
+ background: var(--kb-color-border-strong);
48
+ border-radius: 2px;
49
+ transition: background-color 0.2s ease;
50
+ }
51
+
52
+ .kb-custom-menu__resize-handle:hover .kb-custom-menu__resize-handle-bar {
53
+ background: var(--kb-menu-dropdown-border);
54
+ }
55
+
56
+ .kb-custom-menu__wrapper--resizing .kb-custom-menu__resize-handle-bar {
57
+ background: var(--kb-color-primary);
58
+ }
59
+
60
+ /* Toolbar */
61
+ .kb-custom-menu {
62
+ margin: calc(-1 * var(--kb-space-sm)) 0 0 0;
63
+ line-height: 1;
64
+ font-size: var(--kb-text-sm);
65
+ font-family:
66
+ -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue',
67
+ Arial, sans-serif;
68
+ position: sticky;
69
+ top: 0;
70
+ display: flex;
71
+ flex-wrap: nowrap;
72
+ align-items: center;
73
+ gap: 2px;
74
+ height: 56px;
75
+ padding: 0 var(--kb-space-sm);
76
+ background: var(--kb-color-surface-elevated);
77
+ border-bottom: 1px solid var(--kb-color-border-strong);
78
+ z-index: 1000;
79
+ overflow: visible;
80
+ }
81
+
82
+ /* Toolbar items */
83
+ .kb-custom-menu__item {
84
+ display: inline-flex;
85
+ align-items: center;
86
+ }
87
+
88
+ .kb-custom-menu__item .kb-menu__button,
89
+ .kb-custom-menu__item .kb-dropdown__label {
90
+ min-width: 44px;
91
+ min-height: 44px;
92
+ width: 44px;
93
+ height: 44px;
94
+ padding: 0;
95
+ border: none;
96
+ background: transparent;
97
+ color: var(--kb-color-text);
98
+ cursor: pointer;
99
+ border-radius: var(--kb-radius-sm);
100
+ transition: background-color 0.2s ease, outline-color 0.15s ease;
101
+ font-size: var(--kb-text-sm);
102
+ display: inline-flex;
103
+ align-items: center;
104
+ justify-content: center;
105
+ }
106
+
107
+ /* Focus styles for accessibility */
108
+ .kb-custom-menu__item .kb-menu__button:focus,
109
+ .kb-custom-menu__item .kb-dropdown__label:focus {
110
+ outline: 2px solid var(--kb-color-primary);
111
+ outline-offset: 2px;
112
+ }
113
+
114
+ .kb-custom-menu__item .kb-menu__button:focus:not(:focus-visible),
115
+ .kb-custom-menu__item .kb-dropdown__label:focus:not(:focus-visible) {
116
+ outline: none;
117
+ }
118
+
119
+ .kb-custom-menu__item .kb-menu__button:focus-visible,
120
+ .kb-custom-menu__item .kb-dropdown__label:focus-visible {
121
+ outline: 2px solid var(--kb-color-primary);
122
+ outline-offset: 2px;
123
+ }
124
+
125
+ .kb-custom-menu__item .kb-menu__button:hover,
126
+ .kb-custom-menu__item .kb-dropdown__label:hover {
127
+ background: var(--kb-color-surface-hover);
128
+ }
129
+
130
+ .kb-custom-menu__item .kb-menu__button--active {
131
+ background: var(--kb-color-active);
132
+ color: var(--kb-color-primary);
133
+ }
134
+
135
+ .kb-custom-menu__item .kb-menu__button svg {
136
+ width: 20px !important;
137
+ height: 20px !important;
138
+ fill: currentColor;
139
+ }
140
+
141
+ /* Center icon content vertically */
142
+ .kb-custom-menu__item .kb-icon {
143
+ display: inline-flex;
144
+ align-items: center;
145
+ justify-content: center;
146
+ line-height: 1;
147
+ }
148
+
149
+ /* Hide text labels in dropdown buttons - icons only in toolbar */
150
+ .kb-custom-menu__item .kb-dropdown__label-text {
151
+ display: none;
152
+ }
153
+
154
+ /* Dropdown label styling for icon-only mode */
155
+ .kb-custom-menu__item .kb-dropdown__label {
156
+ display: inline-flex;
157
+ align-items: center;
158
+ justify-content: center;
159
+ position: relative;
160
+ }
161
+
162
+ /* Ensure dropdown icons are visible and sized correctly */
163
+ .kb-custom-menu__item .kb-dropdown__label .kb-icon {
164
+ display: inline-flex;
165
+ align-items: center;
166
+ justify-content: center;
167
+ }
168
+
169
+ .kb-custom-menu__item .kb-dropdown__label .kb-icon svg {
170
+ width: 20px !important;
171
+ height: 20px !important;
172
+ fill: currentColor;
173
+ }
174
+
175
+ /* Dropdown arrow for icon-only dropdowns */
176
+ .kb-custom-menu__item .kb-dropdown__label:after {
177
+ content: '';
178
+ border-left: 3px solid transparent;
179
+ border-right: 3px solid transparent;
180
+ border-top: 3px solid currentColor;
181
+ opacity: 0.7;
182
+ position: absolute;
183
+ right: 2px;
184
+ bottom: 2px;
185
+ }
186
+
187
+ /* Remove left padding from dropdown wrapper in custom menu */
188
+ .kb-custom-menu__item .kb-dropdown {
189
+ padding: 1px 0;
190
+ }
191
+
192
+ /* Dropdown menus within custom menu - match toolbar dark background */
193
+ .kb-custom-menu .kb-dropdown__menu {
194
+ background: var(--kb-menu-dropdown-bg);
195
+ border: 1px solid var(--kb-menu-dropdown-border);
196
+ border-radius: var(--kb-radius-lg);
197
+ box-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);
198
+ padding: var(--kb-space-sm) 0;
199
+ }
200
+
201
+ .kb-custom-menu .kb-dropdown__item {
202
+ color: var(--kb-menu-dropdown-text);
203
+ padding: var(--kb-space-sm) var(--kb-space-md);
204
+ font-size: var(--kb-text-sm);
205
+ min-height: 36px;
206
+ border-radius: var(--kb-radius-sm);
207
+ margin: 0 var(--kb-space-sm);
208
+ text-align: left !important;
209
+ justify-content: flex-start !important;
210
+ display: flex !important;
211
+ /* width: 100% !important; */
212
+ }
213
+
214
+ .kb-custom-menu .kb-dropdown__item button,
215
+ .kb-custom-menu .kb-dropdown__item .kb-menu__button {
216
+ width: 100% !important;
217
+ text-align: left !important;
218
+ justify-content: flex-start !important;
219
+ display: flex !important;
220
+ padding: 0 !important;
221
+ background: transparent !important;
222
+ }
223
+
224
+ .kb-custom-menu .kb-dropdown__item button:hover,
225
+ .kb-custom-menu .kb-dropdown__item .kb-menu__button:hover {
226
+ background: transparent !important;
227
+ }
228
+
229
+ .kb-custom-menu .kb-dropdown__item:hover {
230
+ background: var(--kb-menu-dropdown-hover);
231
+ }
232
+
233
+ /* Submenu within custom menu (e.g., Heading levels) */
234
+ .kb-custom-menu .kb-submenu__content {
235
+ background: var(--kb-menu-dropdown-bg) !important;
236
+ border: 1px solid var(--kb-menu-dropdown-border) !important;
237
+ border-radius: var(--kb-radius-lg) !important;
238
+ box-shadow: 0 2px 10px rgba(0, 0, 0, 0.3) !important;
239
+ }
240
+
241
+ .kb-custom-menu .kb-submenu__label {
242
+ color: var(--kb-menu-dropdown-text) !important;
243
+ }
244
+
245
+ .kb-custom-menu .kb-submenu__label:hover {
246
+ background: none;
247
+ }
248
+
249
+ .kb-custom-menu .kb-submenu__label:after {
250
+ border-left-color: var(--kb-menu-dropdown-text) !important;
251
+ }
252
+
253
+ /* Separator */
254
+ .kb-custom-menu__separator {
255
+ width: 1px;
256
+ height: var(--kb-space-lg);
257
+ background: var(--kb-color-border-strong);
258
+ margin: 0 8px;
259
+ flex-shrink: 0;
260
+ }
261
+
262
+ /* Overflow toggle button (3-dot menu) */
263
+ .kb-custom-menu__overflow-toggle {
264
+ display: inline-flex;
265
+ align-items: center;
266
+ justify-content: center;
267
+ min-width: 44px;
268
+ min-height: 44px;
269
+ width: 44px;
270
+ height: 44px;
271
+ padding: 0;
272
+ border: none;
273
+ background: transparent;
274
+ color: var(--kb-color-text);
275
+ cursor: pointer;
276
+ border-radius: var(--kb-radius-sm);
277
+ margin-left: auto;
278
+ flex-shrink: 0;
279
+ transition: background-color 0.2s ease;
280
+ }
281
+
282
+ .kb-custom-menu__overflow-toggle:hover {
283
+ background: var(--kb-color-surface-hover);
284
+ }
285
+
286
+ .kb-custom-menu__overflow-toggle:focus {
287
+ outline: 2px solid var(--kb-color-primary);
288
+ outline-offset: 2px;
289
+ }
290
+
291
+ .kb-custom-menu__overflow-toggle:focus:not(:focus-visible) {
292
+ outline: none;
293
+ }
294
+
295
+ .kb-custom-menu__overflow-toggle:focus-visible {
296
+ outline: 2px solid var(--kb-color-primary);
297
+ outline-offset: 2px;
298
+ }
299
+
300
+ .kb-custom-menu__overflow-toggle svg {
301
+ width: 20px;
302
+ height: 20px;
303
+ fill: currentColor;
304
+ }
305
+
306
+ /* Overflow menu dropdown - Google Docs style */
307
+ .kb-custom-menu__overflow-menu {
308
+ position: absolute;
309
+ top: 48px;
310
+ right: var(--kb-space-sm);
311
+ width: auto;
312
+ min-width: 180px;
313
+ max-width: 320px;
314
+ background: var(--kb-color-surface);
315
+ border: 1px solid var(--kb-color-border-strong);
316
+ border-radius: var(--kb-radius-lg);
317
+ box-shadow: var(--kb-shadow-lg);
318
+ z-index: 1001;
319
+ max-height: 80vh;
320
+ display: flex;
321
+ flex-direction: column;
322
+ overflow: hidden;
323
+ }
324
+
325
+ /* Overflow menu content (scrollable part) */
326
+ .kb-custom-menu__overflow-content {
327
+ flex: 1;
328
+ overflow-y: auto;
329
+ padding: var(--kb-space-sm);
330
+ min-height: 0;
331
+ max-height: 800px;
332
+ }
333
+
334
+ /* Google Docs style grid layout for overflow menu */
335
+ .kb-custom-menu__overflow-content--grid {
336
+ display: flex;
337
+ flex-wrap: wrap;
338
+ align-items: center;
339
+ justify-content: flex-start;
340
+ gap: 2px;
341
+ padding: var(--kb-space-sm);
342
+ }
343
+
344
+ /* Overflow menu section header */
345
+ .kb-custom-menu__overflow-header {
346
+ width: 100%;
347
+ padding: var(--kb-space-sm) var(--kb-space-md) var(--kb-space-xs)
348
+ var(--kb-space-md);
349
+ font-size: 11px;
350
+ font-weight: 600;
351
+ text-transform: uppercase;
352
+ letter-spacing: 0.5px;
353
+ color: var(--kb-color-text-muted);
354
+ margin-bottom: var(--kb-space-xs);
355
+ }
356
+
357
+ /* Overflow menu items - default list style */
358
+ .kb-custom-menu__overflow-item {
359
+ display: flex;
360
+ align-items: center;
361
+ padding: var(--kb-space-md) var(--kb-space-md);
362
+ gap: 12px;
363
+ cursor: pointer;
364
+ transition: background-color 0.2s ease;
365
+ border-radius: var(--kb-radius-sm);
366
+ margin: 0 var(--kb-space-sm);
367
+ }
368
+
369
+ /* Focus styles for overflow menu items */
370
+ .kb-custom-menu__overflow-item:focus {
371
+ outline: 2px solid var(--kb-color-primary);
372
+ outline-offset: -2px;
373
+ }
374
+
375
+ .kb-custom-menu__overflow-item:focus:not(:focus-visible) {
376
+ outline: none;
377
+ }
378
+
379
+ .kb-custom-menu__overflow-item:focus-visible {
380
+ outline: 2px solid var(--kb-color-primary);
381
+ outline-offset: -2px;
382
+ }
383
+
384
+ /* Grid style item (Google Docs style) */
385
+ .kb-custom-menu__overflow-item--grid {
386
+ display: inline-flex;
387
+ align-items: center;
388
+ justify-content: center;
389
+ width: 44px;
390
+ height: 44px;
391
+ padding: 6px;
392
+ margin: 0;
393
+ gap: 0;
394
+ flex-shrink: 0;
395
+ position: relative;
396
+ border-radius: var(--kb-radius-sm);
397
+ }
398
+
399
+ .kb-custom-menu__overflow-item--grid:hover {
400
+ background: var(--kb-color-surface-hover);
401
+ }
402
+
403
+ /* Dropdown items in grid have indicator - same size as regular grid items */
404
+ .kb-custom-menu__overflow-item--grid.kb-custom-menu__overflow-item--dropdown {
405
+ width: 44px;
406
+ min-width: 44px;
407
+ padding: 6px;
408
+ gap: 0;
409
+ position: relative;
410
+ }
411
+
412
+ /* Dropdown indicator (small down arrow) - vertically centered on right */
413
+ .kb-custom-menu__overflow-item-indicator {
414
+ position: absolute;
415
+ right: 2px;
416
+ top: 50%;
417
+ transform: translateY(-50%);
418
+ border-left: 3px solid transparent;
419
+ border-right: 3px solid transparent;
420
+ border-top: 3px solid currentColor;
421
+ opacity: 0.7;
422
+ font-size: 0;
423
+ line-height: 0;
424
+ margin-left: 0;
425
+ }
426
+
427
+ /* Regular list items hover */
428
+ .kb-custom-menu__overflow-item:not(.kb-custom-menu__overflow-item--grid):hover {
429
+ background: var(--kb-color-surface-hover);
430
+ }
431
+
432
+ /* Grid items button styles */
433
+ .kb-custom-menu__overflow-item--grid .kb-menu__button,
434
+ .kb-custom-menu__overflow-item--grid .kb-dropdown__label {
435
+ min-width: 44px;
436
+ min-height: 44px;
437
+ width: 44px;
438
+ height: 44px;
439
+ padding: 0;
440
+ border: none;
441
+ background: transparent;
442
+ color: var(--kb-color-text);
443
+ cursor: pointer;
444
+ border-radius: 0;
445
+ display: flex;
446
+ align-items: center;
447
+ justify-content: center;
448
+ }
449
+
450
+ .kb-custom-menu__overflow-item--grid .kb-menu__button svg {
451
+ width: 20px !important;
452
+ height: 20px !important;
453
+ }
454
+
455
+ /* List-style item button styles */
456
+ .kb-custom-menu__overflow-item:not(.kb-custom-menu__overflow-item--grid)
457
+ .kb-menu__button,
458
+ .kb-custom-menu__overflow-item:not(.kb-custom-menu__overflow-item--grid)
459
+ .kb-dropdown__label {
460
+ min-height: 36px;
461
+ padding: var(--kb-space-sm) 0;
462
+ border: none;
463
+ background: transparent;
464
+ color: var(--kb-color-text);
465
+ cursor: pointer;
466
+ border-radius: 0;
467
+ transition: none;
468
+ font-size: var(--kb-text-sm);
469
+ display: flex;
470
+ align-items: center;
471
+ flex-shrink: 0;
472
+ }
473
+
474
+ /* Hide buttons without icons in list-style items (empty buttons in submenu items) */
475
+ .kb-custom-menu__overflow-item:not(.kb-custom-menu__overflow-item--grid)
476
+ .kb-menu__button:not(:has(svg)):not(:has(.kb-icon)) {
477
+ display: none;
478
+ }
479
+
480
+ /* Grid items always show the button */
481
+ .kb-custom-menu__overflow-item--grid .kb-menu__button {
482
+ display: flex !important;
483
+ }
484
+
485
+ .kb-custom-menu__overflow-item[data-tool-id='tool-toggle-underline']
486
+ .kb-menu__button {
487
+ display: flex;
488
+ }
489
+
490
+ /* Grid-style items don't need specific height overrides */
491
+ .kb-custom-menu__overflow-item--grid[data-tool-id='tool-insert'],
492
+ .kb-custom-menu__overflow-item--grid[data-tool-id='tool-type'] {
493
+ height: 36px;
494
+ }
495
+
496
+ .kb-custom-menu__overflow-item[data-tool-id='tool-text-color'] button {
497
+ display: flex;
498
+ }
499
+
500
+ .kb-custom-menu__item[data-tool-id='tool-insert'],
501
+ .kb-custom-menu__item[data-tool-id='tool-type'],
502
+ .kb-custom-menu__item[data-tool-id='tool-table'] {
503
+ position: relative;
504
+ }
505
+
506
+ .kb-custom-menu__item[data-tool-id='tool-insert'] > div > button:after,
507
+ .kb-custom-menu__item[data-tool-id='tool-type'] > div > button:after,
508
+ .kb-custom-menu__item[data-tool-id='tool-table'] > div > button:after {
509
+ content: '';
510
+ border-left: 3px solid transparent;
511
+ border-right: 3px solid transparent;
512
+ border-top: 3px solid currentColor;
513
+ opacity: 0.7;
514
+ position: absolute;
515
+ right: 2px;
516
+ bottom: 2px;
517
+ }
518
+
519
+ .kb-custom-menu__item[data-tool-id='tool-toggle-code-font'] button > span,
520
+ .kb-custom-menu__item[data-tool-id='tool-text-color'] button > span,
521
+ .kb-custom-menu__item[data-tool-id='tool-text-highlight'] button > span,
522
+ .kb-custom-menu__item[data-tool-id='tool-toggle-underline'] button > span {
523
+ display: none;
524
+ }
525
+
526
+ .kb-custom-menu__overflow-item .kb-menu__button:hover,
527
+ .kb-custom-menu__overflow-item .kb-dropdown__label:hover {
528
+ background: transparent;
529
+ }
530
+
531
+ .kb-custom-menu__overflow-item .kb-menu__button svg {
532
+ width: 20px;
533
+ height: 20px;
534
+ flex-shrink: 0;
535
+ fill: currentColor;
536
+ }
537
+
538
+ /* Overflow item label */
539
+ .kb-custom-menu__overflow-item-label {
540
+ flex: 1;
541
+ color: var(--kb-color-text);
542
+ font-size: var(--kb-text-sm);
543
+ white-space: nowrap;
544
+ overflow: hidden;
545
+ text-overflow: ellipsis;
546
+ }
547
+
548
+ /* Overflow item chevron (for dropdowns) */
549
+ .kb-custom-menu__overflow-item-chevron {
550
+ display: flex;
551
+ align-items: center;
552
+ margin-left: auto;
553
+ padding-left: var(--kb-space-sm);
554
+ color: var(--kb-color-text-muted);
555
+ }
556
+
557
+ .kb-custom-menu__overflow-item-chevron svg {
558
+ width: 16px;
559
+ height: 16px;
560
+ fill: none;
561
+ stroke: currentColor;
562
+ }
563
+
564
+ /* Overflow submenu header */
565
+ .kb-custom-menu__overflow-submenu-header {
566
+ display: flex;
567
+ align-items: center;
568
+ gap: var(--kb-space-sm);
569
+ padding: var(--kb-space-md);
570
+ border-bottom: 1px solid var(--kb-color-border);
571
+ background: var(--kb-color-surface);
572
+ position: sticky;
573
+ top: 0;
574
+ z-index: 1;
575
+ }
576
+
577
+ .kb-custom-menu__overflow-back-button {
578
+ display: flex;
579
+ align-items: center;
580
+ justify-content: center;
581
+ padding: var(--kb-space-xs);
582
+ border: none;
583
+ background: transparent;
584
+ border-radius: var(--kb-radius-sm);
585
+ cursor: pointer;
586
+ color: var(--kb-color-text);
587
+ transition: background-color 0.15s ease;
588
+ }
589
+
590
+ .kb-custom-menu__overflow-back-button:hover {
591
+ background: var(--kb-color-surface-hover);
592
+ }
593
+
594
+ .kb-custom-menu__overflow-back-button:focus {
595
+ outline: 2px solid var(--kb-color-primary);
596
+ outline-offset: 2px;
597
+ }
598
+
599
+ .kb-custom-menu__overflow-back-button:focus:not(:focus-visible) {
600
+ outline: none;
601
+ }
602
+
603
+ .kb-custom-menu__overflow-back-button:focus-visible {
604
+ outline: 2px solid var(--kb-color-primary);
605
+ outline-offset: 2px;
606
+ }
607
+
608
+ .kb-custom-menu__overflow-back-button svg {
609
+ width: 20px;
610
+ height: 20px;
611
+ fill: none;
612
+ stroke: currentColor;
613
+ }
614
+
615
+ .kb-custom-menu__overflow-submenu-title {
616
+ flex: 1;
617
+ font-size: var(--kb-text-base);
618
+ font-weight: 500;
619
+ color: var(--kb-color-text);
620
+ white-space: nowrap;
621
+ overflow: hidden;
622
+ text-overflow: ellipsis;
623
+ }
624
+
625
+ /* Overflow separator */
626
+ .kb-custom-menu__overflow-separator {
627
+ height: 1px;
628
+ background: var(--kb-color-border);
629
+ margin: var(--kb-space-sm) 0;
630
+ }
631
+
632
+ /* Overflow footer (sticky manage button container) */
633
+ .kb-custom-menu__overflow-footer {
634
+ flex-shrink: 0;
635
+ border-top: 1px solid var(--kb-color-border);
636
+ background: var(--kb-color-surface);
637
+ padding: var(--kb-space-sm) 0;
638
+ }
639
+
640
+ /* Manage button in overflow menu */
641
+ .kb-custom-menu__manage-button {
642
+ width: calc(100% - 32px);
643
+ margin: 0 var(--kb-space-md);
644
+ min-height: 36px;
645
+ padding: var(--kb-space-sm) 12px;
646
+ border: none;
647
+ background: transparent;
648
+ color: var(--kb-color-primary);
649
+ cursor: pointer;
650
+ border-radius: var(--kb-radius-sm);
651
+ transition: background-color 0.2s ease;
652
+ font-size: var(--kb-text-sm);
653
+ display: flex;
654
+ align-items: center;
655
+ gap: 12px;
656
+ text-align: left;
657
+ font-weight: 500;
658
+ }
659
+
660
+ .kb-custom-menu__manage-button:hover {
661
+ background: var(--kb-color-hover);
662
+ }
663
+
664
+ .kb-custom-menu__manage-button svg {
665
+ width: 20px;
666
+ height: 20px;
667
+ flex-shrink: 0;
668
+ }
669
+
670
+ /* Modal backdrop */
671
+ .kb-custom-menu__modal-backdrop {
672
+ position: fixed;
673
+ top: 0;
674
+ left: 0;
675
+ right: 0;
676
+ bottom: 0;
677
+ background: rgba(0, 0, 0, 0.5);
678
+ z-index: 10000;
679
+ display: flex;
680
+ align-items: center;
681
+ justify-content: center;
682
+ padding: 20px;
683
+ animation: fadeIn 0.2s ease;
684
+ }
685
+
686
+ @keyframes fadeIn {
687
+ from {
688
+ opacity: 0;
689
+ }
690
+ to {
691
+ opacity: 1;
692
+ }
693
+ }
694
+
695
+ /* Modal */
696
+ .kb-custom-menu__modal {
697
+ background: var(--kb-color-surface);
698
+ border-radius: 12px;
699
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.2);
700
+ width: 100%;
701
+ max-width: 500px;
702
+ max-height: 80vh;
703
+ display: flex;
704
+ flex-direction: column;
705
+ animation: slideUp 0.3s ease;
706
+ }
707
+
708
+ @keyframes slideUp {
709
+ from {
710
+ transform: translateY(20px);
711
+ opacity: 0;
712
+ }
713
+ to {
714
+ transform: translateY(0);
715
+ opacity: 1;
716
+ }
717
+ }
718
+
719
+ /* Modal header */
720
+ .kb-custom-menu__modal-header {
721
+ display: flex;
722
+ align-items: center;
723
+ justify-content: space-between;
724
+ padding: 20px var(--kb-space-lg);
725
+ border-bottom: 1px solid var(--kb-color-border);
726
+ }
727
+
728
+ .kb-custom-menu__modal-header h2 {
729
+ margin: 0;
730
+ font-size: 20px;
731
+ font-weight: 500;
732
+ color: var(--kb-color-text);
733
+ }
734
+
735
+ .kb-custom-menu__modal-close {
736
+ display: flex;
737
+ align-items: center;
738
+ justify-content: center;
739
+ width: 32px;
740
+ height: 32px;
741
+ padding: 0;
742
+ border: none;
743
+ background: transparent;
744
+ color: var(--kb-color-text-muted);
745
+ cursor: pointer;
746
+ border-radius: 50%;
747
+ transition: background-color 0.2s ease;
748
+ }
749
+
750
+ .kb-custom-menu__modal-close:hover {
751
+ background: var(--kb-color-surface-hover);
752
+ }
753
+
754
+ .kb-custom-menu__modal-close svg {
755
+ width: 20px;
756
+ height: 20px;
757
+ }
758
+
759
+ /* Modal message */
760
+ .kb-custom-menu__modal-message {
761
+ padding: var(--kb-space-md) var(--kb-space-lg);
762
+ background: var(--kb-menu-info-bg);
763
+ color: var(--kb-menu-info-text);
764
+ font-size: 13px;
765
+ font-weight: 500;
766
+ border-bottom: 1px solid var(--kb-color-border-strong);
767
+ }
768
+
769
+ /* Modal content */
770
+ .kb-custom-menu__modal-content {
771
+ flex: 1;
772
+ overflow-y: auto;
773
+ padding: var(--kb-space-md) 0;
774
+ }
775
+
776
+ /* Tool list */
777
+ .kb-custom-menu__tool-list {
778
+ display: flex;
779
+ flex-direction: column;
780
+ gap: 2px;
781
+ }
782
+
783
+ /* Tool item */
784
+ .kb-custom-menu__tool-item {
785
+ display: flex;
786
+ align-items: center;
787
+ gap: 12px;
788
+ padding: 12px var(--kb-space-lg);
789
+ cursor: pointer;
790
+ transition: background-color 0.2s ease;
791
+ user-select: none;
792
+ }
793
+
794
+ .kb-custom-menu__tool-item:hover {
795
+ background: rgba(60, 64, 67, 0.04);
796
+ }
797
+
798
+ .kb-custom-menu__tool-item input[type='checkbox'] {
799
+ width: 18px;
800
+ height: 18px;
801
+ cursor: pointer;
802
+ accent-color: var(--kb-color-primary);
803
+ }
804
+
805
+ .kb-custom-menu__tool-item span {
806
+ flex: 1;
807
+ color: var(--kb-color-text);
808
+ font-size: var(--kb-text-sm);
809
+ }
810
+
811
+ .kb-custom-menu__tool-item--disabled {
812
+ opacity: 0.5;
813
+ cursor: not-allowed;
814
+ }
815
+
816
+ .kb-custom-menu__tool-item--disabled:hover {
817
+ background: transparent;
818
+ }
819
+
820
+ .kb-custom-menu__tool-item--disabled input[type='checkbox'] {
821
+ cursor: not-allowed;
822
+ }
823
+
824
+ /* Modal footer */
825
+ .kb-custom-menu__modal-footer {
826
+ display: flex;
827
+ align-items: center;
828
+ justify-content: flex-end;
829
+ padding: var(--kb-space-md) var(--kb-space-lg);
830
+ border-top: 1px solid var(--kb-color-border);
831
+ gap: var(--kb-space-sm);
832
+ }
833
+
834
+ .kb-custom-menu__modal-button {
835
+ min-width: 80px;
836
+ padding: var(--kb-space-sm) var(--kb-space-lg);
837
+ border: none;
838
+ border-radius: var(--kb-radius-sm);
839
+ font-size: var(--kb-text-sm);
840
+ font-weight: 500;
841
+ cursor: pointer;
842
+ transition: all 0.2s ease;
843
+ }
844
+
845
+ .kb-custom-menu__modal-button--primary {
846
+ background: var(--kb-color-primary);
847
+ color: white;
848
+ }
849
+
850
+ .kb-custom-menu__modal-button--primary:hover {
851
+ background: var(--kb-color-primary-hover);
852
+ box-shadow: var(--kb-shadow-sm);
853
+ }
854
+
855
+ .kb-custom-menu__modal-button--primary:active {
856
+ background: var(--kb-color-primary-active);
857
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.16);
858
+ }
859
+
860
+ /* Small screen adjustments - toolbar stays at top */
861
+ @media (max-width: 767.98px) {
862
+ .kb-custom-menu__overflow-menu {
863
+ /* Dropdown stays below toolbar */
864
+ max-width: 100%;
865
+ left: var(--kb-space-sm);
866
+ right: var(--kb-space-sm);
867
+ }
868
+
869
+ /* Larger touch targets for overflow menu items on mobile */
870
+ .kb-custom-menu__overflow-item {
871
+ min-height: 44px;
872
+ padding: var(--kb-space-md);
873
+ }
874
+
875
+ .kb-custom-menu__overflow-item--grid {
876
+ min-width: 44px;
877
+ min-height: 44px;
878
+ }
879
+
880
+ .kb-custom-menu__modal {
881
+ max-width: 100%;
882
+ max-height: 90vh;
883
+ margin: 0;
884
+ border-radius: 12px 12px 0 0;
885
+ }
886
+
887
+ /* Larger back button touch target */
888
+ .kb-custom-menu__overflow-back-button {
889
+ min-width: 44px;
890
+ min-height: 44px;
891
+ }
892
+ }
893
+
894
+ /* Dark mode support */
895
+ @media (prefers-color-scheme: dark) {
896
+ .kb-custom-menu {
897
+ background: var(--kb-color-surface-elevated);
898
+ border-bottom-color: var(--kb-color-border);
899
+ }
900
+
901
+ .kb-custom-menu__resize-handle:hover {
902
+ background: rgba(232, 234, 237, 0.06);
903
+ }
904
+
905
+ .kb-custom-menu__resize-handle-bar {
906
+ background: var(--kb-menu-dropdown-border);
907
+ }
908
+
909
+ .kb-custom-menu__resize-handle:hover .kb-custom-menu__resize-handle-bar {
910
+ background: var(--kb-color-text-muted);
911
+ }
912
+
913
+ .kb-custom-menu__wrapper--resizing .kb-custom-menu__resize-handle-bar {
914
+ background: var(--kb-color-primary);
915
+ }
916
+
917
+ .kb-custom-menu__item .kb-menu__button,
918
+ .kb-custom-menu__item .kb-dropdown__label,
919
+ .kb-custom-menu__overflow-toggle {
920
+ color: var(--kb-menu-dropdown-text);
921
+ }
922
+
923
+ .kb-custom-menu__item .kb-menu__button:hover,
924
+ .kb-custom-menu__item .kb-dropdown__label:hover,
925
+ .kb-custom-menu__overflow-toggle:hover {
926
+ background: var(--kb-menu-dropdown-hover);
927
+ }
928
+
929
+ .kb-custom-menu__separator {
930
+ background: var(--kb-menu-dropdown-border);
931
+ }
932
+
933
+ .kb-custom-menu__overflow-menu {
934
+ background: var(--kb-menu-dropdown-bg);
935
+ border-color: var(--kb-menu-dropdown-border);
936
+ }
937
+
938
+ .kb-custom-menu__overflow-header {
939
+ color: var(--kb-color-text-muted);
940
+ }
941
+
942
+ .kb-custom-menu__overflow-item .kb-menu__button,
943
+ .kb-custom-menu__overflow-item .kb-dropdown__label {
944
+ color: var(--kb-menu-dropdown-text);
945
+ }
946
+
947
+ .kb-custom-menu__overflow-item-label {
948
+ color: var(--kb-menu-dropdown-text);
949
+ }
950
+
951
+ .kb-custom-menu__overflow-item:hover {
952
+ background: var(--kb-menu-dropdown-hover);
953
+ }
954
+
955
+ .kb-custom-menu__overflow-separator {
956
+ background: var(--kb-menu-dropdown-border);
957
+ }
958
+
959
+ .kb-custom-menu__overflow-footer {
960
+ background: var(--kb-menu-dropdown-bg);
961
+ border-top-color: var(--kb-menu-dropdown-border);
962
+ }
963
+
964
+ .kb-custom-menu__modal {
965
+ background: var(--kb-color-surface);
966
+ }
967
+
968
+ .kb-custom-menu__modal-header {
969
+ border-bottom-color: var(--kb-menu-dropdown-border);
970
+ }
971
+
972
+ .kb-custom-menu__modal-header h2 {
973
+ color: var(--kb-menu-dropdown-text);
974
+ }
975
+
976
+ .kb-custom-menu__modal-close {
977
+ color: var(--kb-color-text-muted);
978
+ }
979
+
980
+ .kb-custom-menu__modal-message {
981
+ background: var(--kb-menu-info-bg);
982
+ color: var(--kb-menu-info-text);
983
+ border-bottom-color: var(--kb-menu-dropdown-border);
984
+ }
985
+
986
+ .kb-custom-menu__modal-footer {
987
+ border-top-color: var(--kb-menu-dropdown-border);
988
+ }
989
+
990
+ .kb-custom-menu__tool-item span {
991
+ color: var(--kb-menu-dropdown-text);
992
+ }
993
+ }
994
+
995
+ /* Drag and drop styles */
996
+ .kb-custom-menu__wrapper--dragging {
997
+ user-select: none;
998
+ cursor: grabbing !important;
999
+ }
1000
+
1001
+ .kb-custom-menu__wrapper--dragging * {
1002
+ cursor: grabbing !important;
1003
+ }
1004
+
1005
+ .kb-custom-menu__item {
1006
+ cursor: grab;
1007
+ transition: opacity 0.2s ease, transform 0.2s ease;
1008
+ }
1009
+
1010
+ /* Only show grabbing cursor when wrapper has dragging class, not just on :active */
1011
+ .kb-custom-menu__wrapper--dragging .kb-custom-menu__item {
1012
+ cursor: grabbing !important;
1013
+ }
1014
+
1015
+ /* Ensure buttons inside items have pointer cursor for click feedback */
1016
+ .kb-custom-menu__item .kb-menu__button,
1017
+ .kb-custom-menu__item .kb-dropdown__label {
1018
+ cursor: pointer !important;
1019
+ }
1020
+
1021
+ /* Override to grabbing cursor only when actively dragging */
1022
+ .kb-custom-menu__wrapper--dragging .kb-custom-menu__item .kb-menu__button,
1023
+ .kb-custom-menu__wrapper--dragging .kb-custom-menu__item .kb-dropdown__label {
1024
+ cursor: grabbing !important;
1025
+ }
1026
+
1027
+ .kb-custom-menu__item--dragging {
1028
+ opacity: 0.3;
1029
+ }
1030
+
1031
+ .kb-custom-menu__overflow-item--dragging {
1032
+ opacity: 0.3;
1033
+ }
1034
+
1035
+ .kb-custom-menu__drag-ghost {
1036
+ opacity: 0.9;
1037
+ background: var(--kb-color-surface-elevated);
1038
+ border-radius: var(--kb-radius-sm);
1039
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
1040
+ transform: scale(1.05);
1041
+ }
1042
+
1043
+ .kb-custom-menu__drop-placeholder {
1044
+ width: 4px;
1045
+ min-height: 32px;
1046
+ background: var(--kb-color-primary);
1047
+ border-radius: 2px;
1048
+ margin: 0 2px;
1049
+ display: inline-flex;
1050
+ flex-shrink: 0;
1051
+ }
1052
+
1053
+ /* Pinned dropdown menu (independent from overflow) */
1054
+ .kb-custom-menu__pinned-dropdown {
1055
+ min-width: 200px;
1056
+ max-width: 300px;
1057
+ background: var(--kb-menu-dropdown-bg) !important;
1058
+ border: 1px solid var(--kb-color-border-strong);
1059
+ border-radius: var(--kb-radius-lg);
1060
+ box-shadow: var(--kb-shadow-lg);
1061
+ max-height: 400px;
1062
+ overflow-y: auto;
1063
+ }
1064
+
1065
+ /* Overflow menu footer (for Reset to Default) */
1066
+ .kb-custom-menu__overflow-footer {
1067
+ padding: var(--kb-space-sm);
1068
+ border-top: 1px solid var(--kb-color-border);
1069
+ display: flex;
1070
+ justify-content: center;
1071
+ }
1072
+
1073
+ /* Reset to Default button */
1074
+ .kb-custom-menu__reset-button {
1075
+ display: flex;
1076
+ align-items: center;
1077
+ gap: var(--kb-space-sm);
1078
+ padding: var(--kb-space-sm) var(--kb-space-md);
1079
+ font-size: 12px;
1080
+ color: var(--kb-color-text-muted);
1081
+ background: transparent;
1082
+ border: 1px solid var(--kb-color-border);
1083
+ border-radius: var(--kb-radius-sm);
1084
+ cursor: pointer;
1085
+ transition: all 0.2s ease;
1086
+ }
1087
+
1088
+ .kb-custom-menu__reset-button:hover {
1089
+ background: var(--kb-color-surface-hover);
1090
+ color: var(--kb-color-text);
1091
+ border-color: var(--kb-color-border-strong);
1092
+ }
1093
+
1094
+ .kb-custom-menu__reset-button:focus {
1095
+ outline: 2px solid var(--kb-color-primary);
1096
+ outline-offset: 2px;
1097
+ }
1098
+
1099
+ .kb-custom-menu__reset-button:focus:not(:focus-visible) {
1100
+ outline: none;
1101
+ }
1102
+
1103
+ .kb-custom-menu__reset-button:focus-visible {
1104
+ outline: 2px solid var(--kb-color-primary);
1105
+ outline-offset: 2px;
1106
+ }
1107
+
1108
+ .kb-custom-menu__reset-button svg {
1109
+ width: 14px;
1110
+ height: 14px;
1111
+ flex-shrink: 0;
1112
+ }
1113
+
1114
+ .kb-custom-menu__reset-button span {
1115
+ white-space: nowrap;
1116
+ }
1117
+
1118
+ /* Icon-only variant for toolbar display */
1119
+ .kb-custom-menu__reset-button--icon-only {
1120
+ padding: var(--kb-space-sm);
1121
+ border: none;
1122
+ background: transparent;
1123
+ }
1124
+
1125
+ .kb-custom-menu__reset-button--icon-only:hover {
1126
+ background: var(--kb-color-surface-hover);
1127
+ border: none;
1128
+ }
1129
+
1130
+ .kb-custom-menu__reset-button--icon-only svg {
1131
+ width: 18px;
1132
+ height: 18px;
1133
+ }