@duskmoon-dev/core 1.19.3 → 1.19.5

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 (121) hide show
  1. package/README.md +1 -1
  2. package/dist/base.css +484 -0
  3. package/dist/components/accordion.css +33 -9
  4. package/dist/components/alert.css +81 -3
  5. package/dist/components/autocomplete.css +67 -13
  6. package/dist/components/avatar.css +39 -15
  7. package/dist/components/badge.css +15 -3
  8. package/dist/components/card.css +12 -0
  9. package/dist/components/carousel.css +28 -0
  10. package/dist/components/chat.css +15 -11
  11. package/dist/components/checkbox.css +83 -13
  12. package/dist/components/collapse.css +67 -16
  13. package/dist/components/countdown.css +22 -0
  14. package/dist/components/datepicker.css +76 -0
  15. package/dist/components/diff.css +33 -0
  16. package/dist/components/file-input.css +107 -0
  17. package/dist/components/filter-group.css +452 -0
  18. package/dist/components/form-group.css +95 -204
  19. package/dist/components/form.css +1551 -421
  20. package/dist/components/index.css +6248 -5799
  21. package/dist/components/input.css +114 -31
  22. package/dist/components/kbd.css +28 -0
  23. package/dist/components/list.css +22 -3
  24. package/dist/components/loading.css +105 -0
  25. package/dist/components/modal.css +62 -1
  26. package/dist/components/otp-input.css +124 -6
  27. package/dist/components/progress.css +74 -0
  28. package/dist/components/radial-progress.css +47 -0
  29. package/dist/components/radio.css +70 -0
  30. package/dist/components/range.css +41 -0
  31. package/dist/components/rating.css +39 -12
  32. package/dist/components/select.css +74 -0
  33. package/dist/components/skeleton.css +13 -1
  34. package/dist/components/snackbar.css +48 -18
  35. package/dist/components/stat.css +40 -0
  36. package/dist/components/switch.css +70 -0
  37. package/dist/components/table.css +8 -0
  38. package/dist/components/textarea.css +74 -0
  39. package/dist/components/timeline.css +40 -25
  40. package/dist/components/toast.css +188 -34
  41. package/dist/components/toggle-switch.css +165 -0
  42. package/dist/components/toggle.css +198 -32
  43. package/dist/components/tooltip.css +2 -47
  44. package/dist/components/validator.css +66 -0
  45. package/dist/effects/aura.css +22 -0
  46. package/dist/effects/hover-3d.css +8 -0
  47. package/dist/effects/hover-gallery.css +14 -0
  48. package/dist/effects/index.css +65 -0
  49. package/dist/effects/text-rotate.css +16 -0
  50. package/dist/esm/components/accordion.js +33 -9
  51. package/dist/esm/components/alert.js +81 -3
  52. package/dist/esm/components/autocomplete.js +67 -13
  53. package/dist/esm/components/avatar.js +39 -15
  54. package/dist/esm/components/badge.js +15 -3
  55. package/dist/esm/components/card.js +12 -0
  56. package/dist/esm/components/carousel.d.ts +5 -0
  57. package/dist/esm/components/carousel.js +37 -0
  58. package/dist/esm/components/chat.js +15 -11
  59. package/dist/esm/components/checkbox.js +84 -14
  60. package/dist/esm/components/collapse.js +67 -16
  61. package/dist/esm/components/countdown.d.ts +5 -0
  62. package/dist/esm/components/countdown.js +31 -0
  63. package/dist/esm/components/datepicker.js +77 -1
  64. package/dist/esm/components/diff.d.ts +5 -0
  65. package/dist/esm/components/diff.js +42 -0
  66. package/dist/esm/components/file-input.d.ts +5 -0
  67. package/dist/esm/components/file-input.js +116 -0
  68. package/dist/esm/components/filter-group.d.ts +5 -0
  69. package/dist/esm/components/filter-group.js +461 -0
  70. package/dist/esm/components/form-group.js +96 -205
  71. package/dist/esm/components/form.js +1539 -409
  72. package/dist/esm/components/input.js +115 -32
  73. package/dist/esm/components/kbd.d.ts +5 -0
  74. package/dist/esm/components/kbd.js +37 -0
  75. package/dist/esm/components/list.js +22 -3
  76. package/dist/esm/components/loading.d.ts +5 -0
  77. package/dist/esm/components/loading.js +114 -0
  78. package/dist/esm/components/modal.js +62 -1
  79. package/dist/esm/components/otp-input.js +125 -7
  80. package/dist/esm/components/progress.js +74 -0
  81. package/dist/esm/components/radial-progress.d.ts +5 -0
  82. package/dist/esm/components/radial-progress.js +56 -0
  83. package/dist/esm/components/radio.js +71 -1
  84. package/dist/esm/components/range.d.ts +5 -0
  85. package/dist/esm/components/range.js +50 -0
  86. package/dist/esm/components/rating.js +39 -12
  87. package/dist/esm/components/select.js +75 -1
  88. package/dist/esm/components/skeleton.js +13 -1
  89. package/dist/esm/components/snackbar.js +48 -18
  90. package/dist/esm/components/stat.d.ts +5 -0
  91. package/dist/esm/components/stat.js +49 -0
  92. package/dist/esm/components/switch.js +71 -1
  93. package/dist/esm/components/table.js +8 -0
  94. package/dist/esm/components/textarea.js +75 -1
  95. package/dist/esm/components/timeline.js +40 -25
  96. package/dist/esm/components/toast.js +188 -34
  97. package/dist/esm/components/toggle-switch.d.ts +5 -0
  98. package/dist/esm/components/toggle-switch.js +174 -0
  99. package/dist/esm/components/toggle.js +198 -32
  100. package/dist/esm/components/tooltip.js +2 -47
  101. package/dist/esm/components/validator.d.ts +5 -0
  102. package/dist/esm/components/validator.js +75 -0
  103. package/dist/esm/effects/aura.d.ts +5 -0
  104. package/dist/esm/effects/aura.js +31 -0
  105. package/dist/esm/effects/hover-3d.d.ts +5 -0
  106. package/dist/esm/effects/hover-3d.js +17 -0
  107. package/dist/esm/effects/hover-gallery.d.ts +5 -0
  108. package/dist/esm/effects/hover-gallery.js +23 -0
  109. package/dist/esm/effects/index.d.ts +5 -0
  110. package/dist/esm/effects/index.js +74 -0
  111. package/dist/esm/effects/text-rotate.d.ts +5 -0
  112. package/dist/esm/effects/text-rotate.js +25 -0
  113. package/dist/index.css +7652 -7204
  114. package/dist/index.min.css +1 -1
  115. package/dist/standalone/duskmoonui-themes.css +1 -1
  116. package/dist/standalone/duskmoonui.css +7598 -7141
  117. package/dist/standalone/duskmoonui.js +18 -16
  118. package/dist/standalone/duskmoonui.mjs +18 -16
  119. package/dist/types/types/plugin.d.ts +1 -1
  120. package/dist/types/types/plugin.d.ts.map +1 -1
  121. package/package.json +110 -1
