@keenmate/pure-admin-core 2.0.2 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/README.md +65 -9
  2. package/dist/css/main.css +309 -83
  3. package/package.json +6 -4
  4. package/scripts/download-themes.js +268 -0
  5. package/scripts/pack-theme.js +2 -2
  6. package/snippets/badges.html +4 -4
  7. package/snippets/buttons.html +64 -0
  8. package/snippets/tooltips.html +36 -36
  9. package/src/scss/_core.scss +3 -0
  10. package/src/scss/core-components/_buttons.scss +97 -0
  11. package/src/scss/core-components/_cards.scss +13 -3
  12. package/src/scss/core-components/_data-display.scss +35 -2
  13. package/src/scss/core-components/_filter-card.scss +58 -0
  14. package/src/scss/core-components/_tables.scss +4 -0
  15. package/src/scss/core-components/_timeline.scss +2 -2
  16. package/src/scss/core-components/_tooltips.scss +110 -54
  17. package/src/scss/core-components/badges/_badge-base.scss +14 -3
  18. package/dist/fonts/google/3y976aknfjLm_3lMKjiMgmUUYBs04Y8UH-qVHQ.woff2 +0 -0
  19. package/dist/fonts/google/3y976aknfjLm_3lMKjiMgmUUYBs04Y8UH-qVHQ.woff2.1 +0 -0
  20. package/dist/fonts/google/3y976aknfjLm_3lMKjiMgmUUYBs04Y8UH-qVHQ.woff2.2 +0 -0
  21. package/dist/fonts/google/3y976aknfjLm_3lMKjiMgmUUYBs04Y8VH-qVHQ.woff2 +0 -0
  22. package/dist/fonts/google/3y976aknfjLm_3lMKjiMgmUUYBs04Y8VH-qVHQ.woff2.1 +0 -0
  23. package/dist/fonts/google/3y976aknfjLm_3lMKjiMgmUUYBs04Y8VH-qVHQ.woff2.2 +0 -0
  24. package/dist/fonts/google/3y976aknfjLm_3lMKjiMgmUUYBs04Y8bH-o.woff2 +0 -0
  25. package/dist/fonts/google/3y976aknfjLm_3lMKjiMgmUUYBs04Y8bH-o.woff2.1 +0 -0
  26. package/dist/fonts/google/3y976aknfjLm_3lMKjiMgmUUYBs04Y8fH-qVHQ.woff2 +0 -0
  27. package/dist/fonts/google/3y976aknfjLm_3lMKjiMgmUUYBs04Y8fH-qVHQ.woff2.1 +0 -0
  28. package/dist/fonts/google/3y976aknfjLm_3lMKjiMgmUUYBs04Y8fH-qVHQ.woff2.2 +0 -0
  29. package/dist/fonts/google/6aez4K2oVqwIvtE2H68T.woff2 +0 -0
  30. package/dist/fonts/google/6aez4K2oVqwIvtU2Hw.woff2 +0 -0
  31. package/dist/fonts/google/6aez4K2oVqwIvtY2H68T.woff2 +0 -0
  32. package/dist/fonts/google/6aez4K2oVqwIvtg2H68T.woff2 +0 -0
  33. package/dist/fonts/google/6aez4K2oVqwIvto2H68T.woff2 +0 -0
  34. package/dist/fonts/google/6aez4K2oVqwIvts2H68T.woff2 +0 -0
  35. package/dist/fonts/google/7Auup_AqnyWWAxW2Wk3swUz56MS91Eww8SX21nejog.woff2 +0 -0
  36. package/dist/fonts/google/7Auup_AqnyWWAxW2Wk3swUz56MS91Eww8SX21nijogp5.woff2 +0 -0
  37. package/dist/fonts/google/7Auup_AqnyWWAxW2Wk3swUz56MS91Eww8SX21nmjogp5.woff2 +0 -0
  38. package/dist/fonts/google/PN_xRfK9oXHga0XdZ8g_vT0.woff2 +0 -0
  39. package/dist/fonts/google/PN_xRfK9oXHga0XdZsg_.woff2 +0 -0
  40. package/dist/fonts/google/PN_xRfK9oXHga0XdaMg_vT0.woff2 +0 -0
  41. package/dist/fonts/google/TK3tWkYFABsmjsphPho.woff2 +0 -0
  42. package/dist/fonts/google/TK3tWkYFABsmjspuPho7vA.woff2 +0 -0
  43. package/dist/fonts/google/TK3tWkYFABsmjspvPho7vA.woff2 +0 -0
  44. package/dist/fonts/google/dg45_pLmvrkcOkBnKsOzXyGWTBcmg-X6VjTYJwQj.woff2 +0 -0
  45. package/dist/fonts/google/dg45_pLmvrkcOkBnKsOzXyGWTBcmg-X6VjXYJwQj.woff2 +0 -0
  46. package/dist/fonts/google/dg45_pLmvrkcOkBnKsOzXyGWTBcmg-X6Vj_YJwQj.woff2 +0 -0
  47. package/dist/fonts/google/dg45_pLmvrkcOkBnKsOzXyGWTBcmg-X6VjbYJwQj.woff2 +0 -0
  48. package/dist/fonts/google/dg45_pLmvrkcOkBnKsOzXyGWTBcmg-X6VjvYJw.woff2 +0 -0
  49. package/dist/fonts/google/fonts-tracklist.txt +0 -48
  50. package/dist/fonts/google/vEFO2_JTCgwQ5ejvMV0O96D01E8J0tJXHKbBjM4.woff2 +0 -0
  51. package/dist/fonts/google/vEFO2_JTCgwQ5ejvMV0O96D01E8J0tJXHKbOjM7sfA.woff2 +0 -0
  52. package/dist/fonts/google/vEFO2_JTCgwQ5ejvMV0O96D01E8J0tJXHKbPjM7sfA.woff2 +0 -0
  53. package/dist/fonts/google/wEOhEADFm8hSaQTFG18FErVhsC9x-tarUfLtrftV.woff2 +0 -0
  54. package/dist/fonts/google/wEOhEADFm8hSaQTFG18FErVhsC9x-tarUfXtrftV.woff2 +0 -0
  55. package/dist/fonts/google/wEOhEADFm8hSaQTFG18FErVhsC9x-tarUfbtrQ.woff2 +0 -0
  56. package/dist/fonts/google/wEOhEADFm8hSaQTFG18FErVhsC9x-tarUfjtrftV.woff2 +0 -0
  57. package/dist/fonts/google/wEOhEADFm8hSaQTFG18FErVhsC9x-tarUfntrftV.woff2 +0 -0
  58. package/dist/fonts/google/wEOhEADFm8hSaQTFG18FErVhsC9x-tarUfrtrftV.woff2 +0 -0
  59. package/dist/fonts/google/wEOhEADFm8hSaQTFG18FErVhsC9x-tarUfvtrftV.woff2 +0 -0
  60. package/dist/fonts/google/xn7_YHE41ni1AdIRqAuZuw1Bx9mbZk79FN_B-bnBeA.woff2 +0 -0
  61. package/dist/fonts/google/xn7_YHE41ni1AdIRqAuZuw1Bx9mbZk79FN_C-bk.woff2 +0 -0
  62. package/dist/fonts/google/xn7_YHE41ni1AdIRqAuZuw1Bx9mbZk79FN_G-bnBeA.woff2 +0 -0
  63. package/dist/fonts/google/xn7_YHE41ni1AdIRqAuZuw1Bx9mbZk79FN_M-bnBeA.woff2 +0 -0
  64. package/dist/fonts/google/xn7_YHE41ni1AdIRqAuZuw1Bx9mbZk79FN_N-bnBeA.woff2 +0 -0
  65. package/dist/fonts/google/xn7_YHE41ni1AdIRqAuZuw1Bx9mbZk79FN_P-bnBeA.woff2 +0 -0
