@keenmate/pure-admin-core 1.3.0 → 1.4.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 (37) hide show
  1. package/README.md +25 -1
  2. package/dist/css/main.css +766 -760
  3. package/package.json +1 -1
  4. package/src/scss/_core.scss +4 -0
  5. package/src/scss/_fonts.scss +1 -17
  6. package/src/scss/_rtl-helpers.scss +161 -0
  7. package/src/scss/core-components/_alerts.scss +3 -3
  8. package/src/scss/core-components/_base.scss +4 -3
  9. package/src/scss/core-components/_buttons.scss +9 -9
  10. package/src/scss/core-components/_callouts.scss +14 -9
  11. package/src/scss/core-components/_checkbox-lists.scss +6 -6
  12. package/src/scss/core-components/_code.scss +10 -10
  13. package/src/scss/core-components/_command-palette.scss +5 -14
  14. package/src/scss/core-components/_comparison.scss +3 -3
  15. package/src/scss/core-components/_data-display.scss +6 -6
  16. package/src/scss/core-components/_detail-panel.scss +36 -24
  17. package/src/scss/core-components/_file-selector.scss +2 -2
  18. package/src/scss/core-components/_grid.scss +13 -24
  19. package/src/scss/core-components/_lists.scss +12 -12
  20. package/src/scss/core-components/_modals.scss +2 -8
  21. package/src/scss/core-components/_pagers.scss +1 -1
  22. package/src/scss/core-components/_profile.scss +11 -6
  23. package/src/scss/core-components/_settings-panel.scss +22 -9
  24. package/src/scss/core-components/_tables.scss +26 -30
  25. package/src/scss/core-components/_tabs.scss +27 -14
  26. package/src/scss/core-components/_timeline.scss +5 -5
  27. package/src/scss/core-components/_toasts.scss +57 -21
  28. package/src/scss/core-components/_tooltips.scss +11 -6
  29. package/src/scss/core-components/_utilities.scss +56 -31
  30. package/src/scss/core-components/forms/_input-groups.scss +23 -22
  31. package/src/scss/core-components/forms/_input-wrapper.scss +3 -3
  32. package/src/scss/core-components/forms/_query-editor.scss +1 -1
  33. package/src/scss/core-components/layout/_layout-responsive.scss +3 -4
  34. package/src/scss/core-components/layout/_navbar-elements.scss +17 -6
  35. package/src/scss/core-components/layout/_navbar.scss +11 -22
  36. package/src/scss/core-components/layout/_sidebar-states.scss +25 -16
  37. package/src/scss/core-components/layout/_sidebar.scss +22 -16
@@ -149,12 +149,12 @@
149
149
  // Align first/last column with card header/footer padding
150
150
  th:first-child,
151
151
  td:first-child {
152
- padding-left: $card-header-padding-h;
152
+ padding-inline-start: $card-header-padding-h; // RTL: flips to padding-right
153
153
  }
154
154
 
155
155
  th:last-child,
156
156
  td:last-child {
157
- padding-right: $card-header-padding-h;
157
+ padding-inline-end: $card-header-padding-h; // RTL: flips to padding-left
158
158
  }
159
159
 
160
160
  // Remove bottom border from last row (card border handles it)
@@ -167,8 +167,8 @@
167
167
  &__footer {
168
168
  padding: $card-footer-padding-v $card-footer-padding-h;
169
169
  border-top: $border-width-base solid var(--pa-border-color);
170
- border-bottom-left-radius: $card-border-radius;
171
- border-bottom-right-radius: $card-border-radius;
170
+ border-end-start-radius: $card-border-radius; // RTL: bottom-right in RTL
171
+ border-end-end-radius: $card-border-radius; // RTL: bottom-left in RTL
172
172
  background: var(--pa-card-footer-bg);
173
173
  display: flex;
174
174
  justify-content: space-between;
@@ -260,8 +260,7 @@
260
260
  background: transparent;
261
261
  border-bottom: none;
262
262
  border-radius: 0;
263
- padding-left: 0;
264
- padding-right: 0;
263
+ padding-inline: 0;
265
264
  }
