@kerebron/extension-menu 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 (76) hide show
  1. package/README.md +26 -1
  2. package/assets/custom-menu.css +838 -0
  3. package/assets/menu.css +353 -26
  4. package/esm/_dnt.shims.d.ts +6 -0
  5. package/esm/_dnt.shims.d.ts.map +1 -0
  6. package/esm/_dnt.shims.js +61 -0
  7. package/esm/editor/src/CoreEditor.d.ts +13 -4
  8. package/esm/editor/src/CoreEditor.d.ts.map +1 -1
  9. package/esm/editor/src/CoreEditor.js +64 -12
  10. package/esm/editor/src/Extension.d.ts +6 -1
  11. package/esm/editor/src/Extension.d.ts.map +1 -1
  12. package/esm/editor/src/Extension.js +21 -1
  13. package/esm/editor/src/ExtensionManager.d.ts +5 -6
  14. package/esm/editor/src/ExtensionManager.d.ts.map +1 -1
  15. package/esm/editor/src/ExtensionManager.js +43 -55
  16. package/esm/editor/src/Mark.d.ts +3 -0
  17. package/esm/editor/src/Mark.d.ts.map +1 -1
  18. package/esm/editor/src/Mark.js +11 -0
  19. package/esm/editor/src/Node.d.ts +5 -2
  20. package/esm/editor/src/Node.d.ts.map +1 -1
  21. package/esm/editor/src/Node.js +13 -2
  22. package/esm/editor/src/commands/CommandManager.d.ts +13 -6
  23. package/esm/editor/src/commands/CommandManager.d.ts.map +1 -1
  24. package/esm/editor/src/commands/CommandManager.js +59 -2
  25. package/esm/editor/src/commands/baseCommandFactories.d.ts +3 -0
  26. package/esm/editor/src/commands/baseCommandFactories.d.ts.map +1 -0
  27. package/esm/editor/src/commands/baseCommandFactories.js +836 -0
  28. package/esm/editor/src/commands/keyCommandFactories.d.ts +3 -0
  29. package/esm/editor/src/commands/keyCommandFactories.d.ts.map +1 -0
  30. package/esm/editor/src/commands/keyCommandFactories.js +10 -0
  31. package/esm/editor/src/commands/mod.d.ts +5 -53
  32. package/esm/editor/src/commands/mod.d.ts.map +1 -1
  33. package/esm/editor/src/commands/mod.js +14 -821
  34. package/esm/editor/src/commands/replaceCommandFactories.d.ts +3 -0
  35. package/esm/editor/src/commands/replaceCommandFactories.d.ts.map +1 -0
  36. package/esm/editor/src/commands/replaceCommandFactories.js +94 -0
  37. package/esm/editor/src/commands/types.d.ts +18 -0
  38. package/esm/editor/src/commands/types.d.ts.map +1 -0
  39. package/esm/editor/src/commands/types.js +1 -0
  40. package/esm/editor/src/mod.d.ts +2 -0
  41. package/esm/editor/src/mod.d.ts.map +1 -1
  42. package/esm/editor/src/mod.js +2 -0
  43. package/esm/editor/src/plugins/TrackSelecionPlugin.d.ts +6 -0
  44. package/esm/editor/src/plugins/TrackSelecionPlugin.d.ts.map +1 -0
  45. package/esm/editor/src/plugins/TrackSelecionPlugin.js +24 -0
  46. package/esm/editor/src/types.d.ts +19 -1
  47. package/esm/editor/src/types.d.ts.map +1 -1
  48. package/esm/editor/src/ui.d.ts +15 -0
  49. package/esm/editor/src/ui.d.ts.map +1 -0
  50. package/esm/editor/src/ui.js +16 -0
  51. package/esm/editor/src/utilities/SmartOutput.d.ts +9 -7
  52. package/esm/editor/src/utilities/SmartOutput.d.ts.map +1 -1
  53. package/esm/editor/src/utilities/SmartOutput.js +35 -20
  54. package/esm/extension-menu/src/CustomMenuPlugin.d.ts +61 -0
  55. package/esm/extension-menu/src/CustomMenuPlugin.d.ts.map +1 -0
  56. package/esm/extension-menu/src/CustomMenuPlugin.js +1130 -0
  57. package/esm/extension-menu/src/ExtensionCustomMenu.d.ts +11 -0
  58. package/esm/extension-menu/src/ExtensionCustomMenu.d.ts.map +1 -0
  59. package/esm/extension-menu/src/ExtensionCustomMenu.js +23 -0
  60. package/esm/extension-menu/src/buildMenu.d.ts +5 -0
  61. package/esm/extension-menu/src/buildMenu.d.ts.map +1 -0
  62. package/esm/extension-menu/src/{ExtensionMenu.js → buildMenu.js} +88 -75
  63. package/esm/extension-menu/src/icons.d.ts.map +1 -1
  64. package/esm/extension-menu/src/icons.js +5 -0
  65. package/esm/extension-menu/src/menu.d.ts +1 -8
  66. package/esm/extension-menu/src/menu.d.ts.map +1 -1
  67. package/esm/extension-menu/src/menu.js +9 -51
  68. package/esm/extension-menu/src/mod.d.ts +3 -0
  69. package/esm/extension-menu/src/mod.d.ts.map +1 -0
  70. package/esm/extension-menu/src/mod.js +2 -0
  71. package/package.json +8 -4
  72. package/esm/extension-menu/src/ExtensionMenu.d.ts +0 -17
  73. package/esm/extension-menu/src/ExtensionMenu.d.ts.map +0 -1
  74. package/esm/extension-menu/src/MenuPlugin.d.ts +0 -9
  75. package/esm/extension-menu/src/MenuPlugin.d.ts.map +0 -1
  76. package/esm/extension-menu/src/MenuPlugin.js +0 -245
