@keenmate/pure-admin-core 2.3.1 → 2.3.3

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 (70) hide show
  1. package/README.md +30 -9
  2. package/dist/css/main.css +205 -190
  3. package/package.json +1 -1
  4. package/snippets/buttons.html +375 -365
  5. package/snippets/command-palette.html +15 -13
  6. package/src/scss/_base-css-variables.scss +10 -0
  7. package/src/scss/_core.scss +121 -121
  8. package/src/scss/core-components/_alerts.scss +227 -227
  9. package/src/scss/core-components/_badges.scss +16 -16
  10. package/src/scss/core-components/_base.scss +125 -125
  11. package/src/scss/core-components/_buttons.scss +31 -16
  12. package/src/scss/core-components/_callouts.scss +152 -152
  13. package/src/scss/core-components/_cards.scss +488 -488
  14. package/src/scss/core-components/_checkbox-lists.scss +289 -289
  15. package/src/scss/core-components/_code.scss +141 -141
  16. package/src/scss/core-components/_command-palette.scss +518 -509
  17. package/src/scss/core-components/_comparison.scss +172 -172
  18. package/src/scss/core-components/_data-display.scss +9 -9
  19. package/src/scss/core-components/_data-viz.scss +9 -9
  20. package/src/scss/core-components/_detail-panel.scss +1 -1
  21. package/src/scss/core-components/_file-selector.scss +780 -780
  22. package/src/scss/core-components/_filter-card.scss +58 -58
  23. package/src/scss/core-components/_forms.scss +16 -16
  24. package/src/scss/core-components/_grid.scss +293 -293
  25. package/src/scss/core-components/_layout.scss +15 -15
  26. package/src/scss/core-components/_lists.scss +211 -211
  27. package/src/scss/core-components/_loaders.scss +277 -277
  28. package/src/scss/core-components/_logic-tree.scss +280 -280
  29. package/src/scss/core-components/_modals.scss +203 -203
  30. package/src/scss/core-components/_notifications.scss +320 -320
  31. package/src/scss/core-components/_pagers.scss +141 -141
  32. package/src/scss/core-components/_popconfirm.scss +170 -170
  33. package/src/scss/core-components/_profile.scss +405 -405
  34. package/src/scss/core-components/_scrollbars.scss +40 -40
  35. package/src/scss/core-components/_settings-panel.scss +141 -141
  36. package/src/scss/core-components/_statistics.scss +200 -201
  37. package/src/scss/core-components/_tables.scss +900 -900
  38. package/src/scss/core-components/_tabs.scss +504 -504
  39. package/src/scss/core-components/_timeline.scss +589 -589
  40. package/src/scss/core-components/_toasts.scss +425 -425
  41. package/src/scss/core-components/_tooltips.scss +605 -605
  42. package/src/scss/core-components/_utilities.scss +1 -1
  43. package/src/scss/core-components/_web-components-theme.scss +21 -21
  44. package/src/scss/core-components/badges/_badge-base.scss +121 -121
  45. package/src/scss/core-components/badges/_badge-group.scss +25 -25
  46. package/src/scss/core-components/badges/_composite-badge-variants.scss +396 -396
  47. package/src/scss/core-components/badges/_composite-badge.scss +70 -70
  48. package/src/scss/core-components/badges/_index.scss +10 -10
  49. package/src/scss/core-components/badges/_labels.scss +155 -155
  50. package/src/scss/core-components/forms/_checkboxes-radios.scss +205 -205
  51. package/src/scss/core-components/forms/_form-inputs.scss +3 -3
  52. package/src/scss/core-components/forms/_form-layout.scss +66 -66
  53. package/src/scss/core-components/forms/_form-states.scss +115 -115
  54. package/src/scss/core-components/forms/_index.scss +12 -12
  55. package/src/scss/core-components/forms/_input-groups.scss +154 -154
  56. package/src/scss/core-components/forms/_input-wrapper.scss +89 -89
  57. package/src/scss/core-components/forms/_query-editor.scss +313 -313
  58. package/src/scss/core-components/layout/_index.scss +11 -11
  59. package/src/scss/core-components/layout/_layout-container.scss +168 -168
  60. package/src/scss/core-components/layout/_layout-responsive.scss +99 -99
  61. package/src/scss/core-components/layout/_navbar-elements.scss +250 -250
  62. package/src/scss/core-components/layout/_navbar.scss +83 -83
  63. package/src/scss/core-components/layout/_sidebar-states.scss +237 -237
  64. package/src/scss/core-components/layout/_sidebar.scss +234 -234
  65. package/src/scss/main.scss +7 -7
  66. package/src/scss/utilities.scss +740 -740
  67. package/src/scss/variables/_base.scss +228 -228
  68. package/src/scss/variables/_components.scss +748 -748
  69. package/src/scss/variables/_layout.scss +65 -65
  70. package/src/scss/variables/_typography.scss +37 -37