@@ -423,5 +423,102 @@
423
423
  position: relative;
424
424
  z-index: $z-index-modal;
425
425
  }
426
+
427
+ }
428
+
429
+ // === Split Button (primary action + dropdown toggle) ===
430
+ .pa-btn-split {
431
+ position: relative;
432
+ display: inline-flex;
433
+
434
+ // RTL: reverse order so toggle is on inline-start side
435
+ [dir="rtl"] & {
436
+ flex-direction: row-reverse;
437
+ }
438
+
439
+ // Joined buttons with no gap
440
+ .pa-btn {
441
+ border-radius: 0;
442
+
443
+ &:first-child {
444
+ border-start-start-radius: $border-radius;
445
+ border-end-start-radius: $border-radius;
446
+ border-inline-end: none;
447
+ }
448
+ }
449
+
450
+ // Toggle button (chevron) - fixed square width
451
+ &__toggle {
452
+ border-start-end-radius: $border-radius;
453
+ border-end-end-radius: $border-radius;
454
+ border-inline-start: $border-width-base solid rgba(255, 255, 255, 0.25);
455
+ border-inline-end: none;
456
+ padding-inline: 0;
457
+ display: inline-flex;
458
+ align-items: center;
459
+ justify-content: center;
460
+ width: $btn-height-base;
461
+ min-width: $btn-height-base;
462
+
463
+ &.pa-btn--xs { width: $btn-height-xs; min-width: $btn-height-xs; }
464
+ &.pa-btn--sm { width: $btn-height-sm; min-width: $btn-height-sm; }
465
+ &.pa-btn--lg { width: $btn-height-lg; min-width: $btn-height-lg; }
466
+ &.pa-btn--xl { width: $btn-height-xl; min-width: $btn-height-xl; }
467
+ }
468
+
469
+ // Chevron icon - opt-in rotation on open
470
+ &__chevron {
471
+ transition: transform $transition-fast $easing-snappy;
472
+ }
473
+
474
+ &--open &__chevron {
475
+ transform: rotate(180deg);
476
+ }
477
+
478
+ // Dropdown menu (moved to body and positioned by Floating UI)
479
+ &__menu {
480
+ display: none;
481
+ position: fixed;
482
+ top: 0;
483
+ left: 0;
484
+ width: max-content;
485
+ background: var(--pa-card-bg);
486
+ border: $border-width-base solid var(--pa-border-color);
487
+ border-radius: $border-radius;
488
+ box-shadow: $shadow-2xl;
489
+ z-index: $z-index-dropdown;
490
+ padding: $spacing-xs 0;
491
+
492
+ &--open {
493
+ display: block;
494
+ }
495
+ }
496
+
497
+ // Menu items
498
+ &__item {
499
+ display: block;
500
+ width: 100%;
501
+ padding: $spacing-sm $spacing-base;
502
+ border: none;
503
+ background: none;
504
+ text-align: start;
505
+ font-size: $font-size-sm;
506
+ color: var(--pa-text-color);
507
+ cursor: pointer;
508
+ white-space: nowrap;
509
+
510
+ &:hover {
511
+ background-color: var(--pa-accent-hover);
512
+ }
513
+
514
+ &--danger {
515
+ color: var(--pa-btn-danger-bg);
516
+
517
+ &:hover {
518
+ background-color: var(--pa-btn-danger-bg);
519
+ color: var(--pa-btn-danger-text);
520
+ }
521
+ }
522
+ }
426
523
  }
