@pitchfork-ui/react 0.8.0 → 0.10.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 (130) hide show
  1. package/LICENSE +21 -0
  2. package/dist/a11y/index.js +1 -0
  3. package/dist/components/Accordion/Accordion2.js +1 -0
  4. package/dist/components/Alert/Alert2.js +1 -0
  5. package/dist/components/Avatar/Avatar2.js +1 -0
  6. package/dist/components/AvatarGroup/AvatarGroup2.js +1 -0
  7. package/dist/components/Badge/Badge2.js +1 -0
  8. package/dist/components/BadgeGroup/BadgeGroup2.js +1 -0
  9. package/dist/components/Breadcrumbs/Breadcrumbs2.js +1 -0
  10. package/dist/components/Button/Button2.js +1 -0
  11. package/dist/components/ButtonGroup/ButtonGroup2.js +1 -0
  12. package/dist/components/Calendar/Calendar2.js +1 -0
  13. package/dist/components/Card/Card2.js +1 -0
  14. package/dist/components/Carousel/Carousel2.js +1 -0
  15. package/dist/components/Checkbox/Checkbox2.js +1 -0
  16. package/dist/components/CodeSnippet/CodeSnippet2.js +1 -0
  17. package/dist/components/Collapsible/Collapsible.css +86 -0
  18. package/dist/components/Collapsible/Collapsible2.js +65 -0
  19. package/dist/components/Combobox/Combobox2.js +1 -0
  20. package/dist/components/CommandPalette/CommandPalette2.js +1 -0
  21. package/dist/components/ContentDivider/ContentDivider2.js +1 -0
  22. package/dist/components/ContextMenu/ContextMenu.css +122 -0
  23. package/dist/components/ContextMenu/ContextMenu2.js +155 -0
  24. package/dist/components/CreditCard/CreditCard2.js +1 -0
  25. package/dist/components/DatePicker/DatePicker2.js +1 -0
  26. package/dist/components/DateRangePicker/DateRangePicker2.js +1 -0
  27. package/dist/components/Dropdown/Dropdown2.js +1 -0
  28. package/dist/components/EmptyState/EmptyState2.js +1 -0
  29. package/dist/components/FileUploader/FileUploader2.js +1 -0
  30. package/dist/components/GaugeChart/GaugeChart2.js +1 -0
  31. package/dist/components/HeaderNavigation/HeaderNavigation2.js +1 -0
  32. package/dist/components/Heatmap/Heatmap2.js +1 -0
  33. package/dist/components/Icon/Icon2.js +18 -0
  34. package/dist/components/InlineCTA/InlineCTA2.js +1 -0
  35. package/dist/components/Input/Input2.js +1 -0
  36. package/dist/components/Kbd/Kbd2.js +1 -0
  37. package/dist/components/LineBarCharts/LineBarChart2.js +1 -0
  38. package/dist/components/LoadingIndicators/LoadingIndicators2.js +1 -0
  39. package/dist/components/Metrics/Metrics2.js +1 -0
  40. package/dist/components/Modal/Modal.css +6 -3
  41. package/dist/components/Modal/Modal2.js +1 -0
  42. package/dist/components/MultiSelect/MultiSelect2.js +1 -0
  43. package/dist/components/Notification/Notification2.js +1 -0
  44. package/dist/components/NumberInput/NumberInput2.js +1 -0
  45. package/dist/components/PageHeader/PageHeader2.js +1 -0
  46. package/dist/components/Pagination/Pagination2.js +1 -0
  47. package/dist/components/PieChart/PieChart2.js +1 -0
  48. package/dist/components/Popover/Popover2.js +1 -0
  49. package/dist/components/ProgressIndicators/ProgressIndicators2.js +1 -0
  50. package/dist/components/ProgressSteps/ProgressSteps2.js +1 -0
  51. package/dist/components/RadarChart/RadarChart2.js +1 -0
  52. package/dist/components/RadioButton/RadioButton2.js +1 -0
  53. package/dist/components/RadioGroup/RadioGroup2.js +1 -0
  54. package/dist/components/Rating/Rating2.js +1 -0
  55. package/dist/components/Resizable/Resizable.css +79 -0
  56. package/dist/components/Resizable/Resizable2.js +101 -0
  57. package/dist/components/RichTextEditor/RichTextEditor2.js +1 -0
  58. package/dist/components/ScrollArea/ScrollArea.css +54 -0
  59. package/dist/components/ScrollArea/ScrollArea2.js +18 -0
  60. package/dist/components/SectionFooter/SectionFooter2.js +1 -0
  61. package/dist/components/SectionHeader/SectionHeader2.js +1 -0
  62. package/dist/components/Select/Select2.js +1 -0
  63. package/dist/components/SidebarNavigation/SidebarNavigation2.js +1 -0
  64. package/dist/components/SlideoutMenu/SlideoutMenu2.js +1 -0
  65. package/dist/components/Slider/Slider2.js +1 -0
  66. package/dist/components/Sparkline/Sparkline2.js +1 -0
  67. package/dist/components/Switch/Switch2.js +1 -0
  68. package/dist/components/Table/Table2.js +1 -0
  69. package/dist/components/Tabs/Tabs2.js +1 -0
  70. package/dist/components/Tag/Tag2.js +1 -0
  71. package/dist/components/TagInput/TagInput.css +72 -0
  72. package/dist/components/TagInput/TagInput2.js +116 -0
  73. package/dist/components/Textarea/Textarea2.js +1 -0
  74. package/dist/components/TimePicker/TimePicker.css +179 -0
  75. package/dist/components/TimePicker/TimePicker2.js +239 -0
  76. package/dist/components/Timeline/Timeline.css +128 -0
  77. package/dist/components/Timeline/Timeline2.js +49 -0
  78. package/dist/components/Toast/Toast.js +1 -0
  79. package/dist/components/Toolbar/Toolbar.css +37 -0
  80. package/dist/components/Toolbar/Toolbar2.js +71 -0
  81. package/dist/components/Tooltip/Tooltip2.js +1 -0
  82. package/dist/components/TreeView/TreeView2.js +1 -0
  83. package/dist/components/UtilityButton/UtilityButton2.js +1 -0
  84. package/dist/components/VideoPlayer/VideoPlayer2.js +1 -0
  85. package/dist/components/VisuallyHidden/VisuallyHidden.css +26 -0
  86. package/dist/components/VisuallyHidden/VisuallyHidden2.js +21 -0
  87. package/dist/hooks/useAnchoredPosition.js +1 -0
  88. package/dist/hooks/useComposedRefs.js +1 -0
  89. package/dist/hooks/useControllableState.js +1 -0
  90. package/dist/hooks/useDisclosure.js +1 -0
  91. package/dist/hooks/useExitAnimation.js +1 -0
  92. package/dist/hooks/useFocusTrap.js +1 -0
  93. package/dist/hooks/useListNavigation.js +1 -0
  94. package/dist/hooks/useOutsideInteraction.js +1 -0
  95. package/dist/hooks/usePresence.js +1 -0
  96. package/dist/index.cjs +787 -7
  97. package/dist/index.js +11 -1
  98. package/dist/src/components/Collapsible/Collapsible.d.ts +11 -0
  99. package/dist/src/components/Collapsible/Collapsible.test.d.ts +1 -0
  100. package/dist/src/components/Collapsible/index.d.ts +1 -0
  101. package/dist/src/components/ContextMenu/ContextMenu.d.ts +20 -0
  102. package/dist/src/components/ContextMenu/ContextMenu.test.d.ts +1 -0
  103. package/dist/src/components/ContextMenu/index.d.ts +1 -0
  104. package/dist/src/components/Resizable/Resizable.d.ts +19 -0
  105. package/dist/src/components/Resizable/Resizable.test.d.ts +1 -0
  106. package/dist/src/components/Resizable/index.d.ts +1 -0
  107. package/dist/src/components/ScrollArea/ScrollArea.d.ts +12 -0
  108. package/dist/src/components/ScrollArea/ScrollArea.test.d.ts +1 -0
  109. package/dist/src/components/ScrollArea/index.d.ts +1 -0
  110. package/dist/src/components/TagInput/TagInput.d.ts +23 -0
  111. package/dist/src/components/TagInput/TagInput.test.d.ts +1 -0
  112. package/dist/src/components/TagInput/index.d.ts +1 -0
  113. package/dist/src/components/TimePicker/TimePicker.d.ts +18 -0
  114. package/dist/src/components/TimePicker/TimePicker.test.d.ts +1 -0
  115. package/dist/src/components/TimePicker/index.d.ts +1 -0
  116. package/dist/src/components/Timeline/Timeline.d.ts +16 -0
  117. package/dist/src/components/Timeline/Timeline.test.d.ts +1 -0
  118. package/dist/src/components/Timeline/index.d.ts +1 -0
  119. package/dist/src/components/Toolbar/Toolbar.d.ts +8 -0
  120. package/dist/src/components/Toolbar/Toolbar.test.d.ts +1 -0
  121. package/dist/src/components/Toolbar/index.d.ts +1 -0
  122. package/dist/src/components/VisuallyHidden/VisuallyHidden.d.ts +15 -0
  123. package/dist/src/components/VisuallyHidden/VisuallyHidden.test.d.ts +1 -0
  124. package/dist/src/components/VisuallyHidden/index.d.ts +1 -0
  125. package/dist/src/index.d.ts +9 -0
  126. package/dist/styles/theme.css +77 -0
  127. package/dist/styles.css +866 -3
  128. package/dist/utils/FieldWrapper.js +1 -0
  129. package/dist/utils/cx.js +1 -0
  130. package/package.json +29 -3
