@pitchfork-ui/react 0.2.0 → 0.7.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 (70) hide show
  1. package/dist/components/Accordion/Accordion.css +85 -0
  2. package/dist/components/Accordion/Accordion2.js +96 -0
  3. package/dist/components/Alert/Alert.css +29 -1
  4. package/dist/components/Alert/Alert2.js +4 -2
  5. package/dist/components/Avatar/Avatar.css +1 -1
  6. package/dist/components/BadgeGroup/BadgeGroup.css +4 -4
  7. package/dist/components/Button/Button.css +4 -4
  8. package/dist/components/ButtonGroup/ButtonGroup.css +2 -2
  9. package/dist/components/Carousel/Carousel.css +4 -2
  10. package/dist/components/Carousel/Carousel2.js +89 -76
  11. package/dist/components/CodeSnippet/CodeSnippet.css +2 -2
  12. package/dist/components/ContentDivider/ContentDivider.css +2 -2
  13. package/dist/components/DatePicker/DatePicker.css +1 -1
  14. package/dist/components/DatePicker/DatePicker2.js +3 -3
  15. package/dist/components/Dropdown/Dropdown.css +19 -2
  16. package/dist/components/Dropdown/Dropdown2.js +2 -3
  17. package/dist/components/GaugeChart/GaugeChart.css +18 -1
  18. package/dist/components/GaugeChart/GaugeChart2.js +5 -4
  19. package/dist/components/Heatmap/Heatmap.css +104 -0
  20. package/dist/components/Heatmap/Heatmap2.js +160 -0
  21. package/dist/components/InlineCTA/InlineCTA.css +58 -0
  22. package/dist/components/InlineCTA/InlineCTA2.js +14 -2
  23. package/dist/components/Modal/Modal.css +62 -0
  24. package/dist/components/Modal/Modal2.js +8 -6
  25. package/dist/components/MultiSelect/MultiSelect.css +19 -2
  26. package/dist/components/MultiSelect/MultiSelect2.js +3 -4
  27. package/dist/components/Notification/Notification.css +59 -4
  28. package/dist/components/Notification/Notification2.js +4 -2
  29. package/dist/components/Pagination/Pagination.css +5 -2
  30. package/dist/components/PieChart/PieChart.css +34 -0
  31. package/dist/components/PieChart/PieChart2.js +1 -1
  32. package/dist/components/ProgressIndicators/ProgressIndicators.css +20 -2
  33. package/dist/components/ProgressIndicators/ProgressIndicators2.js +4 -1
  34. package/dist/components/ProgressSteps/ProgressSteps.css +20 -3
  35. package/dist/components/RadarChart/RadarChart.css +22 -0
  36. package/dist/components/RadarChart/RadarChart2.js +19 -13
  37. package/dist/components/RichTextEditor/RichTextEditor.css +1 -1
  38. package/dist/components/Select/Select.css +21 -2
  39. package/dist/components/Select/Select2.js +3 -4
  40. package/dist/components/SidebarNavigation/SidebarNavigation.css +1 -1
  41. package/dist/components/SlideoutMenu/SlideoutMenu.css +2 -2
  42. package/dist/components/Sparkline/Sparkline.css +48 -0
  43. package/dist/components/Sparkline/Sparkline2.js +3 -2
  44. package/dist/components/Table/Table.css +4 -4
  45. package/dist/components/Tabs/Tabs.css +31 -5
  46. package/dist/components/Tabs/Tabs2.js +51 -4
  47. package/dist/components/Tag/Tag.css +1 -1
  48. package/dist/components/Tooltip/Tooltip.css +35 -0
  49. package/dist/components/Tooltip/Tooltip2.js +4 -4
  50. package/dist/components/TreeView/TreeView.css +2 -2
  51. package/dist/hooks/useExitAnimation.js +25 -0
  52. package/dist/hooks/usePresence.js +31 -0
  53. package/dist/index.cjs +834 -454
  54. package/dist/index.js +12 -8
  55. package/dist/src/components/Accordion/Accordion.d.ts +20 -0
  56. package/dist/src/components/Accordion/Accordion.test.d.ts +1 -0
  57. package/dist/src/components/Accordion/index.d.ts +1 -0
  58. package/dist/src/components/Heatmap/Heatmap.d.ts +28 -0
  59. package/dist/src/components/Heatmap/Heatmap.test.d.ts +1 -0
  60. package/dist/src/components/Heatmap/index.d.ts +1 -0
  61. package/dist/src/components/InlineCTA/InlineCTA.d.ts +2 -0
  62. package/dist/src/components/Sparkline/Sparkline.d.ts +2 -0
  63. package/dist/src/hooks/index.d.ts +2 -0
  64. package/dist/src/hooks/useExitAnimation.d.ts +18 -0
  65. package/dist/src/hooks/usePresence.d.ts +13 -0
  66. package/dist/src/index.d.ts +2 -0
  67. package/dist/styles/theme.css +47 -13
  68. package/dist/styles.css +767 -66
  69. package/package.json +1 -1
  70. package/theme.starter.css +4 -3
package/dist/styles.css CHANGED
@@ -15,16 +15,16 @@
15
15
  --color-gray-700: #334155;
16
16
  --color-gray-800: #1e293b;
17
17
  --color-gray-900: #0f172a;
18
- --color-brand-50: #eff6ff;
19
- --color-brand-100: #dbeafe;
20
- --color-brand-200: #bfdbfe;
21
- --color-brand-300: #93c5fd;
22
- --color-brand-400: #60a5fa;
23
- --color-brand-500: #3b82f6;
24
- --color-brand-600: #2563eb;
25
- --color-brand-700: #1d4ed8;
26
- --color-brand-800: #1e40af;
27
- --color-brand-900: #1e3a8a;
18
+ --color-brand-50: #eef2ff;
19
+ --color-brand-100: #e0e7ff;
20
+ --color-brand-200: #c7d2fe;
21
+ --color-brand-300: #a5b4fc;
22
+ --color-brand-400: #818cf8;
23
+ --color-brand-500: #6366f1;
24
+ --color-brand-600: #4f46e5;
25
+ --color-brand-700: #4338ca;
26
+ --color-brand-800: #3730a3;
27
+ --color-brand-900: #312e81;
28
28
  --color-success-50: #ecfdf3;
29
29
  --color-success-100: #d1fadf;
30
30
  --color-success-200: #a6f4c5;
@@ -55,6 +55,12 @@
55
55
  --color-danger-700: #b42318;
56
56
  --color-danger-800: #912018;
57
57
  --color-danger-900: #7a271a;
58
+ --duration-fast: 120ms;
59
+ --duration-moderate: 180ms;
60
+ --duration-slow: 280ms;
61
+ --easing-standard: cubic-bezier(0.4, 0, 0.2, 1);
62
+ --easing-decelerate: cubic-bezier(0, 0, 0.2, 1);
63
+ --easing-accelerate: cubic-bezier(0.4, 0, 1, 1);
58
64
  --shadow-sm: 0 1px 2px rgb(15 23 42 / 0.08);
59
65
  --shadow-md: 0 8px 24px rgb(15 23 42 / 0.12);
60
66
  --shadow-lg: 0 18px 48px rgb(15 23 42 / 0.16);
@@ -85,7 +91,7 @@
85
91
  --size-icon-sm: 1rem;
86
92
  --size-icon-md: 1.25rem;
87
93
  --size-icon-lg: 1.5rem;