@@ -1,3 +1,71 @@
1
+ /** Opt-in native presentation. Applications own errors, messages and announcements. */
2
+ @layer components {
3
+ /* Compatibility wrapper states are intentionally immediate. */
4
+ :is(.form-group-info, .form-control.info) { --dm-validation-color: var(--color-info); }
5
+ :is(.form-group-warning, .form-control.warning) { --dm-validation-color: var(--color-warning); }
6
+ :is(.form-group-success, .form-control.success) { --dm-validation-color: var(--color-success); }
7
+
8
+ :is(.input, .select, .textarea, .checkbox, .radio, .switch, .toggle, .file-input, .otp-input-field, .otp-code, .datepicker-input):is(.validate :valid, .validate:valid, .validator.validator-success:user-valid):not([aria-invalid="true"]):not(:where(.form-group-error *, .form-control.error *)):not(:disabled) {
9
+ --dm-validation-color: var(--color-success);
10
+ --dm-validation-content: var(--color-success-content);
11
+ }
12
+
13
+ :is(.input, .select, .textarea, .checkbox, .radio, .switch, .toggle, .file-input, .otp-input-field, .otp-code, .datepicker-input):is(.validate :invalid, .validate:invalid, .validator:user-invalid):not(:disabled) {
14
+ --dm-validation-color: var(--color-error);
15
+ --dm-validation-content: var(--color-error-content);
16
+ }
17
+
18
+ :is(.form-group-error, .form-control.error) {
19
+ --dm-validation-color: var(--color-error);
20
+ --dm-validation-content: var(--color-error-content);
21
+ }
22
+
23
+ /* Higher specificity than native states, including server-invalid + user-valid. */
24
+ :is(.input, .select, .textarea, .checkbox, .radio, .switch, .toggle, .file-input, .otp-input-field, .otp-code, .datepicker-input):is([aria-invalid="true"], .form-group-error *, .form-control.error *):not(:disabled):is(:focus, :not(:focus)) {
25
+ --dm-validation-color: var(--color-error);
26
+ --dm-validation-content: var(--color-error-content);
27
+ }
28
+
29
+ /* This shared selector wins over filled/ghost focus and semantic modifiers. */
30
+ :is(.input, .select, .textarea, .checkbox, .radio, .switch, .toggle, .file-input, .otp-input-field, .otp-code, .datepicker-input):is([aria-invalid="true"], .validator:user-invalid, .validator.validator-success:user-valid, .validate :invalid, .validate :valid, .validate:invalid, .validate:valid, .form-group-error *, .form-group-success *, .form-group-warning *, .form-group-info *, .form-control.error *, .form-control.success *, .form-control.warning *, .form-control.info *):not(:disabled) {
31
+ color: var(--dm-validation-color);
32
+ border-color: var(--dm-validation-color);
33
+ --checkbox-color: var(--dm-validation-color);
34
+ --radio-color: var(--dm-validation-color);
35
+ --switch-color: var(--dm-validation-color);
36
+ --switch-content-color: var(--dm-validation-content, var(--color-primary-content));
37
+ --toggle-color: var(--dm-validation-color);
38
+ }
39
+
40
+ :is(.input, .select, .textarea, .checkbox, .radio, .switch, .toggle, .file-input, .otp-input-field, .otp-code, .datepicker-input):is([aria-invalid="true"], .validator:user-invalid, .validator.validator-success:user-valid, .validate :invalid, .validate :valid, .validate:invalid, .validate:valid, .form-group-error *, .form-group-success *, .form-group-warning *, .form-group-info *, .form-control.error *, .form-control.success *, .form-control.warning *, .form-control.info *):not(:disabled):focus {
41
+ border-color: var(--dm-validation-color);
42
+ box-shadow: 0 0 0 3px color-mix(in oklch, var(--dm-validation-color) 20%, transparent);
43
+ }
44
+
45
+ :is(.form-group-error, .form-control.error) :is(.form-label, .label-text) { color: var(--color-error); }
46
+ :is(.form-group-success, .form-control.success) :is(.form-label, .label-text) { color: var(--color-success); }
47
+ :is(.form-group-warning, .form-control.warning) :is(.form-label, .label-text) { color: var(--color-warning); }
48
+ :is(.form-group-info, .form-control.info) :is(.form-label, .label-text) { color: var(--color-info); }
49
+
50
+ .validator-hint { font-size: 0.75rem; color: var(--color-on-surface-variant); }
51
+ .validator-error { display: none; font-size: 0.75rem; color: var(--color-error); }
52
+ /* Keep OTP actions stationary when blur reveals an error during a click. */
53
+ .otp-code ~ .validator-error { display: block; visibility: hidden; }
54
+ :is(.form-group, .form-control):has(:is([aria-invalid="true"], .validator:user-invalid, .validate :invalid, .validate:invalid):not(:disabled)) > .validator-error,
55
+ :is(.form-group-error, .form-control.error) > .validator-error { display: block; visibility: visible; }
56
+
57
+ @media (forced-colors: active) {
58
+ :is(input, select, textarea):is(.input, .select, .textarea, .checkbox, .radio, .switch, .toggle, .file-input, .otp-input-field, .otp-code, .datepicker-input):focus-visible {
59
+ outline: 2px solid Highlight;
60
+ outline-offset: 2px;
61
+ }
62
+ input:is(.checkbox, .radio, .switch, .toggle) { appearance: auto; }
63
+ input:is(.checkbox, .radio, .switch, .toggle)::before,
64
+ input:is(.checkbox, .radio, .switch, .toggle)::after { content: none; }
65
+ }
66
+ }
67
+
68
+
1
69
  /**
2
70
  * Switch Component Styles
3
71
  * DuskMoonUI - Material Design 3 inspired switch/toggle
@@ -7,6 +75,8 @@
7
75
  */