266
265
 
267
266
  // Footer in plain mode
@@ -269,8 +268,7 @@
269
268
  background: transparent;
270
269
  border-top: none;
271
270
  border-radius: 0;
272
- padding-left: 0;
273
- padding-right: 0;
271
+ padding-inline: 0;
274
272
  }
275
273
  }
276
274
  }
@@ -284,7 +282,7 @@
284
282
  th,
285
283
  td {
286
284
  padding: $table-padding-base-v $table-padding-base-h;
287
- text-align: left;
285
+ text-align: start; // RTL: flips to right
288
286
  border-bottom: $border-width-base solid var(--pa-border-color);
289
287
  vertical-align: middle;
290
288
  line-height: $line-height-tight;
@@ -379,13 +377,13 @@
379
377
 
380
378
  // Hover effects
381
379
  @if $table-hover-accent-width > 0 {
382
- // Header alignment - add padding-left instead of border
380
+ // Header alignment - add padding to match hover accent border
383
381
  th:first-child {
384
- padding-left: $table-hover-accent-width + $table-padding-base-h;
382
+ padding-inline-start: $table-hover-accent-width + $table-padding-base-h; // RTL: flips to padding-right
385
383
  }
386
384
 
387
385
  tbody tr {
388
- border-#{$table-hover-accent-position}: #{$table-hover-accent-width} solid transparent;
386
+ border-inline-start: #{$table-hover-accent-width} solid transparent; // RTL: flips to border-right
389
387
  transition: border-color $transition-normal $easing-smooth;
390
388
  }
391
389
  }
@@ -395,7 +393,7 @@
395
393
 
396
394
  // Apply hover accent if enabled
397
395
  @if $table-hover-accent-width > 0 {
398
- border-#{$table-hover-accent-position}-color: var(--pa-table-hover-accent-color);
396
+ border-inline-start-color: var(--pa-table-hover-accent-color); // RTL: flips to border-right-color
399
397
  }
400
398
  }
401
399
 
@@ -547,7 +545,7 @@
547
545
  &__count {
548
546
  color: var(--pa-text-color-2);
549
547
  font-size: $font-size-xs;
550
- margin-left: $spacing-xs;
548
+ margin-inline-start: $spacing-xs; // RTL: flips to margin-right
551
549
  }
552
550
  }
553
551
 
@@ -575,13 +573,13 @@
575
573
  .pa-virtual-table__header-cell {
576
574
  padding: $virtual-table-cell-padding-v $virtual-table-cell-padding-h;
577
575
  font-weight: $font-weight-semibold;
578
- border-right: $border-width-base solid var(--pa-border-color);
576
+ border-inline-end: $border-width-base solid var(--pa-border-color); // RTL: flips to border-left
579
577
  background: var(--pa-table-header-bg);
580
578
  color: var(--pa-text-color-1);
581
579
  }
582
580
 
583
581
  .pa-virtual-table__header-cell:last-child {
584
- border-right: none;
582
+ border-inline-end: none;
585
583
  }
586
584
 
587
585
  .pa-virtual-table__body {
@@ -596,7 +594,7 @@
596
594
 
597
595
  // Setup for hover accent border (same as pa-table)
598
596
  @if $table-hover-accent-width > 0 {
599
- border-#{$table-hover-accent-position}: #{$table-hover-accent-width} solid transparent;
597
+ border-inline-start: #{$table-hover-accent-width} solid transparent; // RTL: flips to border-right
600
598
  transition: border-color $transition-normal $easing-smooth;
601
599
  }
602
600
  }
@@ -610,13 +608,13 @@
610
608
 
611
609
  // Apply hover accent if enabled (same as pa-table)
612
610
  @if $table-hover-accent-width > 0 {
613
- border-#{$table-hover-accent-position}-color: var(--pa-table-hover-accent-color);
611
+ border-inline-start-color: var(--pa-table-hover-accent-color); // RTL: flips to border-right-color
614
612
  }
615
613
  }
616
614
 
