@keenmate/pure-admin-core 1.0.0 → 1.1.1

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 (77) hide show
  1. package/README.md +85 -7
  2. package/dist/css/main.css +970 -434
  3. package/package.json +1 -1
  4. package/snippets/customization.html +1 -1
  5. package/snippets/forms.html +65 -8
  6. package/snippets/layout.html +4 -4
  7. package/snippets/manifest.json +329 -219
  8. package/snippets/profile.html +51 -3
  9. package/src/scss/_base-css-variables.scss +432 -422
  10. package/src/scss/_core.scss +105 -105
  11. package/src/scss/_fonts.scss +0 -14
  12. package/src/scss/_variables.scss +12 -14
  13. package/src/scss/core-components/_alerts.scss +7 -7
  14. package/src/scss/core-components/_base.scss +3 -3
  15. package/src/scss/core-components/_buttons.scss +425 -425
  16. package/src/scss/core-components/_callouts.scss +139 -139
  17. package/src/scss/core-components/_cards.scss +321 -321
  18. package/src/scss/core-components/_checkbox-lists.scss +2 -2
  19. package/src/scss/core-components/_code.scss +4 -4
  20. package/src/scss/core-components/_command-palette.scss +518 -518
  21. package/src/scss/core-components/_comparison.scss +3 -3
  22. package/src/scss/core-components/_file-selector.scss +780 -780
  23. package/src/scss/core-components/_forms.scss +16 -16
  24. package/src/scss/core-components/_layout.scss +15 -15
  25. package/src/scss/core-components/_lists.scss +7 -7
  26. package/src/scss/core-components/_logic-tree.scss +280 -280
  27. package/src/scss/core-components/_modals.scss +2 -2
  28. package/src/scss/core-components/_notifications.scss +7 -7
  29. package/src/scss/core-components/_pagers.scss +3 -3
  30. package/src/scss/core-components/_popconfirm.scss +1 -1
  31. package/src/scss/core-components/_profile.scss +400 -389
  32. package/src/scss/core-components/_scrollbars.scss +40 -40
  33. package/src/scss/core-components/_settings-panel.scss +5 -5
  34. package/src/scss/core-components/_statistics.scss +6 -6
  35. package/src/scss/core-components/_tables.scss +566 -566
  36. package/src/scss/core-components/_tabs.scss +493 -493
  37. package/src/scss/core-components/_timeline.scss +15 -15
  38. package/src/scss/core-components/_toasts.scss +4 -4
  39. package/src/scss/core-components/_tooltips.scss +8 -8
  40. package/src/scss/core-components/_utilities.scss +11 -30
  41. package/src/scss/core-components/_web-components-theme.scss +294 -294
  42. package/src/scss/core-components/badges/_composite-badge-variants.scss +3 -3
  43. package/src/scss/core-components/badges/_labels.scss +1 -1
  44. package/src/scss/core-components/forms/_checkboxes-radios.scss +2 -2
  45. package/src/scss/core-components/forms/_form-inputs.scss +33 -4
  46. package/src/scss/core-components/forms/_form-layout.scss +2 -2
  47. package/src/scss/core-components/forms/_form-states.scss +27 -1
  48. package/src/scss/core-components/forms/_input-wrapper.scss +1 -1
  49. package/src/scss/core-components/forms/_query-editor.scss +17 -17
  50. package/src/scss/core-components/layout/_layout-container.scss +1 -1
  51. package/src/scss/core-components/layout/_navbar-elements.scss +1 -1
  52. package/src/scss/core-components/layout/_sidebar.scss +5 -5
  53. package/src/scss/utilities.scss +24 -0
  54. package/src/scss/variables/_base.scss +20 -10
  55. package/src/scss/variables/_colors.scss +7 -6
  56. package/src/scss/variables/_components.scss +8 -11
  57. package/src/scss/variables/_index.scss +11 -7
  58. package/src/scss/variables/_spacing.scss +12 -0
  59. package/src/scss/variables/_typography.scss +2 -2
  60. package/dist/fonts/Delivery/Delivery_W_Bd.woff2 +0 -0
  61. package/dist/fonts/Delivery/Delivery_W_BdIt.woff2 +0 -0
  62. package/dist/fonts/Delivery/Delivery_W_CdBlk.woff2 +0 -0
  63. package/dist/fonts/Delivery/Delivery_W_CdLt.woff2 +0 -0
  64. package/dist/fonts/Delivery/Delivery_W_It.woff2 +0 -0
  65. package/dist/fonts/Delivery/Delivery_W_Lt.woff2 +0 -0
  66. package/dist/fonts/Delivery/Delivery_W_LtIt.woff2 +0 -0
  67. package/dist/fonts/Delivery/Delivery_W_Rg.woff2 +0 -0
  68. package/src/scss/themes/_dark-base.scss +0 -207
  69. package/src/scss/themes/audi-light.scss +0 -341
  70. package/src/scss/themes/audi.scss +0 -303
  71. package/src/scss/themes/corporate.scss +0 -229
  72. package/src/scss/themes/dark-blue.scss +0 -165
  73. package/src/scss/themes/dark-green.scss +0 -169
  74. package/src/scss/themes/dark-red.scss +0 -173
  75. package/src/scss/themes/dark.scss +0 -158
  76. package/src/scss/themes/express.scss +0 -294
  77. package/src/scss/themes/minimal.scss +0 -134