88
- --font-family-sans: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
94
+ --font-family-sans: Geist, Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
89
95
  --font-size-2xs: 0.6875rem;
90
96
  --font-size-xs: 0.75rem;
91
97
  --font-size-sm: 0.875rem;
@@ -148,8 +154,13 @@
148
154
  --pf-focus-ring: 0 0 0 var(--pf-focus-ring-width)
149
155
  color-mix(in srgb, var(--pf-focus-ring-color) 35%, transparent);
150
156
  --pf-focus-outline: var(--pf-focus-ring-width) solid var(--pf-focus-ring-color);
151
- --pf-transition-fast: 120ms ease;
152
- --pf-transition-medium: 180ms ease;
157
+ /* Motion — durations and easings come from Style Dictionary (--duration-*, --easing-*) */
158
+ --pf-transition-fast: var(--duration-fast) var(--easing-standard);
159
+ --pf-transition-medium: var(--duration-moderate) var(--easing-standard);
160
+ --pf-transition-slow: var(--duration-slow) var(--easing-standard);
161
+ /* Directional easings for enter/exit animations */
162
+ --pf-transition-enter: var(--duration-moderate) var(--easing-decelerate);
163
+ --pf-transition-exit: var(--duration-fast) var(--easing-accelerate);
153
164
 
154
165
  /* Control aliases */
155
166
  --pf-control-height-sm: var(--size-control-sm, 36px);
@@ -361,6 +372,19 @@
361
372
  --pf-utility-btn-danger-text: var(--color-semantic-status-danger-foreground);
362
373
  --pf-utility-btn-danger-bg-hover: var(--color-danger-100);
363
374
 
375
+ /* Accordion aliases */
376
+ --pf-accordion-border: var(--color-semantic-border-default);
377
+ --pf-accordion-trigger-text: var(--color-semantic-text-default);
378
+ --pf-accordion-trigger-bg-hover: var(--color-semantic-background-subtle);
379
+ --pf-accordion-icon: var(--color-semantic-text-muted);
380
+ --pf-accordion-content-text: var(--color-semantic-text-muted);
381
+
382
+ /* Heatmap aliases */
383
+ --pf-heatmap-color: var(--color-semantic-action-primary);
384
+ --pf-heatmap-empty: var(--color-semantic-background-subtle);
385
+ --pf-heatmap-label-color: var(--color-semantic-text-muted);
386
+ --pf-heatmap-cell-radius: var(--radius-sm);
387
+
364
388
  /* GaugeChart aliases */
365
389
  --pf-gauge-color: var(--color-semantic-action-primary);
366
390
  --pf-gauge-track-color: var(--color-semantic-background-subtle);
@@ -400,6 +424,9 @@
400
424
  --pf-notification-text: var(--color-semantic-text-default);
401
425
  --pf-notification-text-muted: var(--color-semantic-text-muted);
402
426
  --pf-notification-bg-subtle: var(--color-semantic-background-subtle);
427
+ /* Surface the variant tints blend toward; white in light, a dark raised
428
+ surface in dark so cards stay dark and text keeps contrast. */
429
+ --pf-notification-mix-base: var(--color-base-white);
403
430
  --pf-notification-info-bg: var(--color-brand-50);
404
431
  --pf-notification-info-border: var(--color-brand-300);
405
432
  --pf-notification-info-icon: var(--color-brand-700);
@@ -697,6 +724,7 @@
697
724
  --color-semantic-status-danger-bright: var(--color-danger-400);
698
725
 
699
726
  /* Info state overrides — light brand colors (brand-50/100/300) are invisible on dark surfaces */
727
+ --pf-notification-mix-base: var(--color-semantic-background-raised);
700
728
  --pf-notification-info-bg: var(--color-brand-900);
701
729
  --pf-notification-info-border: var(--color-brand-700);
702
730
  --pf-notification-info-icon: var(--color-brand-300);
@@ -735,6 +763,12 @@
735
763
  /* GaugeChart — track uses background-subtle (gray-700) which is 1.72:1 against gray-900 */
736
764
  --pf-gauge-track-color: var(--color-semantic-border-strong);
737
765
 
766
+ /* ProgressSteps — semantic success bg shades flip in dark mode, so the marker
767
+ numbers need opposite text colors to keep ≥4.5:1.
768
+ complete: white on success-700 = 5.4:1; current: success-900 on success-300 = 6.4:1 */
769
+ --pf-progress-steps-complete-text: var(--color-base-white);
770
+ --pf-progress-steps-current-text: var(--color-success-900);
771
+
738
772
  /* TreeView — border-default (gray-700) is 1.73:1 against gray-900, fails WCAG non-text contrast.
739
773
  border-strong (gray-500) gives 3.75:1. */
740
774
  --pf-treeview-border: var(--color-semantic-border-strong);
@@ -783,6 +817,91 @@ body {
783
817
  vertical-align: var(--pf-icon-vertical-align, middle);
784
818
  color: var(--pf-icon-color, currentColor);
785
819
  }