427
524
 
@@ -14,6 +14,7 @@
14
14
  transition: box-shadow $transition-fast $easing-snappy;
15
15
  display: flex;
16
16
  flex-direction: column;
17
+ overflow: hidden;
17
18
 
18
19
  &:hover {
19
20
  box-shadow: $shadow-lg;
@@ -64,14 +65,17 @@
64
65
  font-size: $font-size-base;
65
66
  }
66
67
 
67
- // Direct heading children - don't shrink (for three-part layout)
68
+ // Direct heading children - truncate when card is narrow
68
69
  > h1,
69
70
  > h2,
70
71
  > h3,
71
72
  > h4,
72
73
  > h5,
73
74
  > h6 {
74
- flex-shrink: 0;
75
+ min-width: 0;
76
+ overflow: hidden;
77
+ text-overflow: ellipsis;
78
+ white-space: nowrap;
75
79
  }
76
80
 
77
81
  // Description paragraphs - flexible middle, truncate with ellipsis
@@ -155,10 +159,16 @@
155
159
  }
156
160
  }
157
161
 
158
- // Wrap modifier - allow description to wrap (for mobile or long descriptions)
162
+ // Wrap modifier - allow heading and description to wrap instead of truncating
159
163
  &--wrap {
160
164
  flex-wrap: wrap;
161
165
 
166
+ > h1, > h2, > h3, > h4, > h5, > h6 {
167
+ white-space: normal;
168
+ overflow: visible;
169
+ text-overflow: clip;
170
+ }
171
+
162
172
  > p {
163
173
  white-space: normal;
164
174
  flex-basis: 100%;
@@ -556,6 +556,15 @@
556
556
  justify-content: center; // when --middle makes it flex
557
557
  }
558
558
 
559
+ // Value horizontal alignment
560
+ &--value-end &__value {
561
+ text-align: end;
562
+ }
563
+
564
+ &--value-center &__value {
565
+ text-align: center;
566
+ }
567
+
559
568
  // Truncate: single-line ellipsis on labels and values
560
569
  &--truncate &__label,
561
570
  &--truncate &__value {
@@ -581,6 +590,26 @@
581
590
  }
582
591
  }