617
615
  .pa-virtual-table__cell {
618
616
  padding: $virtual-table-cell-padding-v $virtual-table-cell-padding-h;
619
- border-right: $border-width-base solid var(--pa-border-color);
617
+ border-inline-end: $border-width-base solid var(--pa-border-color); // RTL: flips to border-left
620
618
  overflow: hidden;
621
619
  text-overflow: ellipsis;
622
620
  white-space: nowrap;
@@ -625,7 +623,7 @@
625
623
  }
626
624
 
627
625
  .pa-virtual-table__cell:last-child {
628
- border-right: none;
626
+ border-inline-end: none;
629
627
  }
630
628
 
631
629
  // Responsive Tables - Stackable Layout
@@ -637,8 +635,7 @@
637
635
  -webkit-overflow-scrolling: touch; // Smooth scrolling on iOS
638
636
 
639
637
  // Show subtle scroll hint with border
640
- border-left: $border-width-base solid var(--pa-border-color);
641
- border-right: $border-width-base solid var(--pa-border-color);
638
+ border-inline: $border-width-base solid var(--pa-border-color); // RTL: no change needed (symmetric)
642
639
  }
643
640
 
644
641
  // Mobile: Stack into cards
@@ -658,7 +655,7 @@
658
655
 
659
656
  // Reset hover accent border for mobile
660
657
  @if $table-hover-accent-width > 0 {
661
- border-#{$table-hover-accent-position}: $border-width-base solid var(--pa-border-color) !important;
658
+ border-inline-start: $border-width-base solid var(--pa-border-color) !important; // RTL: flips
662
659
  }
663
660
 
664
661
  &:last-child {
@@ -669,7 +666,7 @@
669
666
  // Make each cell a row within the card
670
667
  tbody td {
671
668
  display: block;
672
- text-align: right;
669
+ text-align: end; // RTL: flips to left (value on end side)
673
670
  padding: $table-responsive-card-padding;
674
671
  position: relative;
675
672
  border-bottom: $border-width-base solid var(--pa-border-color);
@@ -683,15 +680,15 @@
683
680
  &::before {
684
681
  content: attr(data-label);
685
682
  position: absolute;
686
- left: $table-responsive-card-padding;
683
+ inset-inline-start: $table-responsive-card-padding; // RTL: flips to right
687
684
  top: $table-responsive-card-padding;
688
685
  font-weight: $table-responsive-label-font-weight;
689
- text-align: left;
686
+ text-align: start; // RTL: flips to right
690
687
  width: $table-responsive-label-width;
691
688
  }
692
689
 
693
- // Value aligned to the right
694
- padding-left: calc($table-responsive-label-width + $table-responsive-card-padding * 2);
690
+ // Value aligned to the end (leave space for label on start side)
691
+ padding-inline-start: calc($table-responsive-label-width + $table-responsive-card-padding * 2); // RTL: flips
695
692
  }
696
693
 
697
694
  // Disable col-auto effect in responsive view
@@ -730,8 +727,7 @@
730
727
  display: block;
731
728
  overflow-x: auto;
732
729
  -webkit-overflow-scrolling: touch;
733
- border-left: $border-width-base solid var(--pa-border-color);
734
- border-right: $border-width-base solid var(--pa-border-color);
730
+ border-inline: $border-width-base solid var(--pa-border-color); // RTL: no change needed (symmetric)
735
731
  }
736
732
 
737
733
  // Mobile: CSS Grid layout