@@ -1,566 +1,566 @@
1
- /* ========================================
2
- Table Components
3
- Tables, virtual tables, with striped, hover, and spacing variants
4
- ======================================== */
5
- @use '../variables' as *;
6
-
7
- // Duplicate alert definition removed - consolidated above with theme-aware colors
8
-
9
-
10
- // Tables
11
- .pa-table-container {
12
- overflow-x: auto;
13
- border-radius: $border-radius;
14
- border: $border-width-base solid var(--pa-border-color);
15
- background-color: var(--pa-table-bg);
16
- }
17
-
18
- .pa-table {
19
- width: 100%;
20
- border-collapse: collapse;
21
- font-size: $font-size-sm;
22
- background-color: var(--pa-table-bg);
23
-
24
- th,
25
- td {
26
- padding: $table-padding-base-v $table-padding-base-h;
27
- text-align: left;
28
- border-bottom: $border-width-base solid var(--pa-border-color);
29
- vertical-align: middle;
30
- line-height: $line-height-tight;
31
- }
32
-
33
- th {
34
- background-color: var(--pa-table-header-bg);
35
- font-weight: $font-weight-semibold;
36
- color: var(--pa-text-primary);
37
- border-bottom: $border-width-medium solid var(--pa-border-color);
38
- }
39
-
40
- td {
41
- color: var(--pa-text-primary);
42
- background-color: var(--pa-table-bg);
43
- height: $table-cell-height;
44
-
45
- // Buttons in table cells - negative margin to prevent row height growth
46
- .pa-btn {
47
- margin-top: -0.25rem;
48
- margin-bottom: -0.25rem;
49
- }
50
- }
51
-
52
- &:not(&--responsive) {
53
- // Remove bottom border from last row
54
- tbody tr:last-child td {
55
- border-bottom: none;
56
- }
57
- }
58
-
59
- // Striped variant
60
- &--striped {
61
- tbody tr:nth-child(even) td {
62
- background-color: var(--pa-table-stripe);
63
- }
64
- }
65
-
66
- // Size variants - synchronized with button/input sizes
67
- &--xs {
68
- th, td {
69
- padding: $table-padding-xs-v $table-padding-xs-h;
70
- }
71
- td {
72
- height: $table-cell-height-xs;
73
- }
74
- }
75
-
76
- &--sm {
77
- th, td {
78
- padding: $table-padding-sm-v $table-padding-sm-h;
79
- }
80
- td {
81
- height: $table-cell-height-sm;
82
- }
83
- }
84
-
85
- &--lg {
86
- th, td {
87
- padding: $table-padding-lg-v $table-padding-lg-h;
88
- }
89
- td {
90
- height: $table-cell-height-lg;
91
- }
92
- }
93
-
94
- &--xl {
95
- th, td {
96
- padding: $table-padding-xl-v $table-padding-xl-h;
97
- }
98
- td {
99
- height: $table-cell-height-xl;
100
- }
101
- }
102
-
103
- // Hover effects
104
- @if $table-hover-accent-width > 0 {
105
- // Header alignment - add padding-left instead of border
106
- th:first-child {
107
- padding-left: $table-hover-accent-width + $table-padding-base-h;
108
- }
109
-
110
- tbody tr {
111
- border-#{$table-hover-accent-position}: #{$table-hover-accent-width} solid transparent;
112
- transition: border-color $transition-normal $easing-smooth;
113
- }
114
- }
115
-
116
- tbody tr:hover {
117
- background-color: var(--pa-table-hover-bg);
118
-
119
- // Apply hover accent if enabled
120
- @if $table-hover-accent-width > 0 {
121
- border-#{$table-hover-accent-position}-color: var(--pa-table-hover-accent-color);
122
- }
123
- }
124
-
125
- tbody tr:hover td {
126
- background-color: var(--pa-table-hover-bg);
127
- }
128
-
129
- // Remove margin from button groups inside table cells
130
- td .pa-btn-group {
131
- margin-bottom: 0;
132
- flex-wrap: nowrap; // Keep buttons in a row, don't stack vertically
133
- }
134
-
135
- // Column width helper - auto-width columns that shrink to content
136
- .col-auto {
137
- width: 1%;
138
- white-space: nowrap;
139
- }
140
- }
141
-
142
- // Pager
143
- .pa-pager {
144
- display: flex;
145
- margin: $pager-button-margin 0;
146
-
147
- // Remove margins when first/last child in card body
148
- .pa-card__body &:first-child {
149
- margin-top: 0;
150
- }
151
- .pa-card__body &:last-child {
152
- margin-bottom: 0;
153
- }
154
-
155
- // Default center alignment
156
- justify-content: center;
157
-
158
- // Positioning modifiers
159
- &--left {
160
- justify-content: flex-start;
161
- }
162
-
163
- &--center {
164
- justify-content: center;
165
- }
166
-
167
- &--right {
168
- justify-content: flex-end;
169
- }
170
-
171
- &__container {
172
- display: flex;
173
- align-items: center;
174
- gap: $spacing-sm;
175
- white-space: nowrap;
176
- }
177
-
178
- &__controls {
179
- display: flex;
180
- gap: $pager-controls-gap;
181
- }
182
-
183
- &__info {
184
- display: flex;
185
- align-items: center;
186
- gap: $spacing-sm;
187
- }
188
-
189
- &__input {
190
- width: $pager-input-width !important;
191
- text-align: center;
192
- }
193
-
194
- &__text {
195
- color: var(--pa-text-secondary);
196
- font-size: $font-size-sm;
197
- }
198
- }
199
-
200
- // Load More
201
- .pa-load-more {
202
- display: flex;
203
- margin: $spacing-base 0;
204
-
205
- // Remove margins when first/last child in card body
206
- .pa-card__body &:first-child {
207
- margin-top: 0;
208
- }
209
- .pa-card__body &:last-child {
210
- margin-bottom: 0;
211
- }
212
-
213
- // Default center alignment
214
- justify-content: center;
215
-
216
- // Positioning modifiers
217
- &--left {
218
- justify-content: flex-start;
219
- }
220
-
221
- &--center {
222
- justify-content: center;
223
- }
224
-
225
- &--right {
226
- justify-content: flex-end;
227
- }
228
-
229
- &__button {
230
- display: flex;
231
- align-items: center;
232
- gap: $spacing-sm;
233
- padding: $btn-padding-v $btn-padding-h;
234
- background-color: transparent;
235
- border: $border-width-base solid var(--pa-border-color);
236
- border-radius: $border-radius;
237
- color: var(--pa-text-primary);
238
- font-size: $font-size-sm;
239
- cursor: pointer;
240
- transition: all $transition-fast $easing-snappy;
241
-
242
- &:hover {
243
- border-color: var(--pa-accent);
244
- color: var(--pa-accent);
245
- background-color: var(--pa-accent-light);
246
- }
247
-
248
- &--loading {
249
- pointer-events: none;
250
- opacity: 0.7;
251
-
252
- .pa-load-more__spinner {
253
- animation: pa-spin 1s linear infinite;
254
- }
255
- }
256
- }
257
-
258
- &__spinner {
259
- width: $spinner-size;
260
- height: $spinner-size;
261
- border: $spinner-border-width solid var(--pa-border-color);
262
- border-top: $spinner-border-width solid var(--pa-accent);
263
- border-radius: 50%;
264
- }
265
-
266
- &__text {
267
- color: inherit;
268
- }
269
-
270
- &__count {
271
- color: var(--pa-text-secondary);
272
- font-size: $font-size-xs;
273
- margin-left: $spacing-xs;
274
- }
275
- }
276
-
277
- // Virtual Table Styles
278
- .pa-virtual-table {
279
- border: $border-width-base solid var(--pa-border-color);
280
- border-radius: $border-radius;
281
- height: $chart-height;
282
- overflow: auto;
283
- position: relative;
284
- background-color: var(--pa-table-bg);
285
- font-size: $font-size-sm; // Match pa-table font size
286
- }
287
-
288
- .pa-virtual-table__header {
289
- display: grid;
290
- grid-template-columns: $dashboard-grid-col-sm 1fr 1fr $dashboard-grid-col-lg $dashboard-grid-col-md $dashboard-grid-col-md;
291
- background: var(--pa-table-header-bg);
292
- border-bottom: $border-width-medium solid var(--pa-border-color);
293
- position: sticky;
294
- top: 0;
295
- z-index: 10;
296
- }
297
-
298
- .pa-virtual-table__header-cell {
299
- padding: $virtual-table-cell-padding-v $virtual-table-cell-padding-h;
300
- font-weight: $font-weight-semibold;
301
- border-right: $border-width-base solid var(--pa-border-color);
302
- background: var(--pa-table-header-bg);
303
- color: var(--pa-text-primary);
304
- }
305
-
306
- .pa-virtual-table__header-cell:last-child {
307
- border-right: none;
308
- }
309
-
310
- .pa-virtual-table__body {
311
- position: relative;
312
- }
313
-
314
- .pa-virtual-table__row {
315
- display: grid;
316
- grid-template-columns: $dashboard-grid-col-sm 1fr 1fr $dashboard-grid-col-lg $dashboard-grid-col-md $dashboard-grid-col-md;
317
- border-bottom: $border-width-base solid var(--pa-border-color);
318
- background: var(--pa-table-bg);
319
-
320
- // Setup for hover accent border (same as pa-table)
321
- @if $table-hover-accent-width > 0 {
322
- border-#{$table-hover-accent-position}: #{$table-hover-accent-width} solid transparent;
323
- transition: border-color $transition-normal $easing-smooth;
324
- }
325
- }
326
-
327
- .pa-virtual-table__row:nth-child(even) {
328
- background: var(--pa-table-stripe);
329
- }
330
-
331
- .pa-virtual-table__row:hover {
332
- background: var(--pa-table-hover-bg);
333
-
334
- // Apply hover accent if enabled (same as pa-table)
335
- @if $table-hover-accent-width > 0 {
336
- border-#{$table-hover-accent-position}-color: var(--pa-table-hover-accent-color);
337
- }
338
- }
339
-
340
- .pa-virtual-table__cell {
341
- padding: $virtual-table-cell-padding-v $virtual-table-cell-padding-h;
342
- border-right: $border-width-base solid var(--pa-border-color);
343
- overflow: hidden;
344
- text-overflow: ellipsis;
345
- white-space: nowrap;
346
- color: var(--pa-text-primary);
347
- background-color: inherit;
348
- }
349
-
350
- .pa-virtual-table__cell:last-child {
351
- border-right: none;
352
- }
353
-
354
- // Responsive Tables - Stackable Layout
355
- .pa-table--responsive {
356
- // Between tablet and mobile: Enable horizontal scrolling
357
- @media (max-width: $tablet-breakpoint) and (min-width: $table-responsive-breakpoint + 1) {
358
- // Table becomes scrollable but maintains desktop layout
359
- overflow-x: auto;
360
- -webkit-overflow-scrolling: touch; // Smooth scrolling on iOS
361
-
362
- // Show subtle scroll hint with border
363
- border-left: $border-width-base solid var(--pa-border-color);
364
- border-right: $border-width-base solid var(--pa-border-color);
365
- }
366
-
367
- // Mobile: Stack into cards
368
- @media (max-width: $table-responsive-breakpoint) {
369
- // Hide table headers
370
- thead {
371
- display: none;
372
- }
373
-
374
- // Make each row a card
375
- tbody tr {
376
- display: block;
377
- margin-bottom: $table-responsive-card-margin;
378
- border: $border-width-base solid var(--pa-border-color);
379
- border-radius: $border-radius;
380
- overflow: hidden;
381
-
382
- // Reset hover accent border for mobile
383
- @if $table-hover-accent-width > 0 {
384
- border-#{$table-hover-accent-position}: $border-width-base solid var(--pa-border-color) !important;
385
- }
386
-
387
- &:last-child {
388
- margin-bottom: 0;
389
- }
390
- }
391
-
392
- // Make each cell a row within the card
393
- tbody td {
394
- display: block;
395
- text-align: right;
396
- padding: $table-responsive-card-padding;
397
- position: relative;
398
- border-bottom: $border-width-base solid var(--pa-border-color);
399
-
400
- // Last cell in row has no border
401
- &:last-child {
402
- border-bottom: none;
403
- }
404
-
405
- // Label before content
406
- &::before {
407
- content: attr(data-label);
408
- position: absolute;
409
- left: $table-responsive-card-padding;
410
- top: $table-responsive-card-padding;
411
- font-weight: $table-responsive-label-font-weight;
412
- text-align: left;
413
- width: $table-responsive-label-width;
414
- }
415
-
416
- // Value aligned to the right
417
- padding-left: calc($table-responsive-label-width + $table-responsive-card-padding * 2);
418
- }
419
-
420
- // Disable col-auto effect in responsive view
421
- .col-auto {
422
- width: auto;
423
- white-space: normal;
424
- }
425
-
426
- // Striped variant - apply background to entire row (card)
427
- &.pa-table--striped tbody tr:nth-child(even) {
428
- background-color: var(--pa-table-stripe);
429
- }
430
-
431
- // Ensure cells inside striped rows have transparent background
432
- &.pa-table--striped tbody tr:nth-child(even) td {
433
- background-color: transparent;
434
- }
435
-
436
- // Hover effect on the card
437
- tbody tr:hover {
438
- background-color: transparent;
439
- box-shadow: $shadow-sm;
440
- }
441
-
442
- tbody tr:hover td {
443
- background-color: transparent;
444
- }
445
- }
446
- }
447
-
448
- // Responsive Tables - CSS Grid Layout
449
- // Allows custom grid layouts on mobile instead of simple stacking
450
- .pa-table--responsive-grid {
451
- // Between tablet and mobile: Enable horizontal scrolling
452
- @media (max-width: $tablet-breakpoint) and (min-width: $table-responsive-breakpoint + 1) {
453
- display: block;
454
- overflow-x: auto;
455
- -webkit-overflow-scrolling: touch;
456
- border-left: $border-width-base solid var(--pa-border-color);
457
- border-right: $border-width-base solid var(--pa-border-color);
458
- }
459
-
460
- // Mobile: CSS Grid layout
461
- @media (max-width: $table-responsive-breakpoint) {
462
- thead {
463
- display: none;
464
- }
465
-
466
- tbody tr {
467
- display: block;
468
- margin-bottom: $table-responsive-card-margin;
469
- border: $border-width-base solid var(--pa-border-color);
470
- border-radius: $border-radius;
471
- overflow: hidden;
472
-
473
- &:last-child {
474
- margin-bottom: 0;
475
- }
476
- }
477
-
478
- tbody td {
479
- display: block;
480
- padding: $table-responsive-card-padding;
481
- border-bottom: $border-width-base solid var(--pa-border-color);
482
-
483
- &:last-child {
484
- border-bottom: none;
485
- }
486
-
487
- // Label above content (block layout by default)
488
- &::before {
489
- content: attr(data-label);
490
- display: block;
491
- font-weight: $table-responsive-label-font-weight;
492
- color: var(--pa-text-secondary);
493
- font-size: $font-size-xs;
494
- margin-bottom: $spacing-xs;
495
- text-transform: uppercase;
496
- letter-spacing: 0.5px;
497
- }
498
- }
499
-
500
- // Grid container modifier - apply to tbody tr
501
- // Usage: Add data-grid class to <tr> elements that need custom grid
502
- tbody tr[data-grid] {
503
- display: grid;
504
- padding: $table-responsive-card-padding;
505
- gap: $table-responsive-card-padding;
506
- }
507
-
508
- // Grid cell modifier - cells within grid container
509
- tbody tr[data-grid] td {
510
- padding: 0;
511
- border: none;
512
-
513
- &::before {
514
- margin-bottom: $spacing-xs;
515
- }
516
- }
517
-
518
- // Predefined grid layouts
519
- // 2-column grid: data-grid="2"
520
- tbody tr[data-grid="2"] {
521
- grid-template-columns: 1fr 1fr;
522
- }
523
-
524
- // 3-column grid: data-grid="3"
525
- tbody tr[data-grid="3"] {
526
- grid-template-columns: 1fr 1fr 1fr;
527
- }
528
-
529
- // Span helpers for custom layouts
530
- // Use data-span="2" on td to span 2 columns
531
- tbody tr[data-grid] td[data-span="2"] {
532
- grid-column: span 2;
533
- }
534
-
535
- tbody tr[data-grid] td[data-span="3"] {
536
- grid-column: span 3;
537
- }
538
-
539
- tbody tr[data-grid] td[data-span="full"] {
540
- grid-column: 1 / -1; // Span all columns
541
- }
542
-
543
- // Disable col-auto effect in responsive view
544
- .col-auto {
545
- width: auto;
546
- white-space: normal;
547
- }
548
-
549
- // Striped variant - apply background to entire row (card)
550
- &.pa-table--striped tbody tr:nth-child(even) {
551
- background-color: var(--pa-table-stripe);
552
- }
553
-
554
- // Ensure cells inside striped rows have transparent background
555
- &.pa-table--striped tbody tr:nth-child(even) td {
556
- background-color: transparent;
557
- }
558
-
559
- // Hover effect
560
- tbody tr:hover {
561
- background-color: transparent;
562
- box-shadow: $shadow-sm;
563
- }
564
- }
565
- }
566
-
1
+ /* ========================================
2
+ Table Components
3
+ Tables, virtual tables, with striped, hover, and spacing variants
4
+ ======================================== */
5
+ @use '../variables' as *;
6
+
7
+ // Duplicate alert definition removed - consolidated above with theme-aware colors
8
+
9
+
10
+ // Tables
11
+ .pa-table-container {
12
+ overflow-x: auto;
13
+ border-radius: $border-radius;
14
+ border: $border-width-base solid var(--pa-border-color);
15
+ background-color: var(--pa-table-bg);
16
+ }
17
+
18
+ .pa-table {
19
+ width: 100%;
20
+ border-collapse: collapse;
21
+ font-size: $font-size-sm;
22
+ background-color: var(--pa-table-bg);
23
+
24
+ th,
25
+ td {
26
+ padding: $table-padding-base-v $table-padding-base-h;
27
+ text-align: left;
28
+ border-bottom: $border-width-base solid var(--pa-border-color);
29
+ vertical-align: middle;
30
+ line-height: $line-height-tight;
31
+ }
32
+
33
+ th {
34
+ background-color: var(--pa-table-header-bg);
35
+ font-weight: $font-weight-semibold;
36
+ color: var(--pa-text-color-1);
37
+ border-bottom: $border-width-medium solid var(--pa-border-color);
38
+ }
39
+
40
+ td {
41
+ color: var(--pa-text-color-1);
42
+ background-color: var(--pa-table-bg);
43
+ height: $table-cell-height;
44
+
45
+ // Buttons in table cells - negative margin to prevent row height growth
46
+ .pa-btn {
47
+ margin-top: -0.25rem;
48
+ margin-bottom: -0.25rem;
49
+ }
50
+ }
51
+
52
+ &:not(&--responsive) {
53
+ // Remove bottom border from last row
54
+ tbody tr:last-child td {
55
+ border-bottom: none;
56
+ }
57
+ }
58
+
59
+ // Striped variant
60
+ &--striped {
61
+ tbody tr:nth-child(even) td {
62
+ background-color: var(--pa-table-stripe);
63
+ }
64
+ }
65
+
66
+ // Size variants - synchronized with button/input sizes
67
+ &--xs {
68
+ th, td {
69
+ padding: $table-padding-xs-v $table-padding-xs-h;
70
+ }
71
+ td {
72
+ height: $table-cell-height-xs;
73
+ }
74
+ }
75
+
76
+ &--sm {
77
+ th, td {
78
+ padding: $table-padding-sm-v $table-padding-sm-h;
79
+ }
80
+ td {
81
+ height: $table-cell-height-sm;
82
+ }
83
+ }
84
+
85
+ &--lg {
86
+ th, td {
87
+ padding: $table-padding-lg-v $table-padding-lg-h;
88
+ }
89
+ td {
90
+ height: $table-cell-height-lg;
91
+ }
92
+ }
93
+
94
+ &--xl {
95
+ th, td {
96
+ padding: $table-padding-xl-v $table-padding-xl-h;
97
+ }
98
+ td {
99
+ height: $table-cell-height-xl;
100
+ }
101
+ }
102
+
103
+ // Hover effects
104
+ @if $table-hover-accent-width > 0 {
105
+ // Header alignment - add padding-left instead of border
106
+ th:first-child {
107
+ padding-left: $table-hover-accent-width + $table-padding-base-h;
108
+ }
109
+
110
+ tbody tr {
111
+ border-#{$table-hover-accent-position}: #{$table-hover-accent-width} solid transparent;
112
+ transition: border-color $transition-normal $easing-smooth;
113
+ }
114
+ }
115
+
116
+ tbody tr:hover {
117
+ background-color: var(--pa-table-hover-bg);
118
+
119
+ // Apply hover accent if enabled
120
+ @if $table-hover-accent-width > 0 {
121
+ border-#{$table-hover-accent-position}-color: var(--pa-table-hover-accent-color);
122
+ }
123
+ }
124
+
125
+ tbody tr:hover td {
126
+ background-color: var(--pa-table-hover-bg);
127
+ }
128
+
129
+ // Remove margin from button groups inside table cells
130
+ td .pa-btn-group {
131
+ margin-bottom: 0;
132
+ flex-wrap: nowrap; // Keep buttons in a row, don't stack vertically
133
+ }
134
+
135
+ // Column width helper - auto-width columns that shrink to content
136
+ .col-auto {
137
+ width: 1%;
138
+ white-space: nowrap;
139
+ }
140
+ }
141
+
142
+ // Pager
143
+ .pa-pager {
144
+ display: flex;
145
+ margin: $pager-button-margin 0;
146
+
147
+ // Remove margins when first/last child in card body
148
+ .pa-card__body &:first-child {
149
+ margin-top: 0;
150
+ }
151
+ .pa-card__body &:last-child {
152
+ margin-bottom: 0;
153
+ }
154
+
155
+ // Default center alignment
156
+ justify-content: center;
157
+
158
+ // Positioning modifiers
159
+ &--left {
160
+ justify-content: flex-start;
161
+ }
162
+
163
+ &--center {
164
+ justify-content: center;
165
+ }
166
+
167
+ &--right {
168
+ justify-content: flex-end;
169
+ }
170
+
171
+ &__container {
172
+ display: flex;
173
+ align-items: center;
174
+ gap: $spacing-sm;
175
+ white-space: nowrap;
176
+ }
177
+
178
+ &__controls {
179
+ display: flex;
180
+ gap: $pager-controls-gap;
181
+ }
182
+
183
+ &__info {
184
+ display: flex;
185
+ align-items: center;
186
+ gap: $spacing-sm;
187
+ }
188
+
189
+ &__input {
190
+ width: $pager-input-width !important;
191
+ text-align: center;
192
+ }
193
+
194
+ &__text {
195
+ color: var(--pa-text-color-2);
196
+ font-size: $font-size-sm;
197
+ }
198
+ }
199
+
200
+ // Load More
201
+ .pa-load-more {
202
+ display: flex;
203
+ margin: $spacing-base 0;
204
+
205
+ // Remove margins when first/last child in card body
206
+ .pa-card__body &:first-child {
207
+ margin-top: 0;
208
+ }
209
+ .pa-card__body &:last-child {
210
+ margin-bottom: 0;
211
+ }
212
+
213
+ // Default center alignment
214
+ justify-content: center;
215
+
216
+ // Positioning modifiers
217
+ &--left {
218
+ justify-content: flex-start;
219
+ }
220
+
221
+ &--center {
222
+ justify-content: center;
223
+ }
224
+
225
+ &--right {
226
+ justify-content: flex-end;
227
+ }
228
+
229
+ &__button {
230
+ display: flex;
231
+ align-items: center;
232
+ gap: $spacing-sm;
233
+ padding: $btn-padding-v $btn-padding-h;
234
+ background-color: transparent;
235
+ border: $border-width-base solid var(--pa-border-color);
236
+ border-radius: $border-radius;
237
+ color: var(--pa-text-color-1);
238
+ font-size: $font-size-sm;
239
+ cursor: pointer;
240
+ transition: all $transition-fast $easing-snappy;
241
+
242
+ &:hover {
243
+ border-color: var(--pa-accent);
244
+ color: var(--pa-accent);
245
+ background-color: var(--pa-accent-light);
246
+ }
247
+
248
+ &--loading {
249
+ pointer-events: none;
250
+ opacity: 0.7;
251
+
252
+ .pa-load-more__spinner {
253
+ animation: pa-spin 1s linear infinite;
254
+ }
255
+ }
256
+ }
257
+
258
+ &__spinner {
259
+ width: $spinner-size;
260
+ height: $spinner-size;
261
+ border: $spinner-border-width solid var(--pa-border-color);
262
+ border-top: $spinner-border-width solid var(--pa-accent);
263
+ border-radius: 50%;
264
+ }
265
+
266
+ &__text {
267
+ color: inherit;
268
+ }
269
+
270
+ &__count {
271
+ color: var(--pa-text-color-2);
272
+ font-size: $font-size-xs;
273
+ margin-left: $spacing-xs;
274
+ }
275
+ }
276
+
277
+ // Virtual Table Styles
278
+ .pa-virtual-table {
279
+ border: $border-width-base solid var(--pa-border-color);
280
+ border-radius: $border-radius;
281
+ height: $chart-height;
282
+ overflow: auto;
283
+ position: relative;
284
+ background-color: var(--pa-table-bg);
285
+ font-size: $font-size-sm; // Match pa-table font size
286
+ }
287
+
288
+ .pa-virtual-table__header {
289
+ display: grid;
290
+ grid-template-columns: $dashboard-grid-col-sm 1fr 1fr $dashboard-grid-col-lg $dashboard-grid-col-md $dashboard-grid-col-md;
291
+ background: var(--pa-table-header-bg);
292
+ border-bottom: $border-width-medium solid var(--pa-border-color);
293
+ position: sticky;
294
+ top: 0;
295
+ z-index: 10;
296
+ }
297
+
298
+ .pa-virtual-table__header-cell {
299
+ padding: $virtual-table-cell-padding-v $virtual-table-cell-padding-h;
300
+ font-weight: $font-weight-semibold;
301
+ border-right: $border-width-base solid var(--pa-border-color);
302
+ background: var(--pa-table-header-bg);
303
+ color: var(--pa-text-color-1);
304
+ }
305
+
306
+ .pa-virtual-table__header-cell:last-child {
307
+ border-right: none;
308
+ }
309
+
310
+ .pa-virtual-table__body {
311
+ position: relative;
312
+ }
313
+
314
+ .pa-virtual-table__row {
315
+ display: grid;
316
+ grid-template-columns: $dashboard-grid-col-sm 1fr 1fr $dashboard-grid-col-lg $dashboard-grid-col-md $dashboard-grid-col-md;
317
+ border-bottom: $border-width-base solid var(--pa-border-color);
318
+ background: var(--pa-table-bg);
319
+
320
+ // Setup for hover accent border (same as pa-table)
321
+ @if $table-hover-accent-width > 0 {
322
+ border-#{$table-hover-accent-position}: #{$table-hover-accent-width} solid transparent;
323
+ transition: border-color $transition-normal $easing-smooth;
324
+ }
325
+ }
326
+
327
+ .pa-virtual-table__row:nth-child(even) {
328
+ background: var(--pa-table-stripe);
329
+ }
330
+
331
+ .pa-virtual-table__row:hover {
332
+ background: var(--pa-table-hover-bg);
333
+
334
+ // Apply hover accent if enabled (same as pa-table)
335
+ @if $table-hover-accent-width > 0 {
336
+ border-#{$table-hover-accent-position}-color: var(--pa-table-hover-accent-color);
337
+ }
338
+ }
339
+
340
+ .pa-virtual-table__cell {
341
+ padding: $virtual-table-cell-padding-v $virtual-table-cell-padding-h;
342
+ border-right: $border-width-base solid var(--pa-border-color);
343
+ overflow: hidden;
344
+ text-overflow: ellipsis;
345
+ white-space: nowrap;
346
+ color: var(--pa-text-color-1);
347
+ background-color: inherit;
348
+ }
349
+
350
+ .pa-virtual-table__cell:last-child {
351
+ border-right: none;
352
+ }
353
+
354
+ // Responsive Tables - Stackable Layout
355
+ .pa-table--responsive {
356
+ // Between tablet and mobile: Enable horizontal scrolling
357
+ @media (max-width: $tablet-breakpoint) and (min-width: $table-responsive-breakpoint + 1) {
358
+ // Table becomes scrollable but maintains desktop layout
359
+ overflow-x: auto;
360
+ -webkit-overflow-scrolling: touch; // Smooth scrolling on iOS
361
+
362
+ // Show subtle scroll hint with border
363
+ border-left: $border-width-base solid var(--pa-border-color);
364
+ border-right: $border-width-base solid var(--pa-border-color);
365
+ }
366
+
367
+ // Mobile: Stack into cards
368
+ @media (max-width: $table-responsive-breakpoint) {
369
+ // Hide table headers
370
+ thead {
371
+ display: none;
372
+ }
373
+
374
+ // Make each row a card
375
+ tbody tr {
376
+ display: block;
377
+ margin-bottom: $table-responsive-card-margin;
378
+ border: $border-width-base solid var(--pa-border-color);
379
+ border-radius: $border-radius;
380
+ overflow: hidden;
381
+
382
+ // Reset hover accent border for mobile
383
+ @if $table-hover-accent-width > 0 {
384
+ border-#{$table-hover-accent-position}: $border-width-base solid var(--pa-border-color) !important;
385
+ }
386
+
387
+ &:last-child {
388
+ margin-bottom: 0;
389
+ }
390
+ }
391
+
392
+ // Make each cell a row within the card
393
+ tbody td {
394
+ display: block;
395
+ text-align: right;
396
+ padding: $table-responsive-card-padding;
397
+ position: relative;
398
+ border-bottom: $border-width-base solid var(--pa-border-color);
399
+
400
+ // Last cell in row has no border
401
+ &:last-child {
402
+ border-bottom: none;
403
+ }
404
+
405
+ // Label before content
406
+ &::before {
407
+ content: attr(data-label);
408
+ position: absolute;
409
+ left: $table-responsive-card-padding;
410
+ top: $table-responsive-card-padding;
411
+ font-weight: $table-responsive-label-font-weight;
412
+ text-align: left;
413
+ width: $table-responsive-label-width;
414
+ }
415
+
416
+ // Value aligned to the right
417
+ padding-left: calc($table-responsive-label-width + $table-responsive-card-padding * 2);
418
+ }
419
+
420
+ // Disable col-auto effect in responsive view
421
+ .col-auto {
422
+ width: auto;
423
+ white-space: normal;
424
+ }
425
+
426
+ // Striped variant - apply background to entire row (card)
427
+ &.pa-table--striped tbody tr:nth-child(even) {
428
+ background-color: var(--pa-table-stripe);
429
+ }
430
+
431
+ // Ensure cells inside striped rows have transparent background
432
+ &.pa-table--striped tbody tr:nth-child(even) td {
433
+ background-color: transparent;
434
+ }
435
+
436
+ // Hover effect on the card
437
+ tbody tr:hover {
438
+ background-color: transparent;
439
+ box-shadow: $shadow-sm;
440
+ }
441
+
442
+ tbody tr:hover td {
443
+ background-color: transparent;
444
+ }
445
+ }
446
+ }
447
+
448
+ // Responsive Tables - CSS Grid Layout
449
+ // Allows custom grid layouts on mobile instead of simple stacking
450
+ .pa-table--responsive-grid {
451
+ // Between tablet and mobile: Enable horizontal scrolling
452
+ @media (max-width: $tablet-breakpoint) and (min-width: $table-responsive-breakpoint + 1) {
453
+ display: block;
454
+ overflow-x: auto;
455
+ -webkit-overflow-scrolling: touch;
456
+ border-left: $border-width-base solid var(--pa-border-color);
457
+ border-right: $border-width-base solid var(--pa-border-color);
458
+ }
459
+
460
+ // Mobile: CSS Grid layout
461
+ @media (max-width: $table-responsive-breakpoint) {
462
+ thead {
463
+ display: none;
464
+ }
465
+
466
+ tbody tr {
467
+ display: block;
468
+ margin-bottom: $table-responsive-card-margin;
469
+ border: $border-width-base solid var(--pa-border-color);
470
+ border-radius: $border-radius;
471
+ overflow: hidden;
472
+
473
+ &:last-child {
474
+ margin-bottom: 0;
475
+ }
476
+ }
477
+
478
+ tbody td {
479
+ display: block;
480
+ padding: $table-responsive-card-padding;
481
+ border-bottom: $border-width-base solid var(--pa-border-color);
482
+
483
+ &:last-child {
484
+ border-bottom: none;
485
+ }
486
+
487
+ // Label above content (block layout by default)
488
+ &::before {
489
+ content: attr(data-label);
490
+ display: block;
491
+ font-weight: $table-responsive-label-font-weight;
492
+ color: var(--pa-text-color-2);
493
+ font-size: $font-size-xs;
494
+ margin-bottom: $spacing-xs;
495
+ text-transform: uppercase;
496
+ letter-spacing: 0.5px;
497
+ }
498
+ }
499
+
500
+ // Grid container modifier - apply to tbody tr
501
+ // Usage: Add data-grid class to <tr> elements that need custom grid
502
+ tbody tr[data-grid] {
503
+ display: grid;
504
+ padding: $table-responsive-card-padding;
505
+ gap: $table-responsive-card-padding;
506
+ }
507
+
508
+ // Grid cell modifier - cells within grid container
509
+ tbody tr[data-grid] td {
510
+ padding: 0;
511
+ border: none;
512
+
513
+ &::before {
514
+ margin-bottom: $spacing-xs;
515
+ }
516
+ }
517
+
518
+ // Predefined grid layouts
519
+ // 2-column grid: data-grid="2"
520
+ tbody tr[data-grid="2"] {
521
+ grid-template-columns: 1fr 1fr;
522
+ }
523
+
524
+ // 3-column grid: data-grid="3"
525
+ tbody tr[data-grid="3"] {
526
+ grid-template-columns: 1fr 1fr 1fr;
527
+ }
528
+
529
+ // Span helpers for custom layouts
530
+ // Use data-span="2" on td to span 2 columns
531
+ tbody tr[data-grid] td[data-span="2"] {
532
+ grid-column: span 2;
533
+ }
534
+
535
+ tbody tr[data-grid] td[data-span="3"] {
536
+ grid-column: span 3;
537
+ }
538
+
539
+ tbody tr[data-grid] td[data-span="full"] {
540
+ grid-column: 1 / -1; // Span all columns
541
+ }
542
+
543
+ // Disable col-auto effect in responsive view
544
+ .col-auto {
545
+ width: auto;
546
+ white-space: normal;
547
+ }
548
+
549
+ // Striped variant - apply background to entire row (card)
550
+ &.pa-table--striped tbody tr:nth-child(even) {
551
+ background-color: var(--pa-table-stripe);
552
+ }
553
+
554
+ // Ensure cells inside striped rows have transparent background
555
+ &.pa-table--striped tbody tr:nth-child(even) td {
556
+ background-color: transparent;
557
+ }
558
+
559
+ // Hover effect
560
+ tbody tr:hover {
561
+ background-color: transparent;
562
+ box-shadow: $shadow-sm;
563
+ }
564
+ }
565
+ }
566
+