@pitchfork-ui/react 0.9.0 → 0.11.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 (63) hide show
  1. package/dist/components/Badge/Badge.css +4 -0
  2. package/dist/components/Button/Button.css +7 -0
  3. package/dist/components/Collapsible/Collapsible.css +86 -0
  4. package/dist/components/Collapsible/Collapsible2.js +65 -0
  5. package/dist/components/ContextMenu/ContextMenu.css +122 -0
  6. package/dist/components/ContextMenu/ContextMenu2.js +155 -0
  7. package/dist/components/Icon/Icon2.js +17 -0
  8. package/dist/components/InlineCTA/InlineCTA.css +4 -0
  9. package/dist/components/Modal/Modal.css +6 -1
  10. package/dist/components/Resizable/Resizable.css +79 -0
  11. package/dist/components/Resizable/Resizable2.js +101 -0
  12. package/dist/components/ScrollArea/ScrollArea.css +54 -0
  13. package/dist/components/ScrollArea/ScrollArea2.js +18 -0
  14. package/dist/components/Tag/Tag.css +4 -0
  15. package/dist/components/TagInput/TagInput.css +72 -0
  16. package/dist/components/TagInput/TagInput2.js +116 -0
  17. package/dist/components/TimePicker/TimePicker.css +179 -0
  18. package/dist/components/TimePicker/TimePicker2.js +239 -0
  19. package/dist/components/Timeline/Timeline.css +128 -0
  20. package/dist/components/Timeline/Timeline2.js +49 -0
  21. package/dist/components/Toolbar/Toolbar.css +37 -0
  22. package/dist/components/Toolbar/Toolbar2.js +71 -0
  23. package/dist/components/UtilityButton/UtilityButton.css +6 -6
  24. package/dist/components/VisuallyHidden/VisuallyHidden.css +26 -0
  25. package/dist/components/VisuallyHidden/VisuallyHidden2.js +21 -0
  26. package/dist/index.cjs +786 -7
  27. package/dist/index.js +10 -1
  28. package/dist/src/components/Badge/Badge.d.ts +1 -1
  29. package/dist/src/components/Button/Button.d.ts +1 -1
  30. package/dist/src/components/Collapsible/Collapsible.d.ts +11 -0
  31. package/dist/src/components/Collapsible/Collapsible.test.d.ts +1 -0
  32. package/dist/src/components/Collapsible/index.d.ts +1 -0
  33. package/dist/src/components/ContextMenu/ContextMenu.d.ts +20 -0
  34. package/dist/src/components/ContextMenu/ContextMenu.test.d.ts +1 -0
  35. package/dist/src/components/ContextMenu/index.d.ts +1 -0
  36. package/dist/src/components/InlineCTA/InlineCTA.d.ts +1 -1
  37. package/dist/src/components/Resizable/Resizable.d.ts +19 -0
  38. package/dist/src/components/Resizable/Resizable.test.d.ts +1 -0
  39. package/dist/src/components/Resizable/index.d.ts +1 -0
  40. package/dist/src/components/ScrollArea/ScrollArea.d.ts +12 -0
  41. package/dist/src/components/ScrollArea/ScrollArea.test.d.ts +1 -0
  42. package/dist/src/components/ScrollArea/index.d.ts +1 -0
  43. package/dist/src/components/Tag/Tag.d.ts +1 -1
  44. package/dist/src/components/TagInput/TagInput.d.ts +23 -0
  45. package/dist/src/components/TagInput/TagInput.test.d.ts +1 -0
  46. package/dist/src/components/TagInput/index.d.ts +1 -0
  47. package/dist/src/components/TimePicker/TimePicker.d.ts +18 -0
  48. package/dist/src/components/TimePicker/TimePicker.test.d.ts +1 -0
  49. package/dist/src/components/TimePicker/index.d.ts +1 -0
  50. package/dist/src/components/Timeline/Timeline.d.ts +16 -0
  51. package/dist/src/components/Timeline/Timeline.test.d.ts +1 -0
  52. package/dist/src/components/Timeline/index.d.ts +1 -0
  53. package/dist/src/components/Toolbar/Toolbar.d.ts +8 -0
  54. package/dist/src/components/Toolbar/Toolbar.test.d.ts +1 -0
  55. package/dist/src/components/Toolbar/index.d.ts +1 -0
  56. package/dist/src/components/UtilityButton/UtilityButton.d.ts +1 -1
  57. package/dist/src/components/VisuallyHidden/VisuallyHidden.d.ts +15 -0
  58. package/dist/src/components/VisuallyHidden/VisuallyHidden.test.d.ts +1 -0
  59. package/dist/src/components/VisuallyHidden/index.d.ts +1 -0
  60. package/dist/src/index.d.ts +9 -0
  61. package/dist/styles/theme.css +89 -4
  62. package/dist/styles.css +903 -11
  63. package/package.json +1 -1
package/dist/styles.css CHANGED
@@ -198,6 +198,10 @@
198
198
  --pf-button-secondary-text: var(--color-semantic-text-default);
199
199
  --pf-button-ghost-text: var(--color-semantic-text-default);
200
200
  --pf-button-ghost-bg-hover: var(--color-semantic-background-subtle);
201
+ /* Solid reds work on both themes; white text = 4.83:1 (bg) / 6.57:1 (hover) */
202
+ --pf-button-destructive-bg: var(--color-danger-600);
203
+ --pf-button-destructive-bg-hover: var(--color-danger-700);
204
+ --pf-button-destructive-text: var(--color-base-white);
201
205
 
202
206
  /* Field/input aliases */
203
207
  --pf-field-label: var(--color-semantic-text-default);
@@ -242,6 +246,46 @@
242
246
  --pf-command-item-active-bg: var(--color-semantic-action-primary);
243
247
  --pf-command-item-active-text: var(--color-semantic-action-primary-text);
244
248
 