@@ -119,19 +119,22 @@
119
119
  &--vertical {
120
120
  flex-direction: column;
121
121
  border-bottom: none;
122
- border-right: $border-width-base solid var(--pa-border-color);
122
+ border-inline-end: $border-width-base solid var(--pa-border-color); // RTL: flips to border-left
123
123
  gap: 0;
124
124
  margin-bottom: 0;
125
- padding-right: 0;
125
+ padding-inline-end: 0; // RTL: flips to padding-left
126
126
  width: fit-content;
127
127
  min-width: max-content;
128
128
 
129
129
  .pa-tabs__item {
130
130
  justify-content: flex-start;
131
131
  border-bottom: none;
132
- border-right: $border-width-medium solid transparent;
132
+ border-inline-end: $border-width-medium solid transparent; // RTL: flips to border-left
133
133
  padding: $spacing-sm;
134
- border-radius: $border-radius 0 0 $border-radius;
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;
135
138
  gap: $tabs-vertical-item-gap;
136
139
  white-space: nowrap;
137
140
  min-height: 4rem; // Default height for vertical tabs
@@ -141,7 +144,7 @@
141
144
  }
142
145
 
143
146
  &--active {
144
- border-right-color: $accent-color;
147
+ border-inline-end-color: $accent-color; // RTL: flips to border-left-color
145
148
  background-color: rgba($accent-color, $tabs-vertical-active-opacity);
146
149
  }
147
150
 
@@ -224,14 +227,24 @@
224
227
  background: linear-gradient(to right, var(--pa-main-bg), color-mix(in srgb, var(--pa-main-bg) 80%, transparent));
225
228
  }
226
229
 