package/dist/styles.css CHANGED
@@ -242,6 +242,46 @@
242
242
  --pf-command-item-active-bg: var(--color-semantic-action-primary);
243
243
  --pf-command-item-active-text: var(--color-semantic-action-primary-text);
244
244
 
245
+ /* Timeline aliases */
246
+ --pf-timeline-connector: var(--color-semantic-border-default);
247
+ --pf-timeline-title: var(--color-semantic-text-default);
248
+ --pf-timeline-timestamp: var(--color-semantic-text-muted);
249
+ --pf-timeline-description: var(--color-semantic-text-muted);
250
+ --pf-timeline-default-bg: var(--color-brand-100);
251
+ --pf-timeline-default-border: var(--color-semantic-action-primary);
252
+ --pf-timeline-default-icon: var(--color-semantic-action-primary);
253
+ --pf-timeline-success-bg: var(--color-semantic-status-success-background);
254
+ --pf-timeline-success-border: var(--color-semantic-status-success-foreground);
255
+ --pf-timeline-success-icon: var(--color-semantic-status-success-foreground);
256
+ --pf-timeline-warning-bg: var(--color-semantic-status-warning-background);
257
+ --pf-timeline-warning-border: var(--color-semantic-status-warning-foreground);
258
+ --pf-timeline-warning-icon: var(--color-semantic-status-warning-foreground);
259
+ --pf-timeline-danger-bg: var(--color-semantic-status-danger-background);
260
+ --pf-timeline-danger-border: var(--color-semantic-status-danger-foreground);
261
+ --pf-timeline-danger-icon: var(--color-semantic-status-danger-foreground);
262
+
263
+ /* Tag input aliases */
264
+ --pf-taginput-bg: var(--pf-input-bg);
265
+ --pf-taginput-border: var(--pf-input-border);
266
+ --pf-taginput-text: var(--pf-input-text);
267
+ --pf-taginput-placeholder: var(--pf-input-placeholder);
268
+ --pf-taginput-focus-border: var(--color-semantic-action-primary);
269
+ --pf-taginput-invalid-border: var(--color-semantic-status-danger-border);
270
+
271
+ /* Time picker aliases */
272
+ --pf-timepicker-bg: var(--pf-input-bg);
273
+ --pf-timepicker-border: var(--pf-input-border);
274
+ --pf-timepicker-text: var(--pf-input-text);
275
+ --pf-timepicker-text-muted: var(--pf-input-placeholder);
276
+ --pf-timepicker-placeholder: var(--pf-input-placeholder);
277
+ --pf-timepicker-focus-border: var(--color-semantic-action-primary);
278
+ --pf-timepicker-invalid-border: var(--color-semantic-status-danger-border);
279
+ --pf-timepicker-menu-bg: var(--pf-surface-bg);
280
+ --pf-timepicker-menu-border: var(--pf-surface-border-strong);
281
+ --pf-timepicker-option-hover-bg: var(--color-semantic-background-subtle);
282
+ --pf-timepicker-option-active-bg: var(--color-semantic-action-primary);
283
+ --pf-timepicker-option-active-text: var(--color-semantic-action-primary-text);
284
+
245
285
  /* Number input aliases */
