@keenmate/pure-admin-core 1.0.0 → 1.1.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 +77 -7
  2. package/dist/css/main.css +792 -431
  3. package/package.json +1 -1
  4. package/snippets/customization.html +1 -1
  5. package/snippets/layout.html +4 -4
  6. package/snippets/manifest.json +0 -50
  7. package/snippets/profile.html +51 -3
  8. package/src/scss/_base-css-variables.scss +432 -422
  9. package/src/scss/_core.scss +105 -105
  10. package/src/scss/_fonts.scss +0 -14
  11. package/src/scss/_variables.scss +12 -14
  12. package/src/scss/core-components/_alerts.scss +7 -7
  13. package/src/scss/core-components/_base.scss +3 -3
  14. package/src/scss/core-components/_buttons.scss +425 -425
  15. package/src/scss/core-components/_callouts.scss +139 -139
  16. package/src/scss/core-components/_cards.scss +321 -321
  17. package/src/scss/core-components/_checkbox-lists.scss +2 -2
  18. package/src/scss/core-components/_code.scss +4 -4
  19. package/src/scss/core-components/_command-palette.scss +518 -518
  20. package/src/scss/core-components/_comparison.scss +3 -3
  21. package/src/scss/core-components/_file-selector.scss +780 -780
  22. package/src/scss/core-components/_forms.scss +16 -16
  23. package/src/scss/core-components/_layout.scss +15 -15
  24. package/src/scss/core-components/_lists.scss +7 -7
  25. package/src/scss/core-components/_logic-tree.scss +280 -280
  26. package/src/scss/core-components/_modals.scss +2 -2
  27. package/src/scss/core-components/_notifications.scss +7 -7
  28. package/src/scss/core-components/_pagers.scss +3 -3
  29. package/src/scss/core-components/_popconfirm.scss +1 -1
  30. package/src/scss/core-components/_profile.scss +400 -389
  31. package/src/scss/core-components/_scrollbars.scss +40 -40
  32. package/src/scss/core-components/_settings-panel.scss +5 -5
  33. package/src/scss/core-components/_statistics.scss +6 -6
  34. package/src/scss/core-components/_tables.scss +566 -566
  35. package/src/scss/core-components/_tabs.scss +493 -493
  36. package/src/scss/core-components/_timeline.scss +15 -15
  37. package/src/scss/core-components/_toasts.scss +4 -4
  38. package/src/scss/core-components/_tooltips.scss +8 -8
  39. package/src/scss/core-components/_utilities.scss +11 -30
  40. package/src/scss/core-components/_web-components-theme.scss +294 -294
  41. package/src/scss/core-components/badges/_composite-badge-variants.scss +3 -3
  42. package/src/scss/core-components/badges/_labels.scss +1 -1
  43. package/src/scss/core-components/forms/_checkboxes-radios.scss +2 -2
  44. package/src/scss/core-components/forms/_form-inputs.scss +4 -4
  45. package/src/scss/core-components/forms/_form-layout.scss +2 -2
  46. package/src/scss/core-components/forms/_form-states.scss +1 -1
  47. package/src/scss/core-components/forms/_input-wrapper.scss +1 -1
  48. package/src/scss/core-components/forms/_query-editor.scss +17 -17
  49. package/src/scss/core-components/layout/_layout-container.scss +1 -1
  50. package/src/scss/core-components/layout/_navbar-elements.scss +1 -1
  51. package/src/scss/core-components/layout/_sidebar.scss +5 -5
  52. package/src/scss/utilities.scss +24 -0
  53. package/src/scss/variables/_base.scss +20 -10
  54. package/src/scss/variables/_colors.scss +7 -6
  55. package/src/scss/variables/_components.scss +8 -11
  56. package/src/scss/variables/_index.scss +11 -7
  57. package/src/scss/variables/_spacing.scss +12 -0
  58. package/src/scss/variables/_typography.scss +2 -2
  59. package/dist/fonts/Delivery/Delivery_W_Bd.woff2 +0 -0
  60. package/dist/fonts/Delivery/Delivery_W_BdIt.woff2 +0 -0
  61. package/dist/fonts/Delivery/Delivery_W_CdBlk.woff2 +0 -0
  62. package/dist/fonts/Delivery/Delivery_W_CdLt.woff2 +0 -0
  63. package/dist/fonts/Delivery/Delivery_W_It.woff2 +0 -0
  64. package/dist/fonts/Delivery/Delivery_W_Lt.woff2 +0 -0
  65. package/dist/fonts/Delivery/Delivery_W_LtIt.woff2 +0 -0
  66. package/dist/fonts/Delivery/Delivery_W_Rg.woff2 +0 -0
  67. package/src/scss/themes/_dark-base.scss +0 -207
  68. package/src/scss/themes/audi-light.scss +0 -341
  69. package/src/scss/themes/audi.scss +0 -303
  70. package/src/scss/themes/corporate.scss +0 -229
  71. package/src/scss/themes/dark-blue.scss +0 -165
  72. package/src/scss/themes/dark-green.scss +0 -169
  73. package/src/scss/themes/dark-red.scss +0 -173
  74. package/src/scss/themes/dark.scss +0 -158
  75. package/src/scss/themes/express.scss +0 -294
  76. package/src/scss/themes/minimal.scss +0 -134
