@pitchfork-ui/react 0.1.9 → 0.6.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 (154) hide show
  1. package/README.md +20 -5
  2. package/dist/components/Accordion/Accordion.css +85 -0
  3. package/dist/components/Accordion/Accordion2.js +96 -0
  4. package/dist/components/Alert/Alert.css +111 -0
  5. package/dist/{index8.js → components/Alert/Alert2.js} +7 -5
  6. package/dist/components/Avatar/Avatar.css +97 -0
  7. package/dist/{index10.js → components/Avatar/Avatar2.js} +2 -2
  8. package/dist/components/Badge/Badge.css +26 -0
  9. package/dist/{index23.js → components/Badge/Badge2.js} +2 -2
  10. package/dist/components/BadgeGroup/BadgeGroup.css +115 -0
  11. package/dist/{index14.js → components/BadgeGroup/BadgeGroup2.js} +2 -2
  12. package/dist/components/Breadcrumbs/Breadcrumbs.css +45 -0
  13. package/dist/{index18.js → components/Breadcrumbs/Breadcrumbs2.js} +2 -2
  14. package/dist/components/Button/Button.css +93 -0
  15. package/dist/{index12.js → components/Button/Button2.js} +2 -2
  16. package/dist/components/ButtonGroup/ButtonGroup.css +107 -0
  17. package/dist/{index16.js → components/ButtonGroup/ButtonGroup2.js} +2 -2
  18. package/dist/components/Calendar/Calendar.css +144 -0
  19. package/dist/{index40.js → components/Calendar/Calendar2.js} +4 -4
  20. package/dist/components/Card/Card.css +23 -0
  21. package/dist/{index25.js → components/Card/Card2.js} +2 -2
  22. package/dist/components/Carousel/Carousel.css +124 -0
  23. package/dist/components/Carousel/Carousel2.js +147 -0
  24. package/dist/components/Checkbox/Checkbox.css +62 -0
  25. package/dist/{index29.js → components/Checkbox/Checkbox2.js} +2 -2
  26. package/dist/components/CodeSnippet/CodeSnippet.css +155 -0
  27. package/dist/{index46.js → components/CodeSnippet/CodeSnippet2.js} +6 -6
  28. package/dist/components/ContentDivider/ContentDivider.css +38 -0
  29. package/dist/{index48.js → components/ContentDivider/ContentDivider2.js} +2 -2
  30. package/dist/components/CreditCard/CreditCard.css +139 -0
  31. package/dist/{index27.js → components/CreditCard/CreditCard2.js} +2 -2
  32. package/dist/components/DatePicker/DatePicker.css +91 -0
  33. package/dist/{index50.js → components/DatePicker/DatePicker2.js} +9 -9
  34. package/dist/components/Dropdown/Dropdown.css +149 -0
  35. package/dist/{index38.js → components/Dropdown/Dropdown2.js} +8 -9
  36. package/dist/components/EmptyState/EmptyState.css +72 -0
  37. package/dist/{index52.js → components/EmptyState/EmptyState2.js} +3 -3
  38. package/dist/components/FileUploader/FileUploader.css +135 -0
  39. package/dist/{index54.js → components/FileUploader/FileUploader2.js} +4 -4
  40. package/dist/components/GaugeChart/GaugeChart.css +63 -0
  41. package/dist/components/GaugeChart/GaugeChart2.js +74 -0
  42. package/dist/components/HeaderNavigation/HeaderNavigation.css +87 -0
  43. package/dist/{index56.js → components/HeaderNavigation/HeaderNavigation2.js} +2 -2
  44. package/dist/components/Heatmap/Heatmap.css +100 -0
  45. package/dist/components/Heatmap/Heatmap2.js +160 -0
  46. package/dist/components/Icon/Icon.css +6 -0
  47. package/dist/{index6.js → components/Icon/Icon2.js} +2 -2
  48. package/dist/components/InlineCTA/InlineCTA.css +144 -0
  49. package/dist/{index58.js → components/InlineCTA/InlineCTA2.js} +17 -5
  50. package/dist/components/Input/Input.css +75 -0
  51. package/dist/{index21.js → components/Input/Input2.js} +3 -3
  52. package/dist/components/LineBarCharts/LineBarChart.css +122 -0
  53. package/dist/{index60.js → components/LineBarCharts/LineBarChart2.js} +11 -3
  54. package/dist/components/LoadingIndicators/LoadingIndicators.css +107 -0
  55. package/dist/{index62.js → components/LoadingIndicators/LoadingIndicators2.js} +2 -2
  56. package/dist/components/Metrics/Metrics.css +106 -0
  57. package/dist/{index64.js → components/Metrics/Metrics2.js} +3 -3
  58. package/dist/components/Modal/Modal.css +198 -0
  59. package/dist/{index66.js → components/Modal/Modal2.js} +11 -9
  60. package/dist/components/MultiSelect/MultiSelect.css +174 -0
  61. package/dist/{index68.js → components/MultiSelect/MultiSelect2.js} +11 -12
  62. package/dist/components/Notification/Notification.css +242 -0
  63. package/dist/{index70.js → components/Notification/Notification2.js} +7 -5
  64. package/dist/components/PageHeader/PageHeader.css +85 -0
  65. package/dist/{index72.js → components/PageHeader/PageHeader2.js} +3 -3
  66. package/dist/components/Pagination/Pagination.css +101 -0
  67. package/dist/{index74.js → components/Pagination/Pagination2.js} +2 -2
  68. package/dist/components/PieChart/PieChart.css +115 -0
  69. package/dist/{index76.js → components/PieChart/PieChart2.js} +3 -3
  70. package/dist/components/ProgressIndicators/ProgressIndicators.css +95 -0
  71. package/dist/{index78.js → components/ProgressIndicators/ProgressIndicators2.js} +6 -3
  72. package/dist/components/ProgressSteps/ProgressSteps.css +175 -0
  73. package/dist/{index80.js → components/ProgressSteps/ProgressSteps2.js} +2 -2
  74. package/dist/components/RadarChart/RadarChart.css +119 -0
  75. package/dist/{index82.js → components/RadarChart/RadarChart2.js} +21 -15
  76. package/dist/components/RadioButton/RadioButton.css +21 -0
  77. package/dist/{index84.js → components/RadioButton/RadioButton2.js} +2 -2
  78. package/dist/components/RadioGroup/RadioGroup.css +64 -0
  79. package/dist/{index86.js → components/RadioGroup/RadioGroup2.js} +2 -2
  80. package/dist/components/Rating/Rating.css +91 -0
  81. package/dist/{index88.js → components/Rating/Rating2.js} +3 -3
  82. package/dist/components/RichTextEditor/RichTextEditor.css +94 -0
  83. package/dist/{index90.js → components/RichTextEditor/RichTextEditor2.js} +4 -4
  84. package/dist/components/SectionFooter/SectionFooter.css +59 -0
  85. package/dist/{index92.js → components/SectionFooter/SectionFooter2.js} +2 -2
  86. package/dist/components/SectionHeader/SectionHeader.css +78 -0
  87. package/dist/{index94.js → components/SectionHeader/SectionHeader2.js} +2 -2
  88. package/dist/components/Select/Select.css +156 -0
  89. package/dist/{index102.js → components/Select/Select2.js} +11 -12
  90. package/dist/components/SidebarNavigation/SidebarNavigation.css +116 -0
  91. package/dist/{index96.js → components/SidebarNavigation/SidebarNavigation2.js} +2 -2
  92. package/dist/components/SlideoutMenu/SlideoutMenu.css +161 -0
  93. package/dist/{index98.js → components/SlideoutMenu/SlideoutMenu2.js} +3 -3
  94. package/dist/components/Slider/Slider.css +106 -0
  95. package/dist/{index104.js → components/Slider/Slider2.js} +2 -2
  96. package/dist/components/Sparkline/Sparkline.css +65 -0
  97. package/dist/components/Sparkline/Sparkline2.js +100 -0
  98. package/dist/components/Switch/Switch.css +59 -0
  99. package/dist/{index100.js → components/Switch/Switch2.js} +2 -2
  100. package/dist/components/Table/Table.css +126 -0
  101. package/dist/{index108.js → components/Table/Table2.js} +2 -2
  102. package/dist/components/Tabs/Tabs.css +138 -0
  103. package/dist/{index110.js → components/Tabs/Tabs2.js} +53 -6
  104. package/dist/components/Tag/Tag.css +64 -0
  105. package/dist/{index106.js → components/Tag/Tag2.js} +3 -3
  106. package/dist/components/Textarea/Textarea.css +52 -0
  107. package/dist/{index112.js → components/Textarea/Textarea2.js} +3 -3
  108. package/dist/components/Tooltip/Tooltip.css +61 -0
  109. package/dist/{index114.js → components/Tooltip/Tooltip2.js} +6 -6
  110. package/dist/components/TreeView/TreeView.css +109 -0
  111. package/dist/{index116.js → components/TreeView/TreeView2.js} +2 -2
  112. package/dist/components/UtilityButton/UtilityButton.css +90 -0
  113. package/dist/{index118.js → components/UtilityButton/UtilityButton2.js} +2 -2
  114. package/dist/components/VideoPlayer/VideoPlayer.css +41 -0
  115. package/dist/{index120.js → components/VideoPlayer/VideoPlayer2.js} +2 -2
  116. package/dist/{index33.js → hooks/useDisclosure.js} +1 -1
  117. package/dist/hooks/useExitAnimation.js +25 -0
  118. package/dist/{index34.js → hooks/useFocusTrap.js} +1 -1
  119. package/dist/hooks/usePresence.js +31 -0
  120. package/dist/index.cjs +1030 -4720
  121. package/dist/index.js +69 -63
  122. package/dist/src/components/Accordion/Accordion.d.ts +20 -0
  123. package/dist/src/components/Accordion/Accordion.test.d.ts +1 -0
  124. package/dist/src/components/Accordion/index.d.ts +1 -0
  125. package/dist/src/components/GaugeChart/GaugeChart.d.ts +17 -0
  126. package/dist/src/components/GaugeChart/GaugeChart.test.d.ts +1 -0
  127. package/dist/src/components/GaugeChart/index.d.ts +1 -0
  128. package/dist/src/components/Heatmap/Heatmap.d.ts +28 -0
  129. package/dist/src/components/Heatmap/Heatmap.test.d.ts +1 -0
  130. package/dist/src/components/Heatmap/index.d.ts +1 -0
  131. package/dist/src/components/InlineCTA/InlineCTA.d.ts +2 -0
  132. package/dist/src/components/LineBarCharts/LineBarChart.d.ts +2 -0
  133. package/dist/src/components/Sparkline/Sparkline.d.ts +17 -0
  134. package/dist/src/components/Sparkline/Sparkline.test.d.ts +1 -0
  135. package/dist/src/components/Sparkline/index.d.ts +1 -0
  136. package/dist/src/hooks/index.d.ts +2 -0
  137. package/dist/src/hooks/useExitAnimation.d.ts +18 -0
  138. package/dist/src/hooks/usePresence.d.ts +13 -0
  139. package/dist/src/index.d.ts +4 -0
  140. package/dist/styles/theme.css +813 -0
  141. package/dist/styles.css +881 -68
  142. package/dist/{index19.js → utils/FieldWrapper.js} +1 -1
  143. package/package.json +8 -4
  144. package/theme.starter.css +58 -0
  145. package/dist/index42.js +0 -134
  146. package/dist/index43.js +0 -16
  147. package/dist/index44.js +0 -4232
  148. /package/dist/{index3.js → a11y/index.js} +0 -0
  149. /package/dist/{index30.js → hooks/useAnchoredPosition.js} +0 -0
  150. /package/dist/{index31.js → hooks/useComposedRefs.js} +0 -0
  151. /package/dist/{index32.js → hooks/useControllableState.js} +0 -0
  152. /package/dist/{index35.js → hooks/useListNavigation.js} +0 -0
  153. /package/dist/{index36.js → hooks/useOutsideInteraction.js} +0 -0
  154. /package/dist/{index4.js → utils/cx.js} +0 -0
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,30 @@
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
+
388
+ /* GaugeChart aliases */
389
+ --pf-gauge-color: var(--color-semantic-action-primary);
390
+ --pf-gauge-track-color: var(--color-semantic-background-subtle);
391
+ --pf-gauge-center-bg: var(--color-semantic-background-default);
392
+ --pf-gauge-label-color: var(--color-semantic-text-default);
393
+ --pf-gauge-label-size: var(--font-size-2xl);
394
+ --pf-gauge-sub-label-color: var(--color-semantic-text-muted);
395
+
396
+ /* Sparkline aliases */
397
+ --pf-sparkline-color: var(--color-semantic-action-primary);
398
+
364
399
  /* TreeView aliases */