246
286
  --pf-numberinput-bg: var(--pf-input-bg);
247
287
  --pf-numberinput-border: var(--pf-input-border);
@@ -428,6 +468,40 @@
428
468
  --pf-accordion-icon: var(--color-semantic-text-muted);
429
469
  --pf-accordion-content-text: var(--color-semantic-text-muted);
430
470
 
471
+ /* Context menu aliases */
472
+ --pf-contextmenu-bg: var(--pf-surface-bg);
473
+ --pf-contextmenu-border: var(--pf-surface-border-strong);
474
+ --pf-contextmenu-text: var(--color-semantic-text-default);
475
+ --pf-contextmenu-text-muted: var(--color-semantic-text-muted);
476
+ --pf-contextmenu-text-danger: var(--color-semantic-status-danger-foreground);
477
+ --pf-contextmenu-separator: var(--color-semantic-border-default);
478
+ --pf-contextmenu-item-active-bg: var(--color-semantic-action-primary);
479
+ --pf-contextmenu-item-active-text: var(--color-semantic-action-primary-text);
480
+ /* Solid red works on both themes; white text = 4.83:1 */
481
+ --pf-contextmenu-danger-active-bg: var(--color-danger-600);
482
+ --pf-contextmenu-danger-active-text: var(--color-base-white);
483
+
484
+ /* Resizable aliases */
485
+ --pf-resizable-handle-bg: var(--color-semantic-border-default);
486
+ --pf-resizable-handle-active-bg: var(--color-semantic-action-primary);
487
+ --pf-resizable-grip: var(--color-semantic-text-muted);
488
+
489
+ /* Toolbar aliases */
490
+ --pf-toolbar-bg: var(--color-semantic-background-default);
491
+ --pf-toolbar-border: var(--color-semantic-border-default);
492
+ --pf-toolbar-separator: var(--color-semantic-border-default);
493
+
494
+ /* Scroll area aliases */
495
+ --pf-scrollarea-thumb: var(--color-semantic-border-strong);
496
+ --pf-scrollarea-thumb-hover: var(--color-semantic-text-muted);
497
+
498
+ /* Collapsible aliases */
499
+ --pf-collapsible-border: var(--color-semantic-border-default);
500
+ --pf-collapsible-trigger-text: var(--color-semantic-text-default);
501
+ --pf-collapsible-trigger-hover-bg: var(--color-semantic-background-subtle);
502
+ --pf-collapsible-icon: var(--color-semantic-text-muted);
503
+ --pf-collapsible-content-text: var(--color-semantic-text-muted);
504
+
431
505
  /* Heatmap aliases */
432
506
  --pf-heatmap-color: var(--color-semantic-action-primary);
433
507
  --pf-heatmap-empty: var(--color-semantic-background-subtle);
@@ -809,6 +883,9 @@
809
883
  --pf-badge-brand-background: var(--color-brand-900);
810
884
  --pf-badge-brand-foreground: var(--color-brand-300);
811
885
 
886
+ /* Timeline — brand-100 default marker fill is near-white; darken for dark mode */
887
+ --pf-timeline-default-bg: var(--color-brand-900);
888
+
812
889
  --pf-badgegroup-brand-100: var(--color-brand-900);
813
890
  --pf-badgegroup-brand-300: var(--color-brand-700);
814
891
  --pf-badgegroup-brand-700: var(--color-brand-300);
@@ -1522,6 +1599,128 @@ body {
1522
1599
  animation: none;
1523
1600
  }
1524
1601
  }