583
592
 
593
+ // Responsive: stack label above value in very narrow containers
594
+ @container (max-width: 300px) {
595
+ &, &--cols-2, &--fixed, &--fixed#{&}--cols-2 {
596
+ grid-template-columns: 1fr;
597
+ }
598
+
599
+ .pa-desc-table__label {
600
+ border-inline-end: none;
601
+ border-bottom: none;
602
+ }
603
+
604
+ .pa-desc-table__value {
605
+ border-inline-end: none;
606
+ }
607
+
608
+ .pa-desc-table__value--full {
609
+ grid-column: 1;
610
+ }
611
+ }
612
+
584
613
  // Media fallback (for desc-tables outside a container context)
585
614
  @media (max-width: $mobile-breakpoint) {
586
615
  &, &--cols-2 {
@@ -876,8 +905,12 @@
876
905
  }
877
906
 
878
907
  // Label horizontal alignment
879
- &--label-end &__label { justify-content: flex-end; }
880
- &--label-center &__label { justify-content: center; }
908
+ &--label-end &__label { justify-content: flex-end; text-align: end; }
909
+ &--label-center &__label { justify-content: center; text-align: center; }
910
+
911
+ // Value horizontal alignment
912
+ &--value-end &__value { justify-content: flex-end; text-align: end; }
913
+ &--value-center &__value { justify-content: center; text-align: center; }
881
914
 
882
915
  // Truncate: single-line ellipsis on both labels and values
883
916
  &--truncate &__label,
@@ -0,0 +1,58 @@
1
+ /* ========================================
2
+ Filter Card
3
+ Expandable filter card with inline filters and collapsible advanced section
4
+ Based on table-filters pattern from pure-admin demos
5
+ ======================================== */
6
+
7
+ @use '../variables' as *;
8
+
9
+ .pa-filter-card__row {
10
+ display: flex;
11
+ gap: $spacing-sm;
12
+ align-items: center;
13
+ flex-wrap: wrap;
14
+ }
15
+
16
+ .pa-filter-card__filters {
17
+ display: flex;
18
+ gap: $spacing-sm;
19
+ align-items: center;
20
+ flex-wrap: wrap;
21
+ flex: 1;
22
+ min-width: 0;
23
+
24
+ > * {
25
+ flex: 1;
26
+ min-width: 200px;
27
+ }
28
+ }
29
+
30
+ .pa-filter-card__actions {
31
+ display: flex;
32
+ gap: $spacing-xs;
33
+ align-items: center;
34
+ flex-shrink: 0;
35
+ }
36
+
37
+ .pa-filter-card__advanced {
38
+ margin-top: $spacing-md;
39
+ padding-top: $spacing-md;
40
+ border-top: $border-width-base solid var(--pa-border-color);
41
+ }
42
+
43
+ .pa-filter-card__advanced-actions {
44
+ display: flex;
45
+ justify-content: flex-end;
46
+ gap: $spacing-sm;
47
+ margin-top: $spacing-md;
48
+ }
49
+
50
+ .pa-filter-card--loading {
51
+ opacity: 0.7;
52
+ pointer-events: none;
53
+ }
54
+
55
+ .pa-filter-card--disabled {
56
+ opacity: 0.5;
57
+ pointer-events: none;
58
+ }
@@ -891,6 +891,10 @@
891
891
  background-color: transparent;
892
892
  box-shadow: $shadow-sm;
893
893
  }