365
400
  --pf-treeview-bg: var(--color-semantic-background-default);
366
401
  --pf-treeview-border: var(--color-semantic-border-default);
@@ -389,6 +424,9 @@
389
424
  --pf-notification-text: var(--color-semantic-text-default);
390
425
  --pf-notification-text-muted: var(--color-semantic-text-muted);
391
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);
392
430
  --pf-notification-info-bg: var(--color-brand-50);
393
431
  --pf-notification-info-border: var(--color-brand-300);
394
432
  --pf-notification-info-icon: var(--color-brand-700);
@@ -662,9 +700,11 @@
662
700
  --color-semantic-border-default: var(--color-gray-700);
663
701
  --color-semantic-border-strong: var(--color-gray-500);
664
702
  --color-semantic-border-focus: var(--color-brand-400);
665
- --color-semantic-action-primary: var(--color-brand-500);
666
- --color-semantic-action-primary-hover: var(--color-brand-600);
667
- --color-semantic-action-primary-active: var(--color-brand-700);
703
+
704
+ /* brand-600 (#2563eb) on white = ~5:1 — passes WCAG AA for normal text */
705
+ --color-semantic-action-primary: var(--color-brand-600);
706
+ --color-semantic-action-primary-hover: var(--color-brand-700);
707
+ --color-semantic-action-primary-active: var(--color-brand-800);
668
708
  --color-semantic-action-primary-text: var(--color-base-white);
669
709
  --color-semantic-action-secondary: var(--color-gray-800);
670
710
  --color-semantic-action-secondary-hover: var(--color-gray-700);
@@ -678,10 +718,61 @@
678
718
  --color-semantic-status-warning-foreground: var(--color-warning-300);
679
719
  --color-semantic-status-warning-bright: var(--color-warning-400);