@@ -0,0 +1,838 @@
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-dark-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: 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: var(--kb-space-xs);
74
+ padding: 6px var(--kb-space-sm);
75
+ background: var(--kb-color-surface-elevated);
76
+ border-bottom: 1px solid var(--kb-color-border-strong);
77
+ z-index: 1000;
78
+ overflow: visible;
79
+ }
80
+
81
+ /* Toolbar items */
82
+ .kb-custom-menu__item {
83
+ display: inline-flex;
84
+ align-items: center;
85
+ }
86
+
87
+ .kb-custom-menu__item .kb-menu__button,
88
+ .kb-custom-menu__item .kb-dropdown__label {
89
+ min-width: 32px;
90
+ min-height: 32px;
91
+ padding: var(--kb-space-xs) var(--kb-space-sm);
92
+ border: none;
93
+ background: transparent;
94
+ color: var(--kb-color-text);
95
+ cursor: pointer;
96
+ border-radius: var(--kb-radius-sm);
97
+ transition: background-color 0.2s ease;
98
+ font-size: var(--kb-text-sm);
99
+ display: inline-flex;
100
+ align-items: center;
101
+ justify-content: center;
102
+ }
103
+
104
+ .kb-custom-menu__item .kb-menu__button:hover,
105
+ .kb-custom-menu__item .kb-dropdown__label:hover {
106
+ background: var(--kb-color-surface-hover);
107
+ }
108
+
109
+ .kb-custom-menu__item .kb-menu__button--active {
110
+ background: var(--kb-color-active);
111
+ color: var(--kb-color-primary);
112
+ }
113
+
114
+ .kb-custom-menu__item .kb-menu__button svg {
115
+ width: 18px;
116
+ height: 18px;
117
+ fill: currentColor;
118
+ }
119
+
120
+ /* Dropdown menus within custom menu - match toolbar dark background */
121
+ .kb-custom-menu .kb-dropdown__menu {
122
+ background: var(--kb-menu-dropdown-dark-bg);
123
+ border: 1px solid var(--kb-menu-dropdown-dark-border);
124
+ border-radius: var(--kb-radius-lg);
125
+ box-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);
126
+ padding: var(--kb-space-sm) 0;
127
+ }
128
+
129
+ .kb-custom-menu .kb-dropdown__item {
130
+ color: var(--kb-menu-dropdown-dark-text);
131
+ padding: var(--kb-space-sm) var(--kb-space-md);
132
+ font-size: var(--kb-text-sm);
133
+ min-height: 36px;
134
+ border-radius: var(--kb-radius-sm);
135
+ margin: 0 var(--kb-space-sm);
136
+ text-align: left !important;
137
+ justify-content: flex-start !important;
138
+ display: flex !important;
139
+ /* width: 100% !important; */
140
+ }
141
+
142
+ .kb-custom-menu .kb-dropdown__item button,
143
+ .kb-custom-menu .kb-dropdown__item .kb-menu__button {
144
+ width: 100% !important;
145
+ text-align: left !important;
146
+ justify-content: flex-start !important;
147
+ display: flex !important;
148
+ padding: 0 !important;
149
+ background: transparent !important;
150
+ }
151
+
152
+ .kb-custom-menu .kb-dropdown__item button:hover,
153
+ .kb-custom-menu .kb-dropdown__item .kb-menu__button:hover {
154
+ background: transparent !important;
155
+ }
156
+
157
+ .kb-custom-menu .kb-dropdown__item:hover {
158
+ background: rgba(232, 234, 237, 0.08);
159
+ }
160
+
161
+ /* Submenu within custom menu (e.g., Heading levels) */
162
+ .kb-custom-menu .kb-submenu__content {
163
+ background: var(--kb-menu-dropdown-dark-bg) !important;
164
+ border: 1px solid var(--kb-menu-dropdown-dark-border) !important;
165
+ border-radius: var(--kb-radius-lg) !important;
166
+ box-shadow: 0 2px 10px rgba(0, 0, 0, 0.3) !important;
167
+ }
168
+
169
+ .kb-custom-menu .kb-submenu__label {
170
+ color: var(--kb-menu-dropdown-dark-text) !important;
171
+ }
172
+
173
+ .kb-custom-menu .kb-submenu__label:hover {
174
+ background: none;
175
+ }
176
+
177
+ .kb-custom-menu .kb-submenu__label:after {
178
+ border-left-color: var(--kb-menu-dropdown-dark-text) !important;
179
+ }
180
+
181
+ /* Separator */
182
+ .kb-custom-menu__separator {
183
+ width: 1px;
184
+ height: var(--kb-space-lg);
185
+ background: var(--kb-color-border-strong);
186
+ margin: 0 var(--kb-space-xs);
187
+ flex-shrink: 0;
188
+ margin-left: auto;
189
+ }
190
+
191
+ /* Overflow toggle button (3-dot menu) */
192
+ .kb-custom-menu__overflow-toggle {
193
+ display: inline-flex;
194
+ align-items: center;
195
+ justify-content: center;
196
+ min-width: 32px;
197
+ min-height: 32px;
198
+ padding: var(--kb-space-xs);
199
+ border: none;
200
+ background: transparent;
201
+ color: var(--kb-color-text);
202
+ cursor: pointer;
203
+ border-radius: var(--kb-radius-sm);
204
+ margin-left: auto;
205
+ flex-shrink: 0;
206
+ }
207
+
208
+ .kb-custom-menu__overflow-toggle:hover {
209
+ background: var(--kb-color-surface-hover);
210
+ }
211
+
212
+ .kb-custom-menu__overflow-toggle svg {
213
+ width: 20px;
214
+ height: 20px;
215
+ fill: currentColor;
216
+ }
217
+
218
+ /* Overflow menu dropdown */
219
+ .kb-custom-menu__overflow-menu {
220
+ position: absolute;
221
+ top: 48px;
222
+ right: var(--kb-space-sm);
223
+ min-width: 220px;
224
+ max-width: 280px;
225
+ background: var(--kb-color-surface);
226
+ border: 1px solid var(--kb-color-border-strong);
227
+ border-radius: var(--kb-radius-lg);
228
+ box-shadow: var(--kb-shadow-lg);
229
+ z-index: 1001;
230
+ max-height: 80vh;
231
+ display: flex;
232
+ flex-direction: column;
233
+ overflow: hidden;
234
+ }
235
+
236
+ /* Overflow menu content (scrollable part) */
237
+ .kb-custom-menu__overflow-content {
238
+ flex: 1;
239
+ overflow-y: auto;
240
+ padding: var(--kb-space-sm) 0;
241
+ min-height: 0;
242
+ max-height: 800px;
243
+ }
244
+
245
+ /* Overflow menu section header */
246
+ .kb-custom-menu__overflow-header {
247
+ padding: var(--kb-space-sm) var(--kb-space-md) var(--kb-space-xs)
248
+ var(--kb-space-md);
249
+ font-size: 11px;
250
+ font-weight: 600;
251
+ text-transform: uppercase;
252
+ letter-spacing: 0.5px;
253
+ color: var(--kb-color-text-muted);
254
+ margin-bottom: var(--kb-space-xs);
255
+ }
256
+
257
+ /* Overflow menu items */
258
+ .kb-custom-menu__overflow-item {
259
+ display: flex;
260
+ align-items: center;
261
+ padding: var(--kb-space-md) var(--kb-space-md);
262
+ gap: 12px;
263
+ cursor: pointer;
264
+ transition: background-color 0.2s ease;
265
+ border-radius: var(--kb-radius-sm);
266
+ margin: 0 var(--kb-space-sm);
267
+ }
268
+
269
+ .kb-custom-menu__overflow-item:hover {
270
+ background: var(--kb-color-surface-hover);
271
+ }
272
+
273
+ .kb-custom-menu__overflow-item .kb-menu__button,
274
+ .kb-custom-menu__overflow-item .kb-dropdown__label {
275
+ min-height: 36px;
276
+ padding: var(--kb-space-sm) 0;
277
+ border: none;
278
+ background: transparent;
279
+ color: var(--kb-color-text);
280
+ cursor: pointer;
281
+ border-radius: 0;
282
+ transition: none;
283
+ font-size: var(--kb-text-sm);
284
+ display: flex;
285
+ align-items: center;
286
+ flex-shrink: 0;
287
+ }
288
+
289
+ /* Hide buttons without icons (empty buttons in submenu items) */
290
+ .kb-custom-menu__overflow-item
291
+ .kb-menu__button:not(:has(svg)):not(:has(.kb-icon)) {
292
+ display: none;
293
+ }
294
+
295
+ /* Hide empty overflow items with no label text */
296
+ .kb-custom-menu__overflow-item:not(:has(.kb-custom-menu__overflow-item-label)),
297
+ .kb-custom-menu__overflow-item:has(.kb-custom-menu__overflow-item-label:empty) {
298
+ display: none;
299
+ }
300
+
301
+ .kb-custom-menu__overflow-item[data-tool-id='tool-toggle-underline']
302
+ .kb-menu__button {
303
+ display: flex;
304
+ }
305
+
306
+ .kb-custom-menu__overflow-item[data-tool-id='tool-insert'],
307
+ .kb-custom-menu__overflow-item[data-tool-id='tool-type'] {
308
+ height: 68px;
309
+ }
310
+ .kb-custom-menu__overflow-item[data-tool-id='tool-insert'] button,
311
+ .kb-custom-menu__overflow-item[data-tool-id='tool-type'] button,
312
+ .kb-custom-menu__overflow-item[data-tool-id='tool-select-parent-node'] {
313
+ display: none;
314
+ }
315
+
316
+ .kb-custom-menu__overflow-item[data-tool-id='tool-text-color'] button {
317
+ display: flex;
318
+ }
319
+
320
+ .kb-custom-menu__item[data-tool-id='tool-insert'],
321
+ .kb-custom-menu__item[data-tool-id='tool-type'],
322
+ .kb-custom-menu__item[data-tool-id='tool-table'] {
323
+ position: relative;
324
+ }
325
+
326
+ .kb-custom-menu__item[data-tool-id='tool-insert'] > div > button,
327
+ .kb-custom-menu__item[data-tool-id='tool-type'] > div > button,
328
+ .kb-custom-menu__item[data-tool-id='tool-table'] > div > button {
329
+ padding-right: 20px;
330
+ }
331
+
332
+ .kb-custom-menu__item[data-tool-id='tool-insert'] > div > button:after,
333
+ .kb-custom-menu__item[data-tool-id='tool-type'] > div > button:after,
334
+ .kb-custom-menu__item[data-tool-id='tool-table'] > div > button:after {
335
+ content: '▼';
336
+ font-size: 4px;
337
+ color: var(--kb-color-text-muted);
338
+ position: absolute;
339
+ right: 4px;
340
+ }
341
+
342
+ .kb-custom-menu__item[data-tool-id='tool-toggle-code-font'] button > span,
343
+ .kb-custom-menu__item[data-tool-id='tool-text-color'] button > span,
344
+ .kb-custom-menu__item[data-tool-id='tool-text-highlight'] button > span,
345
+ .kb-custom-menu__item[data-tool-id='tool-toggle-underline'] button > span {
346
+ display: none;
347
+ }
348
+
349
+ .kb-custom-menu__overflow-item .kb-menu__button:hover,
350
+ .kb-custom-menu__overflow-item .kb-dropdown__label:hover {
351
+ background: transparent;
352
+ }
353
+
354
+ .kb-custom-menu__overflow-item .kb-menu__button svg {
355
+ width: 20px;
356
+ height: 20px;
357
+ flex-shrink: 0;
358
+ fill: currentColor;
359
+ }
360
+
361
+ /* Overflow item label */
362
+ .kb-custom-menu__overflow-item-label {
363
+ flex: 1;
364
+ color: var(--kb-color-text);
365
+ font-size: var(--kb-text-sm);
366
+ white-space: nowrap;
367
+ overflow: hidden;
368
+ text-overflow: ellipsis;
369
+ }
370
+
371
+ /* Overflow item chevron (for dropdowns) */
372
+ .kb-custom-menu__overflow-item-chevron {
373
+ display: flex;
374
+ align-items: center;
375
+ margin-left: auto;
376
+ padding-left: var(--kb-space-sm);
377
+ color: var(--kb-color-text-muted);
378
+ }
379
+
380
+ .kb-custom-menu__overflow-item-chevron svg {
381
+ width: 16px;
382
+ height: 16px;
383
+ fill: none;
384
+ stroke: currentColor;
385
+ }
386
+
387
+ /* Overflow submenu header */
388
+ .kb-custom-menu__overflow-submenu-header {
389
+ display: flex;
390
+ align-items: center;
391
+ gap: var(--kb-space-sm);
392
+ padding: var(--kb-space-md);
393
+ border-bottom: 1px solid var(--kb-color-border);
394
+ background: var(--kb-color-surface);
395
+ position: sticky;
396
+ top: 0;
397
+ z-index: 1;
398
+ }
399
+
400
+ .kb-custom-menu__overflow-back-button {
401
+ display: flex;
402
+ align-items: center;
403
+ justify-content: center;
404
+ padding: var(--kb-space-xs);
405
+ border: none;
406
+ background: transparent;
407
+ border-radius: var(--kb-radius-sm);
408
+ cursor: pointer;
409
+ color: var(--kb-color-text);
410
+ transition: background-color 0.15s ease;
411
+ }
412
+
413
+ .kb-custom-menu__overflow-back-button:hover {
414
+ background: var(--kb-color-surface-hover);
415
+ }
416
+
417
+ .kb-custom-menu__overflow-back-button svg {
418
+ width: 20px;
419
+ height: 20px;
420
+ fill: none;
421
+ stroke: currentColor;
422
+ }
423
+
424
+ .kb-custom-menu__overflow-submenu-title {
425
+ flex: 1;
426
+ font-size: var(--kb-text-base);
427
+ font-weight: 500;
428
+ color: var(--kb-color-text);
429
+ white-space: nowrap;
430
+ overflow: hidden;
431
+ text-overflow: ellipsis;
432
+ }
433
+
434
+ /* Overflow separator */
435
+ .kb-custom-menu__overflow-separator {
436
+ height: 1px;
437
+ background: var(--kb-color-border);
438
+ margin: var(--kb-space-sm) 0;
439
+ }
440
+
441
+ /* Overflow footer (sticky manage button container) */
442
+ .kb-custom-menu__overflow-footer {
443
+ flex-shrink: 0;
444
+ border-top: 1px solid var(--kb-color-border);
445
+ background: var(--kb-color-surface);
446
+ padding: var(--kb-space-sm) 0;
447
+ }
448
+
449
+ /* Manage button in overflow menu */
450
+ .kb-custom-menu__manage-button {
451
+ width: calc(100% - 32px);
452
+ margin: 0 var(--kb-space-md);
453
+ min-height: 36px;
454
+ padding: var(--kb-space-sm) 12px;
455
+ border: none;
456
+ background: transparent;
457
+ color: var(--kb-color-primary);
458
+ cursor: pointer;
459
+ border-radius: var(--kb-radius-sm);
460
+ transition: background-color 0.2s ease;
461
+ font-size: var(--kb-text-sm);
462
+ display: flex;
463
+ align-items: center;
464
+ gap: 12px;
465
+ text-align: left;
466
+ font-weight: 500;
467
+ }
468
+
469
+ .kb-custom-menu__manage-button:hover {
470
+ background: var(--kb-color-hover);
471
+ }
472
+
473
+ .kb-custom-menu__manage-button svg {
474
+ width: 20px;
475
+ height: 20px;
476
+ flex-shrink: 0;
477
+ }
478
+
479
+ /* Modal backdrop */
480
+ .kb-custom-menu__modal-backdrop {
481
+ position: fixed;
482
+ top: 0;
483
+ left: 0;
484
+ right: 0;
485
+ bottom: 0;
486
+ background: rgba(0, 0, 0, 0.5);
487
+ z-index: 10000;
488
+ display: flex;
489
+ align-items: center;
490
+ justify-content: center;
491
+ padding: 20px;
492
+ animation: fadeIn 0.2s ease;
493
+ }
494
+
495
+ @keyframes fadeIn {
496
+ from {
497
+ opacity: 0;
498
+ }
499
+ to {
500
+ opacity: 1;
501
+ }
502
+ }
503
+
504
+ /* Modal */
505
+ .kb-custom-menu__modal {
506
+ background: var(--kb-color-surface);
507
+ border-radius: 12px;
508
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.2);
509
+ width: 100%;
510
+ max-width: 500px;
511
+ max-height: 80vh;
512
+ display: flex;
513
+ flex-direction: column;
514
+ animation: slideUp 0.3s ease;
515
+ }
516
+
517
+ @keyframes slideUp {
518
+ from {
519
+ transform: translateY(20px);
520
+ opacity: 0;
521
+ }
522
+ to {
523
+ transform: translateY(0);
524
+ opacity: 1;
525
+ }
526
+ }
527
+
528
+ /* Modal header */
529
+ .kb-custom-menu__modal-header {
530
+ display: flex;
531
+ align-items: center;
532
+ justify-content: space-between;
533
+ padding: 20px var(--kb-space-lg);
534
+ border-bottom: 1px solid var(--kb-color-border);
535
+ }
536
+
537
+ .kb-custom-menu__modal-header h2 {
538
+ margin: 0;
539
+ font-size: 20px;
540
+ font-weight: 500;
541
+ color: var(--kb-color-text);
542
+ }
543
+
544
+ .kb-custom-menu__modal-close {
545
+ display: flex;
546
+ align-items: center;
547
+ justify-content: center;
548
+ width: 32px;
549
+ height: 32px;
550
+ padding: 0;
551
+ border: none;
552
+ background: transparent;
553
+ color: var(--kb-color-text-muted);
554
+ cursor: pointer;
555
+ border-radius: 50%;
556
+ transition: background-color 0.2s ease;
557
+ }
558
+
559
+ .kb-custom-menu__modal-close:hover {
560
+ background: var(--kb-color-surface-hover);
561
+ }
562
+
563
+ .kb-custom-menu__modal-close svg {
564
+ width: 20px;
565
+ height: 20px;
566
+ }
567
+
568
+ /* Modal message */
569
+ .kb-custom-menu__modal-message {
570
+ padding: var(--kb-space-md) var(--kb-space-lg);
571
+ background: var(--kb-menu-info-bg);
572
+ color: var(--kb-menu-info-text);
573
+ font-size: 13px;
574
+ font-weight: 500;
575
+ border-bottom: 1px solid var(--kb-color-border-strong);
576
+ }
577
+
578
+ /* Modal content */
579
+ .kb-custom-menu__modal-content {
580
+ flex: 1;
581
+ overflow-y: auto;
582
+ padding: var(--kb-space-md) 0;
583
+ }
584
+
585
+ /* Tool list */
586
+ .kb-custom-menu__tool-list {
587
+ display: flex;
588
+ flex-direction: column;
589
+ gap: 2px;
590
+ }
591
+
592
+ /* Tool item */
593
+ .kb-custom-menu__tool-item {
594
+ display: flex;
595
+ align-items: center;
596
+ gap: 12px;
597
+ padding: 12px var(--kb-space-lg);
598
+ cursor: pointer;
599
+ transition: background-color 0.2s ease;
600
+ user-select: none;
601
+ }
602
+
603
+ .kb-custom-menu__tool-item:hover {
604
+ background: rgba(60, 64, 67, 0.04);
605
+ }
606
+
607
+ .kb-custom-menu__tool-item input[type='checkbox'] {
608
+ width: 18px;
609
+ height: 18px;
610
+ cursor: pointer;
611
+ accent-color: var(--kb-color-primary);
612
+ }
613
+
614
+ .kb-custom-menu__tool-item span {
615
+ flex: 1;
616
+ color: var(--kb-color-text);
617
+ font-size: var(--kb-text-sm);
618
+ }
619
+
620
+ .kb-custom-menu__tool-item--disabled {
621
+ opacity: 0.5;
622
+ cursor: not-allowed;
623
+ }
624
+
625
+ .kb-custom-menu__tool-item--disabled:hover {
626
+ background: transparent;
627
+ }
628
+
629
+ .kb-custom-menu__tool-item--disabled input[type='checkbox'] {
630
+ cursor: not-allowed;
631
+ }
632
+
633
+ /* Modal footer */
634
+ .kb-custom-menu__modal-footer {
635
+ display: flex;
636
+ align-items: center;
637
+ justify-content: flex-end;
638
+ padding: var(--kb-space-md) var(--kb-space-lg);
639
+ border-top: 1px solid var(--kb-color-border);
640
+ gap: var(--kb-space-sm);
641
+ }
642
+
643
+ .kb-custom-menu__modal-button {
644
+ min-width: 80px;
645
+ padding: var(--kb-space-sm) var(--kb-space-lg);
646
+ border: none;
647
+ border-radius: var(--kb-radius-sm);
648
+ font-size: var(--kb-text-sm);
649
+ font-weight: 500;
650
+ cursor: pointer;
651
+ transition: all 0.2s ease;
652
+ }
653
+
654
+ .kb-custom-menu__modal-button--primary {
655
+ background: var(--kb-color-primary);
656
+ color: white;
657
+ }
658
+
659
+ .kb-custom-menu__modal-button--primary:hover {
660
+ background: var(--kb-color-primary-hover);
661
+ box-shadow: var(--kb-shadow-sm);
662
+ }
663
+
664
+ .kb-custom-menu__modal-button--primary:active {
665
+ background: var(--kb-color-primary-active);
666
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.16);
667
+ }
668
+
669
+ /* Mobile responsive (Bootstrap md breakpoint: < 768px) */
670
+ @media (max-width: 767.98px) {
671
+ .kb-custom-menu {
672
+ position: fixed;
673
+ bottom: 0;
674
+ left: 0;
675
+ right: 0;
676
+ top: auto;
677
+ border-bottom: none;
678
+ border-top: 1px solid var(--kb-color-border-strong);
679
+ box-shadow: 0 -2px 8px rgba(0, 0, 0, 0.1);
680
+ backdrop-filter: blur(10px);
681
+ background: rgba(249, 249, 249, 0.95);
682
+ }
683
+
684
+ .kb-custom-menu__overflow-menu {
685
+ position: fixed;
686
+ bottom: 60px;
687
+ left: 0;
688
+ right: 0;
689
+ top: auto;
690
+ max-width: 100%;
691
+ border-radius: 0;
692
+ max-height: 60vh;
693
+ height: auto;
694
+ border: none;
695
+ border-top: 1px solid var(--kb-color-border-strong);
696
+ }
697
+
698
+ .kb-custom-menu__overflow-content {
699
+ flex: 1;
700
+ overflow-y: auto;
701
+ -webkit-overflow-scrolling: touch;
702
+ max-height: calc(60vh - 80px);
703
+ }
704
+
705
+ .kb-custom-menu__overflow-footer {
706
+ padding: 12px 0;
707
+ box-shadow: 0 -2px 8px rgba(0, 0, 0, 0.1);
708
+ }
709
+
710
+ .kb-custom-menu__manage-button {
711
+ min-height: 44px;
712
+ }
713
+
714
+ .kb-custom-menu__modal {
715
+ max-width: 100%;
716
+ max-height: 90vh;
717
+ margin: 0;
718
+ border-radius: 12px 12px 0 0;
719
+ }
720
+
721
+ .kb-custom-menu__overflow-toggle {
722
+ min-width: 44px;
723
+ min-height: 44px;
724
+ }
725
+ }
726
+
727
+ /* Dark mode support */
728
+ @media (prefers-color-scheme: dark) {
729
+ .kb-custom-menu {
730
+ background: var(--kb-color-surface-elevated);
731
+ border-bottom-color: var(--kb-color-border);
732
+ }
733
+
734
+ .kb-custom-menu__resize-handle:hover {
735
+ background: rgba(232, 234, 237, 0.06);
736
+ }
737
+
738
+ .kb-custom-menu__resize-handle-bar {
739
+ background: var(--kb-menu-dropdown-dark-border);
740
+ }
741
+
742
+ .kb-custom-menu__resize-handle:hover .kb-custom-menu__resize-handle-bar {
743
+ background: var(--kb-color-text-muted);
744
+ }
745
+
746
+ .kb-custom-menu__wrapper--resizing .kb-custom-menu__resize-handle-bar {
747
+ background: var(--kb-color-primary);
748
+ }
749
+
750
+ .kb-custom-menu__item .kb-menu__button,
751
+ .kb-custom-menu__item .kb-dropdown__label,
752
+ .kb-custom-menu__overflow-toggle {
753
+ color: var(--kb-menu-dropdown-dark-text);
754
+ }
755
+
756
+ .kb-custom-menu__item .kb-menu__button:hover,
757
+ .kb-custom-menu__item .kb-dropdown__label:hover,
758
+ .kb-custom-menu__overflow-toggle:hover {
759
+ background: rgba(232, 234, 237, 0.08);
760
+ }
761
+
762
+ .kb-custom-menu__separator {
763
+ background: var(--kb-menu-dropdown-dark-border);
764
+ }
765
+
766
+ .kb-custom-menu__overflow-menu {
767
+ background: var(--kb-menu-dropdown-dark-bg);
768
+ border-color: var(--kb-menu-dropdown-dark-border);
769
+ }
770
+
771
+ .kb-custom-menu__overflow-header {
772
+ color: var(--kb-color-text-muted);
773
+ }
774
+
775
+ .kb-custom-menu__overflow-item .kb-menu__button,
776
+ .kb-custom-menu__overflow-item .kb-dropdown__label {
777
+ color: var(--kb-menu-dropdown-dark-text);
778
+ }
779
+
780
+ .kb-custom-menu__overflow-item-label {
781
+ color: var(--kb-menu-dropdown-dark-text);
782
+ }
783
+
784
+ .kb-custom-menu__overflow-item:hover {
785
+ background: rgba(232, 234, 237, 0.08);
786
+ }
787
+
788
+ .kb-custom-menu__overflow-separator {
789
+ background: var(--kb-menu-dropdown-dark-border);
790
+ }
791
+
792
+ .kb-custom-menu__overflow-footer {
793
+ background: var(--kb-menu-dropdown-dark-bg);
794
+ border-top-color: var(--kb-menu-dropdown-dark-border);
795
+ }
796
+
797
+ .kb-custom-menu__modal {
798
+ background: var(--kb-color-surface);
799
+ }
800
+
801
+ .kb-custom-menu__modal-header {
802
+ border-bottom-color: var(--kb-menu-dropdown-dark-border);
803
+ }
804
+
805
+ .kb-custom-menu__modal-header h2 {
806
+ color: var(--kb-menu-dropdown-dark-text);
807
+ }
808
+
809
+ .kb-custom-menu__modal-close {
810
+ color: var(--kb-color-text-muted);
811
+ }
812
+
813
+ .kb-custom-menu__modal-message {
814
+ background: var(--kb-menu-info-bg);
815
+ color: var(--kb-menu-info-text);
816
+ border-bottom-color: var(--kb-menu-dropdown-dark-border);
817
+ }
818
+
819
+ .kb-custom-menu__modal-footer {
820
+ border-top-color: var(--kb-menu-dropdown-dark-border);
821
+ }
822
+
823
+ .kb-custom-menu__tool-item span {
824
+ color: var(--kb-menu-dropdown-dark-text);
825
+ }
826
+ }
827
+
828
+ /* Pinned dropdown menu (independent from overflow) */
829
+ .kb-custom-menu__pinned-dropdown {
830
+ min-width: 200px;
831
+ max-width: 300px;
832
+ background: var(--kb-menu-dropdown-dark-bg) !important;
833
+ border: 1px solid var(--kb-color-border-strong);
834
+ border-radius: var(--kb-radius-lg);
835
+ box-shadow: var(--kb-shadow-lg);
836
+ max-height: 400px;
837
+ overflow-y: auto;
838
+ }