1602
+ .pf-context-menu {
1603
+ display: contents;
1604
+ }
1605
+
1606
+ .pf-context-menu__menu {
1607
+ animation: pf-context-menu-in var(--duration-fast) var(--easing-decelerate);
1608
+ background: var(--pf-contextmenu-bg);
1609
+ border: 1px solid var(--pf-contextmenu-border);
1610
+ border-radius: var(--radius-md);
1611
+ box-shadow: var(--pf-elevation-popover-shadow);
1612
+ display: flex;
1613
+ flex-direction: column;
1614
+ gap: 2px;
1615
+ min-width: 180px;
1616
+ outline: none;
1617
+ padding: var(--space-1);
1618
+ z-index: 1100;
1619
+ }
1620
+
1621
+ .pf-context-menu__menu--exiting {
1622
+ animation: pf-context-menu-out var(--duration-fast) var(--easing-accelerate) forwards;
1623
+ }
1624
+
1625
+ @keyframes pf-context-menu-in {
1626
+ from {
1627
+ opacity: 0;
1628
+ transform: scale(0.96);
1629
+ }
1630
+ to {
1631
+ opacity: 1;
1632
+ transform: scale(1);
1633
+ }
1634
+ }
1635
+
1636
+ @keyframes pf-context-menu-out {
1637
+ from {
1638
+ opacity: 1;
1639
+ transform: scale(1);
1640
+ }
1641
+ to {
1642
+ opacity: 0;
1643
+ transform: scale(0.96);
1644
+ }
1645
+ }
1646
+
1647
+ .pf-context-menu__item {
1648
+ align-items: center;
1649
+ background: var(--pf-contextmenu-bg);
1650
+ border: 0;
1651
+ border-radius: var(--radius-sm);
1652
+ color: var(--pf-contextmenu-text);
1653
+ cursor: pointer;
1654
+ display: flex;
1655
+ font: inherit;
1656
+ gap: var(--space-2);
1657
+ padding: var(--space-2) var(--space-3);
1658
+ text-align: start;
1659
+ width: 100%;
1660
+ }
1661
+
1662
+ .pf-context-menu__item--active {
1663
+ background: var(--pf-contextmenu-item-active-bg);
1664
+ color: var(--pf-contextmenu-item-active-text);
1665
+ }
1666
+
1667
+ .pf-context-menu__item:disabled {
1668
+ color: var(--pf-contextmenu-text-muted);
1669
+ cursor: not-allowed;
1670
+ }
1671
+
1672
+ .pf-context-menu__item--destructive {
1673
+ color: var(--pf-contextmenu-text-danger);
1674
+ }
1675
+
1676
+ .pf-context-menu__item--destructive.pf-context-menu__item--active {
1677
+ background: var(--pf-contextmenu-danger-active-bg);
1678
+ color: var(--pf-contextmenu-danger-active-text);
1679
+ }
1680
+
1681
+ .pf-context-menu__item-icon {
1682
+ align-items: center;
1683
+ display: inline-flex;
1684
+ flex-shrink: 0;
1685
+ height: 1rem;
1686
+ justify-content: center;
1687
+ width: 1rem;
1688
+ }
1689
+
1690
+ .pf-context-menu__item-icon svg {
1691
+ display: block;
1692
+ height: 1rem;
1693
+ width: 1rem;
1694
+ }
1695
+
1696
+ .pf-context-menu__item-label {
1697
+ flex: 1;
1698
+ min-width: 0;
1699
+ }
1700
+
1701
+ .pf-context-menu__item-shortcut {
1702
+ color: var(--pf-contextmenu-text-muted);
1703
+ flex-shrink: 0;
1704
+ font-family: var(--font-family-mono, ui-monospace, monospace);
1705
+ font-size: var(--font-size-xs);
1706
+ }
1707
+
1708
+ .pf-context-menu__item--active .pf-context-menu__item-shortcut {
1709
+ color: inherit;
1710
+ }
1711
+
1712
+ .pf-context-menu__separator {
1713
+ background: var(--pf-contextmenu-separator);
1714
+ height: 1px;
1715
+ margin: var(--space-1) 0;
1716
+ }
1717
+
1718
+ @media (prefers-reduced-motion: reduce) {
1719
+ .pf-context-menu__menu,
1720
+ .pf-context-menu__menu--exiting {
1721
+ animation: none;
1722
+ }
1723
+ }
1525
1724
  .pf-badge-group {
1526
1725
  align-items: center;
1527
1726
  display: inline-flex;
@@ -2685,6 +2884,92 @@ body {
2685
2884
  white-space: nowrap;
2686
2885
  width: 1px;
2687
2886
  }
2887
+ .pf-collapsible {
2888
+ border: 1px solid var(--pf-collapsible-border);
2889
+ border-radius: var(--radius-md);
2890
+ }
2891
+
2892
+ .pf-collapsible__trigger {
2893
+ align-items: center;
2894
+ background: transparent;
2895
+ border: 0;
2896
+ border-radius: var(--radius-md);
2897
+ color: var(--pf-collapsible-trigger-text);
2898
+ cursor: pointer;
2899
+ display: flex;
2900
+ font: inherit;
2901
+ font-weight: var(--font-weight-medium);
2902
+ gap: var(--space-2);
2903
+ justify-content: space-between;
2904
+ padding: var(--space-3);
2905
+ text-align: start;
2906
+ width: 100%;
2907
+ }
2908
+
2909
+ .pf-collapsible__trigger:hover:not(:disabled) {
2910
+ background: var(--pf-collapsible-trigger-hover-bg);
2911
+ }
2912
+
2913
+ .pf-collapsible__trigger:focus-visible {
2914
+ box-shadow: var(--pf-collapsible-focus-ring, var(--pf-focus-ring));
2915
+ outline: none;
2916
+ }
2917
+
2918
+ .pf-collapsible__trigger:disabled {
2919
+ color: var(--pf-control-text-disabled);
2920
+ cursor: not-allowed;
2921
+ }
2922
+
2923
+ .pf-collapsible__label {
2924
+ min-width: 0;
2925
+ }
2926
+
2927
+ .pf-collapsible__icon {
2928
+ align-items: center;
2929
+ color: var(--pf-collapsible-icon);
2930
+ display: inline-flex;
2931
+ flex-shrink: 0;
2932
+ transition: transform var(--pf-transition-fast);
2933
+ }
2934
+
2935
+ .pf-collapsible__icon svg {
2936
+ display: block;
2937
+ height: 16px;
2938
+ width: 16px;
2939
+ }
2940
+
2941
+ .pf-collapsible--open .pf-collapsible__icon {
2942
+ transform: rotate(180deg);
2943
+ }
2944
+
2945
+ /* Height animation via the grid-template-rows 0fr → 1fr technique. */
2946
+ .pf-collapsible__panel {
2947
+ display: grid;
2948
+ grid-template-rows: 0fr;
2949
+ transition: grid-template-rows var(--pf-transition-medium);
2950
+ }
2951
+
2952
+ .pf-collapsible__panel--open {
2953
+ grid-template-rows: 1fr;
2954
+ }
2955
+
2956
+ .pf-collapsible__content {
2957
+ min-height: 0;
2958
+ overflow: hidden;
2959
+ }
2960
+
2961
+ .pf-collapsible__content-inner {
2962
+ border-top: 1px solid var(--pf-collapsible-border);
2963
+ color: var(--pf-collapsible-content-text);
2964
+ padding: var(--space-3);
2965
+ }
2966
+
2967
+ @media (prefers-reduced-motion: reduce) {
2968
+ .pf-collapsible__panel,
2969
+ .pf-collapsible__icon {
2970
+ transition: none;
2971
+ }
2972
+ }
2688
2973
  .pf-combobox {
2689
2974
  position: relative;
2690
2975
  }
@@ -4224,10 +4509,11 @@ body {
4224
4509
  .pf-modal {
4225
4510
  background: var(--pf-modal-bg);
4226
4511
  border: 1px solid color-mix(in srgb, var(--pf-modal-border) 85%, transparent);
4227
- border-radius: var(--radius-lg) var(--radius-lg) 0 0;
4512
+ border-radius: var(--radius-lg);
4228
4513
  box-shadow: var(--pf-modal-elevation-overlay-shadow, var(--pf-elevation-overlay-shadow));
4229
4514
  color: var(--pf-modal-text);
4230
- display: grid;
4515
+ display: flex;
4516
+ flex-direction: column;
4231
4517
  max-height: 92vh;
4232
4518
  overflow: hidden;
4233
4519
  width: 100%;
@@ -4235,7 +4521,6 @@ body {
4235
4521
 
4236
4522
  @media (min-width: 768px) {
4237
4523
  .pf-modal {
4238
- border-radius: var(--radius-lg);
4239
4524
  max-height: min(90vh, 720px);
4240
4525
  }
4241
4526
  }
@@ -4260,6 +4545,7 @@ body {
4260
4545
  .pf-modal__footer {
4261
4546
  align-items: start;
4262
4547
  display: flex;
4548
+ flex-shrink: 0;
4263
4549
  gap: var(--space-3);
4264
4550
  justify-content: space-between;
4265
4551
  padding: var(--space-3);
@@ -4284,7 +4570,9 @@ body {
4284
4570
 
4285
4571
  .pf-modal__body {
4286
4572
  display: grid;
4573
+ flex: 1 1 auto;
4287
4574
  gap: var(--space-4);
4575
+ min-height: 0;
4288
4576
  overflow-y: auto;
4289
4577
  padding: var(--space-3);
4290
4578
  }
@@ -5819,6 +6107,85 @@ body {
5819
6107
  color: var(--pf-rating-badge-reviews);
5820
6108
  font-weight: var(--font-weight-medium);
5821
6109
  }
6110
+ .pf-resizable {
6111
+ display: flex;
6112
+ overflow: hidden;
6113
+ }
6114
+
6115
+ .pf-resizable--horizontal {
6116
+ flex-direction: row;
6117
+ }
6118
+
6119
+ .pf-resizable--vertical {
6120
+ flex-direction: column;
6121
+ }
6122
+
6123
+ .pf-resizable__panel {
6124
+ flex-grow: 0;
6125
+ flex-shrink: 0;
6126
+ min-height: 0;
6127
+ min-width: 0;
6128
+ overflow: auto;
6129
+ }
6130
+
6131
+ .pf-resizable__panel--fill {
6132
+ flex: 1 1 0;
6133
+ }
6134
+
6135
+ /* ── Handle ───────────────────────────────────────────────────────────────── */
6136
+
6137
+ .pf-resizable__handle {
6138
+ align-items: center;
6139
+ background: var(--pf-resizable-handle-bg);
6140
+ display: flex;
6141
+ flex-shrink: 0;
6142
+ justify-content: center;
6143
+ position: relative;
6144
+ touch-action: none;
6145
+ transition: background var(--pf-transition-fast);
6146
+ }
6147
+
6148
+ .pf-resizable__handle:hover,
6149
+ .pf-resizable__handle:focus-visible {
6150
+ background: var(--pf-resizable-handle-active-bg);
6151
+ }
6152
+
6153
+ .pf-resizable__handle:focus-visible {
6154
+ outline: none;
6155
+ box-shadow: var(--pf-resizable-focus-ring, var(--pf-focus-ring));
6156
+ }
6157
+
6158
+ .pf-resizable--horizontal .pf-resizable__handle {
6159
+ cursor: col-resize;
6160
+ width: var(--pf-resizable-handle-size, 6px);
6161
+ }
6162
+
6163
+ .pf-resizable--vertical .pf-resizable__handle {
6164
+ cursor: row-resize;
6165
+ height: var(--pf-resizable-handle-size, 6px);
6166
+ }
6167
+
6168
+ /* Grip affordance (dots/line) centered in the handle. */
6169
+ .pf-resizable__grip {
6170
+ background: var(--pf-resizable-grip);
6171
+ border-radius: var(--radius-full);
6172
+ }
6173
+
6174
+ .pf-resizable--horizontal .pf-resizable__grip {
6175
+ height: 24px;
6176
+ width: 2px;
6177
+ }
6178
+
6179
+ .pf-resizable--vertical .pf-resizable__grip {
6180
+ height: 2px;
6181
+ width: 24px;
6182
+ }
6183
+
6184
+ @media (prefers-reduced-motion: reduce) {
6185
+ .pf-resizable__handle {
6186
+ transition: none;
6187
+ }
6188
+ }
5822
6189
  .pf-rte {
5823
6190
  background: var(--pf-rte-bg);
5824
6191
  border: 1px solid var(--pf-rte-border);
@@ -5913,6 +6280,60 @@ body {
5913
6280
  margin: var(--space-2) 0 0;
5914
6281
  text-align: end;
5915
6282
  }
6283
+ .pf-scroll-area {
6284
+ /* Standard scrollbar styling (Firefox + modern browsers). */
6285
+ scrollbar-color: var(--pf-scrollarea-thumb) transparent;
6286
+ scrollbar-width: thin;
6287
+ /* Reserve a gutter so the scrollbar never overlays (and obscures) content. */
6288
+ scrollbar-gutter: stable;
6289
+ }
6290
+
6291
+ .pf-scroll-area:focus-visible {
6292
+ border-radius: var(--radius-sm);
6293
+ box-shadow: var(--pf-scrollarea-focus-ring, var(--pf-focus-ring));
6294
+ outline: none;
6295
+ }
6296
+
6297
+ .pf-scroll-area--vertical {
6298
+ overflow-x: hidden;
6299
+ overflow-y: auto;
6300
+ }
6301
+
6302
+ .pf-scroll-area--horizontal {
6303
+ overflow-x: auto;
6304
+ overflow-y: hidden;
6305
+ }
6306
+
6307
+ .pf-scroll-area--both {
6308
+ overflow: auto;
6309
+ }
6310
+
6311
+ /* WebKit / Blink scrollbar styling. */
6312
+ .pf-scroll-area::-webkit-scrollbar {
6313
+ height: 10px;
6314
+ width: 10px;
6315
+ }
6316
+
6317
+ .pf-scroll-area::-webkit-scrollbar-track {
6318
+ background: transparent;
6319
+ }
6320
+
6321
+ .pf-scroll-area::-webkit-scrollbar-thumb {
6322
+ background: var(--pf-scrollarea-thumb);
6323
+ /* Transparent border + padding-box clip insets the thumb so it reads slimmer. */
6324
+ background-clip: padding-box;
6325
+ border: 2px solid transparent;
6326
+ border-radius: var(--radius-full);
6327
+ }
6328
+
6329
+ .pf-scroll-area::-webkit-scrollbar-thumb:hover {
6330
+ background: var(--pf-scrollarea-thumb-hover);
6331
+ background-clip: padding-box;
6332
+ }
6333
+
6334
+ .pf-scroll-area::-webkit-scrollbar-corner {
6335
+ background: transparent;
6336
+ }
5916
6337
  .pf-section-footer {
5917
6338
  align-items: flex-start;
5918
6339
  display: flex;
@@ -6777,6 +7198,78 @@ body {
6777
7198
  height: 12px;
6778
7199
  width: 12px;
6779
7200
  }
7201
+ .pf-taginput {
7202
+ background: var(--pf-taginput-bg);
7203
+ border: 1px solid var(--pf-taginput-border);
7204
+ border-radius: var(--radius-md);
7205
+ cursor: text;
7206
+ min-height: 40px;
7207
+ padding: var(--space-1);
7208
+ transition:
7209
+ border 0.2s,
7210
+ box-shadow 0.2s;
7211
+ }
7212
+
7213
+ .pf-taginput:focus-within {
7214
+ border-color: var(--pf-taginput-focus-border);
7215
+ box-shadow: var(--pf-taginput-focus-ring, var(--pf-focus-ring));
7216
+ }
7217
+
7218
+ .pf-taginput--invalid {
7219
+ border-color: var(--pf-taginput-invalid-border);
7220
+ }
7221
+
7222
+ .pf-taginput--disabled {
7223
+ background: var(--pf-control-bg-disabled);
7224
+ border-color: var(--pf-control-border-disabled);
7225
+ cursor: not-allowed;
7226
+ opacity: 0.6;
7227
+ }
7228
+
7229
+ .pf-taginput__tags {
7230
+ align-items: center;
7231
+ display: flex;
7232
+ flex-wrap: wrap;
7233
+ gap: var(--space-1);
7234
+ list-style: none;
7235
+ margin: 0;
7236
+ padding: 0;
7237
+ }
7238
+
7239
+ .pf-taginput__tag {
7240
+ display: inline-flex;
7241
+ }
7242
+
7243
+ .pf-taginput__field {
7244
+ display: inline-flex;
7245
+ flex: 1;
7246
+ min-width: 8ch;
7247
+ }
7248
+
7249
+ .pf-taginput__input {
7250
+ background: transparent;
7251
+ border: none;
7252
+ color: var(--pf-taginput-text);
7253
+ flex: 1;
7254
+ font: inherit;
7255
+ min-width: 0;
7256
+ outline: none;
7257
+ padding: var(--space-1) var(--space-2);
7258
+ }
7259
+
7260
+ .pf-taginput__input::placeholder {
7261
+ color: var(--pf-taginput-placeholder);
7262
+ }
7263
+
7264
+ .pf-taginput__input:disabled {
7265
+ cursor: not-allowed;
7266
+ }
7267
+
7268
+ @media (prefers-reduced-motion: reduce) {
7269
+ .pf-taginput {
7270
+ transition: none;
7271
+ }
7272
+ }
6780
7273
  .pf-table {
6781
7274
  background: var(--pf-table-bg);
6782
7275
  border: 1px solid var(--pf-table-border);
@@ -7093,6 +7586,350 @@ body {
7093
7586
  .pf-textarea--invalid {
7094
7587
  border-color: var(--pf-textarea-invalid-border);
7095
7588
  }
7589
+ .pf-timeline {
7590
+ display: grid;
7591
+ gap: 0;
7592
+ list-style: none;
7593
+ margin: 0;
7594
+ padding: 0;
7595
+ }
7596
+
7597
+ .pf-timeline__item {
7598
+ /* Shared line height for the title; markers center themselves on it. */
7599
+ --pf-timeline-line: 1.375rem;
7600
+ --pf-timeline-marker-size: 16px;
7601
+ column-gap: var(--space-3);
7602
+ display: grid;
7603
+ grid-template-columns: auto 1fr;
7604
+ }
7605
+
7606
+ /* ── Rail (marker + connector) ────────────────────────────────────────────── */
7607
+
7608
+ .pf-timeline__rail {
7609
+ align-items: center;
7610
+ display: flex;
7611
+ flex-direction: column;
7612
+ }
7613
+
7614
+ .pf-timeline__marker {
7615
+ align-items: center;
7616
+ background: var(--pf-timeline-marker-bg);
7617
+ border: 2px solid var(--pf-timeline-marker-border);
7618
+ border-radius: var(--radius-full);
7619
+ color: var(--pf-timeline-marker-icon);
7620
+ display: inline-flex;
7621
+ flex-shrink: 0;
7622
+ height: var(--pf-timeline-marker-size);
7623
+ justify-content: center;
7624
+ /* Vertically center the marker on the title's first line. */
7625
+ margin-top: calc((var(--pf-timeline-line) - var(--pf-timeline-marker-size)) / 2);
7626
+ width: var(--pf-timeline-marker-size);
7627
+ }
7628
+
7629
+ /* Markers carrying an icon are larger to fit it. */
7630
+ .pf-timeline__marker:has(.pf-timeline__marker-icon) {
7631
+ --pf-timeline-marker-size: 28px;
7632
+ }
7633
+
7634
+ .pf-timeline__marker-icon {
7635
+ align-items: center;
7636
+ display: inline-flex;
7637
+ font-size: 0.8rem;
7638
+ justify-content: center;
7639
+ }
7640
+
7641
+ .pf-timeline__marker-icon svg {
7642
+ display: block;
7643
+ height: 14px;
7644
+ width: 14px;
7645
+ }
7646
+
7647
+ .pf-timeline__marker--default {
7648
+ background: var(--pf-timeline-default-bg);
7649
+ border-color: var(--pf-timeline-default-border);
7650
+ color: var(--pf-timeline-default-icon);
7651
+ }
7652
+
7653
+ .pf-timeline__marker--success {
7654
+ background: var(--pf-timeline-success-bg);
7655
+ border-color: var(--pf-timeline-success-border);
7656
+ color: var(--pf-timeline-success-icon);
7657
+ }
7658
+
7659
+ .pf-timeline__marker--warning {
7660
+ background: var(--pf-timeline-warning-bg);
7661
+ border-color: var(--pf-timeline-warning-border);
7662
+ color: var(--pf-timeline-warning-icon);
7663
+ }
7664
+
7665
+ .pf-timeline__marker--danger {
7666
+ background: var(--pf-timeline-danger-bg);
7667
+ border-color: var(--pf-timeline-danger-border);
7668
+ color: var(--pf-timeline-danger-icon);
7669
+ }
7670
+
7671
+ .pf-timeline__connector {
7672
+ background: var(--pf-timeline-connector);
7673
+ flex: 1;
7674
+ margin: var(--space-1) 0;
7675
+ min-height: var(--space-4);
7676
+ width: 2px;
7677
+ }
7678
+
7679
+ /* ── Content ──────────────────────────────────────────────────────────────── */
7680
+
7681
+ .pf-timeline__content {
7682
+ padding-bottom: var(--space-5);
7683
+ }
7684
+
7685
+ .pf-timeline__item--last .pf-timeline__content {
7686
+ padding-bottom: 0;
7687
+ }
7688
+
7689
+ .pf-timeline__header {
7690
+ align-items: baseline;
7691
+ column-gap: var(--space-2);
7692
+ display: flex;
7693
+ flex-wrap: wrap;
7694
+ justify-content: space-between;
7695
+ }
7696
+
7697
+ .pf-timeline__title {
7698
+ color: var(--pf-timeline-title);
7699
+ font-size: var(--font-size-sm);
7700
+ font-weight: var(--font-weight-medium);
7701
+ line-height: var(--pf-timeline-line);
7702
+ margin: 0;
7703
+ }
7704
+
7705
+ .pf-timeline__timestamp {
7706
+ color: var(--pf-timeline-timestamp);
7707
+ font-size: var(--font-size-xs);
7708
+ flex-shrink: 0;
7709
+ white-space: nowrap;
7710
+ }
7711
+
7712
+ .pf-timeline__description {
7713
+ color: var(--pf-timeline-description);
7714
+ font-size: var(--font-size-sm);
7715
+ margin-top: var(--space-1);
7716
+ }
7717
+ .pf-timepicker {
7718
+ position: relative;
7719
+ }
7720
+
7721
+ /* ── Trigger ──────────────────────────────────────────────────────────────── */
7722
+
7723
+ .pf-timepicker__trigger {
7724
+ align-items: center;
7725
+ background: var(--pf-timepicker-bg);
7726
+ border: 1px solid var(--pf-timepicker-border);
7727
+ border-radius: var(--radius-md);
7728
+ color: var(--pf-timepicker-text);
7729
+ cursor: pointer;
7730
+ display: flex;
7731
+ font: inherit;
7732
+ gap: var(--space-2);
7733
+ justify-content: space-between;
7734
+ min-height: 40px;
7735
+ padding: 0 var(--space-3);
7736
+ text-align: start;
7737
+ width: 100%;
7738
+ transition:
7739
+ border 0.2s,
7740
+ box-shadow 0.2s;
7741
+ }
7742
+
7743
+ .pf-timepicker__trigger:focus {
7744
+ outline: none;
7745
+ }
7746
+
7747
+ .pf-timepicker__trigger:focus-visible,
7748
+ .pf-timepicker__trigger--open {
7749
+ border-color: var(--pf-timepicker-focus-border);
7750
+ box-shadow: var(--pf-timepicker-focus-ring, var(--pf-focus-ring));
7751
+ }
7752
+
7753
+ .pf-timepicker__trigger--invalid {
7754
+ border-color: var(--pf-timepicker-invalid-border);
7755
+ }
7756
+
7757
+ .pf-timepicker__trigger:disabled {
7758
+ background: var(--pf-control-bg-disabled);
7759
+ border-color: var(--pf-control-border-disabled);
7760
+ color: var(--pf-control-text-disabled);
7761
+ cursor: not-allowed;
7762
+ opacity: 0.6;
7763
+ }
7764
+
7765
+ .pf-timepicker__value {
7766
+ overflow: hidden;
7767
+ text-overflow: ellipsis;
7768
+ white-space: nowrap;
7769
+ }
7770
+
7771
+ .pf-timepicker__value--placeholder {
7772
+ color: var(--pf-timepicker-placeholder);
7773
+ }
7774
+
7775
+ .pf-timepicker__icon {
7776
+ align-items: center;
7777
+ color: var(--pf-timepicker-text-muted);
7778
+ display: inline-flex;
7779
+ flex-shrink: 0;
7780
+ }
7781
+
7782
+ .pf-timepicker__icon svg {
7783
+ display: block;
7784
+ height: 18px;
7785
+ width: 18px;
7786
+ }
7787
+
7788
+ /* ── Panel ────────────────────────────────────────────────────────────────── */
7789
+
7790
+ .pf-timepicker__panel {
7791
+ animation: pf-timepicker-in var(--duration-fast) var(--easing-decelerate);
7792
+ background: var(--pf-timepicker-menu-bg);
7793
+ border: 1px solid var(--pf-timepicker-menu-border);
7794
+ border-radius: var(--radius-md);
7795
+ box-shadow: var(--pf-elevation-popover-shadow);
7796
+ display: flex;
7797
+ gap: var(--space-1);
7798
+ padding: var(--space-1);
7799
+ position: fixed;
7800
+ z-index: 1000;
7801
+ }
7802
+
7803
+ .pf-timepicker__panel--exiting {
7804
+ animation: pf-timepicker-out var(--duration-fast) var(--easing-accelerate) forwards;
7805
+ }
7806
+
7807
+ @keyframes pf-timepicker-in {
7808
+ from {
7809
+ opacity: 0;
7810
+ transform: translateY(-4px);
7811
+ }
7812
+ to {
7813
+ opacity: 1;
7814
+ transform: translateY(0);
7815
+ }
7816
+ }
7817
+
7818
+ @keyframes pf-timepicker-out {
7819
+ from {
7820
+ opacity: 1;
7821
+ transform: translateY(0);
7822
+ }
7823
+ to {
7824
+ opacity: 0;
7825
+ transform: translateY(-4px);
7826
+ }
7827
+ }
7828
+
7829
+ /* ── Columns ──────────────────────────────────────────────────────────────── */
7830
+
7831
+ .pf-timepicker__column {
7832
+ display: flex;
7833
+ flex-direction: column;
7834
+ gap: 2px;
7835
+ max-height: 220px;
7836
+ overflow-y: auto;
7837
+ scroll-behavior: smooth;
7838
+ scrollbar-width: thin;
7839
+ }
7840
+
7841
+ .pf-timepicker__column--meridiem {
7842
+ overflow-y: visible;
7843
+ }
7844
+
7845
+ .pf-timepicker__option {
7846
+ appearance: none;
7847
+ /* Explicit opaque background (matching the panel) so axe can determine the
7848
+ contrast background directly on each option, even when it's partially
7849
+ clipped by the scrolling column. */
7850
+ background: var(--pf-timepicker-menu-bg);
7851
+ border: 0;
7852
+ border-radius: var(--radius-sm);
7853
+ color: var(--pf-timepicker-text);
7854
+ cursor: pointer;
7855
+ font: inherit;
7856
+ font-variant-numeric: tabular-nums;
7857
+ min-width: 3ch;
7858
+ padding: var(--space-2) var(--space-3);
7859
+ text-align: center;
7860
+ }
7861
+
7862
+ .pf-timepicker__option:hover {
7863
+ background: var(--pf-timepicker-option-hover-bg);
7864
+ }
7865
+
7866
+ .pf-timepicker__option:focus-visible {
7867
+ outline: none;
7868
+ box-shadow: inset 0 0 0 2px var(--pf-timepicker-focus-border);
7869
+ }
7870
+
7871
+ .pf-timepicker__option--selected {
7872
+ background: var(--pf-timepicker-option-active-bg);
7873
+ color: var(--pf-timepicker-option-active-text);
7874
+ font-weight: var(--font-weight-medium);
7875
+ }
7876
+
7877
+ .pf-timepicker__option--selected:hover {
7878
+ background: var(--pf-timepicker-option-active-bg);
7879
+ color: var(--pf-timepicker-option-active-text);
7880
+ }
7881
+
7882
+ @media (prefers-reduced-motion: reduce) {
7883
+ .pf-timepicker__trigger {
7884
+ transition: none;
7885
+ }
7886
+
7887
+ .pf-timepicker__panel,
7888
+ .pf-timepicker__panel--exiting {
7889
+ animation: none;
7890
+ }
7891
+
7892
+ .pf-timepicker__column {
7893
+ scroll-behavior: auto;
7894
+ }
7895
+ }
7896
+ .pf-toolbar {
7897
+ align-items: center;
7898
+ background: var(--pf-toolbar-bg);
7899
+ border: 1px solid var(--pf-toolbar-border);
7900
+ border-radius: var(--radius-md);
7901
+ display: flex;
7902
+ gap: var(--space-1);
7903
+ padding: var(--space-1);
7904
+ }
7905
+
7906
+ .pf-toolbar--horizontal {
7907
+ flex-direction: row;
7908
+ }
7909
+
7910
+ .pf-toolbar--vertical {
7911
+ align-items: stretch;
7912
+ flex-direction: column;
7913
+ width: fit-content;
7914
+ }
7915
+
7916
+ /* ── Separator ────────────────────────────────────────────────────────────── */
7917
+
7918
+ .pf-toolbar__separator {
7919
+ background: var(--pf-toolbar-separator);
7920
+ flex-shrink: 0;
7921
+ }
7922
+
7923
+ .pf-toolbar--horizontal .pf-toolbar__separator {
7924
+ align-self: stretch;
7925
+ margin: var(--space-1) var(--space-1);
7926
+ width: 1px;
7927
+ }
7928
+
7929
+ .pf-toolbar--vertical .pf-toolbar__separator {
7930
+ height: 1px;
7931
+ margin: var(--space-1) var(--space-1);
7932
+ }
7096
7933
  .pf-tooltip__trigger {
7097
7934
  border-radius: var(--radius-sm);
7098
7935
  display: inline-flex;
@@ -7394,3 +8231,29 @@ body {
7394
8231
  padding: var(--space-4);
7395
8232
  text-align: center;
7396
8233
  }
8234
+ .pf-visually-hidden {
8235
+ border: 0;
8236
+ clip: rect(0 0 0 0);
8237
+ clip-path: inset(50%);
8238
+ height: 1px;
8239
+ margin: -1px;
8240
+ overflow: hidden;
8241
+ padding: 0;
8242
+ position: absolute;
8243
+ white-space: nowrap;
8244
+ width: 1px;
8245
+ }
8246
+
8247
+ /* Reveal on keyboard focus (skip-link pattern). */
8248
+ .pf-visually-hidden--focusable:focus,
8249
+ .pf-visually-hidden--focusable:focus-within {
8250
+ clip: auto;
8251
+ clip-path: none;
8252
+ height: auto;
8253
+ margin: 0;
8254
+ overflow: visible;
8255
+ /* Flow back into layout so the revealed content doesn't overlap siblings. */
8256
+ position: static;
8257
+ white-space: normal;
8258
+ width: auto;
8259
+ }