680
720
  --color-semantic-status-danger-background: var(--color-danger-900);
681
- --color-semantic-status-danger-border: var(--color-danger-700);
721
+ /* danger-600 (#d92d20) on gray-900 = 3.71:1 — danger-700 only gives 2.72:1 */
722
+ --color-semantic-status-danger-border: var(--color-danger-600);
682
723
  --color-semantic-status-danger-foreground: var(--color-danger-300);
683
724
  --color-semantic-status-danger-bright: var(--color-danger-400);
684
725
 
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);
728
+ --pf-notification-info-bg: var(--color-brand-900);
729
+ --pf-notification-info-border: var(--color-brand-700);
730
+ --pf-notification-info-icon: var(--color-brand-300);
731
+ --pf-notification-info-title: var(--color-brand-200);
732
+ --pf-notification-info-hover-bg: var(--color-brand-800);
733
+ --pf-notification-info-hover-icon: var(--color-brand-200);
734
+
735
+ --pf-alert-info-background: var(--color-brand-900);
736
+ --pf-alert-info-border: var(--color-brand-700);
737
+ --pf-alert-info-foreground: var(--color-brand-200);
738
+
739
+ --pf-inline-cta-info-bg: var(--color-brand-900);
740
+ --pf-inline-cta-info-border: var(--color-brand-700);
741
+ --pf-inline-cta-info-icon: var(--color-brand-300);
742
+ --pf-inline-cta-info-heading: var(--color-brand-200);
743
+ --pf-inline-cta-info-description: var(--color-brand-300);
744
+
745
+ --pf-badge-brand-background: var(--color-brand-900);
746
+ --pf-badge-brand-foreground: var(--color-brand-300);
747
+
748
+ --pf-badgegroup-brand-100: var(--color-brand-900);
749
+ --pf-badgegroup-brand-300: var(--color-brand-700);
750
+ --pf-badgegroup-brand-700: var(--color-brand-300);
751
+
752
+ --pf-tag-brand-bg: var(--color-brand-900);
753
+ --pf-tag-brand-text: var(--color-brand-300);
754
+
755
+ --pf-utility-btn-brand-bg: var(--color-brand-900);
756
+ --pf-utility-btn-brand-border: var(--color-brand-700);
757
+ --pf-utility-btn-brand-text: var(--color-brand-300);
758
+ --pf-utility-btn-brand-bg-hover: var(--color-brand-800);
759
+
760
+ /* Calendar — same border-default contrast issue as TreeView */
761
+ --pf-calendar-border: var(--color-semantic-border-strong);
762
+
763
+ /* GaugeChart — track uses background-subtle (gray-700) which is 1.72:1 against gray-900 */
764
+ --pf-gauge-track-color: var(--color-semantic-border-strong);
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
+
772
+ /* TreeView — border-default (gray-700) is 1.73:1 against gray-900, fails WCAG non-text contrast.
773
+ border-strong (gray-500) gives 3.75:1. */
774
+ --pf-treeview-border: var(--color-semantic-border-strong);
775
+
685
776
  --pf-focus-ring: 0 0 0 var(--pf-focus-ring-width)
686
777
  color-mix(in srgb, var(--pf-focus-ring-color) 45%, transparent);
687
778
  }