894
+
895
+ tbody tr:hover td {
896
+ background-color: transparent;
897
+ }
894
898
  }
895
899
  }
896
900
 
@@ -557,8 +557,8 @@
557
557
  font-size: $timeline-feed-time-font-size;
558
558
  color: var(--pa-text-color-2);
559
559
  font-weight: $font-weight-medium;
560
- text-align: right;
561
- padding-right: $spacing-sm;
560
+ text-align: end;
561
+ padding-inline-end: $spacing-sm;
562
562
  padding-top: $timeline-feed-time-padding-top;
563
563
  }
564
564
  }
@@ -21,6 +21,12 @@
21
21
  cursor: help;
22
22
  }
23
23
 
24
+ // Keyword modifier - dotted underline for inline term explanations
25
+ &--keyword {
26
+ border-bottom: $border-width-base dotted currentColor;
27
+ cursor: help;
28
+ }
29
+
24
30
  &::before,
25
31
  &::after {
26
32
  position: absolute;
@@ -91,25 +97,38 @@
91
97
  transform: translateX(-50%) translateY(0);
92
98
  }
93
99
 
94
- // Right position
95
- &--right::before {
100
+ // End position (inline-end: right in LTR, left in RTL)
101
+ &--end::before {
96
102
  bottom: auto;
97
- left: calc(100% + $tooltip-distance);
103
+ left: auto;
104
+ inset-inline-start: calc(100% + $tooltip-distance);
98
105
  top: 50%;
99
106
  transform: translateX(-$tooltip-offset) translateY(-50%);
100
107
  }
101
108
 
102
- &--right::after {
109
+ &--end::after {
103
110
  bottom: auto;
104
- left: calc(100% + ($tooltip-arrow-size - 2px));
111
+ left: auto;
112
+ inset-inline-start: calc(100% + ($tooltip-arrow-size - 2px));
105
113
  top: 50%;
106
114
  transform: translateX(-$tooltip-offset) translateY(-50%);
107
115
  border-top-color: transparent;
108
- border-right-color: var(--pa-tooltip-bg);
116
+ border-inline-end-color: var(--pa-tooltip-bg);
109
117
  }
110
118
 
111
- &--right:hover::before,
112
- &--right:hover::after {
119
+ &--end:hover::before,
120
+ &--end:hover::after {
121
+ transform: translateX(0) translateY(-50%);
122
+ }
123
+
124
+ // RTL: reverse slide direction for end position
125
+ [dir="rtl"] &--end::before,
126
+ [dir="rtl"] &--end::after {
127
+ transform: translateX($tooltip-offset) translateY(-50%);
128
+ }
129
+
130
+ [dir="rtl"] &--end:hover::before,
131
+ [dir="rtl"] &--end:hover::after {
113
132
  transform: translateX(0) translateY(-50%);
114
133
  }
115
134
 
@@ -135,27 +154,38 @@
135
154
  transform: translateX(-50%) translateY(0);
136
155
  }
137
156
 
138
- // Left position
139
- &--left::before {
157
+ // Start position (inline-start: left in LTR, right in RTL)
158
+ &--start::before {
140
159
  bottom: auto;
141
160
  left: auto;
142
- right: calc(100% + $tooltip-distance);
161
+ inset-inline-end: calc(100% + $tooltip-distance);
143
162
  top: 50%;
144
163
  transform: translateX($tooltip-offset) translateY(-50%);
145
164
  }
146
165
 
147
- &--left::after {
166
+ &--start::after {
148
167
  bottom: auto;
149
168
  left: auto;
150
- right: calc(100% + ($tooltip-arrow-size - 2px));
169
+ inset-inline-end: calc(100% + ($tooltip-arrow-size - 2px));
151
170
  top: 50%;
152
171
  transform: translateX($tooltip-offset) translateY(-50%);
153
172
  border-top-color: transparent;
154
- border-left-color: var(--pa-tooltip-bg);
173
+ border-inline-start-color: var(--pa-tooltip-bg);
174
+ }
175
+
176
+ &--start:hover::before,
177
+ &--start:hover::after {
178
+ transform: translateX(0) translateY(-50%);
179
+ }
180
+
181
+ // RTL: reverse slide direction for start position
182
+ [dir="rtl"] &--start::before,
183
+ [dir="rtl"] &--start::after {
184
+ transform: translateX(-$tooltip-offset) translateY(-50%);
155
185
  }
156
186
 
157
- &--left:hover::before,
158
- &--left:hover::after {
187
+ [dir="rtl"] &--start:hover::before,
188
+ [dir="rtl"] &--start:hover::after {
159
189
  transform: translateX(0) translateY(-50%);
160
190
  }
161
191
 
@@ -166,17 +196,17 @@
166
196
  &--primary::after {
167
197
  border-top-color: var(--pa-btn-primary-bg);
168
198
  }
169
- &--primary.pa-tooltip--right::after {
199
+ &--primary.pa-tooltip--end::after {
170
200
  border-top-color: transparent;
171
- border-right-color: var(--pa-btn-primary-bg);
201
+ border-inline-end-color: var(--pa-btn-primary-bg);
172
202
  }
173
203
  &--primary.pa-tooltip--bottom::after {
174
204
  border-top-color: transparent;
175
205
  border-bottom-color: var(--pa-btn-primary-bg);
176
206
  }
177
- &--primary.pa-tooltip--left::after {
207
+ &--primary.pa-tooltip--start::after {
178
208
  border-top-color: transparent;
179
- border-left-color: var(--pa-btn-primary-bg);
209
+ border-inline-start-color: var(--pa-btn-primary-bg);
180
210
  }
181
211
 
182
212
  &--success::before {
@@ -185,17 +215,17 @@
185
215
  &--success::after {
186
216
  border-top-color: var(--pa-btn-success-bg);
187
217
  }
188
- &--success.pa-tooltip--right::after {
218
+ &--success.pa-tooltip--end::after {
189
219
  border-top-color: transparent;
190
- border-right-color: var(--pa-btn-success-bg);
220
+ border-inline-end-color: var(--pa-btn-success-bg);
191
221
  }
192
222
  &--success.pa-tooltip--bottom::after {
193
223
  border-top-color: transparent;
194
224
  border-bottom-color: var(--pa-btn-success-bg);
195
225
  }
196
- &--success.pa-tooltip--left::after {
226
+ &--success.pa-tooltip--start::after {
197
227
  border-top-color: transparent;
198
- border-left-color: var(--pa-btn-success-bg);
228
+ border-inline-start-color: var(--pa-btn-success-bg);
199
229
  }
200
230
 
201
231
  &--warning::before {
@@ -205,17 +235,17 @@
205
235
  &--warning::after {
206
236
  border-top-color: var(--pa-btn-warning-bg);
207
237
  }
208
- &--warning.pa-tooltip--right::after {
238
+ &--warning.pa-tooltip--end::after {
209
239
  border-top-color: transparent;
210
- border-right-color: var(--pa-btn-warning-bg);
240
+ border-inline-end-color: var(--pa-btn-warning-bg);
211
241
  }
212
242
  &--warning.pa-tooltip--bottom::after {
213
243
  border-top-color: transparent;
214
244
  border-bottom-color: var(--pa-btn-warning-bg);
215
245
  }
216
- &--warning.pa-tooltip--left::after {
246
+ &--warning.pa-tooltip--start::after {
217
247
  border-top-color: transparent;
218
- border-left-color: var(--pa-btn-warning-bg);
248
+ border-inline-start-color: var(--pa-btn-warning-bg);
219
249
  }
220
250
 
221
251
  &--danger::before {
@@ -224,17 +254,17 @@
224
254
  &--danger::after {
225
255
  border-top-color: var(--pa-btn-danger-bg);
226
256
  }
227
- &--danger.pa-tooltip--right::after {
257
+ &--danger.pa-tooltip--end::after {
228
258
  border-top-color: transparent;
229
- border-right-color: var(--pa-btn-danger-bg);
259
+ border-inline-end-color: var(--pa-btn-danger-bg);
230
260
  }
231
261
  &--danger.pa-tooltip--bottom::after {
232
262
  border-top-color: transparent;
233
263
  border-bottom-color: var(--pa-btn-danger-bg);
234
264
  }
235
- &--danger.pa-tooltip--left::after {
265
+ &--danger.pa-tooltip--start::after {
236
266
  border-top-color: transparent;
237
- border-left-color: var(--pa-btn-danger-bg);
267
+ border-inline-start-color: var(--pa-btn-danger-bg);
238
268
  }
239
269
 
240
270
  // Numbered color variants (color-1 through color-9)
@@ -247,17 +277,17 @@
247
277
  &--color-#{$i}::after {
248
278
  border-top-color: var(--pa-color-#{$i});
249
279
  }
250
- &--color-#{$i}.pa-tooltip--right::after {
280
+ &--color-#{$i}.pa-tooltip--end::after {
251
281
  border-top-color: transparent;
252
- border-right-color: var(--pa-color-#{$i});
282
+ border-inline-end-color: var(--pa-color-#{$i});
253
283
  }
254
284
  &--color-#{$i}.pa-tooltip--bottom::after {
255
285
  border-top-color: transparent;
256
286
  border-bottom-color: var(--pa-color-#{$i});
257
287
  }
258
- &--color-#{$i}.pa-tooltip--left::after {
288
+ &--color-#{$i}.pa-tooltip--start::after {
259
289
  border-top-color: transparent;
260
- border-left-color: var(--pa-color-#{$i});
290
+ border-inline-start-color: var(--pa-color-#{$i});
261
291
  }
262
292
  }
263
293
 
@@ -304,43 +334,69 @@
304
334
  transform: translateX(-50%) translateY(0) !important;
305
335
  }
306
336
 
307
- // Auto-flip from left to right
308
- &--auto-flip-right::before {
309
- left: calc(100% + $tooltip-distance) !important;
337
+ // Auto-flip from start to end
338
+ &--auto-flip-end::before {
339
+ left: auto !important;
310
340
  right: auto !important;
341
+ inset-inline-start: calc(100% + $tooltip-distance) !important;
311
342
  transform: translateX(-$tooltip-offset) translateY(-50%) !important;
312
343
  }
313
344
 
314
- &--auto-flip-right::after {
315
- left: calc(100% + ($tooltip-arrow-size - 2px)) !important;
345
+ &--auto-flip-end::after {
346
+ left: auto !important;
316
347
  right: auto !important;
348
+ inset-inline-start: calc(100% + ($tooltip-arrow-size - 2px)) !important;
317
349
  transform: translateX(-$tooltip-offset) translateY(-50%) !important;
318
- border-left-color: transparent !important;
319
- border-right-color: var(--pa-tooltip-bg) !important;
350
+ border-inline-start-color: transparent !important;
351
+ border-inline-end-color: var(--pa-tooltip-bg) !important;
352
+ }
353
+
354
+ &--auto-flip-end:hover::before,
355
+ &--auto-flip-end:hover::after {
356
+ transform: translateX(0) translateY(-50%) !important;
357
+ }
358
+
359
+ // RTL: reverse slide direction for auto-flip-end
360
+ [dir="rtl"] &--auto-flip-end::before,
361
+ [dir="rtl"] &--auto-flip-end::after {
362
+ transform: translateX($tooltip-offset) translateY(-50%) !important;
320
363
  }
321
364
 
322
- &--auto-flip-right:hover::before,
323
- &--auto-flip-right:hover::after {
365
+ [dir="rtl"] &--auto-flip-end:hover::before,
366
+ [dir="rtl"] &--auto-flip-end:hover::after {
324
367
  transform: translateX(0) translateY(-50%) !important;
325
368
  }
326
369
 
327
- // Auto-flip from right to left
328
- &--auto-flip-left::before {
329
- right: calc(100% + $tooltip-distance) !important;
370
+ // Auto-flip from end to start
371
+ &--auto-flip-start::before {
330
372
  left: auto !important;
373
+ right: auto !important;
374
+ inset-inline-end: calc(100% + $tooltip-distance) !important;
331
375
  transform: translateX($tooltip-offset) translateY(-50%) !important;
332
376
  }
333
377
 
334
- &--auto-flip-left::after {
335
- right: calc(100% + ($tooltip-arrow-size - 2px)) !important;
378
+ &--auto-flip-start::after {
336
379
  left: auto !important;
380
+ right: auto !important;
381
+ inset-inline-end: calc(100% + ($tooltip-arrow-size - 2px)) !important;
337
382
  transform: translateX($tooltip-offset) translateY(-50%) !important;
338
- border-right-color: transparent !important;
339
- border-left-color: var(--pa-tooltip-bg) !important;
383
+ border-inline-end-color: transparent !important;
384
+ border-inline-start-color: var(--pa-tooltip-bg) !important;
385
+ }
386
+
387
+ &--auto-flip-start:hover::before,
388
+ &--auto-flip-start:hover::after {
389
+ transform: translateX(0) translateY(-50%) !important;
390
+ }
391
+
392
+ // RTL: reverse slide direction for auto-flip-start
393
+ [dir="rtl"] &--auto-flip-start::before,
394
+ [dir="rtl"] &--auto-flip-start::after {
395
+ transform: translateX(-$tooltip-offset) translateY(-50%) !important;
340
396
  }
341
397
 
342
- &--auto-flip-left:hover::before,
343
- &--auto-flip-left:hover::after {
398
+ [dir="rtl"] &--auto-flip-start:hover::before,
399
+ [dir="rtl"] &--auto-flip-start:hover::after {
344
400
  transform: translateX(0) translateY(-50%) !important;
345
401
  }
346
402
  }
@@ -13,7 +13,7 @@
13
13
  background-color: var(--pa-btn-secondary-bg);
14
14
  color: var(--pa-btn-secondary-text);
15
15
  font-size: $font-size-xs;
16
- font-weight: $font-weight-semibold;
16
+
17
17
  line-height: 1;
18
18
  text-align: center;
19
19
  white-space: nowrap;
@@ -102,9 +102,20 @@
102
102
  border-color: var(--pa-btn-dark-bg);
103
103
  }
104
104
 
105
- // Left-side ellipsis for paths/hierarchies where end is important
106
- &--ellipsis-left {
105
+ // When truncation is needed, switch from inline-flex to inline-block
106
+ // (text-overflow: ellipsis doesn't work on flex containers)
107
+ &.text-truncate {
108
+ display: inline-block;
109
+ }
110
+
111
+ // Start-side ellipsis for paths/hierarchies where end is important
112
+ &--ellipsis-start {
107
113
  direction: rtl;
108
114
  text-align: left;
115
+
116
+ [dir="rtl"] & {
117
+ direction: ltr;
118
+ text-align: right;
119
+ }
109
120
  }
110
121
  }