@@ -1,780 +1,780 @@
1
- // File Selector Components
2
- // Custom file inputs, drag & drop areas, file previews, and upload progress
3
- @use '../variables' as *;
4
-
5
- // Basic File Input
6
- .pa-file-input {
7
- display: flex;
8
- align-items: center;
9
- gap: $spacing-sm;
10
-
11
- &__native {
12
- position: absolute;
13
- width: 1.6px;
14
- height: 1.6px;
15
- padding: 0;
16
- margin: -1.6px;
17
- overflow: hidden;
18
- clip: rect(0, 0, 0, 0);
19
- white-space: nowrap;
20
- border: 0;
21
- }
22
-
23
- &__button {
24
- flex-shrink: 0;
25
- }
26
-
27
- &__filename {
28
- font-size: $font-size-sm;
29
- color: var(--pa-text-secondary);
30
- overflow: hidden;
31
- text-overflow: ellipsis;
32
- white-space: nowrap;
33
- }
34
- }
35
-
36
- // Drag & Drop Zone
37
- .pa-file-dropzone {
38
- position: relative;
39
- border: 3.2px dashed $border-color;
40
- border-radius: $border-radius;
41
- padding: $spacing-xl;
42
- text-align: center;
43
- transition: all $transition-fast $easing-snappy;
44
- background: var(--pa-input-bg);
45
- cursor: pointer;
46
-
47
- &:hover {
48
- border-color: $accent-color;
49
- background: rgba($accent-color, 0.05);
50
- }
51
-
52
- &--active {
53
- border-color: $accent-color;
54
- background: rgba($accent-color, 0.1);
55
- border-style: solid;
56
- }
57
-
58
- &__input {
59
- position: absolute;
60
- width: 100%;
61
- height: 100%;
62
- top: 0;
63
- left: 0;
64
- opacity: 0;
65
- cursor: pointer;
66
- pointer-events: none; // Prevent direct clicks - JavaScript handles this
67
- }
68
-
69
- &__content {
70
- pointer-events: none;
71
- }
72
-
73
- &__icon {
74
- font-size: $font-size-4xl;
75
- margin-bottom: $spacing-sm;
76
- }
77
-
78
- &__text {
79
- font-size: $font-size-base;
80
- color: var(--pa-text-primary);
81
- margin-bottom: $spacing-xs;
82
-
83
- strong {
84
- color: $accent-color;
85
- font-weight: $font-weight-semibold;
86
- }
87
- }
88
-
89
- &__hint {
90
- font-size: $font-size-xs;
91
- color: var(--pa-text-secondary);
92
- }
93
-
94
- // Compact mode: Files inside dropzone
95
- &__drop-prompt {
96
- padding: $spacing-md;
97
- border-bottom: 1.6px dashed $border-color;
98
- margin: (-$spacing-xl) (-$spacing-xl) $spacing-md (-$spacing-xl);
99
- text-align: center;
100
- font-size: $font-size-sm;
101
- color: var(--pa-text-secondary);
102
-
103
- &-icon {
104
- display: inline-block;
105
- margin-right: $spacing-xs;
106
- font-size: $font-size-lg;
107
- }
108
- }
109
-
110
- &__files-grid {
111
- display: grid;
112
- grid-template-columns: repeat(auto-fill, minmax(9.6rem, 1fr));
113
- gap: $spacing-sm;
114
- text-align: center;
115
- }
116
-
117
- &__file-card {
118
- display: flex;
119
- flex-direction: column;
120
- align-items: center;
121
- padding: $spacing-sm;
122
- border: $border-width-base solid var(--pa-border-color);
123
- border-radius: $border-radius-sm;
124
- background: var(--pa-card-bg);
125
- position: relative;
126
- cursor: default;
127
- transition: all $transition-fast $easing-snappy;
128
-
129
- &:hover {
130
- border-color: $accent-color;
131
- box-shadow: 0 1.6px 4.8px rgba(0, 0, 0, 0.1);
132
- }
133
-
134
- &-icon {
135
- font-size: $font-size-3xl;
136
- margin-bottom: $spacing-xs;
137
- }
138
-
139
- &-name {
140
- font-size: $font-size-2xs;
141
- color: var(--pa-text-primary);
142
- overflow: hidden;
143
- text-overflow: ellipsis;
144
- white-space: nowrap;
145
- width: 100%;
146
- line-height: 1.2;
147
- }
148
-
149
- &-size {
150
- font-size: $font-size-2xs;
151
- color: var(--pa-text-secondary);
152
- margin-top: $spacing-xs;
153
- }
154
-
155
- &-remove {
156
- position: absolute;
157
- top: -$spacing-xs;
158
- right: -$spacing-xs;
159
- width: 2rem;
160
- height: 2rem;
161
- border: none;
162
- background: $danger-bg;
163
- color: #ffffff;
164
- cursor: pointer;
165
- border-radius: 50%;
166
- font-size: $font-size-xs;
167
- line-height: 1;
168
- transition: all $transition-fast $easing-snappy;
169
- display: flex;
170
- align-items: center;
171
- justify-content: center;
172
- opacity: 0;
173
-
174
- &::before {
175
- content: '×';
176
- }
177
- }
178
-
179
- &:hover &-remove {
180
- opacity: 1;
181
- }
182
-
183
- &-remove:hover {
184
- transform: scale(1.1);
185
- background: rgba($danger-bg, 0.9);
186
- }
187
- }
188
-
189
- // Image preview mode inside dropzone
190
- &__image-card {
191
- position: relative;
192
- aspect-ratio: 1;
193
- border-radius: $border-radius-sm;
194
- overflow: hidden;
195
- border: $border-width-base solid var(--pa-border-color);
196
- cursor: default;
197
-
198
- img {
199
- width: 100%;
200
- height: 100%;
201
- object-fit: cover;
202
- }
203
-
204
- &-remove {
205
- position: absolute;
206
- top: $spacing-xs;
207
- right: $spacing-xs;
208
- width: 2rem;
209
- height: 2rem;
210
- border: none;
211
- background: rgba(0, 0, 0, 0.7);
212
- color: #ffffff;
213
- cursor: pointer;
214
- border-radius: 50%;
215
- font-size: $font-size-xs;
216
- line-height: 1;
217
- transition: all $transition-fast $easing-snappy;
218
- display: flex;
219
- align-items: center;
220
- justify-content: center;
221
- opacity: 0;
222
-
223
- &::before {
224
- content: '×';
225
- }
226
- }
227
-
228
- &:hover &-remove {
229
- opacity: 1;
230
- }
231
-
232
- &-remove:hover {
233
- background: $danger-bg;
234
- transform: scale(1.1);
235
- }
236
- }
237
-
238
- // Ultra-compact mode: Summary bar + modal
239
- &__summary {
240
- padding: 0;
241
- border: none;
242
- background: transparent;
243
- font-size: $font-size-base;
244
- color: var(--pa-text-secondary);
245
-
246
- &-line {
247
- display: inline-block;
248
- margin-bottom: 0;
249
- padding: $spacing-xs $spacing-sm;
250
- border-radius: $border-radius-sm;
251
- cursor: pointer;
252
- transition: background-color $transition-fast $easing-snappy;
253
-
254
- &:hover {
255
- background-color: rgba($accent-color, 0.1);
256
- }
257
-
258
- &:not(:last-child)::after {
259
- content: ' • ';
260
- }
261
- }
262
-
263
- &-icon {
264
- font-size: inherit;
265
- }
266
-
267
- &-count {
268
- font-weight: $font-weight-medium;
269
- color: $accent-color;
270
- }
271
-
272
- &-size {
273
- color: var(--pa-text-secondary);
274
- font-weight: normal;
275
- }
276
-
277
- &-current {
278
- display: block;
279
- margin-top: $spacing-xs;
280
- font-style: italic;
281
- color: var(--pa-text-primary);
282
- overflow: hidden;
283
- text-overflow: ellipsis;
284
- white-space: nowrap;
285
- }
286
-
287
- &-progress {
288
- margin-top: $spacing-xs;
289
- }
290
- }
291
- }
292
-
293
- // File Popover (for ultra-compact mode with Floating UI)
294
- .pa-file-popover {
295
- position: absolute;
296
- top: 0;
297
- left: 0;
298
- z-index: 10000;
299
- background: var(--pa-card-bg);
300
- border: $border-width-base solid var(--pa-border-color);
301
- border-radius: $border-radius;
302
- box-shadow: 0 6.4px 32px rgba(0, 0, 0, 0.15);
303
- max-width: 80rem;
304
- width: 90vw;
305
- max-height: 70vh;
306
- display: flex;
307
- flex-direction: column;
308
-
309
- &__arrow {
310
- position: absolute;
311
- width: 12.8px;
312
- height: 12.8px;
313
- background: var(--pa-card-bg);
314
- transform: rotate(45deg);
315
- border: $border-width-base solid var(--pa-border-color);
316
- z-index: -1;
317
-
318
- &[data-popper-arrow] {
319
- visibility: hidden;
320
- }
321
- }
322
-
323
- &__header {
324
- padding: $spacing-md $spacing-lg;
325
- border-bottom: $border-width-base solid var(--pa-border-color);
326
- display: flex;
327
- align-items: center;
328
- justify-content: space-between;
329
- }
330
-
331
- &__title {
332
- font-size: $font-size-base;
333
- font-weight: $font-weight-semibold;
334
- color: var(--pa-text-primary);
335
- }
336
-
337
- &__close {
338
- width: 2.4rem;
339
- height: 2.4rem;
340
- border: none;
341
- background: transparent;
342
- color: var(--pa-text-secondary);
343
- cursor: pointer;
344
- border-radius: $border-radius-sm;
345
- font-size: $font-size-xl;
346
- line-height: 1;
347
- transition: all $transition-fast $easing-snappy;
348
- display: flex;
349
- align-items: center;
350
- justify-content: center;
351
-
352
- &:hover {
353
- background: rgba(var(--pa-text-secondary), 0.1);
354
- color: var(--pa-text-primary);
355
- }
356
- }
357
-
358
- &__body {
359
- padding: $spacing-md;
360
- overflow-y: auto;
361
- flex: 1;
362
- }
363
-
364
- &__table {
365
- width: 100%;
366
- border-collapse: collapse;
367
- font-size: $font-size-sm;
368
-
369
- thead {
370
- position: sticky;
371
- top: 0;
372
- background: var(--pa-card-bg);
373
- z-index: 1;
374
- }
375
-
376
- th {
377
- text-align: left;
378
- padding: $spacing-xs $spacing-sm;
379
- border-bottom: $border-width-base solid var(--pa-border-color);
380
- color: var(--pa-text-secondary);
381
- font-weight: $font-weight-semibold;
382
- font-size: $font-size-xs;
383
- text-transform: uppercase;
384
- }
385
-
386
- td {
387
- padding: $spacing-xs $spacing-sm;
388
- border-bottom: $border-width-base solid var(--pa-border-color);
389
- color: var(--pa-text-primary);
390
- }
391
-
392
- tbody tr {
393
- &:hover {
394
- background: rgba($accent-color, 0.05);
395
- }
396
-
397
- &.uploading {
398
- background: rgba($accent-color, 0.1);
399
- }
400
- }
401
- }
402
-
403
- &__file-name {
404
- overflow: hidden;
405
- text-overflow: ellipsis;
406
- white-space: nowrap;
407
- max-width: 32rem;
408
- }
409
-
410
- &__file-size {
411
- color: var(--pa-text-secondary);
412
- white-space: nowrap;
413
- }
414
-
415
- &__progress-cell {
416
- min-width: 16rem;
417
- }
418
-
419
- &__progress-bar {
420
- height: 6.4px;
421
- background: rgba($accent-color, 0.2);
422
- border-radius: $border-radius-sm;
423
- overflow: hidden;
424
- margin-bottom: $spacing-xs;
425
- }
426
-
427
- &__progress-fill {
428
- height: 100%;
429
- background: $accent-color;
430
- border-radius: $border-radius-sm;
431
- transition: width 0.48s ease;
432
- }
433
-
434
- &__progress-text {
435
- font-size: $font-size-2xs;
436
- color: var(--pa-text-secondary);
437
- }
438
-
439
- &__status {
440
- font-size: $font-size-2xs;
441
- font-weight: $font-weight-semibold;
442
- text-transform: uppercase;
443
-
444
- &--pending {
445
- color: var(--pa-text-secondary);
446
- }
447
-
448
- &--uploading {
449
- color: $accent-color;
450
- }
451
-
452
- &--complete {
453
- color: $success-bg;
454
- }
455
-
456
- &--error {
457
- color: $danger-bg;
458
- }
459
- }
460
-
461
- &__remove-cell {
462
- text-align: center;
463
- white-space: nowrap;
464
- padding: $spacing-xs !important;
465
- }
466
-
467
- &__remove-btn {
468
- width: 3.2rem;
469
- height: 3.2rem;
470
- border: $border-width-base solid var(--pa-border-color);
471
- background: var(--pa-card-bg);
472
- color: $danger-bg;
473
- cursor: pointer;
474
- border-radius: $border-radius-sm;
475
- font-size: $font-size-2xl;
476
- line-height: 1;
477
- transition: all $transition-fast $easing-snappy;
478
- display: inline-flex;
479
- align-items: center;
480
- justify-content: center;
481
- font-weight: $font-weight-bold;
482
-
483
- &:hover {
484
- background: $danger-bg;
485
- color: #ffffff;
486
- border-color: $danger-bg;
487
- transform: scale(1.1);
488
- }
489
- }
490
- }
491
-
492
- // File List
493
- .pa-file-list {
494
- margin-top: $spacing-md;
495
-
496
- &:empty {
497
- display: none;
498
- }
499
-
500
- &--detailed {
501
- .pa-file-item {
502
- padding: $spacing-sm;
503
- border: $border-width-base solid var(--pa-border-color);
504
- border-radius: $border-radius;
505
- margin-bottom: $spacing-sm;
506
- display: flex;
507
- align-items: center;
508
- gap: $spacing-sm;
509
- background: var(--pa-input-bg);
510
-
511
- &:last-child {
512
- margin-bottom: 0;
513
- }
514
- }
515
- }
516
- }
517
-
518
- // File List Item
519
- .pa-file-item {
520
- display: flex;
521
- align-items: center;
522
- gap: $spacing-sm;
523
-
524
- &__icon {
525
- flex-shrink: 0;
526
- font-size: $font-size-2xl;
527
- width: 4rem;
528
- height: 4rem;
529
- display: flex;
530
- align-items: center;
531
- justify-content: center;
532
- background: rgba($accent-color, 0.1);
533
- border-radius: $border-radius;
534
- color: $accent-color;
535
- }
536
-
537
- &__info {
538
- flex: 1;
539
- min-width: 0;
540
- }
541
-
542
- &__name {
543
- font-size: $font-size-sm;
544
- font-weight: $font-weight-semibold;
545
- color: var(--pa-text-primary);
546
- overflow: hidden;
547
- text-overflow: ellipsis;
548
- white-space: nowrap;
549
- }
550
-
551
- &__meta {
552
- font-size: $font-size-xs;
553
- color: var(--pa-text-secondary);
554
- margin-top: $spacing-xs;
555
- }
556
-
557
- &__remove {
558
- flex-shrink: 0;
559
- width: 2.4rem;
560
- height: 2.4rem;
561
- border: none;
562
- background: transparent;
563
- color: var(--pa-text-secondary);
564
- cursor: pointer;
565
- border-radius: $border-radius-sm;
566
- font-size: $font-size-lg;
567
- line-height: 1;
568
- transition: all $transition-fast $easing-snappy;
569
- display: flex;
570
- align-items: center;
571
- justify-content: center;
572
-
573
- &:hover {
574
- background: rgba($danger-bg, 0.1);
575
- color: $danger-bg;
576
- }
577
-
578
- &::before {
579
- content: '×';
580
- }
581
- }
582
- }
583
-
584
- // File Preview Grid (for images)
585
- .pa-file-preview-grid {
586
- display: grid;
587
- grid-template-columns: repeat(auto-fill, minmax(12.8rem, 1fr));
588
- gap: $spacing-md;
589
- margin-top: $spacing-md;
590
-
591
- &:empty {
592
- display: none;
593
- }
594
- }
595
-
596
- // File Preview Item
597
- .pa-file-preview {
598
- position: relative;
599
- aspect-ratio: 1;
600
- border-radius: $border-radius;
601
- overflow: hidden;
602
- border: $border-width-base solid var(--pa-border-color);
603
-
604
- &__image {
605
- width: 100%;
606
- height: 100%;
607
- object-fit: cover;
608
- }
609
-
610
- &__remove {
611
- position: absolute;
612
- top: $spacing-xs;
613
- right: $spacing-xs;
614
- width: 2.4rem;
615
- height: 2.4rem;
616
- border: none;
617
- background: rgba(0, 0, 0, 0.7);
618
- color: #ffffff;
619
- cursor: pointer;
620
- border-radius: 50%;
621
- font-size: $font-size-base;
622
- line-height: 1;
623
- transition: all $transition-fast $easing-snappy;
624
- display: flex;
625
- align-items: center;
626
- justify-content: center;
627
-
628
- &:hover {
629
- background: $danger-bg;
630
- transform: scale(1.1);
631
- }
632
-
633
- &::before {
634
- content: '×';
635
- }
636
- }
637
-
638
- &__overlay {
639
- position: absolute;
640
- bottom: 0;
641
- left: 0;
642
- right: 0;
643
- background: linear-gradient(to top, rgba(0, 0, 0, 0.7), transparent);
644
- padding: $spacing-xs;
645
- color: #ffffff;
646
- font-size: $font-size-2xs;
647
- overflow: hidden;
648
- text-overflow: ellipsis;
649
- white-space: nowrap;
650
- }
651
- }
652
-
653
- // Upload Progress
654
- .pa-file-progress {
655
- margin-top: $spacing-xs;
656
-
657
- &__bar {
658
- height: 6.4px;
659
- background: rgba($accent-color, 0.2);
660
- border-radius: $border-radius-sm;
661
- overflow: hidden;
662
- }
663
-
664
- &__fill {
665
- height: 100%;
666
- background: $accent-color;
667
- border-radius: $border-radius-sm;
668
- transition: width 0.48s ease;
669
- }
670
-
671
- &__text {
672
- font-size: $font-size-xs;
673
- color: var(--pa-text-secondary);
674
- margin-top: $spacing-xs;
675
- display: flex;
676
- justify-content: space-between;
677
- align-items: center;
678
- }
679
-
680
- &__status {
681
- font-size: $font-size-xs;
682
- font-weight: $font-weight-semibold;
683
-
684
- &--complete {
685
- color: $success-bg;
686
- }
687
-
688
- &--error {
689
- color: $danger-bg;
690
- }
691
- }
692
- }
693
-
694
- // File type icons (using unicode emoji as fallback)
695
- .pa-file-icon {
696
- &--pdf {
697
- &::before {
698
- content: '📄';
699
- }
700
- }
701
-
702
- &--doc,
703
- &--docx {
704
- &::before {
705
- content: '📝';
706
- }
707
- }
708
-
709
- &--xls,
710
- &--xlsx {
711
- &::before {
712
- content: '📊';
713
- }
714
- }
715
-
716
- &--zip,
717
- &--rar {
718
- &::before {
719
- content: '🗜️';
720
- }
721
- }
722
-
723
- &--image {
724
- &::before {
725
- content: '🖼️';
726
- }
727
- }
728
-
729
- &--video {
730
- &::before {
731
- content: '🎬';
732
- }
733
- }
734
-
735
- &--audio {
736
- &::before {
737
- content: '🎵';
738
- }
739
- }
740
-
741
- &--txt {
742
- &::before {
743
- content: '📃';
744
- }
745
- }
746
-
747
- &--default {
748
- &::before {
749
- content: '📁';
750
- }
751
- }
752
- }
753
-
754
- // Drag Overlay (for data-overlay-target feature)
755
- .pa-file-dropzone-overlay {
756
- background: rgba($accent-color, 0.15);
757
- backdrop-filter: blur(3.2px);
758
- border: 4.8px dashed $accent-color;
759
- border-radius: $border-radius;
760
- display: flex;
761
- align-items: center;
762
- justify-content: center;
763
- transition: all $transition-fast $easing-snappy;
764
-
765
- &__content {
766
- text-align: center;
767
- pointer-events: none;
768
- }
769
-
770
- &__icon {
771
- font-size: 6.4rem;
772
- margin-bottom: $spacing-md;
773
- }
774
-
775
- &__text {
776
- font-size: $font-size-xl;
777
- font-weight: $font-weight-semibold;
778
- color: $accent-color;
779
- }
780
- }
1
+ // File Selector Components
2
+ // Custom file inputs, drag & drop areas, file previews, and upload progress
3
+ @use '../variables' as *;
4
+
5
+ // Basic File Input
6
+ .pa-file-input {
7
+ display: flex;
8
+ align-items: center;
9
+ gap: $spacing-sm;
10
+
11
+ &__native {
12
+ position: absolute;
13
+ width: 1.6px;
14
+ height: 1.6px;
15
+ padding: 0;
16
+ margin: -1.6px;
17
+ overflow: hidden;
18
+ clip: rect(0, 0, 0, 0);
19
+ white-space: nowrap;
20
+ border: 0;
21
+ }
22
+
23
+ &__button {
24
+ flex-shrink: 0;
25
+ }
26
+
27
+ &__filename {
28
+ font-size: $font-size-sm;
29
+ color: var(--pa-text-color-2);
30
+ overflow: hidden;
31
+ text-overflow: ellipsis;
32
+ white-space: nowrap;
33
+ }
34
+ }
35
+
36
+ // Drag & Drop Zone
37
+ .pa-file-dropzone {
38
+ position: relative;
39
+ border: 3.2px dashed $border-color;
40
+ border-radius: $border-radius;
41
+ padding: $spacing-xl;
42
+ text-align: center;
43
+ transition: all $transition-fast $easing-snappy;
44
+ background: var(--pa-input-bg);
45
+ cursor: pointer;
46
+
47
+ &:hover {
48
+ border-color: $accent-color;
49
+ background: rgba($accent-color, 0.05);
50
+ }
51
+
52
+ &--active {
53
+ border-color: $accent-color;
54
+ background: rgba($accent-color, 0.1);
55
+ border-style: solid;
56
+ }
57
+
58
+ &__input {
59
+ position: absolute;
60
+ width: 100%;
61
+ height: 100%;
62
+ top: 0;
63
+ left: 0;
64
+ opacity: 0;
65
+ cursor: pointer;
66
+ pointer-events: none; // Prevent direct clicks - JavaScript handles this
67
+ }
68
+
69
+ &__content {
70
+ pointer-events: none;
71
+ }
72
+
73
+ &__icon {
74
+ font-size: $font-size-4xl;
75
+ margin-bottom: $spacing-sm;
76
+ }
77
+
78
+ &__text {
79
+ font-size: $font-size-base;
80
+ color: var(--pa-text-color-1);
81
+ margin-bottom: $spacing-xs;
82
+
83
+ strong {
84
+ color: $accent-color;
85
+ font-weight: $font-weight-semibold;
86
+ }
87
+ }
88
+
89
+ &__hint {
90
+ font-size: $font-size-xs;
91
+ color: var(--pa-text-color-2);
92
+ }
93
+
94
+ // Compact mode: Files inside dropzone
95
+ &__drop-prompt {
96
+ padding: $spacing-md;
97
+ border-bottom: 1.6px dashed $border-color;
98
+ margin: (-$spacing-xl) (-$spacing-xl) $spacing-md (-$spacing-xl);
99
+ text-align: center;
100
+ font-size: $font-size-sm;
101
+ color: var(--pa-text-color-2);
102
+
103
+ &-icon {
104
+ display: inline-block;
105
+ margin-right: $spacing-xs;
106
+ font-size: $font-size-lg;
107
+ }
108
+ }
109
+
110
+ &__files-grid {
111
+ display: grid;
112
+ grid-template-columns: repeat(auto-fill, minmax(9.6rem, 1fr));
113
+ gap: $spacing-sm;
114
+ text-align: center;
115
+ }
116
+
117
+ &__file-card {
118
+ display: flex;
119
+ flex-direction: column;
120
+ align-items: center;
121
+ padding: $spacing-sm;
122
+ border: $border-width-base solid var(--pa-border-color);
123
+ border-radius: $border-radius-sm;
124
+ background: var(--pa-card-bg);
125
+ position: relative;
126
+ cursor: default;
127
+ transition: all $transition-fast $easing-snappy;
128
+
129
+ &:hover {
130
+ border-color: $accent-color;
131
+ box-shadow: 0 1.6px 4.8px rgba(0, 0, 0, 0.1);
132
+ }
133
+
134
+ &-icon {
135
+ font-size: $font-size-3xl;
136
+ margin-bottom: $spacing-xs;
137
+ }
138
+
139
+ &-name {
140
+ font-size: $font-size-2xs;
141
+ color: var(--pa-text-color-1);
142
+ overflow: hidden;
143
+ text-overflow: ellipsis;
144
+ white-space: nowrap;
145
+ width: 100%;
146
+ line-height: 1.2;
147
+ }
148
+
149
+ &-size {
150
+ font-size: $font-size-2xs;
151
+ color: var(--pa-text-color-2);
152
+ margin-top: $spacing-xs;
153
+ }
154
+
155
+ &-remove {
156
+ position: absolute;
157
+ top: -$spacing-xs;
158
+ right: -$spacing-xs;
159
+ width: 2rem;
160
+ height: 2rem;
161
+ border: none;
162
+ background: $danger-bg;
163
+ color: #ffffff;
164
+ cursor: pointer;
165
+ border-radius: 50%;
166
+ font-size: $font-size-xs;
167
+ line-height: 1;
168
+ transition: all $transition-fast $easing-snappy;
169
+ display: flex;
170
+ align-items: center;
171
+ justify-content: center;
172
+ opacity: 0;
173
+
174
+ &::before {
175
+ content: '×';
176
+ }
177
+ }
178
+
179
+ &:hover &-remove {
180
+ opacity: 1;
181
+ }
182
+
183
+ &-remove:hover {
184
+ transform: scale(1.1);
185
+ background: rgba($danger-bg, 0.9);
186
+ }
187
+ }
188
+
189
+ // Image preview mode inside dropzone
190
+ &__image-card {
191
+ position: relative;
192
+ aspect-ratio: 1;
193
+ border-radius: $border-radius-sm;
194
+ overflow: hidden;
195
+ border: $border-width-base solid var(--pa-border-color);
196
+ cursor: default;
197
+
198
+ img {
199
+ width: 100%;
200
+ height: 100%;
201
+ object-fit: cover;
202
+ }
203
+
204
+ &-remove {
205
+ position: absolute;
206
+ top: $spacing-xs;
207
+ right: $spacing-xs;
208
+ width: 2rem;
209
+ height: 2rem;
210
+ border: none;
211
+ background: rgba(0, 0, 0, 0.7);
212
+ color: #ffffff;
213
+ cursor: pointer;
214
+ border-radius: 50%;
215
+ font-size: $font-size-xs;
216
+ line-height: 1;
217
+ transition: all $transition-fast $easing-snappy;
218
+ display: flex;
219
+ align-items: center;
220
+ justify-content: center;
221
+ opacity: 0;
222
+
223
+ &::before {
224
+ content: '×';
225
+ }
226
+ }
227
+
228
+ &:hover &-remove {
229
+ opacity: 1;
230
+ }
231
+
232
+ &-remove:hover {
233
+ background: $danger-bg;
234
+ transform: scale(1.1);
235
+ }
236
+ }
237
+
238
+ // Ultra-compact mode: Summary bar + modal
239
+ &__summary {
240
+ padding: 0;
241
+ border: none;
242
+ background: transparent;
243
+ font-size: $font-size-base;
244
+ color: var(--pa-text-color-2);
245
+
246
+ &-line {
247
+ display: inline-block;
248
+ margin-bottom: 0;
249
+ padding: $spacing-xs $spacing-sm;
250
+ border-radius: $border-radius-sm;
251
+ cursor: pointer;
252
+ transition: background-color $transition-fast $easing-snappy;
253
+
254
+ &:hover {
255
+ background-color: rgba($accent-color, 0.1);
256
+ }
257
+
258
+ &:not(:last-child)::after {
259
+ content: ' • ';
260
+ }
261
+ }
262
+
263
+ &-icon {
264
+ font-size: inherit;
265
+ }
266
+
267
+ &-count {
268
+ font-weight: $font-weight-medium;
269
+ color: $accent-color;
270
+ }
271
+
272
+ &-size {
273
+ color: var(--pa-text-color-2);
274
+ font-weight: normal;
275
+ }
276
+
277
+ &-current {
278
+ display: block;
279
+ margin-top: $spacing-xs;
280
+ font-style: italic;
281
+ color: var(--pa-text-color-1);
282
+ overflow: hidden;
283
+ text-overflow: ellipsis;
284
+ white-space: nowrap;
285
+ }
286
+
287
+ &-progress {
288
+ margin-top: $spacing-xs;
289
+ }
290
+ }
291
+ }
292
+
293
+ // File Popover (for ultra-compact mode with Floating UI)
294
+ .pa-file-popover {
295
+ position: absolute;
296
+ top: 0;
297
+ left: 0;
298
+ z-index: 10000;
299
+ background: var(--pa-card-bg);
300
+ border: $border-width-base solid var(--pa-border-color);
301
+ border-radius: $border-radius;
302
+ box-shadow: 0 6.4px 32px rgba(0, 0, 0, 0.15);
303
+ max-width: 80rem;
304
+ width: 90vw;
305
+ max-height: 70vh;
306
+ display: flex;
307
+ flex-direction: column;
308
+
309
+ &__arrow {
310
+ position: absolute;
311
+ width: 12.8px;
312
+ height: 12.8px;
313
+ background: var(--pa-card-bg);
314
+ transform: rotate(45deg);
315
+ border: $border-width-base solid var(--pa-border-color);
316
+ z-index: -1;
317
+
318
+ &[data-popper-arrow] {
319
+ visibility: hidden;
320
+ }
321
+ }
322
+
323
+ &__header {
324
+ padding: $spacing-md $spacing-lg;
325
+ border-bottom: $border-width-base solid var(--pa-border-color);
326
+ display: flex;
327
+ align-items: center;
328
+ justify-content: space-between;
329
+ }
330
+
331
+ &__title {
332
+ font-size: $font-size-base;
333
+ font-weight: $font-weight-semibold;
334
+ color: var(--pa-text-color-1);
335
+ }
336
+
337
+ &__close {
338
+ width: 2.4rem;
339
+ height: 2.4rem;
340
+ border: none;
341
+ background: transparent;
342
+ color: var(--pa-text-color-2);
343
+ cursor: pointer;
344
+ border-radius: $border-radius-sm;
345
+ font-size: $font-size-xl;
346
+ line-height: 1;
347
+ transition: all $transition-fast $easing-snappy;
348
+ display: flex;
349
+ align-items: center;
350
+ justify-content: center;
351
+
352
+ &:hover {
353
+ background: rgba(var(--pa-text-color-2), 0.1);
354
+ color: var(--pa-text-color-1);
355
+ }
356
+ }
357
+
358
+ &__body {
359
+ padding: $spacing-md;
360
+ overflow-y: auto;
361
+ flex: 1;
362
+ }
363
+
364
+ &__table {
365
+ width: 100%;
366
+ border-collapse: collapse;
367
+ font-size: $font-size-sm;
368
+
369
+ thead {
370
+ position: sticky;
371
+ top: 0;
372
+ background: var(--pa-card-bg);
373
+ z-index: 1;
374
+ }
375
+
376
+ th {
377
+ text-align: left;
378
+ padding: $spacing-xs $spacing-sm;
379
+ border-bottom: $border-width-base solid var(--pa-border-color);
380
+ color: var(--pa-text-color-2);
381
+ font-weight: $font-weight-semibold;
382
+ font-size: $font-size-xs;
383
+ text-transform: uppercase;
384
+ }
385
+
386
+ td {
387
+ padding: $spacing-xs $spacing-sm;
388
+ border-bottom: $border-width-base solid var(--pa-border-color);
389
+ color: var(--pa-text-color-1);
390
+ }
391
+
392
+ tbody tr {
393
+ &:hover {
394
+ background: rgba($accent-color, 0.05);
395
+ }
396
+
397
+ &.uploading {
398
+ background: rgba($accent-color, 0.1);
399
+ }
400
+ }
401
+ }
402
+
403
+ &__file-name {
404
+ overflow: hidden;
405
+ text-overflow: ellipsis;
406
+ white-space: nowrap;
407
+ max-width: 32rem;
408
+ }
409
+
410
+ &__file-size {
411
+ color: var(--pa-text-color-2);
412
+ white-space: nowrap;
413
+ }
414
+
415
+ &__progress-cell {
416
+ min-width: 16rem;
417
+ }
418
+
419
+ &__progress-bar {
420
+ height: 6.4px;
421
+ background: rgba($accent-color, 0.2);
422
+ border-radius: $border-radius-sm;
423
+ overflow: hidden;
424
+ margin-bottom: $spacing-xs;
425
+ }
426
+
427
+ &__progress-fill {
428
+ height: 100%;
429
+ background: $accent-color;
430
+ border-radius: $border-radius-sm;
431
+ transition: width 0.48s ease;
432
+ }
433
+
434
+ &__progress-text {
435
+ font-size: $font-size-2xs;
436
+ color: var(--pa-text-color-2);
437
+ }
438
+
439
+ &__status {
440
+ font-size: $font-size-2xs;
441
+ font-weight: $font-weight-semibold;
442
+ text-transform: uppercase;
443
+
444
+ &--pending {
445
+ color: var(--pa-text-color-2);
446
+ }
447
+
448
+ &--uploading {
449
+ color: $accent-color;
450
+ }
451
+
452
+ &--complete {
453
+ color: $success-bg;
454
+ }
455
+
456
+ &--error {
457
+ color: $danger-bg;
458
+ }
459
+ }
460
+
461
+ &__remove-cell {
462
+ text-align: center;
463
+ white-space: nowrap;
464
+ padding: $spacing-xs !important;
465
+ }
466
+
467
+ &__remove-btn {
468
+ width: 3.2rem;
469
+ height: 3.2rem;
470
+ border: $border-width-base solid var(--pa-border-color);
471
+ background: var(--pa-card-bg);
472
+ color: $danger-bg;
473
+ cursor: pointer;
474
+ border-radius: $border-radius-sm;
475
+ font-size: $font-size-2xl;
476
+ line-height: 1;
477
+ transition: all $transition-fast $easing-snappy;
478
+ display: inline-flex;
479
+ align-items: center;
480
+ justify-content: center;
481
+ font-weight: $font-weight-bold;
482
+
483
+ &:hover {
484
+ background: $danger-bg;
485
+ color: #ffffff;
486
+ border-color: $danger-bg;
487
+ transform: scale(1.1);
488
+ }
489
+ }
490
+ }
491
+
492
+ // File List
493
+ .pa-file-list {
494
+ margin-top: $spacing-md;
495
+
496
+ &:empty {
497
+ display: none;
498
+ }
499
+
500
+ &--detailed {
501
+ .pa-file-item {
502
+ padding: $spacing-sm;
503
+ border: $border-width-base solid var(--pa-border-color);
504
+ border-radius: $border-radius;
505
+ margin-bottom: $spacing-sm;
506
+ display: flex;
507
+ align-items: center;
508
+ gap: $spacing-sm;
509
+ background: var(--pa-input-bg);
510
+
511
+ &:last-child {
512
+ margin-bottom: 0;
513
+ }
514
+ }
515
+ }
516
+ }
517
+
518
+ // File List Item
519
+ .pa-file-item {
520
+ display: flex;
521
+ align-items: center;
522
+ gap: $spacing-sm;
523
+
524
+ &__icon {
525
+ flex-shrink: 0;
526
+ font-size: $font-size-2xl;
527
+ width: 4rem;
528
+ height: 4rem;
529
+ display: flex;
530
+ align-items: center;
531
+ justify-content: center;
532
+ background: rgba($accent-color, 0.1);
533
+ border-radius: $border-radius;
534
+ color: $accent-color;
535
+ }
536
+
537
+ &__info {
538
+ flex: 1;
539
+ min-width: 0;
540
+ }
541
+
542
+ &__name {
543
+ font-size: $font-size-sm;
544
+ font-weight: $font-weight-semibold;
545
+ color: var(--pa-text-color-1);
546
+ overflow: hidden;
547
+ text-overflow: ellipsis;
548
+ white-space: nowrap;
549
+ }
550
+
551
+ &__meta {
552
+ font-size: $font-size-xs;
553
+ color: var(--pa-text-color-2);
554
+ margin-top: $spacing-xs;
555
+ }
556
+
557
+ &__remove {
558
+ flex-shrink: 0;
559
+ width: 2.4rem;
560
+ height: 2.4rem;
561
+ border: none;
562
+ background: transparent;
563
+ color: var(--pa-text-color-2);
564
+ cursor: pointer;
565
+ border-radius: $border-radius-sm;
566
+ font-size: $font-size-lg;
567
+ line-height: 1;
568
+ transition: all $transition-fast $easing-snappy;
569
+ display: flex;
570
+ align-items: center;
571
+ justify-content: center;
572
+
573
+ &:hover {
574
+ background: rgba($danger-bg, 0.1);
575
+ color: $danger-bg;
576
+ }
577
+
578
+ &::before {
579
+ content: '×';
580
+ }
581
+ }
582
+ }
583
+
584
+ // File Preview Grid (for images)
585
+ .pa-file-preview-grid {
586
+ display: grid;
587
+ grid-template-columns: repeat(auto-fill, minmax(12.8rem, 1fr));
588
+ gap: $spacing-md;
589
+ margin-top: $spacing-md;
590
+
591
+ &:empty {
592
+ display: none;
593
+ }
594
+ }
595
+
596
+ // File Preview Item
597
+ .pa-file-preview {
598
+ position: relative;
599
+ aspect-ratio: 1;
600
+ border-radius: $border-radius;
601
+ overflow: hidden;
602
+ border: $border-width-base solid var(--pa-border-color);
603
+
604
+ &__image {
605
+ width: 100%;
606
+ height: 100%;
607
+ object-fit: cover;
608
+ }
609
+
610
+ &__remove {
611
+ position: absolute;
612
+ top: $spacing-xs;
613
+ right: $spacing-xs;
614
+ width: 2.4rem;
615
+ height: 2.4rem;
616
+ border: none;
617
+ background: rgba(0, 0, 0, 0.7);
618
+ color: #ffffff;
619
+ cursor: pointer;
620
+ border-radius: 50%;
621
+ font-size: $font-size-base;
622
+ line-height: 1;
623
+ transition: all $transition-fast $easing-snappy;
624
+ display: flex;
625
+ align-items: center;
626
+ justify-content: center;
627
+
628
+ &:hover {
629
+ background: $danger-bg;
630
+ transform: scale(1.1);
631
+ }
632
+
633
+ &::before {
634
+ content: '×';
635
+ }
636
+ }
637
+
638
+ &__overlay {
639
+ position: absolute;
640
+ bottom: 0;
641
+ left: 0;
642
+ right: 0;
643
+ background: linear-gradient(to top, rgba(0, 0, 0, 0.7), transparent);
644
+ padding: $spacing-xs;
645
+ color: #ffffff;
646
+ font-size: $font-size-2xs;
647
+ overflow: hidden;
648
+ text-overflow: ellipsis;
649
+ white-space: nowrap;
650
+ }
651
+ }
652
+
653
+ // Upload Progress
654
+ .pa-file-progress {
655
+ margin-top: $spacing-xs;
656
+
657
+ &__bar {
658
+ height: 6.4px;
659
+ background: rgba($accent-color, 0.2);
660
+ border-radius: $border-radius-sm;
661
+ overflow: hidden;
662
+ }
663
+
664
+ &__fill {
665
+ height: 100%;
666
+ background: $accent-color;
667
+ border-radius: $border-radius-sm;
668
+ transition: width 0.48s ease;
669
+ }
670
+
671
+ &__text {
672
+ font-size: $font-size-xs;
673
+ color: var(--pa-text-color-2);
674
+ margin-top: $spacing-xs;
675
+ display: flex;
676
+ justify-content: space-between;
677
+ align-items: center;
678
+ }
679
+
680
+ &__status {
681
+ font-size: $font-size-xs;
682
+ font-weight: $font-weight-semibold;
683
+
684
+ &--complete {
685
+ color: $success-bg;
686
+ }
687
+
688
+ &--error {
689
+ color: $danger-bg;
690
+ }
691
+ }
692
+ }
693
+
694
+ // File type icons (using unicode emoji as fallback)
695
+ .pa-file-icon {
696
+ &--pdf {
697
+ &::before {
698
+ content: '📄';
699
+ }
700
+ }
701
+
702
+ &--doc,
703
+ &--docx {
704
+ &::before {
705
+ content: '📝';
706
+ }
707
+ }
708
+
709
+ &--xls,
710
+ &--xlsx {
711
+ &::before {
712
+ content: '📊';
713
+ }
714
+ }
715
+
716
+ &--zip,
717
+ &--rar {
718
+ &::before {
719
+ content: '🗜️';
720
+ }
721
+ }
722
+
723
+ &--image {
724
+ &::before {
725
+ content: '🖼️';
726
+ }
727
+ }
728
+
729
+ &--video {
730
+ &::before {
731
+ content: '🎬';
732
+ }
733
+ }
734
+
735
+ &--audio {
736
+ &::before {
737
+ content: '🎵';
738
+ }
739
+ }
740
+
741
+ &--txt {
742
+ &::before {
743
+ content: '📃';
744
+ }
745
+ }
746
+
747
+ &--default {
748
+ &::before {
749
+ content: '📁';
750
+ }
751
+ }
752
+ }
753
+
754
+ // Drag Overlay (for data-overlay-target feature)
755
+ .pa-file-dropzone-overlay {
756
+ background: rgba($accent-color, 0.15);
757
+ backdrop-filter: blur(3.2px);
758
+ border: 4.8px dashed $accent-color;
759
+ border-radius: $border-radius;
760
+ display: flex;
761
+ align-items: center;
762
+ justify-content: center;
763
+ transition: all $transition-fast $easing-snappy;
764
+
765
+ &__content {
766
+ text-align: center;
767
+ pointer-events: none;
768
+ }
769
+
770
+ &__icon {
771
+ font-size: 6.4rem;
772
+ margin-bottom: $spacing-md;
773
+ }
774
+
775
+ &__text {
776
+ font-size: $font-size-xl;
777
+ font-weight: $font-weight-semibold;
778
+ color: $accent-color;
779
+ }
780
+ }