249
+ /* Timeline aliases */
250
+ --pf-timeline-connector: var(--color-semantic-border-default);
251
+ --pf-timeline-title: var(--color-semantic-text-default);
252
+ --pf-timeline-timestamp: var(--color-semantic-text-muted);
253
+ --pf-timeline-description: var(--color-semantic-text-muted);
254
+ --pf-timeline-default-bg: var(--color-brand-100);
255
+ --pf-timeline-default-border: var(--color-semantic-action-primary);
256
+ --pf-timeline-default-icon: var(--color-semantic-action-primary);
257
+ --pf-timeline-success-bg: var(--color-semantic-status-success-background);
258
+ --pf-timeline-success-border: var(--color-semantic-status-success-foreground);
259
+ --pf-timeline-success-icon: var(--color-semantic-status-success-foreground);
260
+ --pf-timeline-warning-bg: var(--color-semantic-status-warning-background);
261
+ --pf-timeline-warning-border: var(--color-semantic-status-warning-foreground);
262
+ --pf-timeline-warning-icon: var(--color-semantic-status-warning-foreground);
263
+ --pf-timeline-danger-bg: var(--color-semantic-status-danger-background);
264
+ --pf-timeline-danger-border: var(--color-semantic-status-danger-foreground);
265
+ --pf-timeline-danger-icon: var(--color-semantic-status-danger-foreground);
266
+
267
+ /* Tag input aliases */
268
+ --pf-taginput-bg: var(--pf-input-bg);
269
+ --pf-taginput-border: var(--pf-input-border);
270
+ --pf-taginput-text: var(--pf-input-text);
271
+ --pf-taginput-placeholder: var(--pf-input-placeholder);
272
+ --pf-taginput-focus-border: var(--color-semantic-action-primary);
273
+ --pf-taginput-invalid-border: var(--color-semantic-status-danger-border);
274
+
275
+ /* Time picker aliases */
276
+ --pf-timepicker-bg: var(--pf-input-bg);
277
+ --pf-timepicker-border: var(--pf-input-border);
278
+ --pf-timepicker-text: var(--pf-input-text);
279
+ --pf-timepicker-text-muted: var(--pf-input-placeholder);
280
+ --pf-timepicker-placeholder: var(--pf-input-placeholder);
281
+ --pf-timepicker-focus-border: var(--color-semantic-action-primary);
282
+ --pf-timepicker-invalid-border: var(--color-semantic-status-danger-border);
283
+ --pf-timepicker-menu-bg: var(--pf-surface-bg);
284
+ --pf-timepicker-menu-border: var(--pf-surface-border-strong);
285
+ --pf-timepicker-option-hover-bg: var(--color-semantic-background-subtle);
286
+ --pf-timepicker-option-active-bg: var(--color-semantic-action-primary);
287
+ --pf-timepicker-option-active-text: var(--color-semantic-action-primary-text);
288
+
245
289
  /* Number input aliases */
246
290
  --pf-numberinput-bg: var(--pf-input-bg);
247
291
  --pf-numberinput-border: var(--pf-input-border);
@@ -400,10 +444,10 @@
400
444
  --pf-utility-btn-brand-border: var(--color-brand-300);
401
445
  --pf-utility-btn-brand-text: var(--color-brand-700);
402
446
  --pf-utility-btn-brand-bg-hover: var(--color-brand-200);
403
- --pf-utility-btn-danger-bg: var(--color-semantic-status-danger-background);
404
- --pf-utility-btn-danger-border: var(--color-semantic-status-danger-border);
405
- --pf-utility-btn-danger-text: var(--color-semantic-status-danger-foreground);
406
- --pf-utility-btn-danger-bg-hover: var(--color-danger-100);
447
+ --pf-utility-btn-destructive-bg: var(--color-semantic-status-danger-background);
448
+ --pf-utility-btn-destructive-border: var(--color-semantic-status-danger-border);
449
+ --pf-utility-btn-destructive-text: var(--color-semantic-status-danger-foreground);
450
+ --pf-utility-btn-destructive-bg-hover: var(--color-danger-100);
407
451
 
408
452
  /* Kbd aliases */
409
453
  --pf-kbd-bg: var(--color-semantic-background-subtle);
@@ -428,6 +472,40 @@
428
472
  --pf-accordion-icon: var(--color-semantic-text-muted);
429
473
  --pf-accordion-content-text: var(--color-semantic-text-muted);
430
474
 
475
+ /* Context menu aliases */
476
+ --pf-contextmenu-bg: var(--pf-surface-bg);
477
+ --pf-contextmenu-border: var(--pf-surface-border-strong);
478
+ --pf-contextmenu-text: var(--color-semantic-text-default);
479
+ --pf-contextmenu-text-muted: var(--color-semantic-text-muted);
480
+ --pf-contextmenu-text-danger: var(--color-semantic-status-danger-foreground);
481
+ --pf-contextmenu-separator: var(--color-semantic-border-default);
482
+ --pf-contextmenu-item-active-bg: var(--color-semantic-action-primary);
483
+ --pf-contextmenu-item-active-text: var(--color-semantic-action-primary-text);
484
+ /* Solid red works on both themes; white text = 4.83:1 */
485
+ --pf-contextmenu-danger-active-bg: var(--color-danger-600);
486
+ --pf-contextmenu-danger-active-text: var(--color-base-white);
487
+
488
+ /* Resizable aliases */
489
+ --pf-resizable-handle-bg: var(--color-semantic-border-default);
490
+ --pf-resizable-handle-active-bg: var(--color-semantic-action-primary);
491
+ --pf-resizable-grip: var(--color-semantic-text-muted);
492
+
493
+ /* Toolbar aliases */
494
+ --pf-toolbar-bg: var(--color-semantic-background-default);
495
+ --pf-toolbar-border: var(--color-semantic-border-default);
496
+ --pf-toolbar-separator: var(--color-semantic-border-default);
497
+
498
+ /* Scroll area aliases */
499
+ --pf-scrollarea-thumb: var(--color-semantic-border-strong);
500
+ --pf-scrollarea-thumb-hover: var(--color-semantic-text-muted);
501
+
502
+ /* Collapsible aliases */
503
+ --pf-collapsible-border: var(--color-semantic-border-default);
504
+ --pf-collapsible-trigger-text: var(--color-semantic-text-default);
505
+ --pf-collapsible-trigger-hover-bg: var(--color-semantic-background-subtle);
506
+ --pf-collapsible-icon: var(--color-semantic-text-muted);
507
+ --pf-collapsible-content-text: var(--color-semantic-text-muted);
508
+
431
509
  /* Heatmap aliases */
