@keenmate/pure-admin-core 2.3.1 → 2.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/README.md +30 -9
  2. package/dist/css/main.css +205 -190
  3. package/package.json +1 -1
  4. package/snippets/buttons.html +375 -365
  5. package/snippets/command-palette.html +15 -13
  6. package/src/scss/_base-css-variables.scss +10 -0
  7. package/src/scss/_core.scss +121 -121
  8. package/src/scss/core-components/_alerts.scss +227 -227
  9. package/src/scss/core-components/_badges.scss +16 -16
  10. package/src/scss/core-components/_base.scss +125 -125
  11. package/src/scss/core-components/_buttons.scss +31 -16
  12. package/src/scss/core-components/_callouts.scss +152 -152
  13. package/src/scss/core-components/_cards.scss +488 -488
  14. package/src/scss/core-components/_checkbox-lists.scss +289 -289
  15. package/src/scss/core-components/_code.scss +141 -141
  16. package/src/scss/core-components/_command-palette.scss +518 -509
  17. package/src/scss/core-components/_comparison.scss +172 -172
  18. package/src/scss/core-components/_data-display.scss +9 -9
  19. package/src/scss/core-components/_data-viz.scss +9 -9
  20. package/src/scss/core-components/_detail-panel.scss +1 -1
  21. package/src/scss/core-components/_file-selector.scss +780 -780
  22. package/src/scss/core-components/_filter-card.scss +58 -58
  23. package/src/scss/core-components/_forms.scss +16 -16
  24. package/src/scss/core-components/_grid.scss +293 -293
  25. package/src/scss/core-components/_layout.scss +15 -15
  26. package/src/scss/core-components/_lists.scss +211 -211
  27. package/src/scss/core-components/_loaders.scss +277 -277
  28. package/src/scss/core-components/_logic-tree.scss +280 -280
  29. package/src/scss/core-components/_modals.scss +203 -203
  30. package/src/scss/core-components/_notifications.scss +320 -320
  31. package/src/scss/core-components/_pagers.scss +141 -141
  32. package/src/scss/core-components/_popconfirm.scss +170 -170
  33. package/src/scss/core-components/_profile.scss +405 -405
  34. package/src/scss/core-components/_scrollbars.scss +40 -40
  35. package/src/scss/core-components/_settings-panel.scss +141 -141
  36. package/src/scss/core-components/_statistics.scss +200 -201
  37. package/src/scss/core-components/_tables.scss +900 -900
  38. package/src/scss/core-components/_tabs.scss +504 -504
  39. package/src/scss/core-components/_timeline.scss +589 -589
  40. package/src/scss/core-components/_toasts.scss +425 -425
  41. package/src/scss/core-components/_tooltips.scss +605 -605
  42. package/src/scss/core-components/_utilities.scss +1 -1
  43. package/src/scss/core-components/_web-components-theme.scss +21 -21
  44. package/src/scss/core-components/badges/_badge-base.scss +121 -121
  45. package/src/scss/core-components/badges/_badge-group.scss +25 -25
  46. package/src/scss/core-components/badges/_composite-badge-variants.scss +396 -396
  47. package/src/scss/core-components/badges/_composite-badge.scss +70 -70
  48. package/src/scss/core-components/badges/_index.scss +10 -10
  49. package/src/scss/core-components/badges/_labels.scss +155 -155
  50. package/src/scss/core-components/forms/_checkboxes-radios.scss +205 -205
  51. package/src/scss/core-components/forms/_form-inputs.scss +3 -3
  52. package/src/scss/core-components/forms/_form-layout.scss +66 -66
  53. package/src/scss/core-components/forms/_form-states.scss +115 -115
  54. package/src/scss/core-components/forms/_index.scss +12 -12
  55. package/src/scss/core-components/forms/_input-groups.scss +154 -154
  56. package/src/scss/core-components/forms/_input-wrapper.scss +89 -89
  57. package/src/scss/core-components/forms/_query-editor.scss +313 -313
  58. package/src/scss/core-components/layout/_index.scss +11 -11
  59. package/src/scss/core-components/layout/_layout-container.scss +168 -168
  60. package/src/scss/core-components/layout/_layout-responsive.scss +99 -99
  61. package/src/scss/core-components/layout/_navbar-elements.scss +250 -250
  62. package/src/scss/core-components/layout/_navbar.scss +83 -83
  63. package/src/scss/core-components/layout/_sidebar-states.scss +237 -237
  64. package/src/scss/core-components/layout/_sidebar.scss +234 -234
  65. package/src/scss/main.scss +7 -7
  66. package/src/scss/utilities.scss +740 -740
  67. package/src/scss/variables/_base.scss +228 -228
  68. package/src/scss/variables/_components.scss +748 -748
  69. package/src/scss/variables/_layout.scss +65 -65
  70. package/src/scss/variables/_typography.scss +37 -37