@@ -726,6 +817,91 @@ body {
726
817
  vertical-align: var(--pf-icon-vertical-align, middle);
727
818
  color: var(--pf-icon-color, currentColor);
728
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
+ }
729
905
  .pf-alert {
730
906
  align-items: flex-start;
731
907
  border: 1px solid var(--pf-alert-border);
@@ -801,7 +977,7 @@ body {
801
977
  display: inline-flex;
802
978
  font-size: var(--font-size-md);
803
979
  justify-content: center;
804
- margin-left: auto;
980
+ margin-inline-start: auto;
805
981
  padding: 0;
806
982
  }
807
983
 
@@ -809,6 +985,34 @@ body {
809
985
  box-shadow: var(--pf-alert-focus-ring, var(--pf-focus-ring));
810
986
  outline: none;
811
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
+ }
812
1016
  .pf-avatar {
813
1017
  --pf-avatar-status-size: 10px;
814
1018
  --pf-avatar-status-offset: -2px;
@@ -886,7 +1090,7 @@ body {
886
1090
  top: var(--pf-avatar-status-offset);
887
1091
  height: var(--pf-avatar-status-size, 10px);
888
1092
  position: absolute;
889
- right: var(--pf-avatar-status-offset);
1093
+ inset-inline-end: var(--pf-avatar-status-offset);
890
1094
  width: var(--pf-avatar-status-size, 10px);
891
1095
  z-index: 1;
892
1096
  }
@@ -920,10 +1124,10 @@ body {
920
1124
  min-height: 40px;
921
1125
  text-decoration: none;
922
1126
  transition:
923
- background-color 120ms ease,
924
- border-color 120ms ease,
925
- color 120ms ease,
926
- 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);
927
1131
  }
928
1132
 
929
1133
  .pf-button:focus-visible {
@@ -1027,13 +1231,13 @@ body {
1027
1231
  }
1028
1232
 
1029
1233
  .pf-badge-group--leading .pf-badge-group__text {
1030
- margin-left: -1px;
1031
- padding-left: calc(var(--space-2) + 2px);
1234
+ margin-inline-start: -1px;
1235
+ padding-inline-start: calc(var(--space-2) + 2px);
1032
1236
  }
1033
1237
 
1034
1238
  .pf-badge-group--trailing .pf-badge-group__text {
1035
- margin-right: -1px;
1036
- padding-right: calc(var(--space-2) + 2px);
1239
+ margin-inline-end: -1px;
1240
+ padding-inline-end: calc(var(--space-2) + 2px);
1037
1241
  }
1038
1242
 
1039
1243
  .pf-badge-group--leading .pf-badge-group__badge {
@@ -1130,7 +1334,7 @@ body {
1130
1334
  gap: var(--space-2);
1131
1335
  justify-content: center;
1132
1336
  line-height: 1;
1133
- margin-left: -1px;
1337
+ margin-inline-start: -1px;
1134
1338
  min-height: 40px;
1135
1339
  padding: 0 var(--space-4);
1136
1340
  position: relative;
@@ -1144,7 +1348,7 @@ body {
1144
1348
  .pf-button-group__button:first-child {
1145
1349
  border-bottom-left-radius: var(--radius-md);
1146
1350
  border-top-left-radius: var(--radius-md);
1147
- margin-left: 0;
1351
+ margin-inline-start: 0;
1148
1352
  }
1149
1353
 
1150
1354
  .pf-button-group__button:last-child {
@@ -1634,7 +1838,7 @@ body {
1634
1838
  color: var(--pf-dropdown-text-muted);
1635
1839
  display: inline-flex;
1636
1840
  height: var(--pf-dropdown-icon-size);
1637
- transition: transform 140ms ease;
1841
+ transition: transform var(--pf-transition-fast);
1638
1842
  width: var(--pf-dropdown-icon-size);
1639
1843
  }
1640
1844
 
@@ -1658,6 +1862,19 @@ body {
1658
1862
  padding: var(--space-1);
1659
1863
  position: fixed;
1660
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
+ }
1661
1878
  }
1662
1879
 
1663
1880
  .pf-dropdown__item {
@@ -1672,7 +1889,7 @@ body {
1672
1889
  justify-content: space-between;
1673
1890
  min-height: 34px;
1674
1891
  padding: 0 var(--space-2);
1675
- text-align: left;
1892
+ text-align: start;
1676
1893
  width: 100%;
1677
1894
  }
1678
1895
 
@@ -1722,6 +1939,10 @@ body {
1722
1939
  .pf-dropdown__chevron {
1723
1940
  transition: none;
1724
1941
  }
1942
+
1943
+ .pf-dropdown__menu {
1944
+ animation: none;
1945
+ }
1725
1946
  }
1726
1947
  .pf-calendar {
1727
1948
  background: var(--pf-calendar-bg);
@@ -1887,7 +2108,8 @@ body {
1887
2108
 
1888
2109
  .pf-carousel__track {
1889
2110
  display: flex;
1890
- 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);
1891
2113
  width: 100%;
1892
2114
  }
1893
2115
 
@@ -1964,7 +2186,8 @@ body {
1964
2186
  cursor: pointer;
1965
2187
  height: var(--pf-carousel-indicator-size, 8px);
1966
2188
  padding: 0;
1967
- 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);
1968
2191
  width: var(--pf-carousel-indicator-size, 8px);
1969
2192
  }
1970
2193
 
@@ -2123,8 +2346,8 @@ body {
2123
2346
  .pf-code-snippet__line-number {
2124
2347
  color: var(--pf-code-snippet-line-number, var(--color-gray-400));
2125
2348
  min-width: 2.5ch;
2126
- padding-right: var(--space-3);
2127
- text-align: right;
2349
+ padding-inline-end: var(--space-3);
2350
+ text-align: end;
2128
2351
  user-select: none;
2129
2352
  vertical-align: top;
2130
2353
  }
@@ -2153,8 +2376,8 @@ body {
2153
2376
  }
2154
2377
 
2155
2378
  .pf-content-divider--inset {
2156
- padding-left: var(--space-2);
2157
- padding-right: var(--space-2);
2379
+ padding-inline-start: var(--space-2);
2380
+ padding-inline-end: var(--space-2);
2158
2381
  }
2159
2382
 
2160
2383
  .pf-content-divider__line {
@@ -2201,7 +2424,7 @@ body {
2201
2424
  min-height: 40px;
2202
2425
  min-width: 0;
2203
2426
  padding: 0 var(--space-3);
2204
- text-align: left;
2427
+ text-align: start;
2205
2428
  }
2206
2429
 
2207
2430
  .pf-date-picker__trigger:hover:not(:disabled) {
@@ -2576,6 +2799,64 @@ body {
2576
2799
  gap: var(--space-3);
2577
2800
  grid-template-columns: auto 1fr;
2578
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
+ }
2579
2860
  }
2580
2861
 
2581
2862
  @media (min-width: 768px) {
@@ -2653,6 +2934,169 @@ body {
2653
2934
  background: color-mix(in srgb, var(--pf-inline-cta-warning-bg) 60%, var(--color-base-white));
2654
2935
  border-color: var(--pf-inline-cta-warning-border);
2655
2936
  }
2937
+ .pf-gauge {
2938
+ position: relative;
2939
+ display: inline-flex;
2940
+ align-items: center;
2941
+ justify-content: center;
2942
+ }
2943
+
2944
+ .pf-gauge__svg {
2945
+ position: absolute;
2946
+ inset: 0;
2947
+ }
2948
+
2949
+ .pf-gauge__track {
2950
+ stroke: var(--pf-gauge-track-color);
2951
+ }
2952
+
2953
+ .pf-gauge__fill {
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
+ }
2972
+ }
2973
+
2974
+ .pf-gauge__center {
2975
+ display: flex;
2976
+ flex-direction: column;
2977
+ align-items: center;
2978
+ justify-content: center;
2979
+ gap: var(--space-1);
2980
+ position: relative;
2981
+ z-index: 1;
2982
+ padding: var(--space-2);
2983
+ border-radius: var(--radius-full);
2984
+ background: var(--pf-gauge-center-bg);
2985
+ text-align: center;
2986
+ }
2987
+
2988
+ .pf-gauge__label {
2989
+ color: var(--pf-gauge-label-color);
2990
+ font-size: var(--pf-gauge-label-size);
2991
+ font-weight: var(--font-weight-semibold);
2992
+ line-height: 1;
2993
+ }
2994
+
2995
+ .pf-gauge__sub-label {
2996
+ color: var(--pf-gauge-sub-label-color);
2997
+ font-size: var(--font-size-sm);
2998
+ line-height: 1;
2999
+ }
3000
+ .pf-heatmap {
3001
+ display: inline-block;
3002
+ font-family: var(--font-family-sans);
3003
+ }
3004
+
3005
+ .pf-heatmap__empty {
3006
+ color: var(--color-semantic-text-muted);
3007
+ font-size: var(--font-size-sm);
3008
+ padding: var(--space-4);
3009
+ text-align: center;
3010
+ }
3011
+
3012
+ .pf-heatmap__body {
3013
+ display: flex;
3014
+ gap: var(--pf-heatmap-cell-gap);
3015
+ }
3016
+
3017
+ .pf-heatmap__weekdays {
3018
+ display: flex;
3019
+ flex-direction: column;
3020
+ }
3021
+
3022
+ .pf-heatmap__weekday-spacer {
3023
+ display: block;
3024
+ height: calc(var(--font-size-xs) + var(--space-1));
3025
+ }
3026
+
3027
+ .pf-heatmap__weekday-grid {
3028
+ display: grid;
3029
+ grid-template-rows: repeat(7, var(--pf-heatmap-cell-size));
3030
+ gap: var(--pf-heatmap-cell-gap);
3031
+ }
3032
+
3033
+ .pf-heatmap__weekday {
3034
+ align-items: center;
3035
+ color: var(--pf-heatmap-label-color);
3036
+ display: flex;
3037
+ font-size: var(--font-size-xs);
3038
+ line-height: 1;
3039
+ padding-inline-end: var(--space-1);
3040
+ }
3041
+
3042
+ .pf-heatmap__main {
3043
+ display: flex;
3044
+ flex-direction: column;
3045
+ gap: var(--space-1);
3046
+ }
3047
+
3048
+ .pf-heatmap__months {
3049
+ display: grid;
3050
+ gap: var(--pf-heatmap-cell-gap);
3051
+ height: var(--font-size-xs);
3052
+ }
3053
+
3054
+ .pf-heatmap__month {
3055
+ color: var(--pf-heatmap-label-color);
3056
+ font-size: var(--font-size-xs);
3057
+ line-height: 1;
3058
+ }
3059
+
3060
+ .pf-heatmap__grid {
3061
+ display: grid;
3062
+ grid-template-rows: repeat(7, var(--pf-heatmap-cell-size));
3063
+ grid-auto-flow: column;
3064
+ grid-auto-columns: var(--pf-heatmap-cell-size);
3065
+ gap: var(--pf-heatmap-cell-gap);
3066
+ }
3067
+
3068
+ .pf-heatmap__cell {
3069
+ border-radius: var(--pf-heatmap-cell-radius);
3070
+ height: var(--pf-heatmap-cell-size);
3071
+ width: var(--pf-heatmap-cell-size);
3072
+ }
3073
+
3074
+ .pf-heatmap__cell--empty {
3075
+ background: transparent;
3076
+ }
3077
+
3078
+ /* Staggered fade-in on mount — per-column animation-delay is set inline so
3079
+ the grid wipes in left-to-right (oldest week → newest). */
3080
+ .pf-heatmap__cell {
3081
+ animation: pf-heatmap-cell-in var(--duration-moderate) var(--easing-decelerate) both;
3082
+ }
3083
+
3084
+ @keyframes pf-heatmap-cell-in {
3085
+ from {
3086
+ opacity: 0;
3087
+ transform: scale(0.6);
3088
+ }
3089
+ to {
3090
+ opacity: 1;
3091
+ transform: scale(1);
3092
+ }
3093
+ }
3094
+
3095
+ @media (prefers-reduced-motion: reduce) {
3096
+ .pf-heatmap__cell {
3097
+ animation: none;
3098
+ }
3099
+ }
2656
3100
  /* ─── Chart color palette ─────────────────────────────────────────────── */
2657
3101
  :root {
2658
3102
  --pf-chart-color-1: var(--color-brand-600);
@@ -3079,6 +3523,8 @@ body {
3079
3523
  }
3080
3524
 
3081
3525
  .pf-modal__body {
3526
+ display: grid;
3527
+ gap: var(--space-4);
3082
3528
  overflow-y: auto;
3083
3529
  padding: var(--space-3);
3084
3530
  }
@@ -3124,6 +3570,66 @@ body {
3124
3570
  color: var(--pf-modal-text);
3125
3571
  outline: none;
3126
3572
  }
3573
+
3574
+ /* Entrance animation — uses motion tokens via theme aliases */
3575
+ @keyframes pf-modal-overlay-in {
3576
+ from {
3577
+ opacity: 0;
3578
+ }
3579
+ to {
3580
+ opacity: 1;
3581
+ }
3582
+ }
3583
+
3584
+ @keyframes pf-modal-in {
3585
+ from {
3586
+ opacity: 0;
3587
+ transform: translateY(8px) scale(0.98);
3588
+ }
3589
+ to {
3590
+ opacity: 1;
3591
+ transform: translateY(0) scale(1);
3592
+ }
3593
+ }
3594
+
3595
+ .pf-modal__overlay {
3596
+ animation: pf-modal-overlay-in var(--pf-transition-fast);
3597
+ }
3598
+
3599
+ .pf-modal {
3600
+ animation: pf-modal-in var(--pf-transition-enter);
3601
+ }
3602
+
3603
+ /* Exit animation — plays while the dialog is being dismissed (presence handling) */
3604
+ @keyframes pf-modal-overlay-out {
3605
+ to {
3606
+ opacity: 0;
3607
+ }
3608
+ }
3609
+
3610
+ @keyframes pf-modal-out {
3611
+ to {
3612
+ opacity: 0;
3613
+ transform: translateY(8px) scale(0.98);
3614
+ }
3615
+ }
3616
+
3617
+ .pf-modal__overlay--exiting {
3618
+ animation: pf-modal-overlay-out var(--pf-transition-fast) forwards;
3619
+ }
3620
+
3621
+ .pf-modal--exiting {
3622
+ animation: pf-modal-out var(--pf-transition-fast) forwards;
3623
+ }
3624
+
3625
+ @media (prefers-reduced-motion: reduce) {
3626
+ .pf-modal__overlay,
3627
+ .pf-modal,
3628
+ .pf-modal__overlay--exiting,
3629
+ .pf-modal--exiting {
3630
+ animation: none;
3631
+ }
3632
+ }
3127
3633
  .pf-multi-select {
3128
3634
  position: relative;
3129
3635
  }
@@ -3141,7 +3647,7 @@ body {
3141
3647
  justify-content: space-between;
3142
3648
  min-height: 40px;
3143
3649
  padding: var(--space-1) var(--space-2) var(--space-1) var(--space-2);
3144
- text-align: left;
3650
+ text-align: start;
3145
3651
  width: 100%;
3146
3652
  transition:
3147
3653
  background 0.2s,
@@ -3204,7 +3710,7 @@ body {
3204
3710
  justify-content: center;
3205
3711
  width: 20px;
3206
3712
  transform-origin: center;
3207
- transition: transform 140ms ease;
3713
+ transition: transform var(--pf-transition-fast);
3208
3714
  }
3209
3715
 
3210
3716
  .pf-multi-select__icon svg {
@@ -3229,6 +3735,19 @@ body {
3229
3735
  padding: var(--space-1);
3230
3736
  position: fixed;
3231
3737
  z-index: 1000;
3738
+ transform-origin: top center;
3739
+ animation: pf-multi-select-menu-in var(--duration-fast) var(--easing-decelerate);
3740
+ }
3741
+
3742
+ @keyframes pf-multi-select-menu-in {
3743
+ from {
3744
+ opacity: 0;
3745
+ transform: translateY(-4px) scaleY(0.96);
3746
+ }
3747
+ to {
3748
+ opacity: 1;
3749
+ transform: translateY(0) scaleY(1);
3750
+ }
3232
3751
  }
3233
3752
 
3234
3753
  .pf-multi-select__option {
@@ -3280,6 +3799,10 @@ body {
3280
3799
  .pf-multi-select__icon {
3281
3800
  transition: none;
3282
3801
  }
3802
+
3803
+ .pf-multi-select__menu {
3804
+ animation: none;
3805
+ }
3283
3806
  }
3284
3807
  .pf-notification-stack {
3285
3808
  display: grid;
@@ -3342,6 +3865,45 @@ body {
3342
3865
  max-width: none;
3343
3866
  padding: var(--space-3);
3344
3867
  width: 100%;
3868
+ animation: pf-notification-in var(--duration-moderate) var(--easing-decelerate);
3869
+ }
3870
+
3871
+ @keyframes pf-notification-in {
3872
+ from {
3873
+ opacity: 0;
3874
+ transform: translateX(12px);
3875
+ }
3876
+ }
3877
+
3878
+ /* Exit: slide off to the right and collapse so stacked siblings reflow. */
3879
+ .pf-notification--exiting {
3880
+ animation: pf-notification-out var(--duration-moderate) var(--easing-accelerate) forwards;
3881
+ overflow: hidden;
3882
+ pointer-events: none;
3883
+ }
3884
+
3885
+ @keyframes pf-notification-out {
3886
+ from {
3887
+ opacity: 1;
3888
+ transform: translateX(0);
3889
+ max-height: 480px;
3890
+ }
3891
+ to {
3892
+ opacity: 0;
3893
+ transform: translateX(100%);
3894
+ max-height: 0;
3895
+ margin-top: 0;
3896
+ margin-bottom: 0;
3897
+ padding-top: 0;
3898
+ padding-bottom: 0;
3899
+ }
3900
+ }
3901
+
3902
+ @media (prefers-reduced-motion: reduce) {
3903
+ .pf-notification,
3904
+ .pf-notification--exiting {
3905
+ animation: none;
3906
+ }
3345
3907
  }
3346
3908
 
3347
3909
  @media (min-width: 768px) {
@@ -3352,22 +3914,38 @@ body {
3352
3914
  }
3353
3915
 
3354
3916
  .pf-notification--info {
3355
- background: color-mix(in srgb, var(--pf-notification-info-bg) 45%, var(--color-base-white));
3917
+ background: color-mix(
3918
+ in srgb,
3919
+ var(--pf-notification-info-bg) 45%,
3920
+ var(--pf-notification-mix-base)
3921
+ );
3356
3922
  border-color: var(--pf-notification-info-border);
3357
3923
  }
3358
3924
 
3359
3925
  .pf-notification--success {
3360
- background: color-mix(in srgb, var(--pf-notification-success-bg) 45%, var(--color-base-white));
3926
+ background: color-mix(
3927
+ in srgb,
3928
+ var(--pf-notification-success-bg) 45%,
3929
+ var(--pf-notification-mix-base)
3930
+ );
3361
3931
  border-color: var(--pf-notification-success-border);
3362
3932
  }
3363
3933
 
3364
3934
  .pf-notification--warning {
3365
- background: color-mix(in srgb, var(--pf-notification-warning-bg) 45%, var(--color-base-white));
3935
+ background: color-mix(
3936
+ in srgb,
3937
+ var(--pf-notification-warning-bg) 45%,
3938
+ var(--pf-notification-mix-base)
3939
+ );
3366
3940
  border-color: var(--pf-notification-warning-border);
3367
3941
  }
3368
3942
 
3369
3943
  .pf-notification--danger {
3370
- background: color-mix(in srgb, var(--pf-notification-danger-bg) 45%, var(--color-base-white));
3944
+ background: color-mix(
3945
+ in srgb,
3946
+ var(--pf-notification-danger-bg) 45%,
3947
+ var(--pf-notification-mix-base)
3948
+ );
3371
3949
  border-color: var(--pf-notification-danger-border);
3372
3950
  }
3373
3951
 
@@ -3677,6 +4255,38 @@ body {
3677
4255
  position: relative;
3678
4256
  }
3679
4257
 
4258
+ /* The conic-gradient lives on a masked layer so it can sweep ("build out")
4259
+ clockwise on mount without clipping the center label. */
4260
+ @property --pf-pie-sweep {
4261
+ syntax: '<percentage>';
4262
+ inherits: false;
4263
+ initial-value: 0%;
4264
+ }
4265
+
4266
+ .pf-pie-chart__visual::before {
4267
+ content: '';
4268
+ position: absolute;
4269
+ inset: 0;
4270
+ border-radius: inherit;
4271
+ background-image: var(--pf-pie-gradient);
4272
+ --pf-pie-sweep: 100%;
4273
+ -webkit-mask: conic-gradient(#000 var(--pf-pie-sweep), #0000 0);
4274
+ mask: conic-gradient(#000 var(--pf-pie-sweep), #0000 0);
4275
+ animation: pf-pie-sweep var(--duration-slow) var(--easing-decelerate);
4276
+ }
4277
+
4278
+ @keyframes pf-pie-sweep {
4279
+ from {
4280
+ --pf-pie-sweep: 0%;
4281
+ }
4282
+ }
4283
+
4284
+ @media (prefers-reduced-motion: reduce) {
4285
+ .pf-pie-chart__visual::before {
4286
+ animation: none;
4287
+ }
4288
+ }
4289
+
3680
4290
  .pf-pie-chart__visual--empty {
3681
4291
  outline: 1px solid var(--pf-piechart-border-muted);
3682
4292
  }
@@ -3691,6 +4301,8 @@ body {
3691
4301
  font-weight: var(--font-weight-semibold);
3692
4302
  justify-content: center;
3693
4303
  line-height: 1.2;
4304
+ position: relative;
4305
+ z-index: 1;
3694
4306
  text-align: center;
3695
4307
  }
3696
4308
 
@@ -3755,8 +4367,16 @@ body {
3755
4367
  background: var(--pf-progress-accent);
3756
4368
  border-radius: inherit;
3757
4369
  height: 100%;
3758
- transition: width 200ms ease;
3759
4370
  width: var(--pf-progress-fill, 0%);
4371
+ /* Animate fill in from 0 on mount, and smoothly between values on change */
4372
+ transition: width var(--pf-transition-slow);
4373
+ animation: pf-progress-bar-in var(--duration-slow) var(--easing-decelerate);
4374
+ }
4375
+
4376
+ @keyframes pf-progress-bar-in {
4377
+ from {
4378
+ width: 0;
4379
+ }
3760
4380
  }
3761
4381
 
3762
4382
  .pf-progress-bar__value {
@@ -3793,7 +4413,16 @@ body {
3793
4413
  .pf-progress-circle__fill {
3794
4414
  stroke: var(--pf-progress-accent);
3795
4415
  stroke-linecap: round;
3796
- transition: stroke-dashoffset 200ms ease;
4416
+ stroke-dashoffset: var(--pf-progress-dashoffset);
4417
+ /* Animate fill in from empty on mount, and smoothly between values on change */
4418
+ transition: stroke-dashoffset var(--pf-transition-slow);
4419
+ animation: pf-progress-circle-in var(--duration-slow) var(--easing-decelerate);
4420
+ }
4421
+
4422
+ @keyframes pf-progress-circle-in {
4423
+ from {
4424
+ stroke-dashoffset: var(--pf-progress-circ);
4425
+ }
3797
4426
  }
3798
4427
 
3799
4428
  .pf-progress-circle__value {
@@ -3810,6 +4439,7 @@ body {
3810
4439
  .pf-progress-bar__fill,
3811
4440
  .pf-progress-circle__fill {
3812
4441
  transition: none;
4442
+ animation: none;
3813
4443
  }
3814
4444
  }
3815
4445
  .pf-progress-steps {
@@ -3876,13 +4506,21 @@ body {
3876
4506
  width: 28px;
3877
4507
  position: relative;
3878
4508
  z-index: 1;
4509
+ /* Animate marker as its status changes when the current step advances */
4510
+ transition:
4511
+ background-color var(--pf-transition-medium),
4512
+ border-color var(--pf-transition-medium),
4513
+ color var(--pf-transition-medium),
4514
+ box-shadow var(--pf-transition-medium);
3879
4515
  }
3880
4516
 
3881
4517
  .pf-progress-steps__connector {
3882
4518
  background: var(--pf-progress-steps-border);
3883
4519
  display: block;
3884
4520
  flex: 1;
3885
- margin-left: var(--space-2);
4521
+ margin-inline-start: var(--space-2);
4522
+ /* Connector "activates" with a smooth fill as the step completes */
4523
+ transition: background-color var(--pf-transition-slow);
3886
4524
  }
3887
4525
 
3888
4526
  .pf-progress-steps--horizontal .pf-progress-steps__connector {
@@ -3894,7 +4532,7 @@ body {
3894
4532
  display: block;
3895
4533
  height: 1px;
3896
4534
  left: 50%;
3897
- margin-left: 0;
4535
+ margin-inline-start: 0;
3898
4536
  position: absolute;
3899
4537
  top: 50%;
3900
4538
  transform: translateY(-50%);
@@ -3925,7 +4563,7 @@ body {
3925
4563
 
3926
4564
  .pf-progress-steps--vertical .pf-progress-steps__connector {
3927
4565
  bottom: calc(var(--space-3) * -1);
3928
- left: 14px;
4566
+ inset-inline-start: 14px;
3929
4567
  margin: 0;
3930
4568
  position: absolute;
3931
4569
  top: 28px;
@@ -3941,6 +4579,7 @@ body {
3941
4579
  font-size: var(--font-size-sm);
3942
4580
  font-weight: var(--font-weight-semibold);
3943
4581
  margin: var(--space-1) 0 0;
4582
+ transition: color var(--pf-transition-medium);
3944
4583
  }
3945
4584
 
3946
4585
  .pf-progress-steps__description {
@@ -3970,6 +4609,14 @@ body {
3970
4609
  .pf-progress-steps__item--current .pf-progress-steps__title {
3971
4610
  color: var(--pf-progress-steps-current-title);
3972
4611
  }
4612
+
4613
+ @media (prefers-reduced-motion: reduce) {
4614
+ .pf-progress-steps__marker,
4615
+ .pf-progress-steps__connector,
4616
+ .pf-progress-steps__title {
4617
+ transition: none;
4618
+ }
4619
+ }
3973
4620
  .pf-radar-chart {
3974
4621
  align-items: stretch;
3975
4622
  display: inline-flex;
@@ -4067,6 +4714,28 @@ body {
4067
4714
  padding: var(--space-4);
4068
4715
  text-align: center;
4069
4716
  }
4717
+
4718
+ /* Grow the value polygon out from the center on mount */
4719
+ .pf-radar-chart__value {
4720
+ animation: pf-radar-grow var(--duration-slow) var(--easing-decelerate);
4721
+ }
4722
+
4723
+ @keyframes pf-radar-grow {
4724
+ from {
4725
+ opacity: 0;
4726
+ transform: scale(0);
4727
+ }
4728
+ to {
4729
+ opacity: 1;
4730
+ transform: scale(1);
4731
+ }
4732
+ }
4733
+
4734
+ @media (prefers-reduced-motion: reduce) {
4735
+ .pf-radar-chart__value {
4736
+ animation: none;
4737
+ }
4738
+ }
4070
4739
  .pf-radio-field {
4071
4740
  align-items: center;
4072
4741
  display: inline-flex;
@@ -4335,7 +5004,7 @@ body {
4335
5004
  color: var(--pf-rte-text-muted);
4336
5005
  font-size: var(--font-size-sm);
4337
5006
  margin: var(--space-2) 0 0;
4338
- text-align: right;
5007
+ text-align: end;
4339
5008
  }
4340
5009
  .pf-section-footer {
4341
5010
  align-items: flex-start;
@@ -4552,7 +5221,7 @@ body {
4552
5221
  grid-template-columns: auto 1fr auto;
4553
5222
  min-height: 36px;
4554
5223
  padding: 0 var(--space-2);
4555
- text-align: left;
5224
+ text-align: start;
4556
5225
  text-decoration: none;
4557
5226
  width: 100%;
4558
5227
  }
@@ -4590,6 +5259,71 @@ body {
4590
5259
  text-overflow: ellipsis;
4591
5260
  white-space: nowrap;
4592
5261
  }
5262
+ .pf-sparkline {
5263
+ display: block;
5264
+ overflow: visible;
5265
+ }
5266
+
5267
+ .pf-sparkline__line {
5268
+ stroke: var(--pf-sparkline-color-override, var(--pf-sparkline-color));
5269
+ }
5270
+
5271
+ .pf-sparkline__area {
5272
+ fill: var(--pf-sparkline-color-override, var(--pf-sparkline-color));
5273
+ opacity: var(--pf-sparkline-area-opacity, 0.15);
5274
+ }
5275
+
5276
+ .pf-sparkline__dot {
5277
+ fill: var(--pf-sparkline-color-override, var(--pf-sparkline-color));
5278
+ }
5279
+
5280
+ /* Opt-in mount animation: draw the line, fade in the area and end dot.
5281
+ The line path sets pathLength="1" so dash math is length-independent. */
5282
+ .pf-sparkline--animated .pf-sparkline__line {
5283
+ stroke-dasharray: 1;
5284
+ animation: pf-sparkline-draw var(--duration-slow) var(--easing-standard) both;
5285
+ }
5286
+
5287
+ @keyframes pf-sparkline-draw {
5288
+ from {
5289
+ stroke-dashoffset: 1;
5290
+ }
5291
+ to {
5292
+ stroke-dashoffset: 0;
5293
+ }
5294
+ }
5295
+
5296
+ .pf-sparkline--animated .pf-sparkline__area {
5297
+ animation: pf-sparkline-fade var(--duration-slow) var(--easing-standard) both;
5298
+ }
5299
+
5300
+ @keyframes pf-sparkline-fade {
5301
+ from {
5302
+ opacity: 0;
5303
+ }
5304
+ }
5305
+
5306
+ .pf-sparkline--animated .pf-sparkline__dot {
5307
+ animation: pf-sparkline-dot var(--duration-fast) var(--easing-decelerate) var(--duration-moderate)
5308
+ both;
5309
+ }
5310
+
5311
+ @keyframes pf-sparkline-dot {
5312
+ from {
5313
+ opacity: 0;
5314
+ }
5315
+ to {
5316
+ opacity: 1;
5317
+ }
5318
+ }
5319
+
5320
+ @media (prefers-reduced-motion: reduce) {
5321
+ .pf-sparkline--animated .pf-sparkline__line,
5322
+ .pf-sparkline--animated .pf-sparkline__area,
5323
+ .pf-sparkline--animated .pf-sparkline__dot {
5324
+ animation: none;
5325
+ }
5326
+ }
4593
5327
  .pf-slideout__portal {
4594
5328
  inset: 0;
4595
5329
  position: fixed;
@@ -4601,7 +5335,7 @@ body {
4601
5335
  opacity: 1;
4602
5336
  inset: 0;
4603
5337
  position: absolute;
4604
- transition: opacity 220ms ease;
5338
+ transition: opacity var(--pf-transition-slow);
4605
5339
  }
4606
5340
 
4607
5341
  .pf-slideout__viewport {
@@ -4630,7 +5364,7 @@ body {
4630
5364
  height: 100%;
4631
5365
  max-width: 100%;
4632
5366
  pointer-events: auto;
4633
- transition: transform 220ms ease;
5367
+ transition: transform var(--pf-transition-slow);
4634
5368
  will-change: transform;
4635
5369
  }
4636
5370
 
@@ -4827,7 +5561,7 @@ body {
4827
5561
  justify-content: space-between;
4828
5562
  min-height: 40px;
4829
5563
  padding: 0 var(--space-3);
4830
- text-align: left;
5564
+ text-align: start;
4831
5565
  width: 100%;
4832
5566
  transition:
4833
5567
  background 0.2s,
@@ -4881,7 +5615,7 @@ body {
4881
5615
  justify-content: center;
4882
5616
  width: 20px;
4883
5617
  transform-origin: center;
4884
- transition: transform 140ms ease;
5618
+ transition: transform var(--pf-transition-fast);
4885
5619
  }
4886
5620
 
4887
5621
  .pf-select__icon svg {
@@ -4906,6 +5640,25 @@ body {
4906
5640
  padding: var(--space-1);
4907
5641
  position: fixed;
4908
5642
  z-index: 1000;
5643
+ transform-origin: top center;
5644
+ animation: pf-select-menu-in var(--duration-fast) var(--easing-decelerate);
5645
+ }
5646
+
5647
+ @keyframes pf-select-menu-in {
5648
+ from {
5649
+ opacity: 0;
5650
+ transform: translateY(-4px) scaleY(0.96);
5651
+ }
5652
+ to {
5653
+ opacity: 1;
5654
+ transform: translateY(0) scaleY(1);
5655
+ }
5656
+ }
5657
+
5658
+ @media (prefers-reduced-motion: reduce) {
5659
+ .pf-select__menu {
5660
+ animation: none;
5661
+ }
4909
5662
  }
4910
5663
 
4911
5664
  .pf-select__option {
@@ -5098,7 +5851,7 @@ body {
5098
5851
  display: inline-flex;
5099
5852
  height: 18px;
5100
5853
  justify-content: center;
5101
- margin-right: -2px;
5854
+ margin-inline-end: -2px;
5102
5855
  padding: 0;
5103
5856
  width: 18px;
5104
5857
  }
@@ -5139,9 +5892,9 @@ body {
5139
5892
  font-size: var(--font-size-sm);
5140
5893
  min-height: 56px;
5141
5894
  padding-top: var(--space-3);
5142
- padding-right: var(--space-4, 16px);
5895
+ padding-inline-end: var(--space-4, 16px);
5143
5896
  padding-bottom: var(--space-3);
5144
- padding-left: var(--space-4, 16px);
5897
+ padding-inline-start: var(--space-4, 16px);
5145
5898
  }
5146
5899
 
5147
5900
  .pf-table__head-cell,
@@ -5222,7 +5975,7 @@ body {
5222
5975
  }
5223
5976
 
5224
5977
  .pf-table__cell--left {
5225
- text-align: left;
5978
+ text-align: start;
5226
5979
  }
5227
5980
 
5228
5981
  .pf-table__cell--center {
@@ -5230,7 +5983,7 @@ body {
5230
5983
  }
5231
5984
 
5232
5985
  .pf-table__cell--right {
5233
- text-align: right;
5986
+ text-align: end;
5234
5987
  }
5235
5988
 
5236
5989
  .pf-table__empty {
@@ -5257,6 +6010,31 @@ body {
5257
6010
  .pf-tabs__list {
5258
6011
  display: flex;
5259
6012
  overflow-x: auto;
6013
+ position: relative;
6014
+ }
6015
+
6016
+ .pf-tabs__indicator {
6017
+ position: absolute;
6018
+ pointer-events: none;
6019
+ transition:
6020
+ left var(--pf-transition-medium),
6021
+ width var(--pf-transition-medium),
6022
+ top var(--pf-transition-medium),
6023
+ height var(--pf-transition-medium);
6024
+ }
6025
+
6026
+ .pf-tabs__indicator--underline {
6027
+ bottom: 0;
6028
+ height: var(--pf-tabs-underline-width);
6029
+ background: var(--pf-tabs-text);
6030
+ border-radius: var(--radius-full);
6031
+ }
6032
+
6033
+ .pf-tabs__indicator--pills {
6034
+ background: var(--pf-tabs-bg);
6035
+ border-radius: var(--radius-sm);
6036
+ box-shadow: var(--pf-tabs-elevation-tab-active-shadow, var(--pf-elevation-tab-active-shadow));
6037
+ z-index: 0;
5260
6038
  }
5261
6039
 
5262
6040
  .pf-tabs__list--full-width {
@@ -5285,7 +6063,8 @@ body {
5285
6063
  font-weight: var(--font-weight-medium);
5286
6064
  min-width: 0;
5287
6065
  position: relative;
5288
- transition: color 160ms ease;
6066
+ z-index: 1;
6067
+ transition: color var(--pf-transition-medium);
5289
6068
  white-space: nowrap;
5290
6069
  }
5291
6070
 
@@ -5320,7 +6099,7 @@ body {
5320
6099
  }
5321
6100
 
5322
6101
  .pf-tabs__tab--underline.pf-tabs__tab--active {
5323
- border-bottom-color: var(--pf-tabs-text);
6102
+ /* The sliding indicator draws the underline; keep the transparent border for spacing */
5324
6103
  color: var(--pf-tabs-text);
5325
6104
  }
5326
6105
 
@@ -5334,8 +6113,7 @@ body {
5334
6113
  }
5335
6114
 
5336
6115
  .pf-tabs__tab--pills.pf-tabs__tab--active {
5337
- background: var(--pf-tabs-bg);
5338
- box-shadow: var(--pf-tabs-elevation-tab-active-shadow, var(--pf-elevation-tab-active-shadow));
6116
+ /* The sliding indicator draws the pill background */
5339
6117
  color: var(--pf-tabs-text);
5340
6118
  }
5341
6119
 
@@ -5351,7 +6129,8 @@ body {
5351
6129
  }
5352
6130
 
5353
6131
  @media (prefers-reduced-motion: reduce) {
5354
- .pf-tabs__tab {
6132
+ .pf-tabs__tab,
6133
+ .pf-tabs__indicator {
5355
6134
  transition: none;
5356
6135
  }
5357
6136
  }
@@ -5433,6 +6212,41 @@ body {
5433
6212
  position: fixed;
5434
6213
  z-index: 1100;
5435
6214
  }
6215
+
6216
+ /* Entrance animation — uses motion tokens via theme aliases */
6217
+ @keyframes pf-tooltip-in {
6218
+ from {
6219
+ opacity: 0;
6220
+ transform: translateY(2px);
6221
+ }
6222
+ to {
6223
+ opacity: 1;
6224
+ transform: translateY(0);
6225
+ }
6226
+ }
6227
+
6228
+ .pf-tooltip {
6229
+ animation: pf-tooltip-in var(--pf-transition-fast);
6230
+ }
6231
+
6232
+ /* Exit fade — plays while the tooltip is dismissed (presence handling) */
6233
+ @keyframes pf-tooltip-out {
6234
+ to {
6235
+ opacity: 0;
6236
+ transform: translateY(2px);
6237
+ }
6238
+ }
6239
+
6240
+ .pf-tooltip--exiting {
6241
+ animation: pf-tooltip-out var(--duration-fast) var(--easing-accelerate) forwards;
6242
+ }
6243
+
6244
+ @media (prefers-reduced-motion: reduce) {
6245
+ .pf-tooltip,
6246
+ .pf-tooltip--exiting {
6247
+ animation: none;
6248
+ }
6249
+ }
5436
6250
  .pf-tree-view {
5437
6251
  background: var(--pf-treeview-bg);
5438
6252
  border: 1px solid var(--pf-treeview-border);
@@ -5455,7 +6269,7 @@ body {
5455
6269
  display: grid;
5456
6270
  grid-template-columns: auto 1fr;
5457
6271
  min-width: 0;
5458
- padding-left: calc(var(--pf-tree-level, 0) * var(--space-4));
6272
+ padding-inline-start: calc(var(--pf-tree-level, 0) * var(--space-4));
5459
6273
  }
5460
6274
 
5461
6275
  .pf-tree-view__toggle-wrap {
@@ -5504,7 +6318,7 @@ body {
5504
6318
  min-height: 34px;
5505
6319
  min-width: 0;
5506
6320
  padding: 0 var(--space-2);
5507
- text-align: left;
6321
+ text-align: start;
5508
6322
  width: 100%;
5509
6323
  }
5510
6324
 
@@ -5673,4 +6487,3 @@ body {
5673
6487
  padding: var(--space-4);
5674
6488
  text-align: center;
5675
6489
  }
5676
- /*$vite$:1*/