8
76
 
9
77
  @layer components {
78
+ :where(.switch) { box-sizing: border-box; }
79
+
10
80
  /* Base Switch - applied directly to input[type="checkbox"] */
11
81
  .switch {
12
82
  --switch-width: 3.25rem;
@@ -171,6 +171,8 @@
171
171
  /* Selected Row */
172
172
  .table-row-selected,
173
173
  .table tr.selected,
174
+ .table-hover tbody tr:is(.selected, .table-row-selected),
175
+ .table-hover .table-row:is(.selected, .table-row-selected),
174
176
  .table-selectable tbody tr.table-row-selected,
175
177
  .table-selectable .table-row.table-row-selected,
176
178
  .table-selectable tbody tr.selected,
@@ -179,6 +181,12 @@
179
181
  color: var(--color-on-primary-container);
180
182
  }
181
183
 
184
+ .table-numeric { text-align: end; font-variant-numeric: tabular-nums; }
185
+ .table-center { text-align: center; }
186
+ .table-actions { white-space: nowrap; text-align: end; }
187
+ .table-checkbox { inline-size: 1%; }
188
+ .table-sort-icon { display: inline-block; margin-inline-start: 0.25rem; }
189
+
182
190
  /* Clickable Row */
183
191
  .table-row-clickable,
184
192
  .table tbody tr[data-href] {
@@ -1,9 +1,79 @@
1
+ /** Opt-in native presentation. Applications own errors, messages and announcements. */
2
+ @layer components {
3
+ /* Compatibility wrapper states are intentionally immediate. */
4
+ :is(.form-group-info, .form-control.info) { --dm-validation-color: var(--color-info); }
5
+ :is(.form-group-warning, .form-control.warning) { --dm-validation-color: var(--color-warning); }
6
+ :is(.form-group-success, .form-control.success) { --dm-validation-color: var(--color-success); }
7
+
8
+ :is(.input, .select, .textarea, .checkbox, .radio, .switch, .toggle, .file-input, .otp-input-field, .otp-code, .datepicker-input):is(.validate :valid, .validate:valid, .validator.validator-success:user-valid):not([aria-invalid="true"]):not(:where(.form-group-error *, .form-control.error *)):not(:disabled) {
9
+ --dm-validation-color: var(--color-success);
10
+ --dm-validation-content: var(--color-success-content);
11
+ }
12
+
13
+ :is(.input, .select, .textarea, .checkbox, .radio, .switch, .toggle, .file-input, .otp-input-field, .otp-code, .datepicker-input):is(.validate :invalid, .validate:invalid, .validator:user-invalid):not(:disabled) {
14
+ --dm-validation-color: var(--color-error);
15
+ --dm-validation-content: var(--color-error-content);
16
+ }
17
+
18
+ :is(.form-group-error, .form-control.error) {
19
+ --dm-validation-color: var(--color-error);
20
+ --dm-validation-content: var(--color-error-content);
21
+ }
22
+
23
+ /* Higher specificity than native states, including server-invalid + user-valid. */
24
+ :is(.input, .select, .textarea, .checkbox, .radio, .switch, .toggle, .file-input, .otp-input-field, .otp-code, .datepicker-input):is([aria-invalid="true"], .form-group-error *, .form-control.error *):not(:disabled):is(:focus, :not(:focus)) {
25
+ --dm-validation-color: var(--color-error);
26
+ --dm-validation-content: var(--color-error-content);
27
+ }
28
+
29
+ /* This shared selector wins over filled/ghost focus and semantic modifiers. */
30
+ :is(.input, .select, .textarea, .checkbox, .radio, .switch, .toggle, .file-input, .otp-input-field, .otp-code, .datepicker-input):is([aria-invalid="true"], .validator:user-invalid, .validator.validator-success:user-valid, .validate :invalid, .validate :valid, .validate:invalid, .validate:valid, .form-group-error *, .form-group-success *, .form-group-warning *, .form-group-info *, .form-control.error *, .form-control.success *, .form-control.warning *, .form-control.info *):not(:disabled) {
31
+ color: var(--dm-validation-color);
32
+ border-color: var(--dm-validation-color);
33
+ --checkbox-color: var(--dm-validation-color);
34
+ --radio-color: var(--dm-validation-color);
35
+ --switch-color: var(--dm-validation-color);
36
+ --switch-content-color: var(--dm-validation-content, var(--color-primary-content));
37
+ --toggle-color: var(--dm-validation-color);
38
+ }
39
+
40
+ :is(.input, .select, .textarea, .checkbox, .radio, .switch, .toggle, .file-input, .otp-input-field, .otp-code, .datepicker-input):is([aria-invalid="true"], .validator:user-invalid, .validator.validator-success:user-valid, .validate :invalid, .validate :valid, .validate:invalid, .validate:valid, .form-group-error *, .form-group-success *, .form-group-warning *, .form-group-info *, .form-control.error *, .form-control.success *, .form-control.warning *, .form-control.info *):not(:disabled):focus {
41
+ border-color: var(--dm-validation-color);
42
+ box-shadow: 0 0 0 3px color-mix(in oklch, var(--dm-validation-color) 20%, transparent);
43
+ }
44
+
45
+ :is(.form-group-error, .form-control.error) :is(.form-label, .label-text) { color: var(--color-error); }
46
+ :is(.form-group-success, .form-control.success) :is(.form-label, .label-text) { color: var(--color-success); }
47
+ :is(.form-group-warning, .form-control.warning) :is(.form-label, .label-text) { color: var(--color-warning); }
48
+ :is(.form-group-info, .form-control.info) :is(.form-label, .label-text) { color: var(--color-info); }
49
+
50
+ .validator-hint { font-size: 0.75rem; color: var(--color-on-surface-variant); }
51
+ .validator-error { display: none; font-size: 0.75rem; color: var(--color-error); }
52
+ /* Keep OTP actions stationary when blur reveals an error during a click. */
53
+ .otp-code ~ .validator-error { display: block; visibility: hidden; }
54
+ :is(.form-group, .form-control):has(:is([aria-invalid="true"], .validator:user-invalid, .validate :invalid, .validate:invalid):not(:disabled)) > .validator-error,
55
+ :is(.form-group-error, .form-control.error) > .validator-error { display: block; visibility: visible; }
56
+
57
+ @media (forced-colors: active) {
58
+ :is(input, select, textarea):is(.input, .select, .textarea, .checkbox, .radio, .switch, .toggle, .file-input, .otp-input-field, .otp-code, .datepicker-input):focus-visible {
59
+ outline: 2px solid Highlight;
60
+ outline-offset: 2px;
61
+ }
62
+ input:is(.checkbox, .radio, .switch, .toggle) { appearance: auto; }
63
+ input:is(.checkbox, .radio, .switch, .toggle)::before,
64
+ input:is(.checkbox, .radio, .switch, .toggle)::after { content: none; }
65
+ }
66
+ }
67
+
68
+
1
69
  /**
2
70
  * Textarea Component Styles
3
71
  * DuskMoonUI - Material Design 3 inspired multi-line text input
4
72
  */
5
73
 
6
74
  @layer components {
75
+ :where(.textarea) { box-sizing: border-box; }
76
+
7
77
  /* ============================================
8
78
  * TEXTAREA CONTAINER
9
79
  * ============================================ */
@@ -217,6 +287,10 @@
217
287
  * SIZE VARIANTS
218
288
  * ============================================ */
219
289
 
290
+ .textarea-xs { min-height: 3rem; padding: 0.375rem 0.625rem; font-size: 0.75rem; line-height: 1rem; }
291
+ .textarea-md { min-height: 6rem; }
292
+ .textarea-bordered { border-color: var(--color-outline); }
293
+
220
294
  .textarea-sm {
221
295
  min-height: 4rem;
222
296
  padding: 0.5rem 0.75rem;
@@ -17,7 +17,7 @@
17
17
  content: '';
18
18
  position: absolute;
19
19
  top: 0;
20
- left: 1.25rem;
20
+ inset-inline-start: 1.25rem;
21
21
  width: 2px;
22
22
  height: 100%;
23
23
  background-color: var(--color-outline-variant);
@@ -64,6 +64,7 @@
64
64
 
65
65
  /* Timeline Content */
66
66
  .timeline-content {
67
+ overflow-wrap: anywhere;
67
68
  flex: 1;
68
69
  padding-top: 0.375rem;
69
70
  min-width: 0;
@@ -163,9 +164,18 @@
163
164
  background-color: var(--color-primary-content);
164
165
  }
165
166
 
167
+ .timeline-marker-secondary { border-color: var(--color-secondary); background: var(--color-secondary-container); }
168
+ .timeline-marker-tertiary { border-color: var(--color-tertiary); background: var(--color-tertiary-container); }
169
+ .timeline-marker-success { border-color: var(--color-success); background: var(--color-success-container); }
170
+ .timeline-marker-error { border-color: var(--color-error); background: var(--color-error-container); }
171
+ .timeline-item-active > .timeline-marker { border-color: var(--color-primary); background: var(--color-primary-container); }
172
+ .timeline-item-pending > .timeline-marker { border-style: dashed; }
173
+ .timeline-compact > .timeline-item { padding-block-end: 0.75rem; gap: 0.5rem; }
174
+ .timeline-content-card { padding: 1rem; border: 1px solid var(--color-outline-variant); border-radius: var(--radius-md); background: var(--color-surface-container); box-shadow: var(--shadow-sm); }
175
+
166
176
  /* Size Variants */
167
177
  .timeline-sm::before {
168
- left: 0.75rem;
178
+ inset-inline-start: 0.75rem;
169
179
  }
170
180
 
171
181
  .timeline-sm .timeline-marker {
@@ -183,7 +193,7 @@
183
193
  }
184
194
 
185
195
  .timeline-lg::before {
186
- left: 1.5rem;
196
+ inset-inline-start: 1.5rem;
187
197
  }
188
198
 
189
199
  .timeline-lg .timeline-marker {
@@ -197,38 +207,38 @@
197
207
 
198
208
  /* Alternate Layout (zigzag) */
199
209
  .timeline-alternate {
200
- padding-left: 0;
210
+ padding-inline-start: 0;
201
211
  }
202
212
 
203
213
  .timeline-alternate::before {
204
- left: 50%;
214
+ inset-inline-start: 50%;
205
215
  transform: translateX(-50%);
206
216
  }
207
217
 
208
218
  .timeline-alternate .timeline-item {
209
219
  width: 50%;
210
- padding-right: 2rem;
220
+ padding-inline-end: 2rem;
211
221
  }
212
222
 
213
223
  .timeline-alternate .timeline-item:nth-child(even) {
214
- margin-left: 50%;
215
- padding-right: 0;
216
- padding-left: 2rem;
224
+ margin-inline-start: 50%;
225
+ padding-inline-end: 0;
226
+ padding-inline-start: 2rem;
217
227
  flex-direction: row-reverse;
218
228
  }
219
229
 
220
230
  .timeline-alternate .timeline-item:nth-child(even) .timeline-content {
221
- text-align: right;
231
+ text-align: end;
222
232
  }
223
233
 
224
234
  .timeline-alternate .timeline-marker {
225
235
  position: absolute;
226
- left: 100%;
236
+ inset-inline-start: 100%;
227
237
  transform: translateX(-50%);
228
238
  }
229
239
 
230
240
  .timeline-alternate .timeline-item:nth-child(even) .timeline-marker {
231
- left: 0;
241
+ inset-inline-start: 0;
232
242
  transform: translateX(-50%);
233
243
  }
234
244
 
@@ -238,8 +248,8 @@
238
248
  }
239
249
 
240
250
  .timeline-right::before {
241
- left: auto;
242
- right: 1.25rem;
251
+ inset-inline-start: auto;
252
+ inset-inline-end: 1.25rem;
243
253
  }
244
254
 
245
255
  .timeline-right .timeline-item {
@@ -247,7 +257,7 @@
247
257
  }
248
258
 
249
259
  .timeline-right .timeline-content {
250
- text-align: right;
260
+ text-align: end;
251
261
  }
252
262
 
253
263
  /* Horizontal Timeline */
@@ -259,7 +269,7 @@
259
269
 
260
270
  .timeline-horizontal::before {
261
271
  top: 1.25rem;
262
- left: 0;
272
+ inset-inline-start: 0;
263
273
  width: 100%;
264
274
  height: 2px;
265
275
  }
@@ -267,12 +277,12 @@
267
277
  .timeline-horizontal .timeline-item {
268
278
  flex-direction: column;
269
279
  padding-bottom: 0;
270
- padding-right: 2rem;
280
+ padding-inline-end: 2rem;
271
281
  min-width: 10rem;
272
282
  }
273
283
 
274
284
  .timeline-horizontal .timeline-item:last-child {
275
- padding-right: 0;
285
+ padding-inline-end: 0;
276
286
  }
277
287
 
278
288
  .timeline-horizontal .timeline-content {
@@ -280,6 +290,9 @@
280
290
  text-align: center;
281
291
  }
282
292
 
293
+ .timeline-alternate:dir(rtl)::before,
294
+ .timeline-alternate:dir(rtl) .timeline-marker { transform: translateX(50%); }
295
+
283
296
  /* Collapsible Timeline */
284
297
  .timeline-collapsible .timeline-item {
285
298
  cursor: pointer;
@@ -318,28 +331,30 @@
318
331
 
319
332
  /* Responsive */
320
333
  @media (max-width: 640px) {
321
- .timeline-alternate::before {
322
- left: 1.25rem;
334
+ .timeline-alternate::before,
335
+ .timeline-alternate:dir(rtl)::before {
336
+ inset-inline-start: 1.25rem;
323
337
  transform: none;
324
338
  }
325
339
 
326
340
  .timeline-alternate .timeline-item,
327
341
  .timeline-alternate .timeline-item:nth-child(even) {
328
342
  width: 100%;
329
- margin-left: 0;
330
- padding-left: 0;
331
- padding-right: 0;
343
+ margin-inline-start: 0;
344
+ padding-inline-start: 0;
345
+ padding-inline-end: 0;
332
346
  flex-direction: row;
333
347
  }
334
348
 
335
349
  .timeline-alternate .timeline-item:nth-child(even) .timeline-content {
336
- text-align: left;
350
+ text-align: start;
337
351
  }
338
352
 
339
353
  .timeline-alternate .timeline-marker,
354
+ .timeline-alternate:dir(rtl) .timeline-marker,
340
355
  .timeline-alternate .timeline-item:nth-child(even) .timeline-marker {
341
356
  position: relative;
342
- left: 0;
357
+ inset-inline-start: 0;
343
358
  transform: none;
344
359
  }
345
360
  }