@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,493 +1,493 @@
1
- /* ========================================
2
- Tabs Component
3
- Standalone tabs for organizing content into separate sections
4
- ======================================== */
5
- @use '../variables' as *;
6
-
7
- // Tabs container
8
- .pa-tabs {
9
- display: flex;
10
- flex-wrap: wrap;
11
- border-bottom: $border-width-base solid var(--pa-border-color);
12
- gap: $spacing-sm;
13
- margin-bottom: $tabs-margin-bottom;
14
-
15
- // Tab items
16
- &__item {
17
- padding: $btn-padding-v $btn-padding-h;
18
- border: none;
19
- background: none;
20
- color: var(--pa-text-secondary);
21
- cursor: pointer;
22
- transition: all $transition-fast $easing-snappy;
23
- border-bottom: $border-width-medium solid transparent;
24
- display: flex;
25
- align-items: center;
26
- gap: $spacing-sm;
27
- font-size: $font-size-sm;
28
- white-space: nowrap;
29
-
30
- &:hover {
31
- color: var(--pa-text-primary);
32
- background-color: rgba($accent-color, $card-tab-hover-opacity);
33
- }
34
-
35
- &--active {
36
- color: $accent-color;
37
- border-bottom-color: $accent-color;
38
- font-weight: $font-weight-semibold;
39
- }
40
-
41
- // Icons in tabs
42
- i {
43
- font-size: $font-size-sm;
44
- }
45
- }
46
-
47
- // Tab content container
48
- &__content {
49
- // No specific styling needed, just a wrapper
50
- }
51
-
52
- // Tab panels
53
- &__panel {
54
- display: none;
55
- padding-top: $tabs-panel-padding-top;
56
-
57
- &--active {
58
- display: block;
59
- }
60
-
61
- // Remove top margin from first heading
62
- h4 {
63
- margin-top: 0;
64
- }
65
- }
66
-
67
- // Pills variant
68
- &--pills {
69
- border-bottom: none;
70
- gap: $spacing-sm;
71
-
72
- .pa-tabs__item {
73
- border-radius: $border-radius-lg;
74
- border: $border-width-base solid transparent;
75
- background-color: var(--pa-primary-bg);
76
-
77
- &:hover {
78
- background-color: rgba($accent-color, $tabs-pill-hover-opacity);
79
- border-color: rgba($accent-color, $tabs-pill-border-opacity);
80
- color: var(--pa-text-primary);
81
- }
82
-
83
- &--active {
84
- background-color: var(--pa-accent);
85
- color: white;
86
- border-color: var(--pa-accent);
87
- }
88
- }
89
- }
90
-
91
- // Boxed variant
92
- &--boxed {
93
- border: $border-width-base solid var(--pa-border-color);
94
- border-radius: $border-radius-lg;
95
- padding: $spacing-xs;
96
- background-color: var(--pa-primary-bg);
97
- gap: $spacing-xs;
98
-
99
- .pa-tabs__item {
100
- border-radius: $border-radius;
101
- border: none;
102
- border-bottom: none;
103
- padding: $spacing-sm $spacing-md;
104
-
105
- &:hover {
106
- background-color: rgba($accent-color, $tabs-boxed-hover-opacity);
107
- color: var(--pa-text-primary);
108
- }
109
-
110
- &--active {
111
- background-color: var(--pa-card-bg);
112
- color: var(--pa-text-primary);
113
- box-shadow: $shadow-sm;
114
- }
115
- }
116
- }
117
-
118
- // Vertical tabs
119
- &--vertical {
120
- flex-direction: column;
121
- border-bottom: none;
122
- border-right: $border-width-base solid var(--pa-border-color);
123
- gap: 0;
124
- margin-bottom: 0;
125
- padding-right: 0;
126
- width: fit-content;
127
- min-width: max-content;
128
-
129
- .pa-tabs__item {
130
- justify-content: flex-start;
131
- border-bottom: none;
132
- border-right: $border-width-medium solid transparent;
133
- padding: $spacing-sm;
134
- border-radius: $border-radius 0 0 $border-radius;
135
- gap: $tabs-vertical-item-gap;
136
- white-space: nowrap;
137
- min-height: 4rem; // Default height for vertical tabs
138
-
139
- &:hover {
140
- background-color: rgba($accent-color, $tabs-vertical-hover-opacity);
141
- }
142
-
143
- &--active {
144
- border-right-color: $accent-color;
145
- background-color: rgba($accent-color, $tabs-vertical-active-opacity);
146
- }
147
-
148
- // Icon with fixed width (follows sidebar pattern)
149
- i {
150
- width: $tabs-vertical-icon-size;
151
- min-width: $tabs-vertical-icon-size;
152
- display: flex;
153
- align-items: center;
154
- justify-content: center;
155
- flex-shrink: 0;
156
- }
157
-
158
- // Text with ellipsis overflow (follows sidebar pattern)
159
- span {
160
- overflow: hidden;
161
- text-overflow: ellipsis;
162
- white-space: nowrap;
163
- }
164
- }
165
- }
166
-
167
- // Centered tabs
168
- &--centered {
169
- justify-content: center;
170
-
171
- // For vertical tabs, center the content within each item
172
- &.pa-tabs--vertical {
173
- .pa-tabs__item {
174
- display: flex !important;
175
- justify-content: center;
176
- align-items: center;
177
- }
178
- }
179
- }
180
-
181
- // No-wrap tabs - prevent wrapping (opt-out of default behavior)
182
- &--nowrap {
183
- flex-wrap: nowrap;
184
- }
185
-
186
- // Scrollable tabs - horizontal scroll with arrow navigation
187
- &--scrollable {
188
- position: relative;
189
- overflow: hidden;
190
- flex-wrap: nowrap; // Force no-wrap for scrolling to work
191
-
192
- // Inner scrollable container
193
- .pa-tabs__scroll-container {
194
- display: flex;
195
- overflow-x: auto;
196
- scroll-behavior: smooth;
197
- scrollbar-width: none; // Firefox
198
- gap: $spacing-sm;
199
-
200
- &::-webkit-scrollbar {
201
- display: none; // Chrome, Safari
202
- }
203
- }
204
-
205
- // Scroll arrows
206
- .pa-tabs__scroll-btn {
207
- position: absolute;
208
- top: 0;
209
- bottom: 0;
210
- width: $tabs-scroll-btn-width;
211
- border: none;
212
- background: linear-gradient(to right, color-mix(in srgb, var(--pa-primary-bg) 95%, transparent), transparent);
213
- color: var(--pa-text-primary);
214
- cursor: pointer;
215
- z-index: 1;
216
- display: flex;
217
- align-items: center;
218
- justify-content: center;
219
- transition: opacity $transition-fast;
220
- opacity: 0;
221
- pointer-events: none;
222
-
223
- &:hover {
224
- background: linear-gradient(to right, var(--pa-primary-bg), color-mix(in srgb, var(--pa-primary-bg) 80%, transparent));
225
- }
226
-
227
- &--left {
228
- left: 0;
229
- background: linear-gradient(to right, color-mix(in srgb, var(--pa-primary-bg) 95%, transparent), transparent);
230
- }
231
-
232
- &--right {
233
- right: 0;
234
- background: linear-gradient(to left, color-mix(in srgb, var(--pa-primary-bg) 95%, transparent), transparent);
235
- }
236
-
237
- &--visible {
238
- opacity: 1;
239
- pointer-events: auto;
240
- }
241
-
242
- i {
243
- font-size: $font-size-lg;
244
- }
245
- }
246
- }
247
-
248
- // Collapse tabs - show only icons when constrained, active tab shows full title
249
- &--collapse {
250
- flex-wrap: nowrap; // Don't wrap collapsed tabs
251
-
252
- // Hide text spans by default (only show icons)
253
- .pa-tabs__item {
254
- span {
255
- display: none;
256
- }
257
-
258
- // Active tab shows both icon and text
259
- &--active {
260
- span {
261
- display: inline;
262
- }
263
- }
264
-
265
- // Tooltips on collapsed tabs
266
- position: relative;
267
- }
268
- }
269
-
270
- // Full width tabs
271
- &--full {
272
- .pa-tabs__item {
273
- flex: 1;
274
- justify-content: center;
275
- }
276
- }
277
-
278
- // Border top variant - active indicator on top instead of bottom
279
- &--border-top {
280
- border-bottom: none;
281
- border-top: $border-width-base solid var(--pa-border-color);
282
-
283
- .pa-tabs__item {
284
- border-bottom: none;
285
- border-top: $border-width-medium solid transparent;
286
-
287
- &--active {
288
- border-top-color: $accent-color;
289
- border-bottom-color: transparent;
290
- }
291
- }
292
- }
293
-
294
- // Size variants
295
- &--sm {
296
- .pa-tabs__item {
297
- padding: $btn-padding-sm-v $btn-padding-sm-h;
298
- font-size: $font-size-xs;
299
-
300
- i {
301
- font-size: $font-size-xs;
302
- }
303
- }
304
- }
305
-
306
- &--lg {
307
- .pa-tabs__item {
308
- padding: $btn-padding-lg-v $btn-padding-lg-h;
309
- font-size: $font-size-lg;
310
-
311
- i {
312
- font-size: $font-size-lg;
313
- }
314
- }
315
- }
316
-
317
- // Horizontal tabs container (for wrapping tabs + content)
318
- &__container {
319
- // Bordered variant - wraps entire tabs system in card-like border
320
- &--bordered {
321
- border: $border-width-base solid var(--pa-border-color);
322
- border-radius: $border-radius-lg;
323
- padding: $card-body-padding-v $card-body-padding-h;
324
- background-color: var(--pa-card-bg);
325
- margin-bottom: $spacing-base; // Match pa-card margin
326
-
327
- // Remove bottom border from tabs since wrapper has border
328
- .pa-tabs {
329
- border-bottom: none;
330
- padding-bottom: $spacing-md;
331
- margin-bottom: 0;
332
- border-bottom: $border-width-base solid var(--pa-border-color); // Divider between tabs and content
333
- }
334
-
335
- // Remove top padding from content since wrapper provides spacing
336
- .pa-tabs__content {
337
- padding-top: $spacing-md;
338
- }
339
- }
340
-
341
- // Card variant - tabs act as card header (same height as pa-card__header)
342
- &--card {
343
- position: relative; // For dropdown positioning
344
- border: $card-border-width solid var(--pa-border-color);
345
- border-radius: $card-border-radius;
346
- background-color: var(--pa-card-bg);
347
- box-shadow: $shadow-sm;
348
- margin-bottom: $spacing-base; // Match pa-card margin
349
-
350
- .pa-tabs {
351
- height: $card-header-min-height;
352
- padding: $card-header-padding-v $card-header-padding-h;
353
- background: var(--pa-card-header-bg);
354
- border-bottom: $border-width-base solid var(--pa-border-color);
355
- box-sizing: border-box;
356
- border-top-left-radius: $card-border-radius;
357
- border-top-right-radius: $card-border-radius;
358
- margin-bottom: 0;
359
- align-items: center;
360
- gap: $spacing-xs;
361
- flex-wrap: nowrap;
362
- overflow: visible; // Allow dropdown to overflow
363
- }
364
-
365
- .pa-tabs__content {
366
- padding: $card-body-padding-v $card-body-padding-h;
367
- }
368
-
369
- .pa-tabs__panel {
370
- padding-top: 0;
371
- }
372
-
373
- // Overflow toggle for tabs that don't fit
374
- .pa-tabs__overflow {
375
- position: relative;
376
- margin-left: auto;
377
- flex-shrink: 0;
378
- }
379
-
380
- .pa-tabs__overflow-toggle {
381
- position: relative;
382
- display: flex;
383
- align-items: center;
384
- justify-content: center;
385
- width: $card-header-min-height;
386
- height: 100%;
387
- padding: 0;
388
- border: none;
389
- background: transparent;
390
- color: var(--pa-text-secondary);
391
- cursor: pointer;
392
- transition: all $transition-fast $easing-snappy;
393
- border-left: $border-width-base solid var(--pa-border-color);
394
- margin: (-$card-header-padding-v) (-$card-header-padding-h) (-$card-header-padding-v) 0;
395
- box-sizing: content-box;
396
- height: $card-header-min-height;
397
-
398
- &:hover {
399
- background-color: rgba($accent-color, $card-tab-hover-opacity);
400
- color: var(--pa-text-primary);
401
- }
402
-
403
- // When overflow contains the active tab
404
- &--has-active {
405
- color: var(--pa-accent);
406
-
407
- &::after {
408
- content: '';
409
- position: absolute;
410
- bottom: 0;
411
- left: 0;
412
- right: 0;
413
- height: $border-width-medium;
414
- background: var(--pa-accent);
415
- }
416
- }
417
-
418
- i {
419
- font-size: $font-size-sm;
420
- }
421
- }
422
-
423
- .pa-tabs__overflow-menu {
424
- position: absolute;
425
- top: $card-header-min-height;
426
- right: 0;
427
- min-width: 15rem;
428
- background: var(--pa-card-bg);
429
- border: $card-border-width solid var(--pa-border-color);
430
- border-radius: $border-radius;
431
- box-shadow: $shadow-lg;
432
- z-index: $z-index-dropdown;
433
- display: none;
434
- flex-direction: column;
435
- padding: $spacing-xs 0;
436
-
437
- &--open {
438
- display: flex;
439
- }
440
-
441
- .pa-tabs__item {
442
- padding: $spacing-sm $spacing-base;
443
- border: none;
444
- border-bottom: none;
445
- border-radius: 0;
446
- text-align: left;
447
- white-space: nowrap;
448
-
449
- &:hover {
450
- background-color: rgba($accent-color, $card-tab-hover-opacity);
451
- }
452
-
453
- &--active {
454
- background-color: rgba($accent-color, 0.1);
455
- border-bottom: none;
456
- }
457
- }
458
- }
459
- }
460
- }
461
-
462
- // Vertical tabs layout wrapper (for proper spacing with content)
463
- &__vertical-layout {
464
- display: flex;
465
- gap: $spacing-base;
466
- align-items: flex-start;
467
-
468
- // All panels in vertical layout should have no top padding (aligned horizontally with tabs)
469
- .pa-tabs__content .pa-tabs__panel {
470
- padding-top: 0;
471
- }
472
-
473
- // Bordered variant - wraps entire tabs system in card-like border
474
- &--bordered {
475
- border: $border-width-base solid var(--pa-border-color);
476
- border-radius: $border-radius-lg;
477
- padding: $card-body-padding-v $card-body-padding-h;
478
- background-color: var(--pa-card-bg);
479
- margin-bottom: $spacing-base; // Match pa-card margin
480
-
481
- // Add divider between tabs and content (gap already provides spacing)
482
- .pa-tabs--vertical {
483
- border-right: $border-width-base solid var(--pa-border-color);
484
-
485
- // Make tab items full width so active border reaches divider
486
- .pa-tabs__item {
487
- width: 100%;
488
- }
489
- }
490
- }
491
- }
492
-
493
- }
1
+ /* ========================================
2
+ Tabs Component
3
+ Standalone tabs for organizing content into separate sections
4
+ ======================================== */
5
+ @use '../variables' as *;
6
+
7
+ // Tabs container
8
+ .pa-tabs {
9
+ display: flex;
10
+ flex-wrap: wrap;
11
+ border-bottom: $border-width-base solid var(--pa-border-color);
12
+ gap: $spacing-sm;
13
+ margin-bottom: $tabs-margin-bottom;
14
+
15
+ // Tab items
16
+ &__item {
17
+ padding: $btn-padding-v $btn-padding-h;
18
+ border: none;
19
+ background: none;
20
+ color: var(--pa-text-color-2);
21
+ cursor: pointer;
22
+ transition: all $transition-fast $easing-snappy;
23
+ border-bottom: $border-width-medium solid transparent;
24
+ display: flex;
25
+ align-items: center;
26
+ gap: $spacing-sm;
27
+ font-size: $font-size-sm;
28
+ white-space: nowrap;
29
+
30
+ &:hover {
31
+ color: var(--pa-text-color-1);
32
+ background-color: rgba($accent-color, $card-tab-hover-opacity);
33
+ }
34
+
35
+ &--active {
36
+ color: $accent-color;
37
+ border-bottom-color: $accent-color;
38
+ font-weight: $font-weight-semibold;
39
+ }
40
+
41
+ // Icons in tabs
42
+ i {
43
+ font-size: $font-size-sm;
44
+ }
45
+ }
46
+
47
+ // Tab content container
48
+ &__content {
49
+ // No specific styling needed, just a wrapper
50
+ }
51
+
52
+ // Tab panels
53
+ &__panel {
54
+ display: none;
55
+ padding-top: $tabs-panel-padding-top;
56
+
57
+ &--active {
58
+ display: block;
59
+ }
60
+
61
+ // Remove top margin from first heading
62
+ h4 {
63
+ margin-top: 0;
64
+ }
65
+ }
66
+
67
+ // Pills variant
68
+ &--pills {
69
+ border-bottom: none;
70
+ gap: $spacing-sm;
71
+
72
+ .pa-tabs__item {
73
+ border-radius: $border-radius-lg;
74
+ border: $border-width-base solid transparent;
75
+ background-color: var(--pa-main-bg);
76
+
77
+ &:hover {
78
+ background-color: rgba($accent-color, $tabs-pill-hover-opacity);
79
+ border-color: rgba($accent-color, $tabs-pill-border-opacity);
80
+ color: var(--pa-text-color-1);
81
+ }
82
+
83
+ &--active {
84
+ background-color: var(--pa-accent);
85
+ color: white;
86
+ border-color: var(--pa-accent);
87
+ }
88
+ }
89
+ }
90
+
91
+ // Boxed variant
92
+ &--boxed {
93
+ border: $border-width-base solid var(--pa-border-color);
94
+ border-radius: $border-radius-lg;
95
+ padding: $spacing-xs;
96
+ background-color: var(--pa-main-bg);
97
+ gap: $spacing-xs;
98
+
99
+ .pa-tabs__item {
100
+ border-radius: $border-radius;
101
+ border: none;
102
+ border-bottom: none;
103
+ padding: $spacing-sm $spacing-md;
104
+
105
+ &:hover {
106
+ background-color: rgba($accent-color, $tabs-boxed-hover-opacity);
107
+ color: var(--pa-text-color-1);
108
+ }
109
+
110
+ &--active {
111
+ background-color: var(--pa-card-bg);
112
+ color: var(--pa-text-color-1);
113
+ box-shadow: $shadow-sm;
114
+ }
115
+ }
116
+ }
117
+
118
+ // Vertical tabs
119
+ &--vertical {
120
+ flex-direction: column;
121
+ border-bottom: none;
122
+ border-right: $border-width-base solid var(--pa-border-color);
123
+ gap: 0;
124
+ margin-bottom: 0;
125
+ padding-right: 0;
126
+ width: fit-content;
127
+ min-width: max-content;
128
+
129
+ .pa-tabs__item {
130
+ justify-content: flex-start;
131
+ border-bottom: none;
132
+ border-right: $border-width-medium solid transparent;
133
+ padding: $spacing-sm;
134
+ border-radius: $border-radius 0 0 $border-radius;
135
+ gap: $tabs-vertical-item-gap;
136
+ white-space: nowrap;
137
+ min-height: 4rem; // Default height for vertical tabs
138
+
139
+ &:hover {
140
+ background-color: rgba($accent-color, $tabs-vertical-hover-opacity);
141
+ }
142
+
143
+ &--active {
144
+ border-right-color: $accent-color;
145
+ background-color: rgba($accent-color, $tabs-vertical-active-opacity);
146
+ }
147
+
148
+ // Icon with fixed width (follows sidebar pattern)
149
+ i {
150
+ width: $tabs-vertical-icon-size;
151
+ min-width: $tabs-vertical-icon-size;
152
+ display: flex;
153
+ align-items: center;
154
+ justify-content: center;
155
+ flex-shrink: 0;
156
+ }
157
+
158
+ // Text with ellipsis overflow (follows sidebar pattern)
159
+ span {
160
+ overflow: hidden;
161
+ text-overflow: ellipsis;
162
+ white-space: nowrap;
163
+ }
164
+ }
165
+ }
166
+
167
+ // Centered tabs
168
+ &--centered {
169
+ justify-content: center;
170
+
171
+ // For vertical tabs, center the content within each item
172
+ &.pa-tabs--vertical {
173
+ .pa-tabs__item {
174
+ display: flex !important;
175
+ justify-content: center;
176
+ align-items: center;
177
+ }
178
+ }
179
+ }
180
+
181
+ // No-wrap tabs - prevent wrapping (opt-out of default behavior)
182
+ &--nowrap {
183
+ flex-wrap: nowrap;
184
+ }
185
+
186
+ // Scrollable tabs - horizontal scroll with arrow navigation
187
+ &--scrollable {
188
+ position: relative;
189
+ overflow: hidden;
190
+ flex-wrap: nowrap; // Force no-wrap for scrolling to work
191
+
192
+ // Inner scrollable container
193
+ .pa-tabs__scroll-container {
194
+ display: flex;
195
+ overflow-x: auto;
196
+ scroll-behavior: smooth;
197
+ scrollbar-width: none; // Firefox
198
+ gap: $spacing-sm;
199
+
200
+ &::-webkit-scrollbar {
201
+ display: none; // Chrome, Safari
202
+ }
203
+ }
204
+
205
+ // Scroll arrows
206
+ .pa-tabs__scroll-btn {
207
+ position: absolute;
208
+ top: 0;
209
+ bottom: 0;
210
+ width: $tabs-scroll-btn-width;
211
+ border: none;
212
+ background: linear-gradient(to right, color-mix(in srgb, var(--pa-main-bg) 95%, transparent), transparent);
213
+ color: var(--pa-text-color-1);
214
+ cursor: pointer;
215
+ z-index: 1;
216
+ display: flex;
217
+ align-items: center;
218
+ justify-content: center;
219
+ transition: opacity $transition-fast;
220
+ opacity: 0;
221
+ pointer-events: none;
222
+
223
+ &:hover {
224
+ background: linear-gradient(to right, var(--pa-main-bg), color-mix(in srgb, var(--pa-main-bg) 80%, transparent));
225
+ }
226
+
227
+ &--left {
228
+ left: 0;
229
+ background: linear-gradient(to right, color-mix(in srgb, var(--pa-main-bg) 95%, transparent), transparent);
230
+ }
231
+
232
+ &--right {
233
+ right: 0;
234
+ background: linear-gradient(to left, color-mix(in srgb, var(--pa-main-bg) 95%, transparent), transparent);
235
+ }
236
+
237
+ &--visible {
238
+ opacity: 1;
239
+ pointer-events: auto;
240
+ }
241
+
242
+ i {
243
+ font-size: $font-size-lg;
244
+ }
245
+ }
246
+ }
247
+
248
+ // Collapse tabs - show only icons when constrained, active tab shows full title
249
+ &--collapse {
250
+ flex-wrap: nowrap; // Don't wrap collapsed tabs
251
+
252
+ // Hide text spans by default (only show icons)
253
+ .pa-tabs__item {
254
+ span {
255
+ display: none;
256
+ }
257
+
258
+ // Active tab shows both icon and text
259
+ &--active {
260
+ span {
261
+ display: inline;
262
+ }
263
+ }
264
+
265
+ // Tooltips on collapsed tabs
266
+ position: relative;
267
+ }
268
+ }
269
+
270
+ // Full width tabs
271
+ &--full {
272
+ .pa-tabs__item {
273
+ flex: 1;
274
+ justify-content: center;
275
+ }
276
+ }
277
+
278
+ // Border top variant - active indicator on top instead of bottom
279
+ &--border-top {
280
+ border-bottom: none;
281
+ border-top: $border-width-base solid var(--pa-border-color);
282
+
283
+ .pa-tabs__item {
284
+ border-bottom: none;
285
+ border-top: $border-width-medium solid transparent;
286
+
287
+ &--active {
288
+ border-top-color: $accent-color;
289
+ border-bottom-color: transparent;
290
+ }
291
+ }
292
+ }
293
+
294
+ // Size variants
295
+ &--sm {
296
+ .pa-tabs__item {
297
+ padding: $btn-padding-sm-v $btn-padding-sm-h;
298
+ font-size: $font-size-xs;
299
+
300
+ i {
301
+ font-size: $font-size-xs;
302
+ }
303
+ }
304
+ }
305
+
306
+ &--lg {
307
+ .pa-tabs__item {
308
+ padding: $btn-padding-lg-v $btn-padding-lg-h;
309
+ font-size: $font-size-lg;
310
+
311
+ i {
312
+ font-size: $font-size-lg;
313
+ }
314
+ }
315
+ }
316
+
317
+ // Horizontal tabs container (for wrapping tabs + content)
318
+ &__container {
319
+ // Bordered variant - wraps entire tabs system in card-like border
320
+ &--bordered {
321
+ border: $border-width-base solid var(--pa-border-color);
322
+ border-radius: $border-radius-lg;
323
+ padding: $card-body-padding-v $card-body-padding-h;
324
+ background-color: var(--pa-card-bg);
325
+ margin-bottom: $spacing-base; // Match pa-card margin
326
+
327
+ // Remove bottom border from tabs since wrapper has border
328
+ .pa-tabs {
329
+ border-bottom: none;
330
+ padding-bottom: $spacing-md;
331
+ margin-bottom: 0;
332
+ border-bottom: $border-width-base solid var(--pa-border-color); // Divider between tabs and content
333
+ }
334
+
335
+ // Remove top padding from content since wrapper provides spacing
336
+ .pa-tabs__content {
337
+ padding-top: $spacing-md;
338
+ }
339
+ }
340
+
341
+ // Card variant - tabs act as card header (same height as pa-card__header)
342
+ &--card {
343
+ position: relative; // For dropdown positioning
344
+ border: $card-border-width solid var(--pa-border-color);
345
+ border-radius: $card-border-radius;
346
+ background-color: var(--pa-card-bg);
347
+ box-shadow: $shadow-sm;
348
+ margin-bottom: $spacing-base; // Match pa-card margin
349
+
350
+ .pa-tabs {
351
+ height: $card-header-min-height;
352
+ padding: $card-header-padding-v $card-header-padding-h;
353
+ background: var(--pa-card-header-bg);
354
+ border-bottom: $border-width-base solid var(--pa-border-color);
355
+ box-sizing: border-box;
356
+ border-top-left-radius: $card-border-radius;
357
+ border-top-right-radius: $card-border-radius;
358
+ margin-bottom: 0;
359
+ align-items: center;
360
+ gap: $spacing-xs;
361
+ flex-wrap: nowrap;
362
+ overflow: visible; // Allow dropdown to overflow
363
+ }
364
+
365
+ .pa-tabs__content {
366
+ padding: $card-body-padding-v $card-body-padding-h;
367
+ }
368
+
369
+ .pa-tabs__panel {
370
+ padding-top: 0;
371
+ }
372
+
373
+ // Overflow toggle for tabs that don't fit
374
+ .pa-tabs__overflow {
375
+ position: relative;
376
+ margin-left: auto;
377
+ flex-shrink: 0;
378
+ }
379
+
380
+ .pa-tabs__overflow-toggle {
381
+ position: relative;
382
+ display: flex;
383
+ align-items: center;
384
+ justify-content: center;
385
+ width: $card-header-min-height;
386
+ height: 100%;
387
+ padding: 0;
388
+ border: none;
389
+ background: transparent;
390
+ color: var(--pa-text-color-2);
391
+ cursor: pointer;
392
+ transition: all $transition-fast $easing-snappy;
393
+ border-left: $border-width-base solid var(--pa-border-color);
394
+ margin: (-$card-header-padding-v) (-$card-header-padding-h) (-$card-header-padding-v) 0;
395
+ box-sizing: content-box;
396
+ height: $card-header-min-height;
397
+
398
+ &:hover {
399
+ background-color: rgba($accent-color, $card-tab-hover-opacity);
400
+ color: var(--pa-text-color-1);
401
+ }
402
+
403
+ // When overflow contains the active tab
404
+ &--has-active {
405
+ color: var(--pa-accent);
406
+
407
+ &::after {
408
+ content: '';
409
+ position: absolute;
410
+ bottom: 0;
411
+ left: 0;
412
+ right: 0;
413
+ height: $border-width-medium;
414
+ background: var(--pa-accent);
415
+ }
416
+ }
417
+
418
+ i {
419
+ font-size: $font-size-sm;
420
+ }
421
+ }
422
+
423
+ .pa-tabs__overflow-menu {
424
+ position: absolute;
425
+ top: $card-header-min-height;
426
+ right: 0;
427
+ min-width: 15rem;
428
+ background: var(--pa-card-bg);
429
+ border: $card-border-width solid var(--pa-border-color);
430
+ border-radius: $border-radius;
431
+ box-shadow: $shadow-lg;
432
+ z-index: $z-index-dropdown;
433
+ display: none;
434
+ flex-direction: column;
435
+ padding: $spacing-xs 0;
436
+
437
+ &--open {
438
+ display: flex;
439
+ }
440
+
441
+ .pa-tabs__item {
442
+ padding: $spacing-sm $spacing-base;
443
+ border: none;
444
+ border-bottom: none;
445
+ border-radius: 0;
446
+ text-align: left;
447
+ white-space: nowrap;
448
+
449
+ &:hover {
450
+ background-color: rgba($accent-color, $card-tab-hover-opacity);
451
+ }
452
+
453
+ &--active {
454
+ background-color: rgba($accent-color, 0.1);
455
+ border-bottom: none;
456
+ }
457
+ }
458
+ }
459
+ }
460
+ }
461
+
462
+ // Vertical tabs layout wrapper (for proper spacing with content)
463
+ &__vertical-layout {
464
+ display: flex;
465
+ gap: $spacing-base;
466
+ align-items: flex-start;
467
+
468
+ // All panels in vertical layout should have no top padding (aligned horizontally with tabs)
469
+ .pa-tabs__content .pa-tabs__panel {
470
+ padding-top: 0;
471
+ }
472
+
473
+ // Bordered variant - wraps entire tabs system in card-like border
474
+ &--bordered {
475
+ border: $border-width-base solid var(--pa-border-color);
476
+ border-radius: $border-radius-lg;
477
+ padding: $card-body-padding-v $card-body-padding-h;
478
+ background-color: var(--pa-card-bg);
479
+ margin-bottom: $spacing-base; // Match pa-card margin
480
+
481
+ // Add divider between tabs and content (gap already provides spacing)
482
+ .pa-tabs--vertical {
483
+ border-right: $border-width-base solid var(--pa-border-color);
484
+
485
+ // Make tab items full width so active border reaches divider
486
+ .pa-tabs__item {
487
+ width: 100%;
488
+ }
489
+ }
490
+ }
491
+ }
492
+
493
+ }