820
+ .pf-accordion {
821
+ border: 1px solid var(--pf-accordion-border);
822
+ border-radius: var(--radius-md);
823
+ overflow: hidden;
824
+ }
825
+
826
+ .pf-accordion__item + .pf-accordion__item {
827
+ border-top: 1px solid var(--pf-accordion-border);
828
+ }
829
+
830
+ .pf-accordion__heading {
831
+ margin: 0;
832
+ font-size: inherit;
833
+ font-weight: inherit;
834
+ }
835
+
836
+ .pf-accordion__trigger {
837
+ align-items: center;
838
+ background: transparent;
839
+ border: 0;
840
+ color: var(--pf-accordion-trigger-text);
841
+ cursor: pointer;
842
+ display: flex;
843
+ font: inherit;
844
+ font-weight: var(--font-weight-medium);
845
+ gap: var(--space-3);
846
+ justify-content: space-between;
847
+ padding: var(--space-3) var(--space-4);
848
+ text-align: start;
849
+ width: 100%;
850
+ }
851
+
852
+ .pf-accordion__trigger:hover:not(:disabled) {
853
+ background: var(--pf-accordion-trigger-bg-hover);
854
+ }
855
+
856
+ .pf-accordion__trigger:focus-visible {
857
+ box-shadow: var(--pf-focus-ring);
858
+ outline: none;
859
+ }
860
+
861
+ .pf-accordion__trigger:disabled {
862
+ cursor: not-allowed;
863
+ opacity: 0.5;
864
+ }
865
+
866
+ .pf-accordion__icon {
867
+ align-items: center;
868
+ color: var(--pf-accordion-icon);
869
+ display: inline-flex;
870
+ flex-shrink: 0;
871
+ transition: transform var(--pf-transition-fast);
872
+ }
873
+
874
+ .pf-accordion__item--open .pf-accordion__icon {
875
+ transform: rotate(180deg);
876
+ }
877
+
878
+ /* Animate open/close height with the grid-template-rows 0fr → 1fr technique */
879
+ .pf-accordion__panel {
880
+ display: grid;
881
+ grid-template-rows: 0fr;
882
+ transition: grid-template-rows var(--pf-transition-medium);
883
+ }
884
+
885
+ .pf-accordion__panel--open {
886
+ grid-template-rows: 1fr;
887
+ }
888
+
889
+ .pf-accordion__content {
890
+ min-height: 0;
891
+ overflow: hidden;
892
+ color: var(--pf-accordion-content-text);
893
+ }
894
+
895
+ .pf-accordion__content-inner {
896
+ padding: 0 var(--space-4) var(--space-4);
897
+ }
898
+
899
+ @media (prefers-reduced-motion: reduce) {
900
+ .pf-accordion__panel,
901
+ .pf-accordion__icon {
902
+ transition: none;
903
+ }
904
+ }
786
905
  .pf-alert {
787
906
  align-items: flex-start;
788
907
  border: 1px solid var(--pf-alert-border);
@@ -858,7 +977,7 @@ body {
858
977
  display: inline-flex;
859
978
  font-size: var(--font-size-md);
860
979
  justify-content: center;
861
- margin-left: auto;
980
+ margin-inline-start: auto;
862
981
  padding: 0;
863
982
  }
864
983
 
@@ -866,6 +985,34 @@ body {
866
985
  box-shadow: var(--pf-alert-focus-ring, var(--pf-focus-ring));
867
986
  outline: none;
868
987
  }
988
+
989
+ /* Exit: fade and collapse so surrounding content reflows when dismissed. */
990
+ .pf-alert--exiting {
991
+ animation: pf-alert-out var(--duration-moderate) var(--easing-accelerate) forwards;
992
+ overflow: hidden;
993
+ pointer-events: none;
994
+ }
995
+
996
+ @keyframes pf-alert-out {
997
+ from {
998
+ opacity: 1;
999
+ max-height: 480px;
1000
+ }
1001
+ to {
1002
+ opacity: 0;
1003
+ max-height: 0;
1004
+ margin-top: 0;
1005
+ margin-bottom: 0;
1006
+ padding-top: 0;
1007
+ padding-bottom: 0;
1008
+ }
1009
+ }
1010
+
1011
+ @media (prefers-reduced-motion: reduce) {
1012
+ .pf-alert--exiting {
1013
+ animation: none;
1014
+ }
1015
+ }
869
1016
  .pf-avatar {
870
1017
  --pf-avatar-status-size: 10px;
871
1018
  --pf-avatar-status-offset: -2px;
@@ -943,7 +1090,7 @@ body {
943
1090
  top: var(--pf-avatar-status-offset);
944
1091
  height: var(--pf-avatar-status-size, 10px);
945
1092
  position: absolute;
946
- right: var(--pf-avatar-status-offset);
1093
+ inset-inline-end: var(--pf-avatar-status-offset);
947
1094
  width: var(--pf-avatar-status-size, 10px);
948
1095
  z-index: 1;
949
1096
  }
@@ -977,10 +1124,10 @@ body {
977
1124
  min-height: 40px;
978
1125
  text-decoration: none;
979
1126
  transition:
980
- background-color 120ms ease,
981
- border-color 120ms ease,
982
- color 120ms ease,
983
- box-shadow 120ms ease;
1127
+ background-color var(--pf-transition-fast),
1128
+ border-color var(--pf-transition-fast),
1129
+ color var(--pf-transition-fast),
1130
+ box-shadow var(--pf-transition-fast);
984
1131
  }
985
1132
 
986
1133
  .pf-button:focus-visible {
@@ -1084,13 +1231,13 @@ body {
1084
1231
  }
1085
1232
 
1086
1233
  .pf-badge-group--leading .pf-badge-group__text {
1087
- margin-left: -1px;
1088
- padding-left: calc(var(--space-2) + 2px);
1234
+ margin-inline-start: -1px;
1235
+ padding-inline-start: calc(var(--space-2) + 2px);
1089
1236
  }
1090
1237
 
1091
1238
  .pf-badge-group--trailing .pf-badge-group__text {
1092
- margin-right: -1px;
1093
- padding-right: calc(var(--space-2) + 2px);
1239
+ margin-inline-end: -1px;
1240
+ padding-inline-end: calc(var(--space-2) + 2px);
1094
1241
  }
1095
1242
 
1096
1243
  .pf-badge-group--leading .pf-badge-group__badge {
@@ -1187,7 +1334,7 @@ body {
1187
1334
  gap: var(--space-2);
1188
1335
  justify-content: center;
1189
1336
  line-height: 1;
1190
- margin-left: -1px;
1337
+ margin-inline-start: -1px;
1191
1338
  min-height: 40px;
1192
1339
  padding: 0 var(--space-4);
1193
1340
  position: relative;
@@ -1201,7 +1348,7 @@ body {
1201
1348
  .pf-button-group__button:first-child {
1202
1349
  border-bottom-left-radius: var(--radius-md);
1203
1350
  border-top-left-radius: var(--radius-md);
1204
- margin-left: 0;
1351
+ margin-inline-start: 0;
1205
1352
  }
1206
1353
 
1207
1354
  .pf-button-group__button:last-child {
@@ -1691,7 +1838,7 @@ body {
1691
1838
  color: var(--pf-dropdown-text-muted);
1692
1839
  display: inline-flex;
1693
1840
  height: var(--pf-dropdown-icon-size);
1694
- transition: transform 140ms ease;
1841
+ transition: transform var(--pf-transition-fast);
1695
1842
  width: var(--pf-dropdown-icon-size);
1696
1843
  }
1697
1844
 
@@ -1715,6 +1862,19 @@ body {
1715
1862
  padding: var(--space-1);
1716
1863
  position: fixed;
1717
1864
  z-index: 1000;
1865
+ transform-origin: top center;
1866
+ animation: pf-dropdown-menu-in var(--duration-fast) var(--easing-decelerate);
1867
+ }
1868
+
1869
+ @keyframes pf-dropdown-menu-in {
1870
+ from {
1871
+ opacity: 0;
1872
+ transform: translateY(-4px) scale(0.97);
1873
+ }
1874
+ to {
1875
+ opacity: 1;
1876
+ transform: translateY(0) scale(1);
1877
+ }
1718
1878
  }
1719
1879
 
1720
1880
  .pf-dropdown__item {
@@ -1729,7 +1889,7 @@ body {
1729
1889
  justify-content: space-between;
1730
1890
  min-height: 34px;
1731
1891
  padding: 0 var(--space-2);
1732
- text-align: left;
1892
+ text-align: start;
1733
1893
  width: 100%;
1734
1894
  }
1735
1895
 
@@ -1779,6 +1939,10 @@ body {
1779
1939
  .pf-dropdown__chevron {
1780
1940
  transition: none;
1781
1941
  }
1942
+
1943
+ .pf-dropdown__menu {
1944
+ animation: none;
1945
+ }
1782
1946
  }
1783
1947
  .pf-calendar {
1784
1948
  background: var(--pf-calendar-bg);
@@ -1944,7 +2108,8 @@ body {
1944
2108
 
1945
2109
  .pf-carousel__track {
1946
2110
  display: flex;
1947
- transition: transform var(--pf-carousel-transition-duration, 180ms) ease-out;
2111
+ transition: transform var(--pf-carousel-transition-duration, var(--duration-moderate))
2112
+ var(--easing-decelerate);
1948
2113
  width: 100%;
1949
2114
  }
1950
2115
 
@@ -2021,7 +2186,8 @@ body {
2021
2186
  cursor: pointer;
2022
2187
  height: var(--pf-carousel-indicator-size, 8px);
2023
2188
  padding: 0;
2024
- transition: all var(--pf-carousel-indicator-transition-duration, 120ms) ease-out;
2189
+ transition: all var(--pf-carousel-indicator-transition-duration, var(--duration-fast))
2190
+ var(--easing-decelerate);
2025
2191
  width: var(--pf-carousel-indicator-size, 8px);
2026
2192
  }
2027
2193
 
@@ -2180,8 +2346,8 @@ body {
2180
2346
  .pf-code-snippet__line-number {
2181
2347
  color: var(--pf-code-snippet-line-number, var(--color-gray-400));
2182
2348
  min-width: 2.5ch;
2183
- padding-right: var(--space-3);
2184
- text-align: right;
2349
+ padding-inline-end: var(--space-3);
2350
+ text-align: end;
2185
2351
  user-select: none;
2186
2352
  vertical-align: top;
2187
2353
  }
@@ -2210,8 +2376,8 @@ body {
2210
2376
  }
2211
2377
 
2212
2378
  .pf-content-divider--inset {
2213
- padding-left: var(--space-2);
2214
- padding-right: var(--space-2);
2379
+ padding-inline-start: var(--space-2);
2380
+ padding-inline-end: var(--space-2);
2215
2381
  }
2216
2382
 
2217
2383
  .pf-content-divider__line {
@@ -2258,7 +2424,7 @@ body {
2258
2424
  min-height: 40px;
2259
2425
  min-width: 0;
2260
2426
  padding: 0 var(--space-3);
2261
- text-align: left;
2427
+ text-align: start;
2262
2428
  }
2263
2429
 
2264
2430
  .pf-date-picker__trigger:hover:not(:disabled) {
@@ -2633,6 +2799,64 @@ body {
2633
2799
  gap: var(--space-3);
2634
2800
  grid-template-columns: auto 1fr;
2635
2801
  padding: var(--space-3);
2802
+ position: relative;
2803
+ }
2804
+
2805
+ /* Leave room for the centered dismiss button so content/action don't crowd it */
2806
+ .pf-inline-cta--dismissible {
2807
+ padding-inline-end: var(--space-12);
2808
+ }
2809
+
2810
+ .pf-inline-cta__dismiss {
2811
+ align-items: center;
2812
+ background: transparent;
2813
+ border: 0;
2814
+ border-radius: var(--radius-sm);
2815
+ color: var(--color-semantic-text-muted);
2816
+ cursor: pointer;
2817
+ display: inline-flex;
2818
+ height: 28px;
2819
+ justify-content: center;
2820
+ position: absolute;
2821
+ inset-inline-end: var(--space-3);
2822
+ top: 50%;
2823
+ transform: translateY(-50%);
2824
+ width: 28px;
2825
+ }
2826
+
2827
+ .pf-inline-cta__dismiss:hover,
2828
+ .pf-inline-cta__dismiss:focus-visible {
2829
+ background: var(--color-semantic-background-subtle);
2830
+ color: var(--color-semantic-text-default);
2831
+ outline: none;
2832
+ }
2833
+
2834
+ /* Exit: fade and collapse so surrounding content reflows when dismissed. */
2835
+ .pf-inline-cta--exiting {
2836
+ animation: pf-inline-cta-out var(--duration-moderate) var(--easing-accelerate) forwards;
2837
+ overflow: hidden;
2838
+ pointer-events: none;
2839
+ }
2840
+
2841
+ @keyframes pf-inline-cta-out {
2842
+ from {
2843
+ opacity: 1;
2844
+ max-height: 480px;
2845
+ }
2846
+ to {
2847
+ opacity: 0;
2848
+ max-height: 0;
2849
+ margin-top: 0;
2850
+ margin-bottom: 0;
2851
+ padding-top: 0;
2852
+ padding-bottom: 0;
2853
+ }
2854
+ }
2855
+
2856
+ @media (prefers-reduced-motion: reduce) {
2857
+ .pf-inline-cta--exiting {
2858
+ animation: none;
2859
+ }
2636
2860
  }
2637
2861
 
2638
2862
  @media (min-width: 768px) {
@@ -2727,7 +2951,24 @@ body {
2727
2951
  }
2728
2952
 
2729
2953
  .pf-gauge__fill {
2730
- transition: stroke-dasharray var(--pf-transition-medium, 180ms ease);
2954
+ stroke-dashoffset: var(--pf-gauge-offset);
2955
+ /* Animate the arc filling from empty to its value on mount, and smoothly
2956
+ when the value changes afterward. */
2957
+ animation: pf-gauge-fill var(--duration-slow) var(--easing-decelerate);
2958
+ transition: stroke-dashoffset var(--pf-transition-medium);
2959
+ }
2960
+
2961
+ @keyframes pf-gauge-fill {
2962
+ from {
2963
+ stroke-dashoffset: var(--pf-gauge-circumference);
2964
+ }
2965
+ }
2966
+
2967
+ @media (prefers-reduced-motion: reduce) {
2968
+ .pf-gauge__fill {
2969
+ animation: none;
2970
+ transition: none;
2971
+ }
2731
2972
  }
2732
2973
 
2733
2974
  .pf-gauge__center {
@@ -2756,6 +2997,110 @@ body {
2756
2997
  font-size: var(--font-size-sm);
2757
2998
  line-height: 1;
2758
2999
  }
3000
+ .pf-heatmap {
3001
+ display: inline-block;
3002
+ max-width: 100%;
3003
+ /* A full year is wider than small screens — scroll horizontally instead of
3004
+ overflowing the page. */
3005
+ overflow-x: auto;
3006
+ font-family: var(--font-family-sans);
3007
+ }
3008
+
3009
+ .pf-heatmap__empty {
3010
+ color: var(--color-semantic-text-muted);
3011
+ font-size: var(--font-size-sm);
3012
+ padding: var(--space-4);
3013
+ text-align: center;
3014
+ }
3015
+
3016
+ .pf-heatmap__body {
3017
+ display: flex;
3018
+ gap: var(--pf-heatmap-cell-gap);
3019
+ }
3020
+
3021
+ .pf-heatmap__weekdays {
3022
+ display: flex;
3023
+ flex-direction: column;
3024
+ }
3025
+
3026
+ .pf-heatmap__weekday-spacer {
3027
+ display: block;
3028
+ height: calc(var(--font-size-xs) + var(--space-1));
3029
+ }
3030
+
3031
+ .pf-heatmap__weekday-grid {
3032
+ display: grid;
3033
+ grid-template-rows: repeat(7, var(--pf-heatmap-cell-size));
3034
+ gap: var(--pf-heatmap-cell-gap);
3035
+ }
3036
+
3037
+ .pf-heatmap__weekday {
3038
+ align-items: center;
3039
+ color: var(--pf-heatmap-label-color);
3040
+ display: flex;
3041
+ font-size: var(--font-size-xs);
3042
+ line-height: 1;
3043
+ padding-inline-end: var(--space-1);
3044
+ }
3045
+
3046
+ .pf-heatmap__main {
3047
+ display: flex;
3048
+ flex-direction: column;
3049
+ gap: var(--space-1);
3050
+ }
3051
+
3052
+ .pf-heatmap__months {
3053
+ display: grid;
3054
+ gap: var(--pf-heatmap-cell-gap);
3055
+ height: var(--font-size-xs);
3056
+ }
3057
+
3058
+ .pf-heatmap__month {
3059
+ color: var(--pf-heatmap-label-color);
3060
+ font-size: var(--font-size-xs);
3061
+ line-height: 1;
3062
+ }
3063
+
3064
+ .pf-heatmap__grid {
3065
+ display: grid;
3066
+ grid-template-rows: repeat(7, var(--pf-heatmap-cell-size));
3067
+ grid-auto-flow: column;
3068
+ grid-auto-columns: var(--pf-heatmap-cell-size);
3069
+ gap: var(--pf-heatmap-cell-gap);
3070
+ }
3071
+
3072
+ .pf-heatmap__cell {
3073
+ border-radius: var(--pf-heatmap-cell-radius);
3074
+ height: var(--pf-heatmap-cell-size);
3075
+ width: var(--pf-heatmap-cell-size);
3076
+ }
3077
+
3078
+ .pf-heatmap__cell--empty {
3079
+ background: transparent;
3080
+ }
3081
+
3082
+ /* Staggered fade-in on mount — per-column animation-delay is set inline so
3083
+ the grid wipes in left-to-right (oldest week → newest). */
3084
+ .pf-heatmap__cell {
3085
+ animation: pf-heatmap-cell-in var(--duration-moderate) var(--easing-decelerate) both;
3086
+ }
3087
+
3088
+ @keyframes pf-heatmap-cell-in {
3089
+ from {
3090
+ opacity: 0;
3091
+ transform: scale(0.6);
3092
+ }
3093
+ to {
3094
+ opacity: 1;
3095
+ transform: scale(1);
3096
+ }
3097
+ }
3098
+
3099
+ @media (prefers-reduced-motion: reduce) {
3100
+ .pf-heatmap__cell {
3101
+ animation: none;
3102
+ }
3103
+ }
2759
3104
  /* ─── Chart color palette ─────────────────────────────────────────────── */
2760
3105
  :root {
2761
3106
  --pf-chart-color-1: var(--color-brand-600);
@@ -3182,6 +3527,8 @@ body {
3182
3527
  }
3183
3528
 
3184
3529
  .pf-modal__body {
3530
+ display: grid;
3531
+ gap: var(--space-4);
3185
3532
  overflow-y: auto;
3186
3533
  padding: var(--space-3);
3187
3534
  }
@@ -3227,6 +3574,66 @@ body {
3227
3574
  color: var(--pf-modal-text);
3228
3575
  outline: none;
3229
3576
  }
3577
+
3578
+ /* Entrance animation — uses motion tokens via theme aliases */
3579
+ @keyframes pf-modal-overlay-in {
3580
+ from {
3581
+ opacity: 0;
3582
+ }
3583
+ to {
3584
+ opacity: 1;
3585
+ }
3586
+ }
3587
+
3588
+ @keyframes pf-modal-in {
3589
+ from {
3590
+ opacity: 0;
3591
+ transform: translateY(8px) scale(0.98);
3592
+ }
3593
+ to {
3594
+ opacity: 1;
3595
+ transform: translateY(0) scale(1);
3596
+ }
3597
+ }
3598
+
3599
+ .pf-modal__overlay {
3600
+ animation: pf-modal-overlay-in var(--pf-transition-fast);
3601
+ }
3602
+
3603
+ .pf-modal {
3604
+ animation: pf-modal-in var(--pf-transition-enter);
3605
+ }
3606
+
3607
+ /* Exit animation — plays while the dialog is being dismissed (presence handling) */
3608
+ @keyframes pf-modal-overlay-out {
3609
+ to {
3610
+ opacity: 0;
3611
+ }
3612
+ }
3613
+
3614
+ @keyframes pf-modal-out {
3615
+ to {
3616
+ opacity: 0;
3617
+ transform: translateY(8px) scale(0.98);
3618
+ }
3619
+ }
3620
+
3621
+ .pf-modal__overlay--exiting {
3622
+ animation: pf-modal-overlay-out var(--pf-transition-fast) forwards;
3623
+ }
3624
+
3625
+ .pf-modal--exiting {
3626
+ animation: pf-modal-out var(--pf-transition-fast) forwards;
3627
+ }
3628
+
3629
+ @media (prefers-reduced-motion: reduce) {
3630
+ .pf-modal__overlay,
3631
+ .pf-modal,
3632
+ .pf-modal__overlay--exiting,
3633
+ .pf-modal--exiting {
3634
+ animation: none;
3635
+ }
3636
+ }
3230
3637
  .pf-multi-select {
3231
3638
  position: relative;
3232
3639
  }
@@ -3244,7 +3651,7 @@ body {
3244
3651
  justify-content: space-between;
3245
3652
  min-height: 40px;
3246
3653
  padding: var(--space-1) var(--space-2) var(--space-1) var(--space-2);
3247
- text-align: left;
3654
+ text-align: start;
3248
3655
  width: 100%;
3249
3656
  transition:
3250
3657
  background 0.2s,
@@ -3307,7 +3714,7 @@ body {
3307
3714
  justify-content: center;
3308
3715
  width: 20px;
3309
3716
  transform-origin: center;
3310
- transition: transform 140ms ease;
3717
+ transition: transform var(--pf-transition-fast);
3311
3718
  }
3312
3719
 
3313
3720
  .pf-multi-select__icon svg {
@@ -3332,6 +3739,19 @@ body {
3332
3739
  padding: var(--space-1);
3333
3740
  position: fixed;
3334
3741
  z-index: 1000;
3742
+ transform-origin: top center;
3743
+ animation: pf-multi-select-menu-in var(--duration-fast) var(--easing-decelerate);
3744
+ }
3745
+
3746
+ @keyframes pf-multi-select-menu-in {
3747
+ from {
3748
+ opacity: 0;
3749
+ transform: translateY(-4px) scaleY(0.96);
3750
+ }
3751
+ to {
3752
+ opacity: 1;
3753
+ transform: translateY(0) scaleY(1);
3754
+ }
3335
3755
  }
3336
3756
 
3337
3757
  .pf-multi-select__option {
@@ -3383,6 +3803,10 @@ body {
3383
3803
  .pf-multi-select__icon {
3384
3804
  transition: none;
3385
3805
  }
3806
+
3807
+ .pf-multi-select__menu {
3808
+ animation: none;
3809
+ }
3386
3810
  }
3387
3811
  .pf-notification-stack {
3388
3812
  display: grid;
@@ -3445,6 +3869,45 @@ body {
3445
3869
  max-width: none;
3446
3870
  padding: var(--space-3);
3447
3871
  width: 100%;
3872
+ animation: pf-notification-in var(--duration-moderate) var(--easing-decelerate);
3873
+ }
3874
+
3875
+ @keyframes pf-notification-in {
3876
+ from {
3877
+ opacity: 0;
3878
+ transform: translateX(12px);
3879
+ }
3880
+ }
3881
+
3882
+ /* Exit: slide off to the right and collapse so stacked siblings reflow. */
3883
+ .pf-notification--exiting {
3884
+ animation: pf-notification-out var(--duration-moderate) var(--easing-accelerate) forwards;
3885
+ overflow: hidden;
3886
+ pointer-events: none;
3887
+ }
3888
+
3889
+ @keyframes pf-notification-out {
3890
+ from {
3891
+ opacity: 1;
3892
+ transform: translateX(0);
3893
+ max-height: 480px;
3894
+ }
3895
+ to {
3896
+ opacity: 0;
3897
+ transform: translateX(100%);
3898
+ max-height: 0;
3899
+ margin-top: 0;
3900
+ margin-bottom: 0;
3901
+ padding-top: 0;
3902
+ padding-bottom: 0;
3903
+ }
3904
+ }
3905
+
3906
+ @media (prefers-reduced-motion: reduce) {
3907
+ .pf-notification,
3908
+ .pf-notification--exiting {
3909
+ animation: none;
3910
+ }
3448
3911
  }
3449
3912
 
3450
3913
  @media (min-width: 768px) {
@@ -3455,22 +3918,38 @@ body {
3455
3918
  }
3456
3919
 
3457
3920
  .pf-notification--info {
3458
- background: color-mix(in srgb, var(--pf-notification-info-bg) 45%, var(--color-base-white));
3921
+ background: color-mix(
3922
+ in srgb,
3923
+ var(--pf-notification-info-bg) 45%,
3924
+ var(--pf-notification-mix-base)
3925
+ );
3459
3926
  border-color: var(--pf-notification-info-border);
3460
3927
  }
3461
3928
 
3462
3929
  .pf-notification--success {
3463
- background: color-mix(in srgb, var(--pf-notification-success-bg) 45%, var(--color-base-white));
3930
+ background: color-mix(
3931
+ in srgb,
3932
+ var(--pf-notification-success-bg) 45%,
3933
+ var(--pf-notification-mix-base)
3934
+ );
3464
3935
  border-color: var(--pf-notification-success-border);
3465
3936
  }
3466
3937
 
3467
3938
  .pf-notification--warning {
3468
- background: color-mix(in srgb, var(--pf-notification-warning-bg) 45%, var(--color-base-white));
3939
+ background: color-mix(
3940
+ in srgb,
3941
+ var(--pf-notification-warning-bg) 45%,
3942
+ var(--pf-notification-mix-base)
3943
+ );
3469
3944
  border-color: var(--pf-notification-warning-border);
3470
3945
  }
3471
3946
 
3472
3947
  .pf-notification--danger {
3473
- background: color-mix(in srgb, var(--pf-notification-danger-bg) 45%, var(--color-base-white));
3948
+ background: color-mix(
3949
+ in srgb,
3950
+ var(--pf-notification-danger-bg) 45%,
3951
+ var(--pf-notification-mix-base)
3952
+ );
3474
3953
  border-color: var(--pf-notification-danger-border);
3475
3954
  }
3476
3955
 
@@ -3658,7 +4137,8 @@ body {
3658
4137
  }
3659
4138
  .pf-pagination {
3660
4139
  align-items: center;
3661
- display: inline-flex;
4140
+ display: flex;
4141
+ flex-wrap: wrap;
3662
4142
  gap: var(--space-2);
3663
4143
  }
3664
4144
 
@@ -3674,7 +4154,9 @@ body {
3674
4154
 
3675
4155
  .pf-pagination__list {
3676
4156
  align-items: center;
3677
- display: inline-flex;
4157
+ display: flex;
4158
+ flex-wrap: wrap;
4159
+ justify-content: center;
3678
4160
  gap: var(--space-2);
3679
4161
  list-style: none;
3680
4162
  margin: 0;
@@ -3780,6 +4262,38 @@ body {
3780
4262
  position: relative;
3781
4263
  }
3782
4264
 
4265
+ /* The conic-gradient lives on a masked layer so it can sweep ("build out")
4266
+ clockwise on mount without clipping the center label. */
4267
+ @property --pf-pie-sweep {
4268
+ syntax: '<percentage>';
4269
+ inherits: false;
4270
+ initial-value: 0%;
4271
+ }
4272
+
4273
+ .pf-pie-chart__visual::before {
4274
+ content: '';
4275
+ position: absolute;
4276
+ inset: 0;
4277
+ border-radius: inherit;
4278
+ background-image: var(--pf-pie-gradient);
4279
+ --pf-pie-sweep: 100%;
4280
+ -webkit-mask: conic-gradient(#000 var(--pf-pie-sweep), #0000 0);
4281
+ mask: conic-gradient(#000 var(--pf-pie-sweep), #0000 0);
4282
+ animation: pf-pie-sweep var(--duration-slow) var(--easing-decelerate);
4283
+ }
4284
+
4285
+ @keyframes pf-pie-sweep {
4286
+ from {
4287
+ --pf-pie-sweep: 0%;
4288
+ }
4289
+ }
4290
+
4291
+ @media (prefers-reduced-motion: reduce) {
4292
+ .pf-pie-chart__visual::before {
4293
+ animation: none;
4294
+ }
4295
+ }
4296
+
3783
4297
  .pf-pie-chart__visual--empty {
3784
4298
  outline: 1px solid var(--pf-piechart-border-muted);
3785
4299
  }
@@ -3794,6 +4308,8 @@ body {
3794
4308
  font-weight: var(--font-weight-semibold);
3795
4309
  justify-content: center;
3796
4310
  line-height: 1.2;
4311
+ position: relative;
4312
+ z-index: 1;
3797
4313
  text-align: center;
3798
4314
  }
3799
4315
 
@@ -3858,8 +4374,16 @@ body {
3858
4374
  background: var(--pf-progress-accent);
3859
4375
  border-radius: inherit;
3860
4376
  height: 100%;
3861
- transition: width 200ms ease;
3862
4377
  width: var(--pf-progress-fill, 0%);
4378
+ /* Animate fill in from 0 on mount, and smoothly between values on change */
4379
+ transition: width var(--pf-transition-slow);
4380
+ animation: pf-progress-bar-in var(--duration-slow) var(--easing-decelerate);
4381
+ }
4382
+
4383
+ @keyframes pf-progress-bar-in {
4384
+ from {
4385
+ width: 0;
4386
+ }
3863
4387
  }
3864
4388
 
3865
4389
  .pf-progress-bar__value {
@@ -3896,7 +4420,16 @@ body {
3896
4420
  .pf-progress-circle__fill {
3897
4421
  stroke: var(--pf-progress-accent);
3898
4422
  stroke-linecap: round;
3899
- transition: stroke-dashoffset 200ms ease;
4423
+ stroke-dashoffset: var(--pf-progress-dashoffset);
4424
+ /* Animate fill in from empty on mount, and smoothly between values on change */
4425
+ transition: stroke-dashoffset var(--pf-transition-slow);
4426
+ animation: pf-progress-circle-in var(--duration-slow) var(--easing-decelerate);
4427
+ }
4428
+
4429
+ @keyframes pf-progress-circle-in {
4430
+ from {
4431
+ stroke-dashoffset: var(--pf-progress-circ);
4432
+ }
3900
4433
  }
3901
4434
 
3902
4435
  .pf-progress-circle__value {
@@ -3913,6 +4446,7 @@ body {
3913
4446
  .pf-progress-bar__fill,
3914
4447
  .pf-progress-circle__fill {
3915
4448
  transition: none;
4449
+ animation: none;
3916
4450
  }
3917
4451
  }
3918
4452
  .pf-progress-steps {
@@ -3979,13 +4513,21 @@ body {
3979
4513
  width: 28px;
3980
4514
  position: relative;
3981
4515
  z-index: 1;
4516
+ /* Animate marker as its status changes when the current step advances */
4517
+ transition:
4518
+ background-color var(--pf-transition-medium),
4519
+ border-color var(--pf-transition-medium),
4520
+ color var(--pf-transition-medium),
4521
+ box-shadow var(--pf-transition-medium);
3982
4522
  }
3983
4523
 
3984
4524
  .pf-progress-steps__connector {
3985
4525
  background: var(--pf-progress-steps-border);
3986
4526
  display: block;
3987
4527
  flex: 1;
3988
- margin-left: var(--space-2);
4528
+ margin-inline-start: var(--space-2);
4529
+ /* Connector "activates" with a smooth fill as the step completes */
4530
+ transition: background-color var(--pf-transition-slow);
3989
4531
  }
3990
4532
 
3991
4533
  .pf-progress-steps--horizontal .pf-progress-steps__connector {
@@ -3997,7 +4539,7 @@ body {
3997
4539
  display: block;
3998
4540
  height: 1px;
3999
4541
  left: 50%;
4000
- margin-left: 0;
4542
+ margin-inline-start: 0;
4001
4543
  position: absolute;
4002
4544
  top: 50%;
4003
4545
  transform: translateY(-50%);
@@ -4028,7 +4570,7 @@ body {
4028
4570
 
4029
4571
  .pf-progress-steps--vertical .pf-progress-steps__connector {
4030
4572
  bottom: calc(var(--space-3) * -1);
4031
- left: 14px;
4573
+ inset-inline-start: 14px;
4032
4574
  margin: 0;
4033
4575
  position: absolute;
4034
4576
  top: 28px;
@@ -4044,6 +4586,7 @@ body {
4044
4586
  font-size: var(--font-size-sm);
4045
4587
  font-weight: var(--font-weight-semibold);
4046
4588
  margin: var(--space-1) 0 0;
4589
+ transition: color var(--pf-transition-medium);
4047
4590
  }
4048
4591
 
4049
4592
  .pf-progress-steps__description {
@@ -4073,6 +4616,14 @@ body {
4073
4616
  .pf-progress-steps__item--current .pf-progress-steps__title {
4074
4617
  color: var(--pf-progress-steps-current-title);
4075
4618
  }
4619
+
4620
+ @media (prefers-reduced-motion: reduce) {
4621
+ .pf-progress-steps__marker,
4622
+ .pf-progress-steps__connector,
4623
+ .pf-progress-steps__title {
4624
+ transition: none;
4625
+ }
4626
+ }
4076
4627
  .pf-radar-chart {
4077
4628
  align-items: stretch;
4078
4629
  display: inline-flex;
@@ -4170,6 +4721,28 @@ body {
4170
4721
  padding: var(--space-4);
4171
4722
  text-align: center;
4172
4723
  }
4724
+
4725
+ /* Grow the value polygon out from the center on mount */
4726
+ .pf-radar-chart__value {
4727
+ animation: pf-radar-grow var(--duration-slow) var(--easing-decelerate);
4728
+ }
4729
+
4730
+ @keyframes pf-radar-grow {
4731
+ from {
4732
+ opacity: 0;
4733
+ transform: scale(0);
4734
+ }
4735
+ to {
4736
+ opacity: 1;
4737
+ transform: scale(1);
4738
+ }
4739
+ }
4740
+
4741
+ @media (prefers-reduced-motion: reduce) {
4742
+ .pf-radar-chart__value {
4743
+ animation: none;
4744
+ }
4745
+ }
4173
4746
  .pf-radio-field {
4174
4747
  align-items: center;
4175
4748
  display: inline-flex;
@@ -4438,7 +5011,7 @@ body {
4438
5011
  color: var(--pf-rte-text-muted);
4439
5012
  font-size: var(--font-size-sm);
4440
5013
  margin: var(--space-2) 0 0;
4441
- text-align: right;
5014
+ text-align: end;
4442
5015
  }
4443
5016
  .pf-section-footer {
4444
5017
  align-items: flex-start;
@@ -4655,7 +5228,7 @@ body {
4655
5228
  grid-template-columns: auto 1fr auto;
4656
5229
  min-height: 36px;
4657
5230
  padding: 0 var(--space-2);
4658
- text-align: left;
5231
+ text-align: start;
4659
5232
  text-decoration: none;
4660
5233
  width: 100%;
4661
5234
  }
@@ -4710,6 +5283,54 @@ body {
4710
5283
  .pf-sparkline__dot {
4711
5284
  fill: var(--pf-sparkline-color-override, var(--pf-sparkline-color));
4712
5285
  }
5286
+
5287
+ /* Opt-in mount animation: draw the line, fade in the area and end dot.
5288
+ The line path sets pathLength="1" so dash math is length-independent. */
5289
+ .pf-sparkline--animated .pf-sparkline__line {
5290
+ stroke-dasharray: 1;
5291
+ animation: pf-sparkline-draw var(--duration-slow) var(--easing-standard) both;
5292
+ }
5293
+
5294
+ @keyframes pf-sparkline-draw {
5295
+ from {
5296
+ stroke-dashoffset: 1;
5297
+ }
5298
+ to {
5299
+ stroke-dashoffset: 0;
5300
+ }
5301
+ }
5302
+
5303
+ .pf-sparkline--animated .pf-sparkline__area {
5304
+ animation: pf-sparkline-fade var(--duration-slow) var(--easing-standard) both;
5305
+ }
5306
+
5307
+ @keyframes pf-sparkline-fade {
5308
+ from {
5309
+ opacity: 0;
5310
+ }
5311
+ }
5312
+
5313
+ .pf-sparkline--animated .pf-sparkline__dot {
5314
+ animation: pf-sparkline-dot var(--duration-fast) var(--easing-decelerate) var(--duration-moderate)
5315
+ both;
5316
+ }
5317
+
5318
+ @keyframes pf-sparkline-dot {
5319
+ from {
5320
+ opacity: 0;
5321
+ }
5322
+ to {
5323
+ opacity: 1;
5324
+ }
5325
+ }
5326
+
5327
+ @media (prefers-reduced-motion: reduce) {
5328
+ .pf-sparkline--animated .pf-sparkline__line,
5329
+ .pf-sparkline--animated .pf-sparkline__area,
5330
+ .pf-sparkline--animated .pf-sparkline__dot {
5331
+ animation: none;
5332
+ }
5333
+ }
4713
5334
  .pf-slideout__portal {
4714
5335
  inset: 0;
4715
5336
  position: fixed;
@@ -4721,7 +5342,7 @@ body {
4721
5342
  opacity: 1;
4722
5343
  inset: 0;
4723
5344
  position: absolute;
4724
- transition: opacity 220ms ease;
5345
+ transition: opacity var(--pf-transition-slow);
4725
5346
  }
4726
5347
 
4727
5348
  .pf-slideout__viewport {
@@ -4750,7 +5371,7 @@ body {
4750
5371
  height: 100%;
4751
5372
  max-width: 100%;
4752
5373
  pointer-events: auto;
4753
- transition: transform 220ms ease;
5374
+ transition: transform var(--pf-transition-slow);
4754
5375
  will-change: transform;
4755
5376
  }
4756
5377
 
@@ -4947,7 +5568,7 @@ body {
4947
5568
  justify-content: space-between;
4948
5569
  min-height: 40px;
4949
5570
  padding: 0 var(--space-3);
4950
- text-align: left;
5571
+ text-align: start;
4951
5572
  width: 100%;
4952
5573
  transition:
4953
5574
  background 0.2s,
@@ -5001,7 +5622,7 @@ body {
5001
5622
  justify-content: center;
5002
5623
  width: 20px;
5003
5624
  transform-origin: center;
5004
- transition: transform 140ms ease;
5625
+ transition: transform var(--pf-transition-fast);
5005
5626
  }
5006
5627
 
5007
5628
  .pf-select__icon svg {
@@ -5026,6 +5647,25 @@ body {
5026
5647
  padding: var(--space-1);
5027
5648
  position: fixed;
5028
5649
  z-index: 1000;
5650
+ transform-origin: top center;
5651
+ animation: pf-select-menu-in var(--duration-fast) var(--easing-decelerate);
5652
+ }
5653
+
5654
+ @keyframes pf-select-menu-in {
5655
+ from {
5656
+ opacity: 0;
5657
+ transform: translateY(-4px) scaleY(0.96);
5658
+ }
5659
+ to {
5660
+ opacity: 1;
5661
+ transform: translateY(0) scaleY(1);
5662
+ }
5663
+ }
5664
+
5665
+ @media (prefers-reduced-motion: reduce) {
5666
+ .pf-select__menu {
5667
+ animation: none;
5668
+ }
5029
5669
  }
5030
5670
 
5031
5671
  .pf-select__option {
@@ -5218,7 +5858,7 @@ body {
5218
5858
  display: inline-flex;
5219
5859
  height: 18px;
5220
5860
  justify-content: center;
5221
- margin-right: -2px;
5861
+ margin-inline-end: -2px;
5222
5862
  padding: 0;
5223
5863
  width: 18px;
5224
5864
  }
@@ -5259,9 +5899,9 @@ body {
5259
5899
  font-size: var(--font-size-sm);
5260
5900
  min-height: 56px;
5261
5901
  padding-top: var(--space-3);
5262
- padding-right: var(--space-4, 16px);
5902
+ padding-inline-end: var(--space-4, 16px);
5263
5903
  padding-bottom: var(--space-3);
5264
- padding-left: var(--space-4, 16px);
5904
+ padding-inline-start: var(--space-4, 16px);
5265
5905
  }
5266
5906
 
5267
5907
  .pf-table__head-cell,
@@ -5342,7 +5982,7 @@ body {
5342
5982
  }
5343
5983
 
5344
5984
  .pf-table__cell--left {
5345
- text-align: left;
5985
+ text-align: start;
5346
5986
  }
5347
5987
 
5348
5988
  .pf-table__cell--center {
@@ -5350,7 +5990,7 @@ body {
5350
5990
  }
5351
5991
 
5352
5992
  .pf-table__cell--right {
5353
- text-align: right;
5993
+ text-align: end;
5354
5994
  }
5355
5995
 
5356
5996
  .pf-table__empty {
@@ -5377,6 +6017,31 @@ body {
5377
6017
  .pf-tabs__list {
5378
6018
  display: flex;
5379
6019
  overflow-x: auto;
6020
+ position: relative;
6021
+ }
6022
+
6023
+ .pf-tabs__indicator {
6024
+ position: absolute;
6025
+ pointer-events: none;
6026
+ transition:
6027
+ left var(--pf-transition-medium),
6028
+ width var(--pf-transition-medium),
6029
+ top var(--pf-transition-medium),
6030
+ height var(--pf-transition-medium);
6031
+ }
6032
+
6033
+ .pf-tabs__indicator--underline {
6034
+ bottom: 0;
6035
+ height: var(--pf-tabs-underline-width);
6036
+ background: var(--pf-tabs-text);
6037
+ border-radius: var(--radius-full);
6038
+ }
6039
+
6040
+ .pf-tabs__indicator--pills {
6041
+ background: var(--pf-tabs-bg);
6042
+ border-radius: var(--radius-sm);
6043
+ box-shadow: var(--pf-tabs-elevation-tab-active-shadow, var(--pf-elevation-tab-active-shadow));
6044
+ z-index: 0;
5380
6045
  }
5381
6046
 
5382
6047
  .pf-tabs__list--full-width {
@@ -5405,7 +6070,8 @@ body {
5405
6070
  font-weight: var(--font-weight-medium);
5406
6071
  min-width: 0;
5407
6072
  position: relative;
5408
- transition: color 160ms ease;
6073
+ z-index: 1;
6074
+ transition: color var(--pf-transition-medium);
5409
6075
  white-space: nowrap;
5410
6076
  }
5411
6077
 
@@ -5440,7 +6106,7 @@ body {
5440
6106
  }
5441
6107
 
5442
6108
  .pf-tabs__tab--underline.pf-tabs__tab--active {
5443
- border-bottom-color: var(--pf-tabs-text);
6109
+ /* The sliding indicator draws the underline; keep the transparent border for spacing */
5444
6110
  color: var(--pf-tabs-text);
5445
6111
  }
5446
6112
 
@@ -5454,8 +6120,7 @@ body {
5454
6120
  }
5455
6121
 
5456
6122
  .pf-tabs__tab--pills.pf-tabs__tab--active {
5457
- background: var(--pf-tabs-bg);
5458
- box-shadow: var(--pf-tabs-elevation-tab-active-shadow, var(--pf-elevation-tab-active-shadow));
6123
+ /* The sliding indicator draws the pill background */
5459
6124
  color: var(--pf-tabs-text);
5460
6125
  }
5461
6126
 
@@ -5471,7 +6136,8 @@ body {
5471
6136
  }
5472
6137
 
5473
6138
  @media (prefers-reduced-motion: reduce) {
5474
- .pf-tabs__tab {
6139
+ .pf-tabs__tab,
6140
+ .pf-tabs__indicator {
5475
6141
  transition: none;
5476
6142
  }
5477
6143
  }
@@ -5553,6 +6219,41 @@ body {
5553
6219
  position: fixed;
5554
6220
  z-index: 1100;
5555
6221
  }
6222
+
6223
+ /* Entrance animation — uses motion tokens via theme aliases */
6224
+ @keyframes pf-tooltip-in {
6225
+ from {
6226
+ opacity: 0;
6227
+ transform: translateY(2px);
6228
+ }
6229
+ to {
6230
+ opacity: 1;
6231
+ transform: translateY(0);
6232
+ }
6233
+ }
6234
+
6235
+ .pf-tooltip {
6236
+ animation: pf-tooltip-in var(--pf-transition-fast);
6237
+ }
6238
+
6239
+ /* Exit fade — plays while the tooltip is dismissed (presence handling) */
6240
+ @keyframes pf-tooltip-out {
6241
+ to {
6242
+ opacity: 0;
6243
+ transform: translateY(2px);
6244
+ }
6245
+ }
6246
+
6247
+ .pf-tooltip--exiting {
6248
+ animation: pf-tooltip-out var(--duration-fast) var(--easing-accelerate) forwards;
6249
+ }
6250
+
6251
+ @media (prefers-reduced-motion: reduce) {
6252
+ .pf-tooltip,
6253
+ .pf-tooltip--exiting {
6254
+ animation: none;
6255
+ }
6256
+ }
5556
6257
  .pf-tree-view {
5557
6258
  background: var(--pf-treeview-bg);
5558
6259
  border: 1px solid var(--pf-treeview-border);
@@ -5575,7 +6276,7 @@ body {
5575
6276
  display: grid;
5576
6277
  grid-template-columns: auto 1fr;
5577
6278
  min-width: 0;
5578
- padding-left: calc(var(--pf-tree-level, 0) * var(--space-4));
6279
+ padding-inline-start: calc(var(--pf-tree-level, 0) * var(--space-4));
5579
6280
  }
5580
6281
 
5581
6282
  .pf-tree-view__toggle-wrap {
@@ -5624,7 +6325,7 @@ body {
5624
6325
  min-height: 34px;
5625
6326
  min-width: 0;
5626
6327
  padding: 0 var(--space-2);
5627
- text-align: left;
6328
+ text-align: start;
5628
6329
  width: 100%;
5629
6330
  }
5630
6331