227
- &--left {
228
- left: 0;
230
+ &--left,
231
+ &--start {
232
+ inset-inline-start: 0; // RTL: flips to right
229
233
  background: linear-gradient(to right, color-mix(in srgb, var(--pa-main-bg) 95%, transparent), transparent);
234
+
235
+ [dir="rtl"] & {
236
+ background: linear-gradient(to left, color-mix(in srgb, var(--pa-main-bg) 95%, transparent), transparent);
237
+ }
230
238
  }
231
239
 
232
- &--right {
233
- right: 0;
240
+ &--right,
241
+ &--end {
242
+ inset-inline-end: 0; // RTL: flips to left
234
243
  background: linear-gradient(to left, color-mix(in srgb, var(--pa-main-bg) 95%, transparent), transparent);
244
+
245
+ [dir="rtl"] & {
246
+ background: linear-gradient(to right, color-mix(in srgb, var(--pa-main-bg) 95%, transparent), transparent);
247
+ }
235
248
  }
236
249
 
237
250
  &--visible {
@@ -373,7 +386,7 @@
373
386
  // Overflow toggle for tabs that don't fit
374
387
  .pa-tabs__overflow {
375
388
  position: relative;
376
- margin-left: auto;
389
+ margin-inline-start: auto; // RTL: flips to margin-right
377
390
  flex-shrink: 0;
378
391
  }
379
392
 
@@ -390,7 +403,7 @@
390
403
  color: var(--pa-text-color-2);
391
404
  cursor: pointer;
392
405
  transition: all $transition-fast $easing-snappy;
393
- border-left: $border-width-base solid var(--pa-border-color);
406
+ border-inline-start: $border-width-base solid var(--pa-border-color); // RTL: flips to border-right
394
407
  margin: (-$card-header-padding-v) (-$card-header-padding-h) (-$card-header-padding-v) 0;
395
408
  box-sizing: content-box;
396
409
  height: $card-header-min-height;
@@ -423,7 +436,7 @@
423
436
  .pa-tabs__overflow-menu {
424
437
  position: absolute;
425
438
  top: $card-header-min-height;
426
- right: 0;
439
+ inset-inline-end: 0; // RTL: flips to left
427
440
  min-width: 15rem;
428
441
  background: var(--pa-card-bg);
429
442
  border: $card-border-width solid var(--pa-border-color);
@@ -443,7 +456,7 @@
443
456
  border: none;
444
457
  border-bottom: none;
445
458
  border-radius: 0;
446
- text-align: left;
459
+ text-align: start; // RTL: flips to right
447
460
  white-space: nowrap;
448
461
 
449
462
  &:hover {
@@ -480,7 +493,7 @@
480
493
 
481
494
  // Add divider between tabs and content (gap already provides spacing)
482
495
  .pa-tabs--vertical {
483
- border-right: $border-width-base solid var(--pa-border-color);
496
+ border-inline-end: $border-width-base solid var(--pa-border-color); // RTL: flips to border-left
484
497
 
485
498
  // Make tab items full width so active border reaches divider
486
499
  .pa-tabs__item {
@@ -13,11 +13,11 @@
13
13
  position: relative;
14
14
  }
15
15
 
16
- // Variant 1: Simple left-aligned timeline (like Timeline #1)
16
+ // Variant 1: Simple start-aligned timeline (like Timeline #1)
17
17
  &--simple {
18
- border-left: $timeline-simple-line-width solid var(--pa-border-color);
19
- margin-left: $timeline-simple-margin-left;
20
- padding-left: $timeline-simple-padding-left;
18
+ border-inline-start: $timeline-simple-line-width solid var(--pa-border-color); // RTL: flips to right
19
+ margin-inline-start: $timeline-simple-margin-left; // RTL: flips to right
20
+ padding-inline-start: $timeline-simple-padding-left; // RTL: flips to right
21
21
 
22
22
  .pa-timeline__item {
23
23
  padding-bottom: $spacing-lg;
@@ -32,7 +32,7 @@
32
32
  &::before {
33
33
  content: '';
34
34
  position: absolute;
35
- left: $timeline-simple-dot-offset;
35
+ inset-inline-start: $timeline-simple-dot-offset; // RTL: flips to right
36
36
  top: 0;
37
37
  width: $timeline-simple-dot-size;
38
38
  height: $timeline-simple-dot-size;
@@ -15,38 +15,47 @@
15
15
  flex-direction: column;
16
16
  gap: $spacing-md;
17
17
 
18
- // Position variations
19
- &--top-right {
18
+ // Position variations - using logical properties for RTL support
19
+ &--top-end {
20
20
  top: $spacing-lg;
21
- right: $spacing-lg;
21
+ inset-inline-end: $spacing-lg; // RTL: flips to left
22
22
  }
23
23
 
24
- &--top-left {
24
+ &--top-start {
25
25
  top: $spacing-lg;
26
- left: $spacing-lg;
26
+ inset-inline-start: $spacing-lg; // RTL: flips to right
27
27
  }
28
28
 
29
- &--bottom-right {
29
+ &--bottom-end {
30
30
  bottom: $spacing-lg;
31
- right: $spacing-lg;
31
+ inset-inline-end: $spacing-lg; // RTL: flips to left
32
32
  }
33
33
 
34
- &--bottom-left {
34
+ &--bottom-start {
35
35
  bottom: $spacing-lg;
36
- left: $spacing-lg;
36
+ inset-inline-start: $spacing-lg; // RTL: flips to right
37
37
  }
38
38
 
39
39
  &--top-center {
40
40
  top: $spacing-lg;
41
- left: 50%;
41
+ inset-inline-start: 50%;
42
42
  transform: translateX(-50%);
43
+
44
+ [dir="rtl"] & {
45
+ transform: translateX(50%);
46
+ }
43
47
  }
44
48
 
45
49
  &--bottom-center {
46
50
  bottom: $spacing-lg;
47
- left: 50%;
51
+ inset-inline-start: 50%;
48
52
  transform: translateX(-50%);
53
+
54
+ [dir="rtl"] & {
55
+ transform: translateX(50%);
56
+ }
49
57
  }
58
+
50
59
  }
51
60
 
52
61
  // ===== TOAST ITEM =====
@@ -81,9 +90,37 @@
81
90
  transform: translateX(100%);
82
91
  }
83
92
 
84
- // Left position animations
85
- .pa-toast-container--top-left &,
86
- .pa-toast-container--bottom-left & {
93
+ // Start position animations (left in LTR, right in RTL)
94
+ .pa-toast-container--top-start &,
95
+ .pa-toast-container--bottom-start & {
96
+ transform: translateX(-100%);
97
+
98
+ &.pa-toast--show {
99
+ transform: translateX(0);
100
+ }
101
+
102
+ &.pa-toast--hide {
103
+ transform: translateX(-100%);
104
+ }
105
+ }
106
+
107
+ // RTL: reverse animation direction for start positions
108
+ [dir="rtl"] .pa-toast-container--top-start &,
109
+ [dir="rtl"] .pa-toast-container--bottom-start & {
110
+ transform: translateX(100%);
111
+
112
+ &.pa-toast--show {
113
+ transform: translateX(0);
114
+ }
115
+
116
+ &.pa-toast--hide {
117
+ transform: translateX(100%);
118
+ }
119
+ }
120
+
121
+ // RTL: reverse animation direction for end positions
122
+ [dir="rtl"] .pa-toast-container--top-end &,
123
+ [dir="rtl"] .pa-toast-container--bottom-end & {
87
124
  transform: translateX(-100%);
88
125
 
89
126
  &.pa-toast--show {
@@ -175,7 +212,7 @@
175
212
  .pa-toast__progress {
176
213
  position: absolute;
177
214
  bottom: 0;
178
- left: 0;
215
+ inset-inline-start: 0; // RTL: flips to right
179
216
  height: $toast-progress-height;
180
217
  background-color: currentColor;
181
218
  opacity: 0.3;
@@ -258,18 +295,17 @@
258
295
 
259
296
  @media (max-width: $mobile-breakpoint) {
260
297
  .pa-toast-container {
261
- left: $spacing-md !important;
262
- right: $spacing-md !important;
298
+ inset-inline: $spacing-md !important; // RTL: full width on mobile
263
299
  transform: none !important;
264
300
 
265
- &--top-right,
266
- &--top-left,
301
+ &--top-end,
302
+ &--top-start,
267
303
  &--top-center {
268
304
  top: $spacing-md;
269
305
  }
270
306
 
271
- &--bottom-right,
272
- &--bottom-left,
307
+ &--bottom-end,
308
+ &--bottom-start,
273
309
  &--bottom-center {
274
310
  bottom: $spacing-md;
275
311
  }
@@ -48,7 +48,7 @@
48
48
  // Multiline tooltip variant
49
49
  &--multiline::before {
50
50
  white-space: normal;
51
- text-align: left;
51
+ text-align: start; // RTL: flips to right
52
52
  width: $tooltip-multiline-width;
53
53
  max-width: $tooltip-multiline-width;
54
54
  line-height: $line-height-base;
@@ -414,7 +414,7 @@
414
414
  font-size: $font-size-sm;
415
415
  line-height: $line-height-base;
416
416
  color: var(--pa-text-color-1);
417
- text-align: left; // Reset inherited alignment for rich content
417
+ text-align: start; // RTL: flips to right
418
418
 
419
419
  p {
420
420
  margin: 0 0 $spacing-sm 0;
@@ -435,7 +435,7 @@
435
435
 
436
436
  ul, ol {
437
437
  margin: $spacing-sm 0;
438
- padding-left: $spacing-lg;
438
+ padding-inline-start: $spacing-lg; // RTL: flips to padding-right
439
439
  }
440
440
 
441
441
  code {
@@ -485,11 +485,16 @@
485
485
  text-align: center;
486
486
  }
487
487
 
488
- &--right &__body {
489
- text-align: right;
488
+ &--end &__body {
489
+ text-align: end; // RTL: flips to left
490
490
  }
491
491
  }
492
492
 
493
+ // Legacy class for backward compatibility
494
+ .pa-popover--right .pa-popover__body {
495
+ text-align: end;
496
+ }
497
+
493
498
  // ========================================
494
499
  // Floating UI Tooltip (Portal Rendering)
495
500
  // ========================================
@@ -510,7 +515,7 @@
510
515
  // Multiline variant
511
516
  &.pa-tooltip--multiline {
512
517
  white-space: normal;
513
- text-align: left;
518
+ text-align: start; // RTL: flips to right
514
519
  max-width: $tooltip-multiline-max-width;
515
520
  }
516
521
 
@@ -5,45 +5,24 @@
5
5
  @use '../variables' as *;
6
6
 
7
7
  // Font size classes - Apply to <html> element for proportional scaling of all rem units
8
+ // These use absolute px values because rem would be calculated against browser default (16px),
9
+ // not the framework's 10px base. Scaling the html font-size scales all rem values proportionally.
8
10
  // Example: document.documentElement.classList.add('font-size-large');
9
- html.font-size-2xs {
10
- font-size: $font-size-2xs;
11
- }
12
-
13
- html.font-size-xs {
14
- font-size: $font-size-xs;
15
- }
16
11
 
17
12
  html.font-size-small {
18
- font-size: $font-size-sm;
19
- }
20
-
21
- html.font-size-medium {
22
- font-size: $font-size-md;
13
+ font-size: 9px; // ~14px body text (9 * 1.6 = 14.4px)
23
14
  }
24
15
 
25
16
  html.font-size-default {
26
- font-size: $font-size-base;
17
+ font-size: 10px; // 16px body text (default, same as html base)
27
18
  }
28
19
 
29
20
  html.font-size-large {
30
- font-size: $font-size-lg;
21
+ font-size: 11px; // ~18px body text (11 * 1.6 = 17.6px)
31
22
  }
32
23
 
33
24
  html.font-size-xlarge {
34
- font-size: $font-size-xl;
35
- }
36
-
37
- html.font-size-2xl {
38
- font-size: $font-size-2xl;
39
- }
40
-
41
- html.font-size-3xl {
42
- font-size: $font-size-3xl;
43
- }
44
-
45
- html.font-size-4xl {
46
- font-size: $font-size-4xl;
25
+ font-size: 12px; // ~19px body text (12 * 1.6 = 19.2px)
47
26
  }
48
27
 
49
28
  // Font family utilities
@@ -186,17 +165,26 @@ html.font-size-4xl {
186
165
  color: var(--pa-text-color-2);
187
166
  }
188
167
 
189
- // Alignment modifiers
190
- &--left {
191
- text-align: left;
168
+ // Alignment modifiers (logical properties for RTL support)
169
+ &--start {
170
+ text-align: start; // RTL: flips to right
192
171
  }
193
172
 
194
173
  &--center {
195
174
  text-align: center;
196
175
  }
197
176
 
177
+ &--end {
178
+ text-align: end; // RTL: flips to left
179
+ }
180
+
181
+ // Legacy aliases for backward compatibility
182
+ &--left {
183
+ text-align: start;
184
+ }
185
+
198
186
  &--right {
199
- text-align: right;
187
+ text-align: end;
200
188
  }
201
189
 
202
190
  // Semantic variants (compound styles)
@@ -322,3 +310,40 @@ html.font-size-4xl {
322
310
  .pa-border-color-#{$i} { border-color: var(--pa-color-#{$i}); }
323
311
  }
324
312
 
313
+ // ========================================
314
+ // Logical Spacing Utilities (RTL-aware)
315
+ // ms = margin-inline-start, me = margin-inline-end
316
+ // ps = padding-inline-start, pe = padding-inline-end
317
+ // ========================================
318
+
319
+ // Margin inline-start (ms-*) - RTL: flips to margin-right
320
+ @each $name, $value in $semantic-spacers {
321
+ .ms-#{$name} { margin-inline-start: #{$value}; }
322
+ }
323
+ .ms-auto { margin-inline-start: auto; }
324
+
325
+ // Margin inline-end (me-*) - RTL: flips to margin-left
326
+ @each $name, $value in $semantic-spacers {
327
+ .me-#{$name} { margin-inline-end: #{$value}; }
328
+ }
329
+ .me-auto { margin-inline-end: auto; }
330
+
331
+ // Padding inline-start (ps-*) - RTL: flips to padding-right
332
+ @each $name, $value in $semantic-spacers {
333
+ .ps-#{$name} { padding-inline-start: #{$value}; }
334
+ }
335
+
336
+ // Padding inline-end (pe-*) - RTL: flips to padding-left
337
+ @each $name, $value in $semantic-spacers {
338
+ .pe-#{$name} { padding-inline-end: #{$value}; }
339
+ }
340
+
341
+ // Text alignment utilities (RTL-aware)
342
+ .text-start { text-align: start; } // RTL: flips to right
343
+ .text-center { text-align: center; }
344
+ .text-end { text-align: end; } // RTL: flips to left
345
+
346
+ // Legacy text alignment (maps to logical properties)
347
+ .text-left { text-align: start; }
348
+ .text-right { text-align: end; }
349
+