@@ -1,509 +1,518 @@
1
- /* ========================================
2
- Command Palette Component
3
- macOS Spotlight-style search with context switching
4
- ======================================== */
5
- @use '../variables' as *;
6
-
7
- .pa-command-palette {
8
- position: fixed;
9
- inset: 0; // RTL: full screen works in both directions
10
- z-index: $z-index-command-palette;
11
- display: none;
12
- align-items: flex-start;
13
- justify-content: center;
14
- padding-top: $command-palette-offset-top;
15
-
16
- &--active {
17
- display: flex;
18
- }
19
-
20
- // Backdrop overlay
21
- &__backdrop {
22
- position: absolute;
23
- inset: 0; // RTL: full screen works in both directions
24
- background-color: var(--pa-command-palette-backdrop-bg);
25
- backdrop-filter: blur($command-palette-backdrop-blur);
26
- animation: fadeIn $transition-normal $easing-smooth;
27
- }
28
-
29
- // Main container
30
- &__container {
31
- position: relative;
32
- width: 100%;
33
- max-width: $command-palette-width;
34
- background-color: var(--pa-modal-content-bg);
35
- border-radius: $command-palette-border-radius;
36
- box-shadow: $command-palette-shadow;
37
- animation: slideDown $transition-normal $easing-smooth;
38
- overflow: hidden;
39
- }
40
-
41
- // Search input wrapper
42
- &__search {
43
- position: relative;
44
- border-bottom: $border-width-base solid var(--pa-border-color);
45
- padding: $spacing-sm;
46
- }
47
-
48
- // Tokens container (resolved query fragments)
49
- &__tokens {
50
- display: flex;
51
- flex-wrap: wrap;
52
- gap: $spacing-xs;
53
- align-items: center;
54
-
55
- .pa-badge {
56
- display: inline-flex;
57
- align-items: center;
58
- margin: 0;
59
-
60
- // Remove button inside badge
61
- &__remove {
62
- margin-inline-start: $spacing-xs; // RTL: flips to margin-right
63
- padding: 0 $spacing-xs;
64
- border: none;
65
- background: transparent;
66
- color: inherit;
67
- cursor: pointer;
68
- font-size: 1.2em;
69
- line-height: 1;
70
- opacity: 0.7;
71
- transition: opacity $transition-fast $easing-smooth;
72
-
73
- &:hover {
74
- opacity: 1;
75
- }
76
- }
77
- }
78
- }
79
-
80
- &__input {
81
- width: 100%;
82
- height: $command-palette-input-height;
83
- padding: $command-palette-input-padding-v $command-palette-input-padding-h;
84
- font-size: $command-palette-input-font-size;
85
- border: $border-width-base solid var(--pa-border-color);
86
- border-radius: $border-radius;
87
- background-color: var(--pa-input-bg);
88
- color: var(--pa-text-color-1);
89
- outline: none;
90
- transition: border-color $transition-fast $easing-snappy;
91
-
92
- &:focus {
93
- border-color: $input-focus-border-color;
94
- box-shadow: 0 0 0 $focus-ring-width $accent-light;
95
- }
96
-
97
- &::placeholder {
98
- color: var(--pa-text-color-2);
99
- opacity: $opacity-muted;
100
- }
101
- }
102
-
103
- // Context label (e.g., "Searching in Products")
104
- &__context {
105
- position: absolute;
106
- inset-inline-end: calc(#{$spacing-sm} + #{$command-palette-input-padding-h}); // RTL: flips to left
107
- top: 50%;
108
- transform: translateY(-50%);
109
- font-size: $font-size-xs;
110
- color: var(--pa-accent);
111
- font-weight: $font-weight-medium;
112
- padding: $spacing-xs $spacing-sm;
113
- background-color: var(--pa-accent-light);
114
- border-radius: $border-radius-sm;
115
- opacity: 0;
116
- transition: opacity $transition-fast $easing-smooth;
117
-
118
- &--visible {
119
- opacity: 1;
120
- }
121
- }
122
-
123
- // Results container
124
- &__results {
125
- max-height: $command-palette-results-max-height;
126
- overflow-y: auto;
127
- padding: $spacing-sm 0;
128
- position: relative;
129
-
130
- // Loading state - show subtle opacity overlay
131
- &--loading {
132
- &::after {
133
- content: '';
134
- position: absolute;
135
- inset: 0; // RTL: full overlay works in both directions
136
- background-color: rgba($modal-content-bg, 0.7);
137
- pointer-events: none;
138
- z-index: 1;
139
- }
140
- }
141
- }
142
-
143
- // Empty state
144
- &__empty {
145
- padding: $command-palette-empty-padding-v $command-palette-input-padding-h;
146
- text-align: center;
147
- color: var(--pa-text-color-2);
148
- font-size: $font-size-sm;
149
- }
150
-
151
- // Loader
152
- &__loader {
153
- padding: $command-palette-empty-padding-v $command-palette-input-padding-h;
154
- display: flex;
155
- align-items: center;
156
- justify-content: center;
157
- gap: $spacing-sm;
158
- color: var(--pa-text-color-2);
159
- font-size: $font-size-sm;
160
-
161
- .pa-spinner {
162
- width: $spacing-base;
163
- height: $spacing-base;
164
- }
165
- }
166
-
167
- // Result item
168
- &__item {
169
- padding: $command-palette-item-padding-v $command-palette-input-padding-h;
170
- cursor: pointer;
171
- transition: background-color $transition-fast $easing-smooth;
172
- display: flex;
173
- align-items: center;
174
- gap: $spacing-sm;
175
-
176
- &:hover {
177
- background-color: var(--pa-command-palette-item-hover-bg);
178
- }
179
-
180
- &--active {
181
- background-color: var(--pa-command-palette-item-active-bg);
182
- }
183
- }
184
-
185
- // Item icon
186
- &__item-icon {
187
- flex-shrink: 0;
188
- width: $command-palette-item-icon-size;
189
- height: $command-palette-item-icon-size;
190
- display: flex;
191
- align-items: center;
192
- justify-content: center;
193
- background-color: var(--pa-accent-light);
194
- color: var(--pa-accent);
195
- border-radius: $border-radius-sm;
196
- font-size: $font-size-sm;
197
- }
198
-
199
- // Item content
200
- &__item-content {
201
- flex: 1;
202
- min-width: 0;
203
- }
204
-
205
- &__item-title {
206
- font-size: $font-size-sm;
207
- font-weight: $font-weight-medium;
208
- color: var(--pa-text-color-1);
209
- margin: 0;
210
- white-space: nowrap;
211
- overflow: hidden;
212
- text-overflow: ellipsis;
213
-
214
- mark {
215
- background-color: var(--pa-command-palette-highlight-bg);
216
- color: var(--pa-command-palette-highlight-text);
217
- font-weight: $font-weight-semibold;
218
- padding: 0 2px;
219
- border-radius: 2px;
220
- }
221
- }
222
-
223
- &__item-meta {
224
- font-size: $font-size-xs;
225
- color: var(--pa-text-color-2);
226
- margin: 0;
227
- margin-top: 2px;
228
- white-space: nowrap;
229
- overflow: hidden;
230
- text-overflow: ellipsis;
231
- }
232
-
233
- // Item badge (e.g., category, status)
234
- &__item-badge {
235
- flex-shrink: 0;
236
- font-size: $font-size-xs;
237
- padding: 2px $spacing-xs;
238
- background-color: $secondary-light-bg;
239
- color: var(--pa-text-color-2);
240
- border-radius: $border-radius-sm;
241
- }
242
-
243
- // Footer with keyboard hints
244
- &__footer {
245
- border-top: $border-width-base solid var(--pa-border-color);
246
- padding: $spacing-sm $command-palette-input-padding-h;
247
- display: flex;
248
- gap: $spacing-base;
249
- font-size: $font-size-xs;
250
- color: var(--pa-text-color-2);
251
- }
252
-
253
- &__hint {
254
- display: flex;
255
- align-items: center;
256
- gap: $spacing-xs;
257
- }
258
-
259
- &__key {
260
- padding: 2px $spacing-xs;
261
- background-color: $secondary-light-bg;
262
- border: $border-width-base solid var(--pa-border-color);
263
- border-radius: $border-radius-sm;
264
- font-family: $body-font-family;
265
- font-weight: $font-weight-medium;
266
- font-size: $font-size-2xs;
267
- line-height: 1;
268
- }
269
-
270
- // Section headers (for grouping results)
271
- &__section {
272
- padding: $spacing-sm $command-palette-input-padding-h $spacing-xs;
273
- font-size: $font-size-xs;
274
- font-weight: $font-weight-semibold;
275
- color: var(--pa-text-color-2);
276
- text-transform: uppercase;
277
- letter-spacing: 0.5px;
278
- }
279
-
280
- // Pagination indicator
281
- &__pagination {
282
- padding: $spacing-xs $command-palette-input-padding-h;
283
- text-align: center;
284
- font-size: $font-size-xs;
285
- color: var(--pa-text-color-2);
286
- border-top: $border-width-base solid var(--pa-border-color);
287
- }
288
- }
289
-
290
- // Animations
291
- @keyframes fadeIn {
292
- from {
293
- opacity: 0;
294
- }
295
- to {
296
- opacity: 1;
297
- }
298
- }
299
-
300
- @keyframes slideDown {
301
- from {
302
- opacity: 0;
303
- transform: translateY(-20px);
304
- }
305
- to {
306
- opacity: 1;
307
- transform: translateY(0);
308
- }
309
- }
310
-
311
- // Responsive
312
- @media (max-width: $mobile-breakpoint) {
313
- .pa-command-palette {
314
- padding-top: $spacing-base;
315
-
316
- &__container {
317
- max-width: calc(100% - #{$spacing-base * 2});
318
- }
319
-
320
- &__results {
321
- max-height: 60vh;
322
- }
323
- }
324
- }
325
-
326
- /* ========================================
327
- Navbar Search Trigger
328
- Button that opens the command palette
329
- ======================================== */
330
-
331
- .pa-navbar-search {
332
- display: flex;
333
- align-items: center;
334
- gap: $spacing-sm;
335
- padding: $input-padding-v $input-padding-h;
336
- background-color: var(--pa-input-bg);
337
- border: $border-width-base solid var(--pa-border-color);
338
- border-radius: $border-radius;
339
- cursor: pointer;
340
- transition: border-color $transition-fast $easing-snappy;
341
-
342
- &:hover {
343
- border-color: $input-focus-border-color;
344
- }
345
-
346
- &:focus {
347
- outline: none;
348
- border-color: $input-focus-border-color;
349
- box-shadow: 0 0 0 $focus-ring-width $accent-light;
350
- }
351
-
352
- // Size modifiers (matching input sizes)
353
- &--xs {
354
- height: #{$base-input-size-xs-height}rem;
355
- font-size: $font-size-xs;
356
- }
357
-
358
- &--sm {
359
- height: #{$base-input-size-sm-height}rem;
360
- font-size: $font-size-xs;
361
- }
362
-
363
- &--md {
364
- height: #{$base-input-size-md-height}rem;
365
- font-size: $font-size-sm;
366
- }
367
-
368
- &--lg {
369
- height: #{$base-input-size-lg-height}rem;
370
- font-size: $font-size-base;
371
- }
372
-
373
- &--xl {
374
- height: #{$base-input-size-xl-height}rem;
375
- font-size: $font-size-lg;
376
- }
377
-
378
- &__icon {
379
- flex-shrink: 0;
380
- opacity: $opacity-muted;
381
- }
382
-
383
- &__placeholder {
384
- flex: 1;
385
- color: var(--pa-text-color-2);
386
- white-space: nowrap;
387
- overflow: hidden;
388
- text-overflow: ellipsis;
389
- }
390
-
391
- &__shortcut {
392
- display: flex;
393
- align-items: center;
394
- gap: 2px;
395
- flex-shrink: 0;
396
-
397
- kbd {
398
- display: inline-flex;
399
- align-items: center;
400
- justify-content: center;
401
- min-width: 2rem;
402
- height: 2rem;
403
- padding: 0 $spacing-xs;
404
- font-family: $body-font-family;
405
- font-size: $font-size-2xs;
406
- font-weight: $font-weight-medium;
407
- color: var(--pa-text-color-2);
408
- background-color: $secondary-light-bg;
409
- border: $border-width-base solid var(--pa-border-color);
410
- border-radius: $border-radius-sm;
411
- box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);
412
- }
413
- }
414
- }
415
-
416
- // Responsive: hide shortcut on small screens
417
- @media (max-width: $mobile-breakpoint) {
418
- .pa-navbar-search {
419
- &__placeholder {
420
- display: none;
421
- }
422
-
423
- &__shortcut {
424
- display: none;
425
- }
426
- }
427
- }
428
-
429
- /* ========================================
430
- Shortcut Help Dialog
431
- Modal content for displaying keyboard shortcuts
432
- ======================================== */
433
-
434
- .pa-shortcut-help {
435
- display: flex;
436
- flex-direction: column;
437
- gap: $spacing-base;
438
- }
439
-
440
- .pa-shortcut-help__category {
441
- display: flex;
442
- flex-direction: column;
443
- gap: $spacing-xs;
444
- }
445
-
446
- .pa-shortcut-help__category-title {
447
- font-size: $font-size-xs;
448
- font-weight: $font-weight-semibold;
449
- text-transform: uppercase;
450
- letter-spacing: 0.5px;
451
- color: var(--pa-text-color-2);
452
- margin: 0;
453
- padding-bottom: $spacing-xs;
454
- border-bottom: $border-width-base solid var(--pa-border-color);
455
- }
456
-
457
- .pa-shortcut-help__list {
458
- display: flex;
459
- flex-direction: column;
460
- gap: $spacing-xs;
461
- }
462
-
463
- .pa-shortcut-help__item {
464
- display: flex;
465
- align-items: center;
466
- justify-content: space-between;
467
- gap: $spacing-base;
468
- padding: $spacing-xs 0;
469
- }
470
-
471
- .pa-shortcut-help__keys {
472
- display: flex;
473
- align-items: center;
474
- gap: $spacing-xs;
475
- flex-shrink: 0;
476
- }
477
-
478
- .pa-shortcut-help__key {
479
- display: inline-flex;
480
- align-items: center;
481
- justify-content: center;
482
- min-width: $spacing-lg;
483
- height: $spacing-lg;
484
- padding: 0 $spacing-xs;
485
- font-family: $body-font-family;
486
- font-size: $font-size-2xs;
487
- font-weight: $font-weight-medium;
488
- color: var(--pa-text-color-1);
489
- background-color: $secondary-light-bg;
490
- border: $border-width-base solid var(--pa-border-color);
491
- border-radius: $border-radius-sm;
492
- box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);
493
- }
494
-
495
- .pa-shortcut-help__separator {
496
- color: var(--pa-text-color-2);
497
- font-size: $font-size-xs;
498
- }
499
-
500
- .pa-shortcut-help__description {
501
- color: var(--pa-text-color-1);
502
- font-size: $font-size-sm;
503
- }
504
-
505
- .pa-shortcut-help__empty {
506
- text-align: center;
507
- color: var(--pa-text-color-2);
508
- padding: $spacing-xl;
509
- }
1
+ /* ========================================
2
+ Command Palette Component
3
+ macOS Spotlight-style search with context switching
4
+ ======================================== */
5
+ @use '../variables' as *;
6
+
7
+ .pa-command-palette {
8
+ position: fixed;
9
+ inset: 0; // RTL: full screen works in both directions
10
+ z-index: $z-index-command-palette;
11
+ display: none;
12
+ align-items: flex-start;
13
+ justify-content: center;
14
+ padding-top: $command-palette-offset-top;
15
+
16
+ &--active {
17
+ display: flex;
18
+ }
19
+
20
+ // Backdrop overlay
21
+ &__backdrop {
22
+ position: absolute;
23
+ inset: 0; // RTL: full screen works in both directions
24
+ background-color: var(--pa-command-palette-backdrop-bg);
25
+ backdrop-filter: blur($command-palette-backdrop-blur);
26
+ animation: fadeIn $transition-normal $easing-smooth;
27
+ }
28
+
29
+ // Main container
30
+ &__container {
31
+ position: relative;
32
+ width: 100%;
33
+ max-width: $command-palette-width;
34
+ background-color: var(--pa-modal-content-bg);
35
+ border-radius: var(--pa-border-radius);
36
+ box-shadow: $command-palette-shadow;
37
+ animation: slideDown $transition-normal $easing-smooth;
38
+ overflow: hidden;
39
+ }
40
+
41
+ // Search input wrapper
42
+ &__search {
43
+ position: relative;
44
+ border-bottom: $border-width-base solid var(--pa-border-color);
45
+ padding: $spacing-sm;
46
+ }
47
+
48
+ // Tokens container (resolved query fragments)
49
+ &__tokens {
50
+ display: flex;
51
+ flex-wrap: wrap;
52
+ gap: $spacing-xs;
53
+ align-items: center;
54
+ margin-bottom: $spacing-sm;
55
+
56
+ &:empty {
57
+ display: none;
58
+ margin-bottom: 0;
59
+ }
60
+
61
+ .pa-badge {
62
+ display: inline-flex;
63
+ align-items: center;
64
+ margin: 0;
65
+
66
+ // Remove button inside badge
67
+ &__remove {
68
+ margin-inline-start: $spacing-xs; // RTL: flips to margin-right
69
+ padding: 0 $spacing-xs;
70
+ border: none;
71
+ background: transparent;
72
+ color: inherit;
73
+ cursor: pointer;
74
+ font-size: 1.2em;
75
+ line-height: 1;
76
+ opacity: 0.7;
77
+ transition: opacity $transition-fast $easing-smooth;
78
+
79
+ &:hover {
80
+ opacity: 1;
81
+ }
82
+ }
83
+ }
84
+ }
85
+
86
+ &__token-prompt {
87
+ font-size: $font-size-xs;
88
+ color: var(--pa-text-color-2);
89
+ font-style: italic;
90
+ }
91
+
92
+ &__input-wrapper {
93
+ position: relative;
94
+ }
95
+
96
+ &__input {
97
+ width: 100%;
98
+ height: $command-palette-input-height;
99
+ padding: $command-palette-input-padding-v $command-palette-input-padding-h;
100
+ font-size: $command-palette-input-font-size;
101
+ border: $border-width-base solid var(--pa-border-color);
102
+ border-radius: var(--pa-border-radius);
103
+ background-color: var(--pa-input-bg);
104
+ color: var(--pa-text-color-1);
105
+ outline: none;
106
+ transition: border-color $transition-fast $easing-snappy;
107
+
108
+ &:focus {
109
+ border-color: $input-focus-border-color;
110
+ box-shadow: 0 0 0 $focus-ring-width $accent-light;
111
+ }
112
+
113
+ &::placeholder {
114
+ color: var(--pa-text-color-2);
115
+ opacity: $opacity-muted;
116
+ }
117
+ }
118
+
119
+ // Context label (e.g., "Searching in Products") — positioned relative to input-wrapper
120
+ &__context {
121
+ position: absolute;
122
+ inset-inline-end: $command-palette-input-padding-h; // RTL: flips to left
123
+ top: 50%;
124
+ transform: translateY(-50%);
125
+ font-size: $font-size-xs;
126
+ color: var(--pa-accent);
127
+ font-weight: $font-weight-medium;
128
+ padding: $spacing-xs $spacing-sm;
129
+ background-color: var(--pa-accent-light);
130
+ border-radius: var(--pa-border-radius-sm);
131
+ opacity: 0;
132
+ transition: opacity $transition-fast $easing-smooth;
133
+
134
+ &--visible {
135
+ opacity: 1;
136
+ }
137
+ }
138
+
139
+ // Results container
140
+ &__results {
141
+ max-height: $command-palette-results-max-height;
142
+ overflow-y: auto;
143
+ padding: $spacing-sm 0;
144
+ position: relative;
145
+
146
+ // Loading state - show subtle opacity overlay
147
+ &--loading {
148
+ &::after {
149
+ content: '';
150
+ position: absolute;
151
+ inset: 0; // RTL: full overlay works in both directions
152
+ background-color: color-mix(in srgb, var(--pa-modal-content-bg) 70%, transparent);
153
+ pointer-events: none;
154
+ z-index: 1;
155
+ }
156
+ }
157
+ }
158
+
159
+ // Empty state
160
+ &__empty {
161
+ padding: $command-palette-empty-padding-v $command-palette-input-padding-h;
162
+ text-align: center;
163
+ color: var(--pa-text-color-2);
164
+ font-size: $font-size-sm;
165
+ }
166
+
167
+ // Loader
168
+ &__loader {
169
+ padding: $command-palette-empty-padding-v $command-palette-input-padding-h;
170
+ display: flex;
171
+ align-items: center;
172
+ justify-content: center;
173
+ gap: $spacing-sm;
174
+ color: var(--pa-text-color-2);
175
+ font-size: $font-size-sm;
176
+
177
+ .pa-spinner {
178
+ width: $spacing-base;
179
+ height: $spacing-base;
180
+ }
181
+ }
182
+
183
+ // Result item
184
+ &__item {
185
+ padding: $command-palette-item-padding-v $command-palette-input-padding-h;
186
+ cursor: pointer;
187
+ transition: background-color $transition-fast $easing-smooth;
188
+ display: flex;
189
+ align-items: center;
190
+ gap: $spacing-sm;
191
+
192
+ &:hover {
193
+ background-color: var(--pa-command-palette-item-hover-bg);
194
+ }
195
+
196
+ &--active {
197
+ background-color: var(--pa-command-palette-item-active-bg);
198
+ }
199
+ }
200
+
201
+ // Item icon
202
+ &__item-icon {
203
+ flex-shrink: 0;
204
+ width: $command-palette-item-icon-size;
205
+ height: $command-palette-item-icon-size;
206
+ display: flex;
207
+ align-items: center;
208
+ justify-content: center;
209
+ background-color: var(--pa-accent-light);
210
+ color: var(--pa-accent);
211
+ border-radius: var(--pa-border-radius-sm);
212
+ font-size: $font-size-sm;
213
+ }
214
+
215
+ // Item content
216
+ &__item-content {
217
+ flex: 1;
218
+ min-width: 0;
219
+ }
220
+
221
+ &__item-title {
222
+ font-size: $font-size-sm;
223
+ font-weight: $font-weight-medium;
224
+ color: var(--pa-text-color-1);
225
+ margin: 0;
226
+ white-space: nowrap;
227
+ overflow: hidden;
228
+ text-overflow: ellipsis;
229
+
230
+ mark {
231
+ background-color: var(--pa-command-palette-highlight-bg);
232
+ color: var(--pa-command-palette-highlight-text);
233
+ font-weight: $font-weight-semibold;
234
+ padding: 0 2px;
235
+ border-radius: var(--pa-border-radius-sm);
236
+ }
237
+ }
238
+
239
+ &__item-meta {
240
+ font-size: $font-size-xs;
241
+ color: var(--pa-text-color-2);
242
+ margin: 0;
243
+ margin-top: 2px;
244
+ white-space: nowrap;
245
+ overflow: hidden;
246
+ text-overflow: ellipsis;
247
+ }
248
+
249
+ // Item badge (e.g., category, status)
250
+
251
+ // Footer with keyboard hints
252
+ &__footer {
253
+ border-top: $border-width-base solid var(--pa-border-color);
254
+ padding: $spacing-sm $command-palette-input-padding-h;
255
+ display: flex;
256
+ gap: $spacing-base;
257
+ font-size: $font-size-xs;
258
+ color: var(--pa-text-color-2);
259
+ }
260
+
261
+ &__hint {
262
+ display: flex;
263
+ align-items: center;
264
+ gap: $spacing-xs;
265
+ }
266
+
267
+ &__key {
268
+ padding: 2px $spacing-xs;
269
+ background-color: var(--pa-command-palette-key-bg);
270
+ color: var(--pa-command-palette-key-text);
271
+ border: $border-width-base solid var(--pa-border-color);
272
+ border-radius: var(--pa-border-radius-sm);
273
+ font-family: $body-font-family;
274
+ font-weight: $font-weight-medium;
275
+ font-size: $font-size-2xs;
276
+ line-height: 1;
277
+ }
278
+
279
+ // Section headers (for grouping results)
280
+ &__section {
281
+ padding: $spacing-sm $command-palette-input-padding-h $spacing-xs;
282
+ font-size: $font-size-xs;
283
+ font-weight: $font-weight-semibold;
284
+ color: var(--pa-text-color-2);
285
+ text-transform: uppercase;
286
+ letter-spacing: 0.5px;
287
+ }
288
+
289
+ // Pagination indicator
290
+ &__pagination {
291
+ padding: $spacing-xs $command-palette-input-padding-h;
292
+ text-align: center;
293
+ font-size: $font-size-xs;
294
+ color: var(--pa-text-color-2);
295
+ border-top: $border-width-base solid var(--pa-border-color);
296
+ }
297
+ }
298
+
299
+ // Animations
300
+ @keyframes fadeIn {
301
+ from {
302
+ opacity: 0;
303
+ }
304
+ to {
305
+ opacity: 1;
306
+ }
307
+ }
308
+
309
+ @keyframes slideDown {
310
+ from {
311
+ opacity: 0;
312
+ transform: translateY(-20px);
313
+ }
314
+ to {
315
+ opacity: 1;
316
+ transform: translateY(0);
317
+ }
318
+ }
319
+
320
+ // Responsive
321
+ @media (max-width: $mobile-breakpoint) {
322
+ .pa-command-palette {
323
+ padding-top: $spacing-base;
324
+
325
+ &__container {
326
+ max-width: calc(100% - #{$spacing-base * 2});
327
+ }
328
+
329
+ &__results {
330
+ max-height: 60vh;
331
+ }
332
+ }
333
+ }
334
+
335
+ /* ========================================
336
+ Navbar Search Trigger
337
+ Button that opens the command palette
338
+ ======================================== */
339
+
340
+ .pa-navbar-search {
341
+ display: flex;
342
+ align-items: center;
343
+ gap: $spacing-sm;
344
+ padding: $input-padding-v $input-padding-h;
345
+ background-color: var(--pa-input-bg);
346
+ border: $border-width-base solid var(--pa-border-color);
347
+ border-radius: var(--pa-border-radius);
348
+ cursor: pointer;
349
+ transition: border-color $transition-fast $easing-snappy;
350
+
351
+ &:hover {
352
+ border-color: $input-focus-border-color;
353
+ }
354
+
355
+ &:focus {
356
+ outline: none;
357
+ border-color: $input-focus-border-color;
358
+ box-shadow: 0 0 0 $focus-ring-width $accent-light;
359
+ }
360
+
361
+ // Size modifiers (matching input sizes)
362
+ &--xs {
363
+ height: #{$base-input-size-xs-height}rem;
364
+ font-size: $font-size-xs;
365
+ }
366
+
367
+ &--sm {
368
+ height: #{$base-input-size-sm-height}rem;
369
+ font-size: $font-size-xs;
370
+ }
371
+
372
+ &--md {
373
+ height: #{$base-input-size-md-height}rem;
374
+ font-size: $font-size-sm;
375
+ }
376
+
377
+ &--lg {
378
+ height: #{$base-input-size-lg-height}rem;
379
+ font-size: $font-size-base;
380
+ }
381
+
382
+ &--xl {
383
+ height: #{$base-input-size-xl-height}rem;
384
+ font-size: $font-size-lg;
385
+ }
386
+
387
+ &__icon {
388
+ flex-shrink: 0;
389
+ opacity: $opacity-muted;
390
+ }
391
+
392
+ &__placeholder {
393
+ flex: 1;
394
+ color: var(--pa-text-color-2);
395
+ white-space: nowrap;
396
+ overflow: hidden;
397
+ text-overflow: ellipsis;
398
+ }
399
+
400
+ &__shortcut {
401
+ display: flex;
402
+ align-items: center;
403
+ gap: 2px;
404
+ flex-shrink: 0;
405
+
406
+ kbd {
407
+ display: inline-flex;
408
+ align-items: center;
409
+ justify-content: center;
410
+ min-width: 2rem;
411
+ height: 2rem;
412
+ padding: 0 $spacing-xs;
413
+ font-family: $body-font-family;
414
+ font-size: $font-size-2xs;
415
+ font-weight: $font-weight-medium;
416
+ color: var(--pa-text-color-2);
417
+ background-color: var(--pa-subtle-bg);
418
+ border: $border-width-base solid var(--pa-border-color);
419
+ border-radius: var(--pa-border-radius-sm);
420
+ box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);
421
+ }
422
+ }
423
+ }
424
+
425
+ // Responsive: hide shortcut on small screens
426
+ @media (max-width: $mobile-breakpoint) {
427
+ .pa-navbar-search {
428
+ &__placeholder {
429
+ display: none;
430
+ }
431
+
432
+ &__shortcut {
433
+ display: none;
434
+ }
435
+ }
436
+ }
437
+
438
+ /* ========================================
439
+ Shortcut Help Dialog
440
+ Modal content for displaying keyboard shortcuts
441
+ ======================================== */
442
+
443
+ .pa-shortcut-help {
444
+ display: flex;
445
+ flex-direction: column;
446
+ gap: $spacing-base;
447
+ }
448
+
449
+ .pa-shortcut-help__category {
450
+ display: flex;
451
+ flex-direction: column;
452
+ gap: $spacing-xs;
453
+ }
454
+
455
+ .pa-shortcut-help__category-title {
456
+ font-size: $font-size-xs;
457
+ font-weight: $font-weight-semibold;
458
+ text-transform: uppercase;
459
+ letter-spacing: 0.5px;
460
+ color: var(--pa-text-color-2);
461
+ margin: 0;
462
+ padding-bottom: $spacing-xs;
463
+ border-bottom: $border-width-base solid var(--pa-border-color);
464
+ }
465
+
466
+ .pa-shortcut-help__list {
467
+ display: flex;
468
+ flex-direction: column;
469
+ gap: $spacing-xs;
470
+ }
471
+
472
+ .pa-shortcut-help__item {
473
+ display: flex;
474
+ align-items: center;
475
+ justify-content: space-between;
476
+ gap: $spacing-base;
477
+ padding: $spacing-xs 0;
478
+ }
479
+
480
+ .pa-shortcut-help__keys {
481
+ display: flex;
482
+ align-items: center;
483
+ gap: $spacing-xs;
484
+ flex-shrink: 0;
485
+ }
486
+
487
+ .pa-shortcut-help__key {
488
+ display: inline-flex;
489
+ align-items: center;
490
+ justify-content: center;
491
+ min-width: $spacing-lg;
492
+ height: $spacing-lg;
493
+ padding: 0 $spacing-xs;
494
+ font-family: $body-font-family;
495
+ font-size: $font-size-2xs;
496
+ font-weight: $font-weight-medium;
497
+ color: var(--pa-text-color-1);
498
+ background-color: var(--pa-subtle-bg);
499
+ border: $border-width-base solid var(--pa-border-color);
500
+ border-radius: var(--pa-border-radius-sm);
501
+ box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);
502
+ }
503
+
504
+ .pa-shortcut-help__separator {
505
+ color: var(--pa-text-color-2);
506
+ font-size: $font-size-xs;
507
+ }
508
+
509
+ .pa-shortcut-help__description {
510
+ color: var(--pa-text-color-1);
511
+ font-size: $font-size-sm;
512
+ }
513
+
514
+ .pa-shortcut-help__empty {
515
+ text-align: center;
516
+ color: var(--pa-text-color-2);
517
+ padding: $spacing-xl;
518
+ }