@keenmate/pure-admin-core 2.3.1 → 2.3.2

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 (69) hide show
  1. package/README.md +5 -5
  2. package/dist/css/main.css +187 -178
  3. package/package.json +1 -1
  4. package/snippets/buttons.html +375 -365
  5. package/src/scss/_base-css-variables.scss +8 -0
  6. package/src/scss/_core.scss +121 -121
  7. package/src/scss/core-components/_alerts.scss +227 -227
  8. package/src/scss/core-components/_badges.scss +16 -16
  9. package/src/scss/core-components/_base.scss +125 -125
  10. package/src/scss/core-components/_buttons.scss +31 -16
  11. package/src/scss/core-components/_callouts.scss +152 -152
  12. package/src/scss/core-components/_cards.scss +488 -488
  13. package/src/scss/core-components/_checkbox-lists.scss +289 -289
  14. package/src/scss/core-components/_code.scss +141 -141
  15. package/src/scss/core-components/_command-palette.scss +509 -509
  16. package/src/scss/core-components/_comparison.scss +172 -172
  17. package/src/scss/core-components/_data-display.scss +9 -9
  18. package/src/scss/core-components/_data-viz.scss +9 -9
  19. package/src/scss/core-components/_detail-panel.scss +1 -1
  20. package/src/scss/core-components/_file-selector.scss +780 -780
  21. package/src/scss/core-components/_filter-card.scss +58 -58
  22. package/src/scss/core-components/_forms.scss +16 -16
  23. package/src/scss/core-components/_grid.scss +293 -293
  24. package/src/scss/core-components/_layout.scss +15 -15
  25. package/src/scss/core-components/_lists.scss +211 -211
  26. package/src/scss/core-components/_loaders.scss +277 -277
  27. package/src/scss/core-components/_logic-tree.scss +280 -280
  28. package/src/scss/core-components/_modals.scss +203 -203
  29. package/src/scss/core-components/_notifications.scss +320 -320
  30. package/src/scss/core-components/_pagers.scss +141 -141
  31. package/src/scss/core-components/_popconfirm.scss +170 -170
  32. package/src/scss/core-components/_profile.scss +405 -405
  33. package/src/scss/core-components/_scrollbars.scss +40 -40
  34. package/src/scss/core-components/_settings-panel.scss +141 -141
  35. package/src/scss/core-components/_statistics.scss +200 -201
  36. package/src/scss/core-components/_tables.scss +900 -900
  37. package/src/scss/core-components/_tabs.scss +504 -504
  38. package/src/scss/core-components/_timeline.scss +589 -589
  39. package/src/scss/core-components/_toasts.scss +425 -425
  40. package/src/scss/core-components/_tooltips.scss +605 -605
  41. package/src/scss/core-components/_utilities.scss +1 -1
  42. package/src/scss/core-components/_web-components-theme.scss +21 -21
  43. package/src/scss/core-components/badges/_badge-base.scss +121 -121
  44. package/src/scss/core-components/badges/_badge-group.scss +25 -25
  45. package/src/scss/core-components/badges/_composite-badge-variants.scss +396 -396
  46. package/src/scss/core-components/badges/_composite-badge.scss +70 -70
  47. package/src/scss/core-components/badges/_index.scss +10 -10
  48. package/src/scss/core-components/badges/_labels.scss +155 -155
  49. package/src/scss/core-components/forms/_checkboxes-radios.scss +205 -205
  50. package/src/scss/core-components/forms/_form-inputs.scss +3 -3
  51. package/src/scss/core-components/forms/_form-layout.scss +66 -66
  52. package/src/scss/core-components/forms/_form-states.scss +115 -115
  53. package/src/scss/core-components/forms/_index.scss +12 -12
  54. package/src/scss/core-components/forms/_input-groups.scss +154 -154
  55. package/src/scss/core-components/forms/_input-wrapper.scss +89 -89
  56. package/src/scss/core-components/forms/_query-editor.scss +313 -313
  57. package/src/scss/core-components/layout/_index.scss +11 -11
  58. package/src/scss/core-components/layout/_layout-container.scss +168 -168
  59. package/src/scss/core-components/layout/_layout-responsive.scss +99 -99
  60. package/src/scss/core-components/layout/_navbar-elements.scss +250 -250
  61. package/src/scss/core-components/layout/_navbar.scss +83 -83
  62. package/src/scss/core-components/layout/_sidebar-states.scss +237 -237
  63. package/src/scss/core-components/layout/_sidebar.scss +234 -234
  64. package/src/scss/main.scss +7 -7
  65. package/src/scss/utilities.scss +740 -740
  66. package/src/scss/variables/_base.scss +228 -228
  67. package/src/scss/variables/_components.scss +748 -748
  68. package/src/scss/variables/_layout.scss +65 -65
  69. 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
+ }