@@ -1,504 +1,504 @@
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-inline-end: $border-width-base solid var(--pa-border-color); // RTL: flips to border-left
123
- gap: 0;
124
- margin-bottom: 0;
125
- padding-inline-end: 0; // RTL: flips to padding-left
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-inline-end: $border-width-medium solid transparent; // RTL: flips to border-left
133
- padding: $spacing-sm;
134
- border-start-start-radius: $border-radius; // RTL: top-right in RTL
135
- border-end-start-radius: $border-radius; // RTL: bottom-right in RTL
136
- border-start-end-radius: 0;
137
- border-end-end-radius: 0;
138
- gap: $tabs-vertical-item-gap;
139
- white-space: nowrap;
140
- min-height: 4rem; // Default height for vertical tabs
141
-
142
- &:hover {
143
- background-color: rgba($accent-color, $tabs-vertical-hover-opacity);
144
- }
145
-
146
- &--active {
147
- border-inline-end-color: $accent-color; // RTL: flips to border-left-color
148
- background-color: rgba($accent-color, $tabs-vertical-active-opacity);
149
- }
150
-
151
- // Icon with fixed width (follows sidebar pattern)
152
- i {
153
- width: $tabs-vertical-icon-size;
154
- min-width: $tabs-vertical-icon-size;
155
- display: flex;
156
- align-items: center;
157
- justify-content: center;
158
- flex-shrink: 0;
159
- }
160
-
161
- // Text with ellipsis overflow (follows sidebar pattern)
162
- span {
163
- overflow: hidden;
164
- text-overflow: ellipsis;
165
- white-space: nowrap;
166
- }
167
- }
168
- }
169
-
170
- // Centered tabs
171
- &--centered {
172
- justify-content: center;
173
-
174
- // For vertical tabs, center the content within each item
175
- &.pa-tabs--vertical {
176
- .pa-tabs__item {
177
- display: flex !important;
178
- justify-content: center;
179
- align-items: center;
180
- }
181
- }
182
- }
183
-
184
- // No-wrap tabs - prevent wrapping (opt-out of default behavior)
185
- &--nowrap {
186
- flex-wrap: nowrap;
187
- }
188
-
189
- // Scrollable tabs - horizontal scroll with arrow navigation
190
- &--scrollable {
191
- position: relative;
192
- overflow: hidden;
193
- flex-wrap: nowrap; // Force no-wrap for scrolling to work
194
-
195
- // Inner scrollable container
196
- .pa-tabs__scroll-container {
197
- display: flex;
198
- overflow-x: auto;
199
- scroll-behavior: smooth;
200
- scrollbar-width: none; // Firefox
201
- gap: $spacing-sm;
202
-
203
- &::-webkit-scrollbar {
204
- display: none; // Chrome, Safari
205
- }
206
- }
207
-
208
- // Scroll arrows
209
- .pa-tabs__scroll-btn {
210
- position: absolute;
211
- top: 0;
212
- bottom: 0;
213
- width: $tabs-scroll-btn-width;
214
- border: none;
215
- background: linear-gradient(to right, color-mix(in srgb, var(--pa-main-bg) 95%, transparent), transparent);
216
- color: var(--pa-text-color-1);
217
- cursor: pointer;
218
- z-index: 1;
219
- display: flex;
220
- align-items: center;
221
- justify-content: center;
222
- transition: opacity $transition-fast;
223
- opacity: 0;
224
- pointer-events: none;
225
-
226
- &:hover {
227
- background: linear-gradient(to right, var(--pa-main-bg), color-mix(in srgb, var(--pa-main-bg) 80%, transparent));
228
- }
229
-
230
- &--start {
231
- inset-inline-start: 0; // RTL: flips to right
232
- background: linear-gradient(to right, color-mix(in srgb, var(--pa-main-bg) 95%, transparent), transparent);
233
-
234
- [dir="rtl"] & {
235
- background: linear-gradient(to left, color-mix(in srgb, var(--pa-main-bg) 95%, transparent), transparent);
236
- }
237
- }
238
-
239
- &--end {
240
- inset-inline-end: 0; // RTL: flips to left
241
- background: linear-gradient(to left, color-mix(in srgb, var(--pa-main-bg) 95%, transparent), transparent);
242
-
243
- [dir="rtl"] & {
244
- background: linear-gradient(to right, color-mix(in srgb, var(--pa-main-bg) 95%, transparent), transparent);
245
- }
246
- }
247
-
248
- &--visible {
249
- opacity: 1;
250
- pointer-events: auto;
251
- }
252
-
253
- i {
254
- font-size: $font-size-lg;
255
- }
256
- }
257
- }
258
-
259
- // Collapse tabs - show only icons when constrained, active tab shows full title
260
- &--collapse {
261
- flex-wrap: nowrap; // Don't wrap collapsed tabs
262
-
263
- // Hide text spans by default (only show icons)
264
- .pa-tabs__item {
265
- span {
266
- display: none;
267
- }
268
-
269
- // Active tab shows both icon and text
270
- &--active {
271
- span {
272
- display: inline;
273
- }
274
- }
275
-
276
- // Tooltips on collapsed tabs
277
- position: relative;
278
- }
279
- }
280
-
281
- // Full width tabs
282
- &--full {
283
- .pa-tabs__item {
284
- flex: 1;
285
- justify-content: center;
286
- }
287
- }
288
-
289
- // Border top variant - active indicator on top instead of bottom
290
- &--border-top {
291
- border-bottom: none;
292
- border-top: $border-width-base solid var(--pa-border-color);
293
-
294
- .pa-tabs__item {
295
- border-bottom: none;
296
- border-top: $border-width-medium solid transparent;
297
-
298
- &--active {
299
- border-top-color: $accent-color;
300
- border-bottom-color: transparent;
301
- }
302
- }
303
- }
304
-
305
- // Size variants
306
- &--sm {
307
- .pa-tabs__item {
308
- padding: $btn-padding-sm-v $btn-padding-sm-h;
309
- font-size: $font-size-xs;
310
-
311
- i {
312
- font-size: $font-size-xs;
313
- }
314
- }
315
- }
316
-
317
- &--lg {
318
- .pa-tabs__item {
319
- padding: $btn-padding-lg-v $btn-padding-lg-h;
320
- font-size: $font-size-lg;
321
-
322
- i {
323
- font-size: $font-size-lg;
324
- }
325
- }
326
- }
327
-
328
- // Horizontal tabs container (for wrapping tabs + content)
329
- &__container {
330
- // Bordered variant - wraps entire tabs system in card-like border
331
- &--bordered {
332
- border: $border-width-base solid var(--pa-border-color);
333
- border-radius: $border-radius-lg;
334
- padding: $card-body-padding-v $card-body-padding-h;
335
- background-color: var(--pa-card-bg);
336
- margin-bottom: $spacing-base; // Match pa-card margin
337
-
338
- // Remove bottom border from tabs since wrapper has border
339
- .pa-tabs {
340
- border-bottom: none;
341
- padding-bottom: $spacing-md;
342
- margin-bottom: 0;
343
- border-bottom: $border-width-base solid var(--pa-border-color); // Divider between tabs and content
344
- }
345
-
346
- // Remove top padding from content since wrapper provides spacing
347
- .pa-tabs__content {
348
- padding-top: $spacing-md;
349
- }
350
- }
351
-
352
- // Card variant - tabs act as card header (same height as pa-card__header)
353
- &--card {
354
- position: relative; // For dropdown positioning
355
- border: $card-border-width solid var(--pa-border-color);
356
- border-radius: $card-border-radius;
357
- background-color: var(--pa-card-bg);
358
- box-shadow: $shadow-sm;
359
- margin-bottom: $spacing-base; // Match pa-card margin
360
-
361
- .pa-tabs {
362
- height: $card-header-min-height;
363
- padding: $card-header-padding-v $card-header-padding-h;
364
- background: var(--pa-card-header-bg);
365
- border-bottom: $border-width-base solid var(--pa-border-color);
366
- box-sizing: border-box;
367
- border-top-left-radius: $card-border-radius;
368
- border-top-right-radius: $card-border-radius;
369
- margin-bottom: 0;
370
- align-items: center;
371
- gap: $spacing-xs;
372
- flex-wrap: nowrap;
373
- overflow: visible; // Allow dropdown to overflow
374
- }
375
-
376
- .pa-tabs__content {
377
- padding: $card-body-padding-v $card-body-padding-h;
378
- }
379
-
380
- .pa-tabs__panel {
381
- padding-top: 0;
382
- }
383
-
384
- // Overflow toggle for tabs that don't fit
385
- .pa-tabs__overflow {
386
- position: relative;
387
- margin-inline-start: auto; // RTL: flips to margin-right
388
- flex-shrink: 0;
389
- }
390
-
391
- .pa-tabs__overflow-toggle {
392
- position: relative;
393
- display: flex;
394
- align-items: center;
395
- justify-content: center;
396
- width: $card-header-min-height;
397
- height: 100%;
398
- padding: 0;
399
- border: none;
400
- background: transparent;
401
- color: var(--pa-text-color-2);
402
- cursor: pointer;
403
- transition: all $transition-fast $easing-snappy;
404
- border-inline-start: $border-width-base solid var(--pa-border-color); // RTL: flips to border-right
405
- margin: (-$card-header-padding-v) (-$card-header-padding-h) (-$card-header-padding-v) 0;
406
- box-sizing: content-box;
407
- height: $card-header-min-height;
408
-
409
- &:hover {
410
- background-color: rgba($accent-color, $card-tab-hover-opacity);
411
- color: var(--pa-text-color-1);
412
- }
413
-
414
- // When overflow contains the active tab
415
- &--has-active {
416
- color: var(--pa-accent);
417
-
418
- &::after {
419
- content: '';
420
- position: absolute;
421
- bottom: 0;
422
- left: 0;
423
- right: 0;
424
- height: $border-width-medium;
425
- background: var(--pa-accent);
426
- }
427
- }
428
-
429
- i {
430
- font-size: $font-size-sm;
431
- }
432
- }
433
-
434
- .pa-tabs__overflow-menu {
435
- position: absolute;
436
- top: $card-header-min-height;
437
- inset-inline-end: 0; // RTL: flips to left
438
- min-width: 15rem;
439
- background: var(--pa-card-bg);
440
- border: $card-border-width solid var(--pa-border-color);
441
- border-radius: $border-radius;
442
- box-shadow: $shadow-lg;
443
- z-index: $z-index-dropdown;
444
- display: none;
445
- flex-direction: column;
446
- padding: $spacing-xs 0;
447
-
448
- &--open {
449
- display: flex;
450
- }
451
-
452
- .pa-tabs__item {
453
- padding: $spacing-sm $spacing-base;
454
- border: none;
455
- border-bottom: none;
456
- border-radius: 0;
457
- text-align: start; // RTL: flips to right
458
- white-space: nowrap;
459
-
460
- &:hover {
461
- background-color: rgba($accent-color, $card-tab-hover-opacity);
462
- }
463
-
464
- &--active {
465
- background-color: rgba($accent-color, 0.1);
466
- border-bottom: none;
467
- }
468
- }
469
- }
470
- }
471
- }
472
-
473
- // Vertical tabs layout wrapper (for proper spacing with content)
474
- &__vertical-layout {
475
- display: flex;
476
- gap: $spacing-base;
477
- align-items: flex-start;
478
-
479
- // All panels in vertical layout should have no top padding (aligned horizontally with tabs)
480
- .pa-tabs__content .pa-tabs__panel {
481
- padding-top: 0;
482
- }
483
-
484
- // Bordered variant - wraps entire tabs system in card-like border
485
- &--bordered {
486
- border: $border-width-base solid var(--pa-border-color);
487
- border-radius: $border-radius-lg;
488
- padding: $card-body-padding-v $card-body-padding-h;
489
- background-color: var(--pa-card-bg);
490
- margin-bottom: $spacing-base; // Match pa-card margin
491
-
492
- // Add divider between tabs and content (gap already provides spacing)
493
- .pa-tabs--vertical {
494
- border-inline-end: $border-width-base solid var(--pa-border-color); // RTL: flips to border-left
495
-
496
- // Make tab items full width so active border reaches divider
497
- .pa-tabs__item {
498
- width: 100%;
499
- }
500
- }
501
- }
502
- }
503
-
504
- }
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: var(--pa-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: var(--pa-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: var(--pa-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-inline-end: $border-width-base solid var(--pa-border-color); // RTL: flips to border-left
123
+ gap: 0;
124
+ margin-bottom: 0;
125
+ padding-inline-end: 0; // RTL: flips to padding-left
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-inline-end: $border-width-medium solid transparent; // RTL: flips to border-left
133
+ padding: $spacing-sm;
134
+ border-start-start-radius: var(--pa-border-radius); // RTL: top-right in RTL
135
+ border-end-start-radius: var(--pa-border-radius); // RTL: bottom-right in RTL
136
+ border-start-end-radius: 0;
137
+ border-end-end-radius: 0;
138
+ gap: $tabs-vertical-item-gap;
139
+ white-space: nowrap;
140
+ min-height: 4rem; // Default height for vertical tabs
141
+
142
+ &:hover {
143
+ background-color: rgba($accent-color, $tabs-vertical-hover-opacity);
144
+ }
145
+
146
+ &--active {
147
+ border-inline-end-color: $accent-color; // RTL: flips to border-left-color
148
+ background-color: rgba($accent-color, $tabs-vertical-active-opacity);
149
+ }
150
+
151
+ // Icon with fixed width (follows sidebar pattern)
152
+ i {
153
+ width: $tabs-vertical-icon-size;
154
+ min-width: $tabs-vertical-icon-size;
155
+ display: flex;
156
+ align-items: center;
157
+ justify-content: center;
158
+ flex-shrink: 0;
159
+ }
160
+
161
+ // Text with ellipsis overflow (follows sidebar pattern)
162
+ span {
163
+ overflow: hidden;
164
+ text-overflow: ellipsis;
165
+ white-space: nowrap;
166
+ }
167
+ }
168
+ }
169
+
170
+ // Centered tabs
171
+ &--centered {
172
+ justify-content: center;
173
+
174
+ // For vertical tabs, center the content within each item
175
+ &.pa-tabs--vertical {
176
+ .pa-tabs__item {
177
+ display: flex !important;
178
+ justify-content: center;
179
+ align-items: center;
180
+ }
181
+ }
182
+ }
183
+
184
+ // No-wrap tabs - prevent wrapping (opt-out of default behavior)
185
+ &--nowrap {
186
+ flex-wrap: nowrap;
187
+ }
188
+
189
+ // Scrollable tabs - horizontal scroll with arrow navigation
190
+ &--scrollable {
191
+ position: relative;
192
+ overflow: hidden;
193
+ flex-wrap: nowrap; // Force no-wrap for scrolling to work
194
+
195
+ // Inner scrollable container
196
+ .pa-tabs__scroll-container {
197
+ display: flex;
198
+ overflow-x: auto;
199
+ scroll-behavior: smooth;
200
+ scrollbar-width: none; // Firefox
201
+ gap: $spacing-sm;
202
+
203
+ &::-webkit-scrollbar {
204
+ display: none; // Chrome, Safari
205
+ }
206
+ }
207
+
208
+ // Scroll arrows
209
+ .pa-tabs__scroll-btn {
210
+ position: absolute;
211
+ top: 0;
212
+ bottom: 0;
213
+ width: $tabs-scroll-btn-width;
214
+ border: none;
215
+ background: linear-gradient(to right, color-mix(in srgb, var(--pa-main-bg) 95%, transparent), transparent);
216
+ color: var(--pa-text-color-1);
217
+ cursor: pointer;
218
+ z-index: 1;
219
+ display: flex;
220
+ align-items: center;
221
+ justify-content: center;
222
+ transition: opacity $transition-fast;
223
+ opacity: 0;
224
+ pointer-events: none;
225
+
226
+ &:hover {
227
+ background: linear-gradient(to right, var(--pa-main-bg), color-mix(in srgb, var(--pa-main-bg) 80%, transparent));
228
+ }
229
+
230
+ &--start {
231
+ inset-inline-start: 0; // RTL: flips to right
232
+ background: linear-gradient(to right, color-mix(in srgb, var(--pa-main-bg) 95%, transparent), transparent);
233
+
234
+ [dir="rtl"] & {
235
+ background: linear-gradient(to left, color-mix(in srgb, var(--pa-main-bg) 95%, transparent), transparent);
236
+ }
237
+ }
238
+
239
+ &--end {
240
+ inset-inline-end: 0; // RTL: flips to left
241
+ background: linear-gradient(to left, color-mix(in srgb, var(--pa-main-bg) 95%, transparent), transparent);
242
+
243
+ [dir="rtl"] & {
244
+ background: linear-gradient(to right, color-mix(in srgb, var(--pa-main-bg) 95%, transparent), transparent);
245
+ }
246
+ }
247
+
248
+ &--visible {
249
+ opacity: 1;
250
+ pointer-events: auto;
251
+ }
252
+
253
+ i {
254
+ font-size: $font-size-lg;
255
+ }
256
+ }
257
+ }
258
+
259
+ // Collapse tabs - show only icons when constrained, active tab shows full title
260
+ &--collapse {
261
+ flex-wrap: nowrap; // Don't wrap collapsed tabs
262
+
263
+ // Hide text spans by default (only show icons)
264
+ .pa-tabs__item {
265
+ span {
266
+ display: none;
267
+ }
268
+
269
+ // Active tab shows both icon and text
270
+ &--active {
271
+ span {
272
+ display: inline;
273
+ }
274
+ }
275
+
276
+ // Tooltips on collapsed tabs
277
+ position: relative;
278
+ }
279
+ }
280
+
281
+ // Full width tabs
282
+ &--full {
283
+ .pa-tabs__item {
284
+ flex: 1;
285
+ justify-content: center;
286
+ }
287
+ }
288
+
289
+ // Border top variant - active indicator on top instead of bottom
290
+ &--border-top {
291
+ border-bottom: none;
292
+ border-top: $border-width-base solid var(--pa-border-color);
293
+
294
+ .pa-tabs__item {
295
+ border-bottom: none;
296
+ border-top: $border-width-medium solid transparent;
297
+
298
+ &--active {
299
+ border-top-color: $accent-color;
300
+ border-bottom-color: transparent;
301
+ }
302
+ }
303
+ }
304
+
305
+ // Size variants
306
+ &--sm {
307
+ .pa-tabs__item {
308
+ padding: $btn-padding-sm-v $btn-padding-sm-h;
309
+ font-size: $font-size-xs;
310
+
311
+ i {
312
+ font-size: $font-size-xs;
313
+ }
314
+ }
315
+ }
316
+
317
+ &--lg {
318
+ .pa-tabs__item {
319
+ padding: $btn-padding-lg-v $btn-padding-lg-h;
320
+ font-size: $font-size-lg;
321
+
322
+ i {
323
+ font-size: $font-size-lg;
324
+ }
325
+ }
326
+ }
327
+
328
+ // Horizontal tabs container (for wrapping tabs + content)
329
+ &__container {
330
+ // Bordered variant - wraps entire tabs system in card-like border
331
+ &--bordered {
332
+ border: $border-width-base solid var(--pa-border-color);
333
+ border-radius: var(--pa-border-radius-lg);
334
+ padding: $card-body-padding-v $card-body-padding-h;
335
+ background-color: var(--pa-card-bg);
336
+ margin-bottom: $spacing-base; // Match pa-card margin
337
+
338
+ // Remove bottom border from tabs since wrapper has border
339
+ .pa-tabs {
340
+ border-bottom: none;
341
+ padding-bottom: $spacing-md;
342
+ margin-bottom: 0;
343
+ border-bottom: $border-width-base solid var(--pa-border-color); // Divider between tabs and content
344
+ }
345
+
346
+ // Remove top padding from content since wrapper provides spacing
347
+ .pa-tabs__content {
348
+ padding-top: $spacing-md;
349
+ }
350
+ }
351
+
352
+ // Card variant - tabs act as card header (same height as pa-card__header)
353
+ &--card {
354
+ position: relative; // For dropdown positioning
355
+ border: $card-border-width solid var(--pa-border-color);
356
+ border-radius: var(--pa-border-radius-lg);
357
+ background-color: var(--pa-card-bg);
358
+ box-shadow: $shadow-sm;
359
+ margin-bottom: $spacing-base; // Match pa-card margin
360
+
361
+ .pa-tabs {
362
+ height: $card-header-min-height;
363
+ padding: $card-header-padding-v $card-header-padding-h;
364
+ background: var(--pa-card-header-bg);
365
+ border-bottom: $border-width-base solid var(--pa-border-color);
366
+ box-sizing: border-box;
367
+ border-top-left-radius: $card-border-radius;
368
+ border-top-right-radius: $card-border-radius;
369
+ margin-bottom: 0;
370
+ align-items: center;
371
+ gap: $spacing-xs;
372
+ flex-wrap: nowrap;
373
+ overflow: visible; // Allow dropdown to overflow
374
+ }
375
+
376
+ .pa-tabs__content {
377
+ padding: $card-body-padding-v $card-body-padding-h;
378
+ }
379
+
380
+ .pa-tabs__panel {
381
+ padding-top: 0;
382
+ }
383
+
384
+ // Overflow toggle for tabs that don't fit
385
+ .pa-tabs__overflow {
386
+ position: relative;
387
+ margin-inline-start: auto; // RTL: flips to margin-right
388
+ flex-shrink: 0;
389
+ }
390
+
391
+ .pa-tabs__overflow-toggle {
392
+ position: relative;
393
+ display: flex;
394
+ align-items: center;
395
+ justify-content: center;
396
+ width: $card-header-min-height;
397
+ height: 100%;
398
+ padding: 0;
399
+ border: none;
400
+ background: transparent;
401
+ color: var(--pa-text-color-2);
402
+ cursor: pointer;
403
+ transition: all $transition-fast $easing-snappy;
404
+ border-inline-start: $border-width-base solid var(--pa-border-color); // RTL: flips to border-right
405
+ margin: (-$card-header-padding-v) (-$card-header-padding-h) (-$card-header-padding-v) 0;
406
+ box-sizing: content-box;
407
+ height: $card-header-min-height;
408
+
409
+ &:hover {
410
+ background-color: rgba($accent-color, $card-tab-hover-opacity);
411
+ color: var(--pa-text-color-1);
412
+ }
413
+
414
+ // When overflow contains the active tab
415
+ &--has-active {
416
+ color: var(--pa-accent);
417
+
418
+ &::after {
419
+ content: '';
420
+ position: absolute;
421
+ bottom: 0;
422
+ left: 0;
423
+ right: 0;
424
+ height: $border-width-medium;
425
+ background: var(--pa-accent);
426
+ }
427
+ }
428
+
429
+ i {
430
+ font-size: $font-size-sm;
431
+ }
432
+ }
433
+
434
+ .pa-tabs__overflow-menu {
435
+ position: absolute;
436
+ top: $card-header-min-height;
437
+ inset-inline-end: 0; // RTL: flips to left
438
+ min-width: 15rem;
439
+ background: var(--pa-card-bg);
440
+ border: $card-border-width solid var(--pa-border-color);
441
+ border-radius: var(--pa-border-radius);
442
+ box-shadow: $shadow-lg;
443
+ z-index: $z-index-dropdown;
444
+ display: none;
445
+ flex-direction: column;
446
+ padding: $spacing-xs 0;
447
+
448
+ &--open {
449
+ display: flex;
450
+ }
451
+
452
+ .pa-tabs__item {
453
+ padding: $spacing-sm $spacing-base;
454
+ border: none;
455
+ border-bottom: none;
456
+ border-radius: 0;
457
+ text-align: start; // RTL: flips to right
458
+ white-space: nowrap;
459
+
460
+ &:hover {
461
+ background-color: rgba($accent-color, $card-tab-hover-opacity);
462
+ }
463
+
464
+ &--active {
465
+ background-color: rgba($accent-color, 0.1);
466
+ border-bottom: none;
467
+ }
468
+ }
469
+ }
470
+ }
471
+ }
472
+
473
+ // Vertical tabs layout wrapper (for proper spacing with content)
474
+ &__vertical-layout {
475
+ display: flex;
476
+ gap: $spacing-base;
477
+ align-items: flex-start;
478
+
479
+ // All panels in vertical layout should have no top padding (aligned horizontally with tabs)
480
+ .pa-tabs__content .pa-tabs__panel {
481
+ padding-top: 0;
482
+ }
483
+
484
+ // Bordered variant - wraps entire tabs system in card-like border
485
+ &--bordered {
486
+ border: $border-width-base solid var(--pa-border-color);
487
+ border-radius: var(--pa-border-radius-lg);
488
+ padding: $card-body-padding-v $card-body-padding-h;
489
+ background-color: var(--pa-card-bg);
490
+ margin-bottom: $spacing-base; // Match pa-card margin
491
+
492
+ // Add divider between tabs and content (gap already provides spacing)
493
+ .pa-tabs--vertical {
494
+ border-inline-end: $border-width-base solid var(--pa-border-color); // RTL: flips to border-left
495
+
496
+ // Make tab items full width so active border reaches divider
497
+ .pa-tabs__item {
498
+ width: 100%;
499
+ }
500
+ }
501
+ }
502
+ }
503
+
504
+ }