432
510
  --pf-heatmap-color: var(--color-semantic-action-primary);
433
511
  --pf-heatmap-empty: var(--color-semantic-background-subtle);
@@ -659,6 +737,8 @@
659
737
  --pf-inline-cta-success-border: var(--color-semantic-status-success-border);
660
738
  --pf-inline-cta-warning-bg: var(--color-semantic-status-warning-background);
661
739
  --pf-inline-cta-warning-border: var(--color-semantic-status-warning-border);
740
+ --pf-inline-cta-danger-bg: var(--color-semantic-status-danger-background);
741
+ --pf-inline-cta-danger-border: var(--color-semantic-status-danger-border);
662
742
 
663
743
  /* Select additions */
664
744
  --pf-select-focus-border: var(--color-semantic-action-primary);
@@ -719,6 +799,8 @@
719
799
  --pf-tag-success-text: var(--color-semantic-status-success-foreground);
720
800
  --pf-tag-warning-bg: var(--color-semantic-status-warning-background);
721
801
  --pf-tag-warning-text: var(--color-semantic-status-warning-foreground);
802
+ --pf-tag-danger-bg: var(--color-semantic-status-danger-background);
803
+ --pf-tag-danger-text: var(--color-semantic-status-danger-foreground);
722
804
 
723
805
  /* HeaderNavigation aliases */
724
806
  --pf-header-nav-bg: var(--color-semantic-background-default);
@@ -809,6 +891,9 @@
809
891
  --pf-badge-brand-background: var(--color-brand-900);
810
892
  --pf-badge-brand-foreground: var(--color-brand-300);
811
893
 
894
+ /* Timeline — brand-100 default marker fill is near-white; darken for dark mode */
895
+ --pf-timeline-default-bg: var(--color-brand-900);
896
+
812
897
  --pf-badgegroup-brand-100: var(--color-brand-900);
813
898
  --pf-badgegroup-brand-300: var(--color-brand-700);
814
899
  --pf-badgegroup-brand-700: var(--color-brand-300);
