@fleetbase/ember-ui 0.3.20 → 0.3.22

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,952 @@
1
+ /* ============================================================================
2
+ Smart Nav Menu – Layout::Header::SmartNavMenu
3
+ ============================================================================
4
+ Styles for the overflow-aware, user-customisable extension navigation bar
5
+ that replaces the static `next-catalog-menu-items` container.
6
+
7
+ Class naming convention: snm-*
8
+ All colours use Tailwind @apply where possible so they inherit the project's
9
+ design tokens and respond correctly to the dark-mode `data-theme` attribute.
10
+
11
+ The overflow dropdown (.snm-dropdown) uses position:fixed and is rendered
12
+ via EmberWormhole into #application-root-wormhole so it escapes the 57px
13
+ header height constraint entirely. Coordinates are injected as inline
14
+ style from JS (getBoundingClientRect on the "More" button).
15
+ ============================================================================ */
16
+
17
+ /* ── Container ──────────────────────────────────────────────────────────────── */
18
+
19
+ .snm-container {
20
+ @apply flex items-center;
21
+ /* Allow the container to shrink when the header is narrow.
22
+ Do NOT set overflow:hidden here – that would clip the dropdown panel. */
23
+ min-width: 0;
24
+ flex: 1 1 auto;
25
+ position: relative;
26
+ }
27
+
28
+ /* ── Bar items (inherit .next-view-header-item base styles) ─────────────────── */
29
+
30
+ .snm-item {
31
+ @apply flex-shrink-0;
32
+ max-width: 160px;
33
+ }
34
+
35
+ .snm-item span {
36
+ @apply truncate;
37
+ }
38
+
39
+ /* ── "More" overflow button ─────────────────────────────────────────────────── */
40
+
41
+ .snm-more-btn {
42
+ @apply flex items-center justify-center flex-shrink-0;
43
+ width: 28px;
44
+ height: 28px;
45
+ padding: 0;
46
+ }
47
+
48
+ .snm-more-btn.is-open {
49
+ @apply bg-gray-700 text-white rounded;
50
+ }
51
+
52
+ /* ── Customise (sliders) button ─────────────────────────────────────────────── */
53
+
54
+ .snm-customise-btn {
55
+ @apply flex items-center justify-center flex-shrink-0;
56
+ width: 28px;
57
+ height: 28px;
58
+ padding: 0;
59
+ }
60
+
61
+ /* ── Overflow dropdown panel ────────────────────────────────────────────────── */
62
+ /*
63
+ Rendered via EmberWormhole into #application-root-wormhole.
64
+ Uses position:fixed with coordinates injected as inline style from JS.
65
+ This completely bypasses the 57px header height constraint.
66
+ */
67
+
68
+ .snm-dropdown {
69
+ position: fixed;
70
+ z-index: 9999;
71
+ /* Default narrow width (fallback for non-wide variant) */
72
+ width: 320px;
73
+ max-height: 60vh;
74
+ min-height: 200px;
75
+ display: flex;
76
+ flex-direction: column;
77
+ border-radius: 8px;
78
+ overflow: hidden;
79
+ /* Dark theme defaults (matches .next-dd-menu dark bg) */
80
+ background-color: #1f2937; /* gray-800 */
81
+ border: 1px solid #374151; /* gray-700 */
82
+ box-shadow: 0 20px 60px rgba(0, 0, 0, 0.5), 0 4px 16px rgba(0, 0, 0, 0.3);
83
+ }
84
+
85
+ /* Phase 2: wide multi-column variant ─────────────────────────────────────── */
86
+ .snm-dropdown--wide {
87
+ /* Wide enough for 2 card columns + gutters */
88
+ width: 680px;
89
+ max-width: calc(100vw - 16px);
90
+ }
91
+
92
+ /* ── Search bar ─────────────────────────────────────────────────────────────── */
93
+
94
+ .snm-dropdown-search-bar {
95
+ @apply flex items-center flex-shrink-0;
96
+ /* Full-width row with a flat bottom border */
97
+ background: transparent;
98
+ border: none;
99
+ border-bottom: 1px solid #374151; /* gray-700 */
100
+ border-radius: 0;
101
+ padding: 0 10px;
102
+ gap: 6px;
103
+ }
104
+
105
+ .snm-dropdown-search-icon {
106
+ @apply flex-shrink-0;
107
+ color: #6b7280; /* gray-500 */
108
+ }
109
+
110
+ .snm-dropdown-search-input {
111
+ @apply flex-1 outline-none;
112
+ font-size: 0.6875rem; /* 11px – very compact */
113
+ line-height: 1.2;
114
+ color: #e5e7eb; /* gray-200 */
115
+ background: none !important;
116
+ border: none !important;
117
+ box-shadow: none !important;
118
+ padding: 0;
119
+ min-width: 0;
120
+ -webkit-appearance: none;
121
+ appearance: none;
122
+ }
123
+
124
+ .snm-dropdown-search-input::placeholder {
125
+ color: #6b7280; /* gray-500 */
126
+ }
127
+
128
+ .snm-dropdown-search-clear {
129
+ @apply flex-shrink-0 flex items-center justify-center w-5 h-5 rounded transition-colors duration-100;
130
+ background: none;
131
+ border: none;
132
+ cursor: pointer;
133
+ color: #6b7280; /* gray-500 */
134
+ padding: 0;
135
+ }
136
+
137
+ .snm-dropdown-search-clear:hover {
138
+ background-color: #374151; /* gray-700 */
139
+ color: #f9fafb; /* gray-50 */
140
+ }
141
+
142
+ /* ── Card grid ──────────────────────────────────────────────────────────────── */
143
+
144
+ .snm-dropdown-grid {
145
+ flex: 1 1 auto;
146
+ overflow-y: auto;
147
+ padding: 8px 6px;
148
+ display: grid;
149
+ /* 2 equal columns */
150
+ grid-template-columns: repeat(2, 1fr);
151
+ gap: 8px;
152
+ align-content: start;
153
+ scrollbar-width: thin;
154
+ scrollbar-color: #4b5563 transparent;
155
+ }
156
+
157
+ .snm-dropdown-grid::-webkit-scrollbar {
158
+ width: 4px;
159
+ }
160
+
161
+ .snm-dropdown-grid::-webkit-scrollbar-track {
162
+ background: transparent;
163
+ }
164
+
165
+ .snm-dropdown-grid::-webkit-scrollbar-thumb {
166
+ background-color: #4b5563;
167
+ border-radius: 2px;
168
+ }
169
+
170
+ /* ── Extension card ─────────────────────────────────────────────────────────── */
171
+
172
+ .snm-dropdown-card {
173
+ @apply flex flex-col rounded-lg;
174
+ padding: 7px 10px;
175
+ background-color: #111827; /* gray-900 */
176
+ border: 1px solid #1f2937; /* gray-800 – darker but lighter than bg */
177
+ transition: border-color 0.15s ease, background-color 0.15s ease;
178
+ position: relative;
179
+ }
180
+
181
+ .snm-dropdown-card:hover {
182
+ border-color: #4b5563; /* gray-600 */
183
+ background-color: #1a2332; /* slightly lighter than gray-900 */
184
+ }
185
+
186
+ /* Card header row: icon + title link + pin button */
187
+ .snm-dropdown-card-header {
188
+ @apply flex items-center;
189
+ gap: 0;
190
+ margin-bottom: 0;
191
+ }
192
+
193
+ /* The main extension link inside a card */
194
+ .snm-dropdown-card-link {
195
+ @apply flex items-center flex-1 text-sm font-medium;
196
+ color: #e5e7eb; /* gray-200 */
197
+ text-decoration: none;
198
+ min-width: 0;
199
+ cursor: pointer;
200
+ border: none;
201
+ background: none;
202
+ padding: 0;
203
+ }
204
+
205
+ .snm-dropdown-card-link:hover {
206
+ color: #f9fafb; /* gray-50 */
207
+ }
208
+
209
+ .snm-dropdown-card-link-wrapper {
210
+ @apply flex flex-1;
211
+ min-width: 0;
212
+ }
213
+
214
+ .snm-dropdown-card-link-wrapper .snm-dropdown-card-link {
215
+ width: 100%;
216
+ }
217
+
218
+ .snm-dropdown-card-icon {
219
+ @apply flex-shrink-0;
220
+ width: 1.125rem;
221
+ margin-right: 7px;
222
+ text-align: center;
223
+ color: #9ca3af; /* gray-400 */
224
+ }
225
+
226
+ .snm-dropdown-card-link:hover .snm-dropdown-card-icon {
227
+ color: #60a5fa; /* blue-400 */
228
+ }
229
+
230
+ .snm-dropdown-card-title {
231
+ @apply truncate;
232
+ font-size: 0.8125rem; /* 13px */
233
+ line-height: 1.4;
234
+ }
235
+
236
+ /* Title + muted parent-label wrapper */
237
+ .snm-dropdown-card-title-group {
238
+ @apply flex items-baseline flex-1 min-w-0;
239
+ gap: 4px;
240
+ }
241
+
242
+ /* Muted "· ParentName" label shown inline next to the shortcut title */
243
+ .snm-dropdown-card-parent-label {
244
+ @apply flex-shrink-0 truncate;
245
+ font-size: 0.6875rem; /* 11px */
246
+ font-weight: 400;
247
+ color: #4b5563; /* gray-600 – clearly muted */
248
+ line-height: 1.4;
249
+ letter-spacing: 0;
250
+ }
251
+
252
+ /* Pin button on card – always visible at low opacity, brightens on hover */
253
+ .snm-dropdown-card .snm-dropdown-pin-btn {
254
+ opacity: 0.35;
255
+ pointer-events: auto;
256
+ }
257
+
258
+ .snm-dropdown-card:hover .snm-dropdown-pin-btn {
259
+ opacity: 1;
260
+ }
261
+
262
+ /* ── Card description ───────────────────────────────────────────────────────── */
263
+
264
+ .snm-dropdown-card-description {
265
+ @apply text-xs;
266
+ color: #6b7280; /* gray-500 */
267
+ margin: 4px 0 6px 0;
268
+ line-height: 1.4;
269
+ /* Clamp to 2 lines */
270
+ display: -webkit-box;
271
+ -webkit-line-clamp: 2;
272
+ -webkit-box-orient: vertical;
273
+ overflow: hidden;
274
+ }
275
+
276
+ /* ── Italic “from Parent” attribution on shortcut cards ───────────────────── */
277
+ /* Shown as a description-style line below the shortcut title */
278
+ .snm-dropdown-card-description--from {
279
+ color: #4b5563; /* gray-600 – slightly more muted than regular description */
280
+ margin-bottom: 0;
281
+ }
282
+
283
+ /* ── Empty state (no search results) ───────────────────────────────────────── */
284
+
285
+ .snm-dropdown-empty {
286
+ @apply flex flex-col items-center justify-center;
287
+ /* Span all grid columns */
288
+ grid-column: 1 / -1;
289
+ padding: 32px 16px;
290
+ color: #6b7280; /* gray-500 */
291
+ text-align: center;
292
+ }
293
+
294
+ .snm-dropdown-empty-icon {
295
+ @apply mb-3;
296
+ opacity: 0.5;
297
+ }
298
+
299
+ .snm-dropdown-empty-text {
300
+ @apply text-sm m-0;
301
+ color: #6b7280; /* gray-500 */
302
+ }
303
+
304
+ /* ── Dropdown header ────────────────────────────────────────────────────────── */
305
+
306
+ .snm-dropdown-header {
307
+ @apply flex items-center flex-shrink-0;
308
+ padding: 6px 8px 6px 12px;
309
+ border-bottom: 1px solid #374151; /* gray-700 */
310
+ background-color: #111827; /* gray-900 */
311
+ gap: 8px;
312
+ }
313
+
314
+ .snm-dropdown-title {
315
+ @apply flex items-center text-xs font-semibold uppercase tracking-wider;
316
+ color: #9ca3af; /* gray-400 */
317
+ }
318
+
319
+ .snm-dropdown-close {
320
+ @apply flex-shrink-0 flex items-center justify-center w-6 h-6 rounded transition-colors duration-150;
321
+ margin-left: auto; /* push to far right of the header flex row */
322
+ background: none;
323
+ border: none;
324
+ cursor: pointer;
325
+ color: #6b7280; /* gray-500 */
326
+ padding: 0;
327
+ }
328
+
329
+ .snm-dropdown-close:hover {
330
+ background-color: #374151; /* gray-700 */
331
+ color: #f9fafb; /* gray-50 */
332
+ }
333
+
334
+ /* ── Dropdown items list ────────────────────────────────────────────────────── */
335
+
336
+ .snm-dropdown-items {
337
+ flex: 1 1 auto;
338
+ overflow-y: auto;
339
+ padding: 6px;
340
+ /* Scrollbar styling to match the rest of the app */
341
+ scrollbar-width: thin;
342
+ scrollbar-color: #4b5563 transparent;
343
+ }
344
+
345
+ .snm-dropdown-items::-webkit-scrollbar {
346
+ width: 4px;
347
+ }
348
+
349
+ .snm-dropdown-items::-webkit-scrollbar-track {
350
+ background: transparent;
351
+ }
352
+
353
+ .snm-dropdown-items::-webkit-scrollbar-thumb {
354
+ background-color: #4b5563;
355
+ border-radius: 2px;
356
+ }
357
+
358
+ /* ── Individual dropdown item ───────────────────────────────────────────────── */
359
+
360
+ .snm-dropdown-item {
361
+ @apply flex items-center w-full text-sm rounded-md transition-colors duration-100;
362
+ padding: 8px 10px;
363
+ color: #d1d5db; /* gray-300 */
364
+ text-decoration: none;
365
+ cursor: pointer;
366
+ border: none;
367
+ background: none;
368
+ margin-bottom: 2px;
369
+ }
370
+
371
+ .snm-dropdown-item:hover {
372
+ background-color: #374151; /* gray-700 */
373
+ color: #f9fafb; /* gray-50 */
374
+ }
375
+
376
+ .snm-dropdown-item:last-child {
377
+ margin-bottom: 0;
378
+ }
379
+
380
+ .snm-dropdown-item-icon {
381
+ @apply flex-shrink-0;
382
+ width: 1.25rem;
383
+ margin-right: 10px;
384
+ text-align: center;
385
+ color: #9ca3af; /* gray-400 */
386
+ }
387
+
388
+ .snm-dropdown-item:hover .snm-dropdown-item-icon {
389
+ color: #60a5fa; /* blue-400 */
390
+ }
391
+
392
+ .snm-dropdown-item-title {
393
+ @apply flex-1 truncate;
394
+ font-size: 0.8125rem; /* 13px */
395
+ line-height: 1.4;
396
+ }
397
+
398
+ /* ── Dropdown item row (wraps link + pin button) ─────────────────────────────
399
+ Each row is a flex container so the link takes all available space and
400
+ the pin button sits flush to the right edge without affecting link width. */
401
+
402
+ .snm-dropdown-item-row {
403
+ @apply flex items-center;
404
+ position: relative;
405
+ margin-bottom: 2px;
406
+ }
407
+
408
+ .snm-dropdown-item-row .snm-dropdown-item {
409
+ margin-bottom: 0; /* row handles the margin */
410
+ flex: 1 1 auto;
411
+ min-width: 0;
412
+ }
413
+
414
+ /* The link wrapper is a transparent pass-through div — it captures the click
415
+ to close the dropdown but does NOT call preventDefault, so the router
416
+ transition fires normally. */
417
+ .snm-dropdown-item-link-wrapper {
418
+ flex: 1 1 auto;
419
+ min-width: 0;
420
+ display: flex;
421
+ }
422
+
423
+ .snm-dropdown-item-link-wrapper .snm-dropdown-item {
424
+ flex: 1 1 auto;
425
+ min-width: 0;
426
+ width: 100%;
427
+ }
428
+
429
+ /* ── Inline pin button ────────────────────────────────────────────────────────
430
+ Appears on the right of each dropdown item row when the bar has capacity.
431
+ Hidden by default; revealed on row hover so it stays out of the way. */
432
+
433
+ .snm-dropdown-pin-btn {
434
+ @apply flex-shrink-0 flex items-center justify-center transition-all duration-150;
435
+ width: 24px;
436
+ height: 24px;
437
+ margin-left: 4px;
438
+ border-radius: 4px;
439
+ border: none;
440
+ background: transparent;
441
+ cursor: pointer;
442
+ color: #4b5563; /* gray-600 – subtle until hovered */
443
+ opacity: 0;
444
+ pointer-events: none;
445
+ }
446
+
447
+ .snm-dropdown-item-row:hover .snm-dropdown-pin-btn {
448
+ opacity: 1;
449
+ pointer-events: auto;
450
+ }
451
+
452
+ .snm-dropdown-pin-btn:hover {
453
+ background-color: #374151; /* gray-700 */
454
+ color: #60a5fa; /* blue-400 */
455
+ }
456
+
457
+ .snm-dropdown-pin-btn:active {
458
+ background-color: #1d4ed8; /* blue-700 */
459
+ color: #fff;
460
+ }
461
+
462
+ /* ── Dropdown footer ────────────────────────────────────────────────────────── */
463
+
464
+ .snm-dropdown-footer {
465
+ @apply flex items-center flex-shrink-0;
466
+ padding: 8px 14px;
467
+ border-top: 1px solid #374151; /* gray-700 */
468
+ background-color: #111827; /* gray-900 */
469
+ }
470
+
471
+ .snm-dropdown-customise-link {
472
+ @apply flex items-center text-xs transition-colors duration-150;
473
+ background: none;
474
+ border: none;
475
+ cursor: pointer;
476
+ padding: 0;
477
+ color: #6b7280; /* gray-500 */
478
+ }
479
+
480
+ .snm-dropdown-customise-link:hover {
481
+ color: #60a5fa; /* blue-400 */
482
+ }
483
+
484
+ /* ── Customiser panel ───────────────────────────────────────────────────────── */
485
+
486
+ /* Semi-transparent backdrop */
487
+ .snm-customizer-backdrop {
488
+ position: fixed;
489
+ inset: 0;
490
+ z-index: 700;
491
+ background: rgba(0, 0, 0, 0.35);
492
+ }
493
+
494
+ /* The panel itself */
495
+ .snm-customizer-panel {
496
+ @apply flex flex-col;
497
+ position: fixed;
498
+ top: 57px; /* height of .next-view-header */
499
+ left: 50%;
500
+ transform: translateX(-50%);
501
+ z-index: 710;
502
+ width: 680px;
503
+ max-width: calc(100vw - 2rem);
504
+ max-height: 60vh;
505
+ border-radius: 8px;
506
+ overflow: hidden;
507
+ @apply bg-gray-900 border border-gray-700 shadow-next-nav;
508
+ }
509
+
510
+ /* Header bar */
511
+ .snm-customizer-header {
512
+ @apply flex items-center justify-between px-4 py-3 border-b border-gray-700 bg-gray-800 flex-shrink-0;
513
+ }
514
+
515
+ .snm-customizer-header-left {
516
+ @apply flex items-center;
517
+ }
518
+
519
+ .snm-customizer-title {
520
+ @apply text-sm font-semibold text-white m-0;
521
+ }
522
+
523
+ .snm-customizer-close {
524
+ @apply flex items-center justify-center w-7 h-7 rounded text-gray-400 hover:text-white hover:bg-gray-700 transition-colors duration-150;
525
+ background: none;
526
+ border: none;
527
+ cursor: pointer;
528
+ }
529
+
530
+ /* Body – two-column layout */
531
+ .snm-customizer-body {
532
+ @apply flex flex-1 overflow-hidden;
533
+ }
534
+
535
+ .snm-customizer-col {
536
+ @apply flex flex-col overflow-hidden;
537
+ flex: 1 1 50%;
538
+ }
539
+
540
+ .snm-customizer-col-pinned {
541
+ @apply border-r border-gray-700;
542
+ }
543
+
544
+ .snm-customizer-col-header {
545
+ @apply flex items-center justify-between px-4 border-b border-gray-700 bg-gray-800 flex-shrink-0;
546
+ /* Fixed height ensures both column headers are always the same size
547
+ regardless of whether the left column has a badge and the right does not. */
548
+ height: 40px;
549
+ min-height: 40px;
550
+ box-sizing: border-box;
551
+ }
552
+
553
+ .snm-customizer-col-title {
554
+ @apply text-xs font-semibold uppercase tracking-wider text-gray-400 flex items-center;
555
+ }
556
+
557
+ .snm-customizer-col-badge {
558
+ @apply text-xs font-mono px-1.5 py-0.5 rounded bg-gray-700 text-gray-300;
559
+ }
560
+
561
+ .snm-customizer-col-badge.at-limit {
562
+ @apply bg-amber-600 text-white;
563
+ }
564
+
565
+ /* Drag-sort list */
566
+ .snm-customizer-drag-list {
567
+ @apply flex-1 overflow-y-auto p-2;
568
+ }
569
+
570
+ .snm-customizer-pinned-item {
571
+ @apply flex items-center px-2 py-1.5 rounded-md mb-1 bg-gray-800 border border-gray-700 cursor-default;
572
+ }
573
+
574
+ .snm-customizer-pinned-item:hover {
575
+ @apply border-gray-600;
576
+ }
577
+
578
+ .snm-drag-handle {
579
+ @apply flex-shrink-0 mr-2 text-gray-500 cursor-grab;
580
+ }
581
+
582
+ .snm-drag-handle:active {
583
+ cursor: grabbing;
584
+ }
585
+
586
+ /* All-extensions list */
587
+ .snm-customizer-all-list {
588
+ @apply flex-1 overflow-y-auto p-2;
589
+ }
590
+
591
+ .snm-customizer-all-item {
592
+ @apply flex items-center w-full px-2 py-1.5 rounded-md mb-1 text-sm text-gray-300 text-left;
593
+ @apply bg-transparent border border-transparent cursor-pointer;
594
+ @apply transition-colors duration-100;
595
+ }
596
+
597
+ .snm-customizer-all-item:hover:not(.is-disabled) {
598
+ @apply bg-gray-800 border-gray-700;
599
+ }
600
+
601
+ .snm-customizer-all-item.is-pinned {
602
+ @apply bg-blue-900 border-blue-700 text-white;
603
+ }
604
+
605
+ .snm-customizer-all-item.is-disabled {
606
+ @apply opacity-40 cursor-not-allowed;
607
+ }
608
+
609
+ .snm-customizer-pinned-check {
610
+ @apply text-blue-400;
611
+ }
612
+
613
+ /* Shared icon + title layout inside customiser items */
614
+ .snm-customizer-item-icon {
615
+ @apply flex-shrink-0 mr-2.5;
616
+ width: 1.25rem;
617
+ text-align: center;
618
+ }
619
+
620
+ .snm-customizer-item-title {
621
+ @apply truncate;
622
+ /* flex-1 removed – parent label sits inline after the title */
623
+ min-width: 0;
624
+ }
625
+
626
+ /* Muted "· ParentName" suffix shown next to shortcut titles in the customiser */
627
+ .snm-customizer-item-parent-label {
628
+ @apply flex-shrink-0 ml-1;
629
+ font-size: 0.6875rem; /* 11px */
630
+ color: #4b5563; /* gray-600 */
631
+ white-space: nowrap;
632
+ }
633
+
634
+ /* Unpin button */
635
+ .snm-customizer-unpin-btn {
636
+ @apply flex-shrink-0 ml-auto flex items-center justify-center w-5 h-5 rounded text-gray-500 hover:text-red-400 hover:bg-gray-700 transition-colors duration-150;
637
+ background: none;
638
+ border: none;
639
+ cursor: pointer;
640
+ }
641
+
642
+ /* Empty state */
643
+ .snm-customizer-empty-state {
644
+ @apply flex flex-col items-center justify-center flex-1 p-6 text-gray-500 text-sm text-center;
645
+ }
646
+
647
+ /* Divider between columns */
648
+ .snm-customizer-divider {
649
+ /* handled by border-r on the left column */
650
+ display: none;
651
+ }
652
+
653
+ /* Footer */
654
+ .snm-customizer-footer {
655
+ @apply flex items-center justify-between px-4 py-3 border-t border-gray-700 bg-gray-800 flex-shrink-0;
656
+ }
657
+
658
+ .snm-customizer-reset-btn {
659
+ @apply flex items-center text-xs text-gray-400 hover:text-gray-200 transition-colors duration-150;
660
+ background: none;
661
+ border: none;
662
+ cursor: pointer;
663
+ padding: 0;
664
+ }
665
+
666
+ .snm-customizer-footer-actions {
667
+ @apply flex items-center space-x-2;
668
+ }
669
+
670
+ /* Generic button helpers */
671
+ .snm-btn {
672
+ @apply inline-flex items-center px-3 py-1.5 rounded text-sm font-medium transition-colors duration-150 cursor-pointer;
673
+ border: none;
674
+ }
675
+
676
+ .snm-btn-secondary {
677
+ @apply bg-gray-700 text-gray-200 hover:bg-gray-600;
678
+ }
679
+
680
+ .snm-btn-primary {
681
+ @apply bg-blue-600 text-white hover:bg-blue-500;
682
+ }
683
+
684
+ /* ── Light theme overrides ──────────────────────────────────────────────────── */
685
+
686
+ /* Dropdown panel – light theme */
687
+ body[data-theme='light'] .snm-dropdown {
688
+ background-color: #ffffff;
689
+ border-color: #e5e7eb; /* gray-200 */
690
+ box-shadow: 0 20px 60px rgba(0, 0, 0, 0.15), 0 4px 16px rgba(0, 0, 0, 0.1);
691
+ }
692
+
693
+ body[data-theme='light'] .snm-dropdown-header {
694
+ background-color: #f9fafb; /* gray-50 */
695
+ border-bottom-color: #e5e7eb; /* gray-200 */
696
+ }
697
+
698
+ body[data-theme='light'] .snm-dropdown-title {
699
+ color: #6b7280; /* gray-500 */
700
+ }
701
+
702
+ body[data-theme='light'] .snm-dropdown-close {
703
+ color: #9ca3af; /* gray-400 */
704
+ }
705
+
706
+ body[data-theme='light'] .snm-dropdown-close:hover {
707
+ background-color: #f3f4f6; /* gray-100 */
708
+ color: #111827; /* gray-900 */
709
+ }
710
+
711
+ body[data-theme='light'] .snm-dropdown-item {
712
+ color: #374151; /* gray-700 */
713
+ }
714
+
715
+ body[data-theme='light'] .snm-dropdown-item:hover {
716
+ background-color: #f3f4f6; /* gray-100 */
717
+ color: #111827; /* gray-900 */
718
+ }
719
+
720
+ body[data-theme='light'] .snm-dropdown-item-icon {
721
+ color: #6b7280; /* gray-500 */
722
+ }
723
+
724
+ body[data-theme='light'] .snm-dropdown-item:hover .snm-dropdown-item-icon {
725
+ color: #2563eb; /* blue-600 */
726
+ }
727
+
728
+ body[data-theme='light'] .snm-dropdown-footer {
729
+ background-color: #f9fafb; /* gray-50 */
730
+ border-top-color: #e5e7eb; /* gray-200 */
731
+ }
732
+
733
+ body[data-theme='light'] .snm-dropdown-customise-link {
734
+ color: #9ca3af; /* gray-400 */
735
+ }
736
+
737
+ body[data-theme='light'] .snm-dropdown-customise-link:hover {
738
+ color: #2563eb; /* blue-600 */
739
+ }
740
+
741
+ body[data-theme='light'] .snm-dropdown-items::-webkit-scrollbar-thumb {
742
+ background-color: #d1d5db; /* gray-300 */
743
+ }
744
+
745
+ /* Phase 2 – light theme: search bar */
746
+ body[data-theme='light'] .snm-dropdown-search-bar {
747
+ background: transparent;
748
+ border-bottom-color: #d1d5db; /* gray-300 */
749
+ }
750
+
751
+ body[data-theme='light'] .snm-dropdown-search-icon {
752
+ color: #9ca3af; /* gray-400 */
753
+ }
754
+
755
+ body[data-theme='light'] .snm-dropdown-search-input {
756
+ color: #374151; /* gray-700 */
757
+ background: none !important;
758
+ border: none !important;
759
+ box-shadow: none !important;
760
+ }
761
+
762
+ body[data-theme='light'] .snm-dropdown-search-input::placeholder {
763
+ color: #9ca3af; /* gray-400 */
764
+ }
765
+
766
+ body[data-theme='light'] .snm-dropdown-search-clear {
767
+ color: #9ca3af; /* gray-400 */
768
+ }
769
+
770
+ body[data-theme='light'] .snm-dropdown-search-clear:hover {
771
+ background-color: #f3f4f6; /* gray-100 */
772
+ color: #111827; /* gray-900 */
773
+ }
774
+
775
+ /* Phase 2 – light theme: card grid */
776
+ body[data-theme='light'] .snm-dropdown-grid::-webkit-scrollbar-thumb {
777
+ background-color: #d1d5db; /* gray-300 */
778
+ }
779
+
780
+ body[data-theme='light'] .snm-dropdown-card {
781
+ background-color: #f9fafb; /* gray-50 */
782
+ border-color: #e5e7eb; /* gray-200 */
783
+ }
784
+
785
+ body[data-theme='light'] .snm-dropdown-card:hover {
786
+ border-color: #d1d5db; /* gray-300 */
787
+ background-color: #f3f4f6; /* gray-100 */
788
+ }
789
+
790
+ body[data-theme='light'] .snm-dropdown-card-link {
791
+ color: #374151; /* gray-700 */
792
+ }
793
+
794
+ body[data-theme='light'] .snm-dropdown-card-link:hover {
795
+ color: #111827; /* gray-900 */
796
+ }
797
+
798
+ body[data-theme='light'] .snm-dropdown-card-icon {
799
+ color: #6b7280; /* gray-500 */
800
+ }
801
+
802
+ body[data-theme='light'] .snm-dropdown-card-link:hover .snm-dropdown-card-icon {
803
+ color: #2563eb; /* blue-600 */
804
+ }
805
+
806
+ body[data-theme='light'] .snm-dropdown-card-description {
807
+ color: #9ca3af; /* gray-400 */
808
+ }
809
+
810
+ body[data-theme='light'] .snm-dropdown-card-description--from {
811
+ color: #9ca3af; /* gray-400 */
812
+ }
813
+
814
+ body[data-theme='light'] .snm-dropdown-empty {
815
+ color: #9ca3af; /* gray-400 */
816
+ }
817
+
818
+ body[data-theme='light'] .snm-dropdown-empty-text {
819
+ color: #9ca3af; /* gray-400 */
820
+ }
821
+ body[data-theme='light'] .snm-dropdown-pin-btn {
822
+ color: #9ca3af; /* gray-400 */
823
+ }
824
+ body[data-theme='light'] .snm-dropdown-pin-btn:hover {
825
+ background-color: #f3f4f6; /* gray-100 */
826
+ color: #2563eb; /* blue-600 */
827
+ }
828
+ body[data-theme='light'] .snm-dropdown-pin-btn:active {
829
+ background-color: #dbeafe; /* blue-100 */
830
+ color: #1d4ed8; /* blue-700 */
831
+ }
832
+ body[data-theme='light'] .snm-more-btn.is-open {
833
+ @apply bg-gray-200 text-gray-900 rounded;
834
+ }
835
+
836
+ /* Customiser panel – light theme */
837
+ body[data-theme='light'] .snm-customizer-panel {
838
+ @apply bg-white border-gray-200;
839
+ }
840
+
841
+ body[data-theme='light'] .snm-customizer-header {
842
+ @apply bg-gray-100 border-gray-200;
843
+ }
844
+
845
+ body[data-theme='light'] .snm-customizer-title {
846
+ @apply text-gray-900;
847
+ }
848
+
849
+ body[data-theme='light'] .snm-customizer-close {
850
+ @apply text-gray-500 hover:text-gray-900 hover:bg-gray-200;
851
+ }
852
+
853
+ body[data-theme='light'] .snm-customizer-col-header {
854
+ @apply bg-gray-50 border-gray-200;
855
+ }
856
+ body[data-theme='light'] .snm-customizer-col-pinned {
857
+ @apply border-gray-200;
858
+ }
859
+
860
+ body[data-theme='light'] .snm-customizer-col-title {
861
+ @apply text-gray-500;
862
+ }
863
+
864
+ body[data-theme='light'] .snm-customizer-col-badge {
865
+ @apply bg-gray-200 text-gray-700;
866
+ }
867
+
868
+ body[data-theme='light'] .snm-customizer-pinned-item {
869
+ @apply bg-gray-50 border-gray-200;
870
+ }
871
+
872
+ body[data-theme='light'] .snm-customizer-pinned-item:hover {
873
+ @apply border-gray-300;
874
+ }
875
+
876
+ body[data-theme='light'] .snm-customizer-all-item {
877
+ @apply text-gray-700;
878
+ }
879
+
880
+ body[data-theme='light'] .snm-customizer-all-item:hover:not(.is-disabled) {
881
+ @apply bg-gray-100 border-gray-200;
882
+ }
883
+
884
+ body[data-theme='light'] .snm-customizer-all-item.is-pinned {
885
+ @apply bg-blue-50 border-blue-300 text-blue-900;
886
+ }
887
+
888
+ body[data-theme='light'] .snm-customizer-footer {
889
+ @apply bg-gray-50 border-gray-200;
890
+ }
891
+
892
+ body[data-theme='light'] .snm-customizer-reset-btn {
893
+ @apply text-gray-500 hover:text-gray-800;
894
+ }
895
+
896
+ body[data-theme='light'] .snm-btn-secondary {
897
+ @apply bg-gray-200 text-gray-700 hover:bg-gray-300;
898
+ }
899
+
900
+ body[data-theme='light'] .snm-drag-handle {
901
+ @apply text-gray-400;
902
+ }
903
+
904
+ body[data-theme='light'] .snm-customizer-backdrop {
905
+ background: rgba(0, 0, 0, 0.2);
906
+ }
907
+
908
+ /* ── Responsive / mobile ────────────────────────────────────────────────────── */
909
+
910
+ @media (max-width: 768px) {
911
+ .snm-dropdown {
912
+ /* On mobile, pin to the top of the viewport edge-to-edge */
913
+ position: fixed !important;
914
+ top: 57px !important;
915
+ left: 0 !important;
916
+ right: 0 !important;
917
+ width: 100% !important;
918
+ max-width: 100% !important;
919
+ border-radius: 0;
920
+ border-left: none;
921
+ border-right: none;
922
+ }
923
+
924
+ /* Single-column card grid on mobile */
925
+ .snm-dropdown-grid {
926
+ grid-template-columns: 1fr;
927
+ }
928
+
929
+ .snm-customizer-panel {
930
+ top: 0;
931
+ left: 0;
932
+ right: 0;
933
+ transform: none;
934
+ width: 100%;
935
+ max-width: 100%;
936
+ max-height: 100vh;
937
+ border-radius: 0;
938
+ }
939
+
940
+ .snm-customizer-body {
941
+ @apply flex-col;
942
+ }
943
+
944
+ .snm-customizer-col-pinned {
945
+ @apply border-r-0 border-b border-gray-700;
946
+ max-height: 40vh;
947
+ }
948
+
949
+ .snm-customizer-col-all {
950
+ max-height: 40vh;
951
+ }
952
+ }