@@ -1276,6 +1361,13 @@ body {
1276
1361
  .pf-button--ghost:hover:not(:disabled) {
1277
1362
  background: var(--pf-button-ghost-bg-hover);
1278
1363
  }
1364
+ .pf-button--destructive {
1365
+ background: var(--pf-button-destructive-bg);
1366
+ color: var(--pf-button-destructive-text);
1367
+ }
1368
+ .pf-button--destructive:hover:not(:disabled) {
1369
+ background: var(--pf-button-destructive-bg-hover);
1370
+ }
1279
1371
 
1280
1372
  .pf-button--loading:disabled {
1281
1373
  cursor: wait;
@@ -1522,6 +1614,128 @@ body {
1522
1614
  animation: none;
1523
1615
  }
1524
1616
  }
1617
+ .pf-context-menu {
1618
+ display: contents;
1619
+ }
1620
+
1621
+ .pf-context-menu__menu {
1622
+ animation: pf-context-menu-in var(--duration-fast) var(--easing-decelerate);
1623
+ background: var(--pf-contextmenu-bg);
1624
+ border: 1px solid var(--pf-contextmenu-border);
1625
+ border-radius: var(--radius-md);
1626
+ box-shadow: var(--pf-elevation-popover-shadow);
1627
+ display: flex;
1628
+ flex-direction: column;
1629
+ gap: 2px;
1630
+ min-width: 180px;
1631
+ outline: none;
1632
+ padding: var(--space-1);
1633
+ z-index: 1100;
1634
+ }
1635
+
1636
+ .pf-context-menu__menu--exiting {
1637
+ animation: pf-context-menu-out var(--duration-fast) var(--easing-accelerate) forwards;
1638
+ }
1639
+
1640
+ @keyframes pf-context-menu-in {
1641
+ from {
1642
+ opacity: 0;
1643
+ transform: scale(0.96);
1644
+ }
1645
+ to {
1646
+ opacity: 1;
1647
+ transform: scale(1);
1648
+ }
1649
+ }
1650
+
1651
+ @keyframes pf-context-menu-out {
1652
+ from {
1653
+ opacity: 1;
1654
+ transform: scale(1);
1655
+ }
1656
+ to {
1657
+ opacity: 0;
1658
+ transform: scale(0.96);
1659
+ }
1660
+ }
1661
+
1662
+ .pf-context-menu__item {
1663
+ align-items: center;
1664
+ background: var(--pf-contextmenu-bg);
1665
+ border: 0;
1666
+ border-radius: var(--radius-sm);
1667
+ color: var(--pf-contextmenu-text);
1668
+ cursor: pointer;
1669
+ display: flex;
1670
+ font: inherit;
1671
+ gap: var(--space-2);
1672
+ padding: var(--space-2) var(--space-3);
1673
+ text-align: start;
1674
+ width: 100%;
1675
+ }
1676
+
1677
+ .pf-context-menu__item--active {
1678
+ background: var(--pf-contextmenu-item-active-bg);
1679
+ color: var(--pf-contextmenu-item-active-text);
1680
+ }
1681
+
1682
+ .pf-context-menu__item:disabled {
1683
+ color: var(--pf-contextmenu-text-muted);
1684
+ cursor: not-allowed;
1685
+ }
1686
+
1687
+ .pf-context-menu__item--destructive {
1688
+ color: var(--pf-contextmenu-text-danger);
1689
+ }
1690
+
1691
+ .pf-context-menu__item--destructive.pf-context-menu__item--active {
1692
+ background: var(--pf-contextmenu-danger-active-bg);
1693
+ color: var(--pf-contextmenu-danger-active-text);
1694
+ }
1695
+
1696
+ .pf-context-menu__item-icon {
1697
+ align-items: center;
1698
+ display: inline-flex;
1699
+ flex-shrink: 0;
1700
+ height: 1rem;
1701
+ justify-content: center;
1702
+ width: 1rem;
1703
+ }
1704
+
1705
+ .pf-context-menu__item-icon svg {
1706
+ display: block;
1707
+ height: 1rem;
1708
+ width: 1rem;
1709
+ }
1710
+
1711
+ .pf-context-menu__item-label {
1712
+ flex: 1;
1713
+ min-width: 0;
1714
+ }
1715
+
1716
+ .pf-context-menu__item-shortcut {
1717
+ color: var(--pf-contextmenu-text-muted);
1718
+ flex-shrink: 0;
1719
+ font-family: var(--font-family-mono, ui-monospace, monospace);
1720
+ font-size: var(--font-size-xs);
1721
+ }
1722
+
1723
+ .pf-context-menu__item--active .pf-context-menu__item-shortcut {
1724
+ color: inherit;
1725
+ }
1726
+
1727
+ .pf-context-menu__separator {
1728
+ background: var(--pf-contextmenu-separator);
1729
+ height: 1px;
1730
+ margin: var(--space-1) 0;
1731
+ }
1732
+
1733
+ @media (prefers-reduced-motion: reduce) {
1734
+ .pf-context-menu__menu,
1735
+ .pf-context-menu__menu--exiting {
1736
+ animation: none;
1737
+ }
1738
+ }
1525
1739
  .pf-badge-group {
1526
1740
  align-items: center;
1527
1741
  display: inline-flex;
@@ -1890,6 +2104,10 @@ body {
1890
2104
  background: var(--pf-badge-warning-background, var(--color-semantic-status-warning-background));
1891
2105
  color: var(--pf-badge-warning-foreground, var(--color-semantic-status-warning-foreground));
1892
2106
  }
2107
+ .pf-badge--danger {
2108
+ background: var(--pf-badge-danger-background, var(--color-semantic-status-danger-background));
2109
+ color: var(--pf-badge-danger-foreground, var(--color-semantic-status-danger-foreground));
2110
+ }
1893
2111
  .pf-card {
1894
2112
  background: var(--pf-card-background);
1895
2113
  border: 1px solid var(--pf-card-border);
@@ -2685,6 +2903,92 @@ body {
2685
2903
  white-space: nowrap;
2686
2904
  width: 1px;
2687
2905
  }
2906
+ .pf-collapsible {
2907
+ border: 1px solid var(--pf-collapsible-border);
2908
+ border-radius: var(--radius-md);
2909
+ }
2910
+
2911
+ .pf-collapsible__trigger {
2912
+ align-items: center;
2913
+ background: transparent;
2914
+ border: 0;
2915
+ border-radius: var(--radius-md);
2916
+ color: var(--pf-collapsible-trigger-text);
2917
+ cursor: pointer;
2918
+ display: flex;
2919
+ font: inherit;
2920
+ font-weight: var(--font-weight-medium);
2921
+ gap: var(--space-2);
2922
+ justify-content: space-between;
2923
+ padding: var(--space-3);
2924
+ text-align: start;
2925
+ width: 100%;
2926
+ }
2927
+
2928
+ .pf-collapsible__trigger:hover:not(:disabled) {
2929
+ background: var(--pf-collapsible-trigger-hover-bg);
2930
+ }
2931
+
2932
+ .pf-collapsible__trigger:focus-visible {
2933
+ box-shadow: var(--pf-collapsible-focus-ring, var(--pf-focus-ring));
2934
+ outline: none;
2935
+ }
2936
+
2937
+ .pf-collapsible__trigger:disabled {
2938
+ color: var(--pf-control-text-disabled);
2939
+ cursor: not-allowed;
2940
+ }
2941
+
2942
+ .pf-collapsible__label {
2943
+ min-width: 0;
2944
+ }
2945
+
2946
+ .pf-collapsible__icon {
2947
+ align-items: center;
2948
+ color: var(--pf-collapsible-icon);
2949
+ display: inline-flex;
2950
+ flex-shrink: 0;
2951
+ transition: transform var(--pf-transition-fast);
2952
+ }
2953
+
2954
+ .pf-collapsible__icon svg {
2955
+ display: block;
2956
+ height: 16px;
2957
+ width: 16px;
2958
+ }
2959
+
2960
+ .pf-collapsible--open .pf-collapsible__icon {
2961
+ transform: rotate(180deg);
2962
+ }
2963
+
2964
+ /* Height animation via the grid-template-rows 0fr → 1fr technique. */
2965
+ .pf-collapsible__panel {
2966
+ display: grid;
2967
+ grid-template-rows: 0fr;
2968
+ transition: grid-template-rows var(--pf-transition-medium);
2969
+ }
2970
+
2971
+ .pf-collapsible__panel--open {
2972
+ grid-template-rows: 1fr;
2973
+ }
2974
+
2975
+ .pf-collapsible__content {
2976
+ min-height: 0;
2977
+ overflow: hidden;
2978
+ }
2979
+
2980
+ .pf-collapsible__content-inner {
2981
+ border-top: 1px solid var(--pf-collapsible-border);
2982
+ color: var(--pf-collapsible-content-text);
2983
+ padding: var(--space-3);
2984
+ }
2985
+
2986
+ @media (prefers-reduced-motion: reduce) {
2987
+ .pf-collapsible__panel,
2988
+ .pf-collapsible__icon {
2989
+ transition: none;
2990
+ }
2991
+ }
2688
2992
  .pf-combobox {
2689
2993
  position: relative;
2690
2994
  }
@@ -3665,6 +3969,10 @@ body {
3665
3969
  background: color-mix(in srgb, var(--pf-inline-cta-warning-bg) 60%, var(--color-base-white));
3666
3970
  border-color: var(--pf-inline-cta-warning-border);
3667
3971
  }
3972
+ .pf-inline-cta--danger {
3973
+ background: color-mix(in srgb, var(--pf-inline-cta-danger-bg) 55%, var(--color-base-white));
3974
+ border-color: var(--pf-inline-cta-danger-border);
3975
+ }
3668
3976
  .pf-kbd {
3669
3977
  align-items: center;
3670
3978
  background: var(--pf-kbd-bg);
@@ -4209,7 +4517,9 @@ body {
4209
4517
  display: flex;
4210
4518
  inset: 0;
4211
4519
  justify-content: center;
4212
- overflow-y: auto;
4520
+ /* visible so the modal's drop shadow isn't clipped; the modal self-caps its
4521
+ height and scrolls internally, so the viewport never needs to scroll. */
4522
+ overflow: visible;
4213
4523
  padding: var(--space-2);
4214
4524
  position: relative;
4215
4525
  }
@@ -4229,7 +4539,9 @@ body {
4229
4539
  color: var(--pf-modal-text);
4230
4540
  display: flex;
4231
4541
  flex-direction: column;
4542
+ /* dvh keeps the modal within the visible viewport on mobile (browser chrome). */
4232
4543
  max-height: 92vh;
4544
+ max-height: 92dvh;
4233
4545
  overflow: hidden;
4234
4546
  width: 100%;
4235
4547
  }
@@ -4237,6 +4549,7 @@ body {
4237
4549
  @media (min-width: 768px) {
4238
4550
  .pf-modal {
4239
4551
  max-height: min(90vh, 720px);
4552
+ max-height: min(90dvh, 720px);
4240
4553
  }
4241
4554
  }
4242
4555
 
@@ -5822,6 +6135,85 @@ body {
5822
6135
  color: var(--pf-rating-badge-reviews);
5823
6136
  font-weight: var(--font-weight-medium);
5824
6137
  }
6138
+ .pf-resizable {
6139
+ display: flex;
6140
+ overflow: hidden;
6141
+ }
6142
+
6143
+ .pf-resizable--horizontal {
6144
+ flex-direction: row;
6145
+ }
6146
+
6147
+ .pf-resizable--vertical {
6148
+ flex-direction: column;
6149
+ }
6150
+
6151
+ .pf-resizable__panel {
6152
+ flex-grow: 0;
6153
+ flex-shrink: 0;
6154
+ min-height: 0;
6155
+ min-width: 0;
6156
+ overflow: auto;
6157
+ }
6158
+
6159
+ .pf-resizable__panel--fill {
6160
+ flex: 1 1 0;
6161
+ }
6162
+
6163
+ /* ── Handle ───────────────────────────────────────────────────────────────── */
6164
+
6165
+ .pf-resizable__handle {
6166
+ align-items: center;
6167
+ background: var(--pf-resizable-handle-bg);
6168
+ display: flex;
6169
+ flex-shrink: 0;
6170
+ justify-content: center;
6171
+ position: relative;
6172
+ touch-action: none;
6173
+ transition: background var(--pf-transition-fast);
6174
+ }
6175
+
6176
+ .pf-resizable__handle:hover,
6177
+ .pf-resizable__handle:focus-visible {
6178
+ background: var(--pf-resizable-handle-active-bg);
6179
+ }
6180
+
6181
+ .pf-resizable__handle:focus-visible {
6182
+ outline: none;
6183
+ box-shadow: var(--pf-resizable-focus-ring, var(--pf-focus-ring));
6184
+ }
6185
+
6186
+ .pf-resizable--horizontal .pf-resizable__handle {
6187
+ cursor: col-resize;
6188
+ width: var(--pf-resizable-handle-size, 6px);
6189
+ }
6190
+
6191
+ .pf-resizable--vertical .pf-resizable__handle {
6192
+ cursor: row-resize;
6193
+ height: var(--pf-resizable-handle-size, 6px);
6194
+ }
6195
+
6196
+ /* Grip affordance (dots/line) centered in the handle. */
6197
+ .pf-resizable__grip {
6198
+ background: var(--pf-resizable-grip);
6199
+ border-radius: var(--radius-full);
6200
+ }
6201
+
6202
+ .pf-resizable--horizontal .pf-resizable__grip {
6203
+ height: 24px;
6204
+ width: 2px;
6205
+ }
6206
+
6207
+ .pf-resizable--vertical .pf-resizable__grip {
6208
+ height: 2px;
6209
+ width: 24px;
6210
+ }
6211
+
6212
+ @media (prefers-reduced-motion: reduce) {
6213
+ .pf-resizable__handle {
6214
+ transition: none;
6215
+ }
6216
+ }
5825
6217
  .pf-rte {
5826
6218
  background: var(--pf-rte-bg);
5827
6219
  border: 1px solid var(--pf-rte-border);
@@ -5916,6 +6308,60 @@ body {
5916
6308
  margin: var(--space-2) 0 0;
5917
6309
  text-align: end;
5918
6310
  }
6311
+ .pf-scroll-area {
6312
+ /* Standard scrollbar styling (Firefox + modern browsers). */
6313
+ scrollbar-color: var(--pf-scrollarea-thumb) transparent;
6314
+ scrollbar-width: thin;
6315
+ /* Reserve a gutter so the scrollbar never overlays (and obscures) content. */
6316
+ scrollbar-gutter: stable;
6317
+ }
6318
+
6319
+ .pf-scroll-area:focus-visible {
6320
+ border-radius: var(--radius-sm);
6321
+ box-shadow: var(--pf-scrollarea-focus-ring, var(--pf-focus-ring));
6322
+ outline: none;
6323
+ }
6324
+
6325
+ .pf-scroll-area--vertical {
6326
+ overflow-x: hidden;
6327
+ overflow-y: auto;
6328
+ }
6329
+
6330
+ .pf-scroll-area--horizontal {
6331
+ overflow-x: auto;
6332
+ overflow-y: hidden;
6333
+ }
6334
+
6335
+ .pf-scroll-area--both {
6336
+ overflow: auto;
6337
+ }
6338
+
6339
+ /* WebKit / Blink scrollbar styling. */
6340
+ .pf-scroll-area::-webkit-scrollbar {
6341
+ height: 10px;
6342
+ width: 10px;
6343
+ }
6344
+
6345
+ .pf-scroll-area::-webkit-scrollbar-track {
6346
+ background: transparent;
6347
+ }
6348
+
6349
+ .pf-scroll-area::-webkit-scrollbar-thumb {
6350
+ background: var(--pf-scrollarea-thumb);
6351
+ /* Transparent border + padding-box clip insets the thumb so it reads slimmer. */
6352
+ background-clip: padding-box;
6353
+ border: 2px solid transparent;
6354
+ border-radius: var(--radius-full);
6355
+ }
6356
+
6357
+ .pf-scroll-area::-webkit-scrollbar-thumb:hover {
6358
+ background: var(--pf-scrollarea-thumb-hover);
6359
+ background-clip: padding-box;
6360
+ }
6361
+
6362
+ .pf-scroll-area::-webkit-scrollbar-corner {
6363
+ background: transparent;
6364
+ }
5919
6365
  .pf-section-footer {
5920
6366
  align-items: flex-start;
5921
6367
  display: flex;
@@ -6750,6 +7196,10 @@ body {
6750
7196
  background: var(--pf-tag-warning-bg);
6751
7197
  color: var(--pf-tag-warning-text);
6752
7198
  }
7199
+ .pf-tag--danger {
7200
+ background: var(--pf-tag-danger-bg);
7201
+ color: var(--pf-tag-danger-text);
7202
+ }
6753
7203
 
6754
7204
  .pf-tag__dismiss {
6755
7205
  align-items: center;
@@ -6780,6 +7230,78 @@ body {
6780
7230
  height: 12px;
6781
7231
  width: 12px;
6782
7232
  }
7233
+ .pf-taginput {
7234
+ background: var(--pf-taginput-bg);
7235
+ border: 1px solid var(--pf-taginput-border);
7236
+ border-radius: var(--radius-md);
7237
+ cursor: text;
7238
+ min-height: 40px;
7239
+ padding: var(--space-1);
7240
+ transition:
7241
+ border 0.2s,
7242
+ box-shadow 0.2s;
7243
+ }
7244
+
7245
+ .pf-taginput:focus-within {
7246
+ border-color: var(--pf-taginput-focus-border);
7247
+ box-shadow: var(--pf-taginput-focus-ring, var(--pf-focus-ring));
7248
+ }
7249
+
7250
+ .pf-taginput--invalid {
7251
+ border-color: var(--pf-taginput-invalid-border);
7252
+ }
7253
+
7254
+ .pf-taginput--disabled {
7255
+ background: var(--pf-control-bg-disabled);
7256
+ border-color: var(--pf-control-border-disabled);
7257
+ cursor: not-allowed;
7258
+ opacity: 0.6;
7259
+ }
7260
+
7261
+ .pf-taginput__tags {
7262
+ align-items: center;
7263
+ display: flex;
7264
+ flex-wrap: wrap;
7265
+ gap: var(--space-1);
7266
+ list-style: none;
7267
+ margin: 0;
7268
+ padding: 0;
7269
+ }
7270
+
7271
+ .pf-taginput__tag {
7272
+ display: inline-flex;
7273
+ }
7274
+
7275
+ .pf-taginput__field {
7276
+ display: inline-flex;
7277
+ flex: 1;
7278
+ min-width: 8ch;
7279
+ }
7280
+
7281
+ .pf-taginput__input {
7282
+ background: transparent;
7283
+ border: none;
7284
+ color: var(--pf-taginput-text);
7285
+ flex: 1;
7286
+ font: inherit;
7287
+ min-width: 0;
7288
+ outline: none;
7289
+ padding: var(--space-1) var(--space-2);
7290
+ }
7291
+
7292
+ .pf-taginput__input::placeholder {
7293
+ color: var(--pf-taginput-placeholder);
7294
+ }
7295
+
7296
+ .pf-taginput__input:disabled {
7297
+ cursor: not-allowed;
7298
+ }
7299
+
7300
+ @media (prefers-reduced-motion: reduce) {
7301
+ .pf-taginput {
7302
+ transition: none;
7303
+ }
7304
+ }
6783
7305
  .pf-table {
6784
7306
  background: var(--pf-table-bg);
6785
7307
  border: 1px solid var(--pf-table-border);
@@ -7096,6 +7618,350 @@ body {
7096
7618
  .pf-textarea--invalid {
7097
7619
  border-color: var(--pf-textarea-invalid-border);
7098
7620
  }
7621
+ .pf-timeline {
7622
+ display: grid;
7623
+ gap: 0;
7624
+ list-style: none;
7625
+ margin: 0;
7626
+ padding: 0;
7627
+ }
7628
+
7629
+ .pf-timeline__item {
7630
+ /* Shared line height for the title; markers center themselves on it. */
7631
+ --pf-timeline-line: 1.375rem;
7632
+ --pf-timeline-marker-size: 16px;
7633
+ column-gap: var(--space-3);
7634
+ display: grid;
7635
+ grid-template-columns: auto 1fr;
7636
+ }
7637
+
7638
+ /* ── Rail (marker + connector) ────────────────────────────────────────────── */
7639
+
7640
+ .pf-timeline__rail {
7641
+ align-items: center;
7642
+ display: flex;
7643
+ flex-direction: column;
7644
+ }
7645
+
7646
+ .pf-timeline__marker {
7647
+ align-items: center;
7648
+ background: var(--pf-timeline-marker-bg);
7649
+ border: 2px solid var(--pf-timeline-marker-border);
7650
+ border-radius: var(--radius-full);
7651
+ color: var(--pf-timeline-marker-icon);
7652
+ display: inline-flex;
7653
+ flex-shrink: 0;
7654
+ height: var(--pf-timeline-marker-size);
7655
+ justify-content: center;
7656
+ /* Vertically center the marker on the title's first line. */
7657
+ margin-top: calc((var(--pf-timeline-line) - var(--pf-timeline-marker-size)) / 2);
7658
+ width: var(--pf-timeline-marker-size);
7659
+ }
7660
+
7661
+ /* Markers carrying an icon are larger to fit it. */
7662
+ .pf-timeline__marker:has(.pf-timeline__marker-icon) {
7663
+ --pf-timeline-marker-size: 28px;
7664
+ }
7665
+
7666
+ .pf-timeline__marker-icon {
7667
+ align-items: center;
7668
+ display: inline-flex;
7669
+ font-size: 0.8rem;
7670
+ justify-content: center;
7671
+ }
7672
+
7673
+ .pf-timeline__marker-icon svg {
7674
+ display: block;
7675
+ height: 14px;
7676
+ width: 14px;
7677
+ }
7678
+
7679
+ .pf-timeline__marker--default {
7680
+ background: var(--pf-timeline-default-bg);
7681
+ border-color: var(--pf-timeline-default-border);
7682
+ color: var(--pf-timeline-default-icon);
7683
+ }
7684
+
7685
+ .pf-timeline__marker--success {
7686
+ background: var(--pf-timeline-success-bg);
7687
+ border-color: var(--pf-timeline-success-border);
7688
+ color: var(--pf-timeline-success-icon);
7689
+ }
7690
+
7691
+ .pf-timeline__marker--warning {
7692
+ background: var(--pf-timeline-warning-bg);
7693
+ border-color: var(--pf-timeline-warning-border);
7694
+ color: var(--pf-timeline-warning-icon);
7695
+ }
7696
+
7697
+ .pf-timeline__marker--danger {
7698
+ background: var(--pf-timeline-danger-bg);
7699
+ border-color: var(--pf-timeline-danger-border);
7700
+ color: var(--pf-timeline-danger-icon);
7701
+ }
7702
+
7703
+ .pf-timeline__connector {
7704
+ background: var(--pf-timeline-connector);
7705
+ flex: 1;
7706
+ margin: var(--space-1) 0;
7707
+ min-height: var(--space-4);
7708
+ width: 2px;
7709
+ }
7710
+
7711
+ /* ── Content ──────────────────────────────────────────────────────────────── */
7712
+
7713
+ .pf-timeline__content {
7714
+ padding-bottom: var(--space-5);
7715
+ }
7716
+
7717
+ .pf-timeline__item--last .pf-timeline__content {
7718
+ padding-bottom: 0;
7719
+ }
7720
+
7721
+ .pf-timeline__header {
7722
+ align-items: baseline;
7723
+ column-gap: var(--space-2);
7724
+ display: flex;
7725
+ flex-wrap: wrap;
7726
+ justify-content: space-between;
7727
+ }
7728
+
7729
+ .pf-timeline__title {
7730
+ color: var(--pf-timeline-title);
7731
+ font-size: var(--font-size-sm);
7732
+ font-weight: var(--font-weight-medium);
7733
+ line-height: var(--pf-timeline-line);
7734
+ margin: 0;
7735
+ }
7736
+
7737
+ .pf-timeline__timestamp {
7738
+ color: var(--pf-timeline-timestamp);
7739
+ font-size: var(--font-size-xs);
7740
+ flex-shrink: 0;
7741
+ white-space: nowrap;
7742
+ }
7743
+
7744
+ .pf-timeline__description {
7745
+ color: var(--pf-timeline-description);
7746
+ font-size: var(--font-size-sm);
7747
+ margin-top: var(--space-1);
7748
+ }
7749
+ .pf-timepicker {
7750
+ position: relative;
7751
+ }
7752
+
7753
+ /* ── Trigger ──────────────────────────────────────────────────────────────── */
7754
+
7755
+ .pf-timepicker__trigger {
7756
+ align-items: center;
7757
+ background: var(--pf-timepicker-bg);
7758
+ border: 1px solid var(--pf-timepicker-border);
7759
+ border-radius: var(--radius-md);
7760
+ color: var(--pf-timepicker-text);
7761
+ cursor: pointer;
7762
+ display: flex;
7763
+ font: inherit;
7764
+ gap: var(--space-2);
7765
+ justify-content: space-between;
7766
+ min-height: 40px;
7767
+ padding: 0 var(--space-3);
7768
+ text-align: start;
7769
+ width: 100%;
7770
+ transition:
7771
+ border 0.2s,
7772
+ box-shadow 0.2s;
7773
+ }
7774
+
7775
+ .pf-timepicker__trigger:focus {
7776
+ outline: none;
7777
+ }
7778
+
7779
+ .pf-timepicker__trigger:focus-visible,
7780
+ .pf-timepicker__trigger--open {
7781
+ border-color: var(--pf-timepicker-focus-border);
7782
+ box-shadow: var(--pf-timepicker-focus-ring, var(--pf-focus-ring));
7783
+ }
7784
+
7785
+ .pf-timepicker__trigger--invalid {
7786
+ border-color: var(--pf-timepicker-invalid-border);
7787
+ }
7788
+
7789
+ .pf-timepicker__trigger:disabled {
7790
+ background: var(--pf-control-bg-disabled);
7791
+ border-color: var(--pf-control-border-disabled);
7792
+ color: var(--pf-control-text-disabled);
7793
+ cursor: not-allowed;
7794
+ opacity: 0.6;
7795
+ }
7796
+
7797
+ .pf-timepicker__value {
7798
+ overflow: hidden;
7799
+ text-overflow: ellipsis;
7800
+ white-space: nowrap;
7801
+ }
7802
+
7803
+ .pf-timepicker__value--placeholder {
7804
+ color: var(--pf-timepicker-placeholder);
7805
+ }
7806
+
7807
+ .pf-timepicker__icon {
7808
+ align-items: center;
7809
+ color: var(--pf-timepicker-text-muted);
7810
+ display: inline-flex;
7811
+ flex-shrink: 0;
7812
+ }
7813
+
7814
+ .pf-timepicker__icon svg {
7815
+ display: block;
7816
+ height: 18px;
7817
+ width: 18px;
7818
+ }
7819
+
7820
+ /* ── Panel ────────────────────────────────────────────────────────────────── */
7821
+
7822
+ .pf-timepicker__panel {
7823
+ animation: pf-timepicker-in var(--duration-fast) var(--easing-decelerate);
7824
+ background: var(--pf-timepicker-menu-bg);
7825
+ border: 1px solid var(--pf-timepicker-menu-border);
7826
+ border-radius: var(--radius-md);
7827
+ box-shadow: var(--pf-elevation-popover-shadow);
7828
+ display: flex;
7829
+ gap: var(--space-1);
7830
+ padding: var(--space-1);
7831
+ position: fixed;
7832
+ z-index: 1000;
7833
+ }
7834
+
7835
+ .pf-timepicker__panel--exiting {
7836
+ animation: pf-timepicker-out var(--duration-fast) var(--easing-accelerate) forwards;
7837
+ }
7838
+
7839
+ @keyframes pf-timepicker-in {
7840
+ from {
7841
+ opacity: 0;
7842
+ transform: translateY(-4px);
7843
+ }
7844
+ to {
7845
+ opacity: 1;
7846
+ transform: translateY(0);
7847
+ }
7848
+ }
7849
+
7850
+ @keyframes pf-timepicker-out {
7851
+ from {
7852
+ opacity: 1;
7853
+ transform: translateY(0);
7854
+ }
7855
+ to {
7856
+ opacity: 0;
7857
+ transform: translateY(-4px);
7858
+ }
7859
+ }
7860
+
7861
+ /* ── Columns ──────────────────────────────────────────────────────────────── */
7862
+
7863
+ .pf-timepicker__column {
7864
+ display: flex;
7865
+ flex-direction: column;
7866
+ gap: 2px;
7867
+ max-height: 220px;
7868
+ overflow-y: auto;
7869
+ scroll-behavior: smooth;
7870
+ scrollbar-width: thin;
7871
+ }
7872
+
7873
+ .pf-timepicker__column--meridiem {
7874
+ overflow-y: visible;
7875
+ }
7876
+
7877
+ .pf-timepicker__option {
7878
+ appearance: none;
7879
+ /* Explicit opaque background (matching the panel) so axe can determine the
7880
+ contrast background directly on each option, even when it's partially
7881
+ clipped by the scrolling column. */
7882
+ background: var(--pf-timepicker-menu-bg);
7883
+ border: 0;
7884
+ border-radius: var(--radius-sm);
7885
+ color: var(--pf-timepicker-text);
7886
+ cursor: pointer;
7887
+ font: inherit;
7888
+ font-variant-numeric: tabular-nums;
7889
+ min-width: 3ch;
7890
+ padding: var(--space-2) var(--space-3);
7891
+ text-align: center;
7892
+ }
7893
+
7894
+ .pf-timepicker__option:hover {
7895
+ background: var(--pf-timepicker-option-hover-bg);
7896
+ }
7897
+
7898
+ .pf-timepicker__option:focus-visible {
7899
+ outline: none;
7900
+ box-shadow: inset 0 0 0 2px var(--pf-timepicker-focus-border);
7901
+ }
7902
+
7903
+ .pf-timepicker__option--selected {
7904
+ background: var(--pf-timepicker-option-active-bg);
7905
+ color: var(--pf-timepicker-option-active-text);
7906
+ font-weight: var(--font-weight-medium);
7907
+ }
7908
+
7909
+ .pf-timepicker__option--selected:hover {
7910
+ background: var(--pf-timepicker-option-active-bg);
7911
+ color: var(--pf-timepicker-option-active-text);
7912
+ }
7913
+
7914
+ @media (prefers-reduced-motion: reduce) {
7915
+ .pf-timepicker__trigger {
7916
+ transition: none;
7917
+ }
7918
+
7919
+ .pf-timepicker__panel,
7920
+ .pf-timepicker__panel--exiting {
7921
+ animation: none;
7922
+ }
7923
+
7924
+ .pf-timepicker__column {
7925
+ scroll-behavior: auto;
7926
+ }
7927
+ }
7928
+ .pf-toolbar {
7929
+ align-items: center;
7930
+ background: var(--pf-toolbar-bg);
7931
+ border: 1px solid var(--pf-toolbar-border);
7932
+ border-radius: var(--radius-md);
7933
+ display: flex;
7934
+ gap: var(--space-1);
7935
+ padding: var(--space-1);
7936
+ }
7937
+
7938
+ .pf-toolbar--horizontal {
7939
+ flex-direction: row;
7940
+ }
7941
+
7942
+ .pf-toolbar--vertical {
7943
+ align-items: stretch;
7944
+ flex-direction: column;
7945
+ width: fit-content;
7946
+ }
7947
+
7948
+ /* ── Separator ────────────────────────────────────────────────────────────── */
7949
+
7950
+ .pf-toolbar__separator {
7951
+ background: var(--pf-toolbar-separator);
7952
+ flex-shrink: 0;
7953
+ }
7954
+
7955
+ .pf-toolbar--horizontal .pf-toolbar__separator {
7956
+ align-self: stretch;
7957
+ margin: var(--space-1) var(--space-1);
7958
+ width: 1px;
7959
+ }
7960
+
7961
+ .pf-toolbar--vertical .pf-toolbar__separator {
7962
+ height: 1px;
7963
+ margin: var(--space-1) var(--space-1);
7964
+ }
7099
7965
  .pf-tooltip__trigger {
7100
7966
  border-radius: var(--radius-sm);
7101
7967
  display: inline-flex;
@@ -7327,14 +8193,14 @@ body {
7327
8193
  background: var(--pf-utility-btn-brand-bg-hover);
7328
8194
  }
7329
8195
 
7330
- .pf-utility-button--danger {
7331
- background: var(--pf-utility-btn-danger-bg);
7332
- border-color: var(--pf-utility-btn-danger-border);
7333
- color: var(--pf-utility-btn-danger-text);
8196
+ .pf-utility-button--destructive {
8197
+ background: var(--pf-utility-btn-destructive-bg);
8198
+ border-color: var(--pf-utility-btn-destructive-border);
8199
+ color: var(--pf-utility-btn-destructive-text);
7334
8200
  }
7335
8201
 
7336
- .pf-utility-button--danger:hover:not(:disabled) {
7337
- background: var(--pf-utility-btn-danger-bg-hover);
8202
+ .pf-utility-button--destructive:hover:not(:disabled) {
8203
+ background: var(--pf-utility-btn-destructive-bg-hover);
7338
8204
  }
7339
8205
 
7340
8206
  .pf-utility-button__icon {
@@ -7397,3 +8263,29 @@ body {
7397
8263
  padding: var(--space-4);
7398
8264
  text-align: center;
7399
8265
  }
8266
+ .pf-visually-hidden {
8267
+ border: 0;
8268
+ clip: rect(0 0 0 0);
8269
+ clip-path: inset(50%);
8270
+ height: 1px;
8271
+ margin: -1px;
8272
+ overflow: hidden;
8273
+ padding: 0;
8274
+ position: absolute;
8275
+ white-space: nowrap;
8276
+ width: 1px;
8277
+ }
8278
+
8279
+ /* Reveal on keyboard focus (skip-link pattern). */
8280
+ .pf-visually-hidden--focusable:focus,
8281
+ .pf-visually-hidden--focusable:focus-within {
8282
+ clip: auto;
8283
+ clip-path: none;
8284
+ height: auto;
8285
+ margin: 0;
8286
+ overflow: visible;
8287
+ /* Flow back into layout so the revealed content doesn't overlap siblings. */
8288
+ position: static;
8289
+ white-space: normal;
8290
+ width: auto;
8291
+ }