@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/index.cjs CHANGED
@@ -1,3 +1,4 @@
1
+ "use client";
1
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
3
  require('./styles.css');//#region \0rolldown/runtime.js
3
4
  var __create = Object.create;
@@ -448,6 +449,23 @@ var customIcons = {
448
449
  "aria-hidden": "true",
449
450
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: "M12 5v14" }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: "M5 12h14" })]
450
451
  }),
452
+ clock: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("svg", {
453
+ width: "1em",
454
+ height: "1em",
455
+ viewBox: "0 0 24 24",
456
+ fill: "none",
457
+ stroke: "currentColor",
458
+ strokeWidth: "2",
459
+ strokeLinecap: "round",
460
+ strokeLinejoin: "round",
461
+ focusable: "false",
462
+ "aria-hidden": "true",
463
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("circle", {
464
+ cx: "12",
465
+ cy: "12",
466
+ r: "9"
467
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: "M12 7v5l3 2" })]
468
+ }),
451
469
  "magnifying-glass": /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("svg", {
452
470
  width: "1em",
453
471
  height: "1em",
@@ -967,6 +985,149 @@ function CommandPalette({ open, onOpenChange, items, placeholder = "Search comma
967
985
  }), document.body);
968
986
  }
969
987
  //#endregion
988
+ //#region src/components/ContextMenu/ContextMenu.tsx
989
+ var isSeparator = (entry) => entry.separator === true;
990
+ var VIEWPORT_PADDING = 8;
991
+ var ContextMenu = (0, react.forwardRef)(function ContextMenu({ className, items, disabled = false, onOpenChange, children, onContextMenu, ...props }, ref) {
992
+ const menuId = (0, react.useId)();
993
+ const [isOpen, setIsOpen] = (0, react.useState)(false);
994
+ const [point, setPoint] = (0, react.useState)({
995
+ x: 0,
996
+ y: 0
997
+ });
998
+ const [coords, setCoords] = (0, react.useState)(null);
999
+ const rootRefs = useComposedRefs((0, react.useRef)(null), ref);
1000
+ const menuRef = (0, react.useRef)(null);
1001
+ const { isMounted, isExiting } = usePresence(isOpen, 140);
1002
+ const actionable = items.filter((e) => !isSeparator(e));
1003
+ const { activeIndex, move, setActiveIndex } = useListNavigation({
1004
+ items: actionable,
1005
+ isDisabled: (item) => Boolean(item.disabled)
1006
+ });
1007
+ const setOpen = (open) => {
1008
+ setIsOpen(open);
1009
+ onOpenChange?.(open);
1010
+ };
1011
+ useOutsideInteraction({
1012
+ refs: [menuRef],
1013
+ enabled: isOpen,
1014
+ onInteractOutside: () => setOpen(false)
1015
+ });
1016
+ (0, react.useLayoutEffect)(() => {
1017
+ if (!isMounted || !menuRef.current) return;
1018
+ const rect = menuRef.current.getBoundingClientRect();
1019
+ const maxLeft = window.innerWidth - rect.width - VIEWPORT_PADDING;
1020
+ const maxTop = window.innerHeight - rect.height - VIEWPORT_PADDING;
1021
+ setCoords({
1022
+ left: Math.max(VIEWPORT_PADDING, Math.min(point.x, maxLeft)),
1023
+ top: Math.max(VIEWPORT_PADDING, Math.min(point.y, maxTop))
1024
+ });
1025
+ }, [
1026
+ isMounted,
1027
+ point.x,
1028
+ point.y
1029
+ ]);
1030
+ const handleContextMenu = (event) => {
1031
+ onContextMenu?.(event);
1032
+ if (disabled || event.defaultPrevented) return;
1033
+ event.preventDefault();
1034
+ setPoint({
1035
+ x: event.clientX,
1036
+ y: event.clientY
1037
+ });
1038
+ setCoords(null);
1039
+ setActiveIndex(actionable.findIndex((item) => !item.disabled));
1040
+ setOpen(true);
1041
+ };
1042
+ const select = (item) => {
1043
+ if (item.disabled) return;
1044
+ item.onSelect?.();
1045
+ setOpen(false);
1046
+ };
1047
+ const onMenuKeyDown = (event) => {
1048
+ if (event.key === Keys.Escape) {
1049
+ event.preventDefault();
1050
+ setOpen(false);
1051
+ } else if (event.key === Keys.ArrowDown) {
1052
+ event.preventDefault();
1053
+ move("next");
1054
+ } else if (event.key === Keys.ArrowUp) {
1055
+ event.preventDefault();
1056
+ move("previous");
1057
+ } else if (event.key === Keys.Home) {
1058
+ event.preventDefault();
1059
+ move("first");
1060
+ } else if (event.key === Keys.End) {
1061
+ event.preventDefault();
1062
+ move("last");
1063
+ } else if (event.key === Keys.Enter || event.key === Keys.Space) {
1064
+ event.preventDefault();
1065
+ const item = actionable[activeIndex];
1066
+ if (item) select(item);
1067
+ }
1068
+ };
1069
+ (0, react.useLayoutEffect)(() => {
1070
+ if (isMounted && coords) menuRef.current?.focus();
1071
+ }, [isMounted, coords]);
1072
+ let actionableIndex = -1;
1073
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1074
+ ref: rootRefs,
1075
+ className: cx("pf-context-menu", className),
1076
+ onContextMenu: handleContextMenu,
1077
+ ...props,
1078
+ children: [children, isMounted && typeof document !== "undefined" ? (0, react_dom.createPortal)(/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1079
+ id: menuId,
1080
+ ref: menuRef,
1081
+ role: "menu",
1082
+ "aria-label": "Context menu",
1083
+ tabIndex: -1,
1084
+ className: cx("pf-context-menu__menu", isExiting && "pf-context-menu__menu--exiting"),
1085
+ style: {
1086
+ position: "fixed",
1087
+ left: coords?.left ?? point.x,
1088
+ top: coords?.top ?? point.y,
1089
+ visibility: coords ? "visible" : "hidden"
1090
+ },
1091
+ onKeyDown: onMenuKeyDown,
1092
+ children: items.map((entry, index) => {
1093
+ if (isSeparator(entry)) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1094
+ role: "separator",
1095
+ className: "pf-context-menu__separator"
1096
+ }, `sep-${index}`);
1097
+ actionableIndex += 1;
1098
+ const itemIndex = actionableIndex;
1099
+ const isActive = itemIndex === activeIndex;
1100
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
1101
+ type: "button",
1102
+ role: "menuitem",
1103
+ disabled: entry.disabled,
1104
+ className: cx("pf-context-menu__item", isActive && "pf-context-menu__item--active", entry.destructive && "pf-context-menu__item--destructive"),
1105
+ onMouseEnter: () => {
1106
+ if (!entry.disabled) setActiveIndex(itemIndex);
1107
+ },
1108
+ onClick: () => select(entry),
1109
+ children: [
1110
+ entry.icon ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1111
+ className: "pf-context-menu__item-icon",
1112
+ "aria-hidden": true,
1113
+ children: entry.icon
1114
+ }) : null,
1115
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1116
+ className: "pf-context-menu__item-label",
1117
+ children: entry.label
1118
+ }),
1119
+ entry.shortcut ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("kbd", {
1120
+ className: "pf-context-menu__item-shortcut",
1121
+ children: entry.shortcut
1122
+ }) : null
1123
+ ]
1124
+ }, entry.id ?? `${entry.label}-${index}`);
1125
+ })
1126
+ }), document.body) : null]
1127
+ });
1128
+ });
1129
+ ContextMenu.displayName = "ContextMenu";
1130
+ //#endregion
970
1131
  //#region src/components/BadgeGroup/BadgeGroup.tsx
971
1132
  var BadgeGroup = (0, react.forwardRef)(({ label, message, color = "gray", appearance = "pill", badgePosition = "leading", className, ...props }, ref) => {
972
1133
  const badge = /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
@@ -1651,16 +1812,16 @@ var Calendar = (0, react.forwardRef)(function Calendar({ className, value, defau
1651
1812
  Calendar.displayName = "Calendar";
1652
1813
  //#endregion
1653
1814
  //#region src/components/Carousel/Carousel.tsx
1654
- var clamp$3 = (value, min, max) => {
1815
+ var clamp$4 = (value, min, max) => {
1655
1816
  return Math.min(Math.max(value, min), max);
1656
1817
  };
1657
1818
  var Carousel = (0, react.forwardRef)(function Carousel({ className, slides, initialIndex = 0, loop = true, showIndicators = true, autoPlay = false, autoPlayInterval = 5e3, onIndexChange, "aria-label": ariaLabel = "Carousel", ...props }, ref) {
1658
1819
  const totalSlides = slides.length;
1659
- const [activeIndex, setActiveIndex] = (0, react.useState)(clamp$3(initialIndex, 0, Math.max(totalSlides - 1, 0)));
1660
- const resolvedActiveIndex = clamp$3(activeIndex, 0, Math.max(totalSlides - 1, 0));
1820
+ const [activeIndex, setActiveIndex] = (0, react.useState)(clamp$4(initialIndex, 0, Math.max(totalSlides - 1, 0)));
1821
+ const resolvedActiveIndex = clamp$4(activeIndex, 0, Math.max(totalSlides - 1, 0));
1661
1822
  const goToIndex = (nextIndex) => {
1662
1823
  if (totalSlides === 0) return;
1663
- const resolvedIndex = loop ? (nextIndex % totalSlides + totalSlides) % totalSlides : clamp$3(nextIndex, 0, totalSlides - 1);
1824
+ const resolvedIndex = loop ? (nextIndex % totalSlides + totalSlides) % totalSlides : clamp$4(nextIndex, 0, totalSlides - 1);
1664
1825
  setActiveIndex(resolvedIndex);
1665
1826
  onIndexChange?.(resolvedIndex);
1666
1827
  };
@@ -1907,6 +2068,62 @@ var CodeSnippet = (0, react.forwardRef)(function CodeSnippet({ className, code,
1907
2068
  });
1908
2069
  CodeSnippet.displayName = "CodeSnippet";
1909
2070
  //#endregion
2071
+ //#region src/components/Collapsible/Collapsible.tsx
2072
+ var Collapsible = (0, react.forwardRef)(function Collapsible({ className, trigger, open, defaultOpen, onOpenChange, disabled = false, showChevron = true, children, ...props }, ref) {
2073
+ const baseId = (0, react.useId)();
2074
+ const triggerId = `${baseId}-trigger`;
2075
+ const contentId = `${baseId}-content`;
2076
+ const disclosure = useDisclosure({
2077
+ open,
2078
+ defaultOpen,
2079
+ onOpenChange,
2080
+ disabled
2081
+ });
2082
+ const isOpen = disclosure.isOpen ?? false;
2083
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
2084
+ ref,
2085
+ className: cx("pf-collapsible", isOpen && "pf-collapsible--open", className),
2086
+ ...props,
2087
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
2088
+ id: triggerId,
2089
+ type: "button",
2090
+ className: "pf-collapsible__trigger",
2091
+ disabled,
2092
+ "aria-expanded": isOpen,
2093
+ "aria-controls": contentId,
2094
+ onClick: () => disclosure.toggle(),
2095
+ onKeyDown: (event) => {
2096
+ if (event.key === Keys.Escape && isOpen) disclosure.close();
2097
+ },
2098
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2099
+ className: "pf-collapsible__label",
2100
+ children: trigger
2101
+ }), showChevron ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2102
+ className: "pf-collapsible__icon",
2103
+ "aria-hidden": true,
2104
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Icon, {
2105
+ name: "chevron-down",
2106
+ "aria-hidden": true
2107
+ })
2108
+ }) : null]
2109
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
2110
+ id: contentId,
2111
+ role: "region",
2112
+ "aria-labelledby": triggerId,
2113
+ className: cx("pf-collapsible__panel", isOpen && "pf-collapsible__panel--open"),
2114
+ ...!isOpen ? { inert: true } : {},
2115
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
2116
+ className: "pf-collapsible__content",
2117
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
2118
+ className: "pf-collapsible__content-inner",
2119
+ children
2120
+ })
2121
+ })
2122
+ })]
2123
+ });
2124
+ });
2125
+ Collapsible.displayName = "Collapsible";
2126
+ //#endregion
1910
2127
  //#region src/components/Combobox/Combobox.tsx
1911
2128
  var Combobox = (0, react.forwardRef)(function Combobox({ id, options, value, defaultValue, onValueChange, label, description, error, placeholder = "Search…", emptyMessage = "No matches", name, required, className, disabled, "aria-describedby": ariaDescribedBy, ...props }, ref) {
1912
2129
  const generatedId = (0, react.useId)();
@@ -3900,7 +4117,7 @@ var decimalsOf = (n) => {
3900
4117
  const dot = str.indexOf(".");
3901
4118
  return dot === -1 ? 0 : str.length - dot - 1;
3902
4119
  };
3903
- var clamp$2 = (n, min, max) => Math.min(Math.max(n, min), max);
4120
+ var clamp$3 = (n, min, max) => Math.min(Math.max(n, min), max);
3904
4121
  var NumberInput = (0, react.forwardRef)(function NumberInput({ id, value, defaultValue, onValueChange, min = -Infinity, max = Infinity, step = 1, label, description, error, formatOptions, locale, decrementLabel = "Decrease", incrementLabel = "Increase", name, required, disabled, className, placeholder, "aria-describedby": ariaDescribedBy, ...props }, ref) {
3905
4122
  const generatedId = (0, react.useId)();
3906
4123
  const fieldId = id ?? generatedId;
@@ -3933,7 +4150,7 @@ var NumberInput = (0, react.forwardRef)(function NumberInput({ id, value, defaul
3933
4150
  setDraft("");
3934
4151
  return;
3935
4152
  }
3936
- const clamped = round(clamp$2(next, min, max));
4153
+ const clamped = round(clamp$3(next, min, max));
3937
4154
  setCurrentValue(clamped);
3938
4155
  setDraft(focused ? String(clamped) : formatValue(clamped));
3939
4156
  };
@@ -4013,7 +4230,7 @@ var NumberInput = (0, react.forwardRef)(function NumberInput({ id, value, defaul
4013
4230
  return;
4014
4231
  }
4015
4232
  const parsed = Number(raw);
4016
- if (!Number.isNaN(parsed)) setCurrentValue(round(clamp$2(parsed, min, max)));
4233
+ if (!Number.isNaN(parsed)) setCurrentValue(round(clamp$3(parsed, min, max)));
4017
4234
  },
4018
4235
  onBlur: () => {
4019
4236
  setFocused(false);
@@ -4710,6 +4927,98 @@ var RatingBadge = (0, react.forwardRef)(function RatingBadge({ value, max = 5, r
4710
4927
  });
4711
4928
  RatingBadge.displayName = "RatingBadge";
4712
4929
  //#endregion
4930
+ //#region src/components/Resizable/Resizable.tsx
4931
+ var clamp$2 = (n, min, max) => Math.min(Math.max(n, min), max);
4932
+ var Resizable = (0, react.forwardRef)(function Resizable({ className, orientation = "horizontal", size, defaultSize = 50, onSizeChange, min = 10, max = 90, step = 2, handleLabel = "Resize panels", children, ...props }, ref) {
4933
+ const handleId = (0, react.useId)();
4934
+ const containerRef = (0, react.useRef)(null);
4935
+ const containerRefs = useComposedRefs(containerRef, ref);
4936
+ const draggingRef = (0, react.useRef)(false);
4937
+ const [current, setCurrent] = useControllableState({
4938
+ value: size,
4939
+ defaultValue: defaultSize,
4940
+ onChange: onSizeChange
4941
+ });
4942
+ const value = clamp$2(current ?? defaultSize, min, max);
4943
+ const isHorizontal = orientation === "horizontal";
4944
+ const panels = react.Children.toArray(children);
4945
+ const first = panels[0] ?? null;
4946
+ const second = panels[1] ?? null;
4947
+ const setFromPointer = (clientX, clientY) => {
4948
+ const el = containerRef.current;
4949
+ if (!el) return;
4950
+ const rect = el.getBoundingClientRect();
4951
+ const pct = isHorizontal ? (clientX - rect.left) / rect.width * 100 : (clientY - rect.top) / rect.height * 100;
4952
+ setCurrent(clamp$2(Math.round(pct), min, max));
4953
+ };
4954
+ const onPointerDown = (event) => {
4955
+ event.preventDefault();
4956
+ event.currentTarget.setPointerCapture(event.pointerId);
4957
+ draggingRef.current = true;
4958
+ };
4959
+ const onPointerMove = (event) => {
4960
+ if (!draggingRef.current) return;
4961
+ setFromPointer(event.clientX, event.clientY);
4962
+ };
4963
+ const onPointerUp = (event) => {
4964
+ draggingRef.current = false;
4965
+ event.currentTarget.releasePointerCapture(event.pointerId);
4966
+ };
4967
+ const onKeyDown = (event) => {
4968
+ const decKey = isHorizontal ? Keys.ArrowLeft : Keys.ArrowUp;
4969
+ const incKey = isHorizontal ? Keys.ArrowRight : Keys.ArrowDown;
4970
+ if (event.key === decKey) {
4971
+ event.preventDefault();
4972
+ setCurrent(clamp$2(value - step, min, max));
4973
+ } else if (event.key === incKey) {
4974
+ event.preventDefault();
4975
+ setCurrent(clamp$2(value + step, min, max));
4976
+ } else if (event.key === Keys.Home) {
4977
+ event.preventDefault();
4978
+ setCurrent(min);
4979
+ } else if (event.key === Keys.End) {
4980
+ event.preventDefault();
4981
+ setCurrent(max);
4982
+ }
4983
+ };
4984
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4985
+ ref: containerRefs,
4986
+ className: cx("pf-resizable", `pf-resizable--${orientation}`, className),
4987
+ ...props,
4988
+ children: [
4989
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
4990
+ className: "pf-resizable__panel",
4991
+ style: { flexBasis: `${value}%` },
4992
+ children: first
4993
+ }),
4994
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
4995
+ id: handleId,
4996
+ role: "separator",
4997
+ tabIndex: 0,
4998
+ "aria-orientation": isHorizontal ? "vertical" : "horizontal",
4999
+ "aria-label": handleLabel,
5000
+ "aria-valuenow": value,
5001
+ "aria-valuemin": min,
5002
+ "aria-valuemax": max,
5003
+ className: "pf-resizable__handle",
5004
+ onPointerDown,
5005
+ onPointerMove,
5006
+ onPointerUp,
5007
+ onKeyDown,
5008
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5009
+ className: "pf-resizable__grip",
5010
+ "aria-hidden": true
5011
+ })
5012
+ }),
5013
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
5014
+ className: "pf-resizable__panel pf-resizable__panel--fill",
5015
+ children: second
5016
+ })
5017
+ ]
5018
+ });
5019
+ });
5020
+ Resizable.displayName = "Resizable";
5021
+ //#endregion
4713
5022
  //#region src/components/RichTextEditor/RichTextEditor.tsx
4714
5023
  var stripOuterPTags = (html) => {
4715
5024
  if (!html) return "";
@@ -4870,6 +5179,18 @@ var RichTextEditor = (0, react.forwardRef)(({ id, label, description, error, val
4870
5179
  });
4871
5180
  RichTextEditor.displayName = "RichTextEditor";
4872
5181
  //#endregion
5182
+ //#region src/components/ScrollArea/ScrollArea.tsx
5183
+ var ScrollArea = (0, react.forwardRef)(function ScrollArea({ className, orientation = "vertical", focusable = true, tabIndex, children, ...props }, ref) {
5184
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
5185
+ ref,
5186
+ className: cx("pf-scroll-area", `pf-scroll-area--${orientation}`, className),
5187
+ tabIndex: tabIndex ?? (focusable ? 0 : void 0),
5188
+ ...props,
5189
+ children
5190
+ });
5191
+ });
5192
+ ScrollArea.displayName = "ScrollArea";
5193
+ //#endregion
4873
5194
  //#region src/components/SectionFooter/SectionFooter.tsx
4874
5195
  var SectionFooter = (0, react.forwardRef)(function SectionFooter({ className, heading, description, actions, divider = true, align = "between", children, ...props }, ref) {
4875
5196
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("footer", {
@@ -5591,6 +5912,111 @@ var Tag = (0, react.forwardRef)(({ className, variant = "neutral", dismissible =
5591
5912
  }));
5592
5913
  Tag.displayName = "Tag";
5593
5914
  //#endregion
5915
+ //#region src/components/TagInput/TagInput.tsx
5916
+ var TagInput = (0, react.forwardRef)(function TagInput({ id, value, defaultValue, onValueChange, label, description, error, placeholder = "Add a tag…", max, allowDuplicates = false, delimiters = [Keys.Enter, ","], validate, tagVariant = "neutral", name, required, disabled, className, "aria-describedby": ariaDescribedBy, ...props }, ref) {
5917
+ const generatedId = (0, react.useId)();
5918
+ const fieldId = id ?? generatedId;
5919
+ const descriptionId = description ? `${fieldId}-description` : void 0;
5920
+ const errorId = error ? `${fieldId}-error` : void 0;
5921
+ const describedBy = composeDescribedBy(ariaDescribedBy, descriptionId, errorId);
5922
+ const [tags, setTags] = useControllableState({
5923
+ value,
5924
+ defaultValue: defaultValue ?? [],
5925
+ onChange: onValueChange
5926
+ });
5927
+ const currentTags = tags ?? [];
5928
+ const [draft, setDraft] = (0, react.useState)("");
5929
+ const inputRef = (0, react.useRef)(null);
5930
+ const inputRefs = useComposedRefs(inputRef, ref);
5931
+ const atMax = max !== void 0 && currentTags.length >= max;
5932
+ const addTag = (raw) => {
5933
+ const tag = raw.trim();
5934
+ if (!tag) return;
5935
+ if (atMax) return;
5936
+ if (validate && !validate(tag)) return;
5937
+ const exists = currentTags.some((t) => t.toLowerCase() === tag.toLowerCase());
5938
+ if (!allowDuplicates && exists) {
5939
+ setDraft("");
5940
+ return;
5941
+ }
5942
+ setTags([...currentTags, tag]);
5943
+ setDraft("");
5944
+ };
5945
+ const removeTag = (index) => {
5946
+ setTags(currentTags.filter((_, i) => i !== index));
5947
+ };
5948
+ const onKeyDown = (event) => {
5949
+ if (disabled) return;
5950
+ if (delimiters.includes(event.key)) {
5951
+ if (draft.trim()) {
5952
+ event.preventDefault();
5953
+ addTag(draft);
5954
+ } else if (event.key !== Keys.Enter) event.preventDefault();
5955
+ return;
5956
+ }
5957
+ if (event.key === "Backspace" && draft === "" && currentTags.length > 0) {
5958
+ event.preventDefault();
5959
+ removeTag(currentTags.length - 1);
5960
+ }
5961
+ };
5962
+ const onPaste = (event) => {
5963
+ const text = event.clipboardData.getData("text");
5964
+ if (!/[,\n\t]/.test(text)) return;
5965
+ event.preventDefault();
5966
+ text.split(/[,\n\t]+/).map((t) => t.trim()).filter(Boolean).forEach((t) => addTag(t));
5967
+ };
5968
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(FieldWrapper, {
5969
+ labelFor: fieldId,
5970
+ label,
5971
+ description,
5972
+ descriptionId,
5973
+ error,
5974
+ errorId,
5975
+ required,
5976
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5977
+ className: cx("pf-taginput", error && "pf-taginput--invalid", disabled && "pf-taginput--disabled"),
5978
+ onClick: () => inputRef.current?.focus(),
5979
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("ul", {
5980
+ className: "pf-taginput__tags",
5981
+ children: [currentTags.map((tag, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", {
5982
+ className: "pf-taginput__tag",
5983
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Tag, {
5984
+ variant: tagVariant,
5985
+ dismissible: !disabled,
5986
+ onDismiss: () => removeTag(index),
5987
+ children: tag
5988
+ })
5989
+ }, `${tag}-${index}`)), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", {
5990
+ className: "pf-taginput__field",
5991
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
5992
+ ...props,
5993
+ id: fieldId,
5994
+ ref: inputRefs,
5995
+ type: "text",
5996
+ className: cx("pf-taginput__input", className),
5997
+ value: draft,
5998
+ placeholder: currentTags.length === 0 ? placeholder : "",
5999
+ disabled: disabled || atMax,
6000
+ required: required && currentTags.length === 0,
6001
+ autoComplete: "off",
6002
+ "aria-invalid": error ? true : void 0,
6003
+ "aria-describedby": describedBy,
6004
+ onChange: (event) => setDraft(event.target.value),
6005
+ onKeyDown,
6006
+ onPaste,
6007
+ onBlur: () => addTag(draft)
6008
+ })
6009
+ })]
6010
+ }), name ? currentTags.map((tag, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
6011
+ type: "hidden",
6012
+ name,
6013
+ value: tag
6014
+ }, index)) : null]
6015
+ })
6016
+ });
6017
+ });
6018
+ TagInput.displayName = "TagInput";
6019
+ //#endregion
5594
6020
  //#region src/components/Table/Table.tsx
5595
6021
  function Table({ className, columns, rows, caption, dense = false, striped = false, hoverable = true, stickyHeader = false, emptyState = "No data available.", defaultSortState, sortState, onSortStateChange, getRowKey, ...props }) {
5596
6022
  const [internalSortState, setInternalSortState] = (0, react.useState)(defaultSortState);
@@ -5844,6 +6270,272 @@ var Textarea = (0, react.forwardRef)(({ id, label, description, error, className
5844
6270
  });
5845
6271
  Textarea.displayName = "Textarea";
5846
6272
  //#endregion
6273
+ //#region src/components/Timeline/Timeline.tsx
6274
+ var Timeline = (0, react.forwardRef)(function Timeline({ className, items, ...props }, ref) {
6275
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("ol", {
6276
+ ref,
6277
+ className: cx("pf-timeline", className),
6278
+ ...props,
6279
+ children: items.map((item, index) => {
6280
+ const tone = item.tone ?? "default";
6281
+ const isLast = index === items.length - 1;
6282
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("li", {
6283
+ className: cx("pf-timeline__item", isLast && "pf-timeline__item--last"),
6284
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6285
+ className: "pf-timeline__rail",
6286
+ "aria-hidden": true,
6287
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6288
+ className: cx("pf-timeline__marker", `pf-timeline__marker--${tone}`),
6289
+ children: item.icon ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6290
+ className: "pf-timeline__marker-icon",
6291
+ children: item.icon
6292
+ }) : null
6293
+ }), !isLast ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: "pf-timeline__connector" }) : null]
6294
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6295
+ className: "pf-timeline__content",
6296
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6297
+ className: "pf-timeline__header",
6298
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
6299
+ className: "pf-timeline__title",
6300
+ children: item.title
6301
+ }), item.timestamp ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6302
+ className: "pf-timeline__timestamp",
6303
+ children: item.timestamp
6304
+ }) : null]
6305
+ }), item.description ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
6306
+ className: "pf-timeline__description",
6307
+ children: item.description
6308
+ }) : null]
6309
+ })]
6310
+ }, item.id ?? index);
6311
+ })
6312
+ });
6313
+ });
6314
+ Timeline.displayName = "Timeline";
6315
+ //#endregion
6316
+ //#region src/components/TimePicker/TimePicker.tsx
6317
+ var pad = (n) => String(n).padStart(2, "0");
6318
+ var parseValue = (value) => {
6319
+ const match = /^(\d{1,2}):(\d{2})$/.exec(value.trim());
6320
+ if (!match) return {
6321
+ hour: null,
6322
+ minute: null
6323
+ };
6324
+ const hour = Number(match[1]);
6325
+ const minute = Number(match[2]);
6326
+ if (hour > 23 || minute > 59) return {
6327
+ hour: null,
6328
+ minute: null
6329
+ };
6330
+ return {
6331
+ hour,
6332
+ minute
6333
+ };
6334
+ };
6335
+ var formatDisplay = (parts, hourCycle) => {
6336
+ if (parts.hour === null || parts.minute === null) return "";
6337
+ if (hourCycle === 24) return `${pad(parts.hour)}:${pad(parts.minute)}`;
6338
+ const meridiem = parts.hour < 12 ? "AM" : "PM";
6339
+ return `${parts.hour % 12 === 0 ? 12 : parts.hour % 12}:${pad(parts.minute)} ${meridiem}`;
6340
+ };
6341
+ var range = (length, step = 1) => Array.from({ length: Math.ceil(length / step) }, (_, i) => i * step);
6342
+ var TimePicker = (0, react.forwardRef)(function TimePicker({ id, value, defaultValue, onValueChange, hourCycle = 24, minuteStep = 1, label, description, error, placeholder = "Select time", required, name, disabled, className, "aria-describedby": ariaDescribedBy, ...props }, ref) {
6343
+ const generatedId = (0, react.useId)();
6344
+ const fieldId = id ?? generatedId;
6345
+ const panelId = `${fieldId}-panel`;
6346
+ const descriptionId = description ? `${fieldId}-description` : void 0;
6347
+ const errorId = error ? `${fieldId}-error` : void 0;
6348
+ const describedBy = composeDescribedBy(ariaDescribedBy, descriptionId, errorId);
6349
+ const [current, setCurrent] = useControllableState({
6350
+ value,
6351
+ defaultValue: defaultValue ?? "",
6352
+ onChange: onValueChange
6353
+ });
6354
+ const parts = parseValue(current ?? "");
6355
+ const disclosure = useDisclosure({ disabled });
6356
+ const isOpen = disclosure.isOpen ?? false;
6357
+ const rootRef = (0, react.useRef)(null);
6358
+ const triggerRefs = useComposedRefs((0, react.useRef)(null), ref);
6359
+ const panelRef = (0, react.useRef)(null);
6360
+ const { isMounted, isExiting } = usePresence(isOpen, 160);
6361
+ const panelStyle = useAnchoredPosition({
6362
+ anchorRef: rootRef,
6363
+ floatingRef: panelRef,
6364
+ enabled: isOpen,
6365
+ matchAnchorWidth: false,
6366
+ flip: true
6367
+ });
6368
+ useOutsideInteraction({
6369
+ refs: [rootRef, panelRef],
6370
+ enabled: isOpen,
6371
+ onInteractOutside: () => disclosure.close()
6372
+ });
6373
+ const hours = hourCycle === 24 ? range(24) : range(12).map((h) => h + 1);
6374
+ const minutes = range(60, minuteStep);
6375
+ const meridiems = ["AM", "PM"];
6376
+ const selectedMeridiem = parts.hour === null ? null : parts.hour < 12 ? "AM" : "PM";
6377
+ const selectedHourDisplay = parts.hour === null ? null : hourCycle === 24 ? parts.hour : parts.hour % 12 === 0 ? 12 : parts.hour % 12;
6378
+ const emit = (next) => {
6379
+ if (next.hour === null || next.minute === null) return;
6380
+ setCurrent(`${pad(next.hour)}:${pad(next.minute)}`);
6381
+ };
6382
+ const selectHour = (h) => {
6383
+ let hour24;
6384
+ if (hourCycle === 24) hour24 = h;
6385
+ else {
6386
+ const meridiem = selectedMeridiem ?? "AM";
6387
+ const base = h % 12;
6388
+ hour24 = meridiem === "PM" ? base + 12 : base;
6389
+ }
6390
+ emit({
6391
+ hour: hour24,
6392
+ minute: parts.minute ?? 0
6393
+ });
6394
+ };
6395
+ const selectMinute = (m) => {
6396
+ emit({
6397
+ hour: parts.hour ?? (hourCycle === 12 ? 0 : 0),
6398
+ minute: m
6399
+ });
6400
+ };
6401
+ const selectMeridiem = (mer) => {
6402
+ const base = (parts.hour ?? 0) % 12;
6403
+ emit({
6404
+ hour: mer === "PM" ? base + 12 : base,
6405
+ minute: parts.minute ?? 0
6406
+ });
6407
+ };
6408
+ const display = formatDisplay(parts, hourCycle);
6409
+ (0, react.useEffect)(() => {
6410
+ if (!isMounted) return;
6411
+ const frame = requestAnimationFrame(() => {
6412
+ panelRef.current?.querySelectorAll("[data-selected=\"true\"]").forEach((el) => el.scrollIntoView({ block: "center" }));
6413
+ });
6414
+ return () => cancelAnimationFrame(frame);
6415
+ }, [isMounted]);
6416
+ const onColumnKeyDown = (event) => {
6417
+ if (event.key !== Keys.ArrowDown && event.key !== Keys.ArrowUp) return;
6418
+ const buttons = Array.from(event.currentTarget.querySelectorAll("button:not(:disabled)"));
6419
+ const index = buttons.indexOf(document.activeElement);
6420
+ if (index === -1) return;
6421
+ event.preventDefault();
6422
+ buttons[event.key === Keys.ArrowDown ? Math.min(index + 1, buttons.length - 1) : Math.max(index - 1, 0)]?.focus();
6423
+ };
6424
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(FieldWrapper, {
6425
+ labelFor: fieldId,
6426
+ label,
6427
+ description,
6428
+ descriptionId,
6429
+ error,
6430
+ errorId,
6431
+ required,
6432
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6433
+ className: "pf-timepicker",
6434
+ ref: rootRef,
6435
+ children: [
6436
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
6437
+ ...props,
6438
+ id: fieldId,
6439
+ ref: triggerRefs,
6440
+ type: "button",
6441
+ className: cx("pf-timepicker__trigger", isOpen && "pf-timepicker__trigger--open", error && "pf-timepicker__trigger--invalid", className),
6442
+ disabled,
6443
+ "aria-haspopup": "dialog",
6444
+ "aria-expanded": isOpen,
6445
+ "aria-required": required || void 0,
6446
+ "aria-invalid": error ? true : void 0,
6447
+ "aria-describedby": describedBy,
6448
+ onClick: () => disclosure.toggle(),
6449
+ onKeyDown: (event) => {
6450
+ if (event.key === Keys.Escape) disclosure.close();
6451
+ },
6452
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6453
+ className: cx("pf-timepicker__value", !display && "pf-timepicker__value--placeholder"),
6454
+ children: display || placeholder
6455
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6456
+ "aria-hidden": true,
6457
+ className: "pf-timepicker__icon",
6458
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Icon, {
6459
+ name: "clock",
6460
+ "aria-hidden": true
6461
+ })
6462
+ })]
6463
+ }),
6464
+ name ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
6465
+ type: "hidden",
6466
+ name,
6467
+ value: current ?? ""
6468
+ }) : null,
6469
+ isMounted && typeof document !== "undefined" ? (0, react_dom.createPortal)(/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6470
+ id: panelId,
6471
+ ref: panelRef,
6472
+ role: "dialog",
6473
+ "aria-label": label ? `${label} picker` : "Time picker",
6474
+ className: cx("pf-timepicker__panel", isExiting && "pf-timepicker__panel--exiting"),
6475
+ style: panelStyle,
6476
+ children: [
6477
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
6478
+ className: "pf-timepicker__column",
6479
+ role: "listbox",
6480
+ "aria-label": "Hour",
6481
+ onKeyDown: onColumnKeyDown,
6482
+ children: hours.map((h) => {
6483
+ const isSel = selectedHourDisplay === h;
6484
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
6485
+ type: "button",
6486
+ role: "option",
6487
+ "aria-selected": isSel,
6488
+ "data-selected": isSel,
6489
+ className: cx("pf-timepicker__option", isSel && "pf-timepicker__option--selected"),
6490
+ onClick: () => selectHour(h),
6491
+ children: pad(h)
6492
+ }, h);
6493
+ })
6494
+ }),
6495
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
6496
+ className: "pf-timepicker__column",
6497
+ role: "listbox",
6498
+ "aria-label": "Minute",
6499
+ onKeyDown: onColumnKeyDown,
6500
+ children: minutes.map((m) => {
6501
+ const isSel = parts.minute === m;
6502
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
6503
+ type: "button",
6504
+ role: "option",
6505
+ "aria-selected": isSel,
6506
+ "data-selected": isSel,
6507
+ className: cx("pf-timepicker__option", isSel && "pf-timepicker__option--selected"),
6508
+ onClick: () => selectMinute(m),
6509
+ children: pad(m)
6510
+ }, m);
6511
+ })
6512
+ }),
6513
+ hourCycle === 12 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
6514
+ className: "pf-timepicker__column pf-timepicker__column--meridiem",
6515
+ role: "listbox",
6516
+ "aria-label": "AM or PM",
6517
+ onKeyDown: onColumnKeyDown,
6518
+ children: meridiems.map((mer) => {
6519
+ const isSel = selectedMeridiem === mer;
6520
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
6521
+ type: "button",
6522
+ role: "option",
6523
+ "aria-selected": isSel,
6524
+ "data-selected": isSel,
6525
+ className: cx("pf-timepicker__option", isSel && "pf-timepicker__option--selected"),
6526
+ onClick: () => selectMeridiem(mer),
6527
+ children: mer
6528
+ }, mer);
6529
+ })
6530
+ }) : null
6531
+ ]
6532
+ }), document.body) : null
6533
+ ]
6534
+ })
6535
+ });
6536
+ });
6537
+ TimePicker.displayName = "TimePicker";
6538
+ //#endregion
5847
6539
  //#region src/components/Toast/Toast.tsx
5848
6540
  var _emit = null;
5849
6541
  function ToastItem({ entry, onRemove }) {
@@ -5968,6 +6660,69 @@ toast.danger = (opts) => toast({
5968
6660
  variant: "danger"
5969
6661
  });
5970
6662
  //#endregion
6663
+ //#region src/components/Toolbar/Toolbar.tsx
6664
+ var ITEM_SELECTOR = "button:not(:disabled), a[href], input:not(:disabled), select:not(:disabled), textarea:not(:disabled), [data-toolbar-item]:not([aria-disabled=\"true\"])";
6665
+ var Toolbar = (0, react.forwardRef)(function Toolbar({ className, orientation = "horizontal", onKeyDown, onFocus, children, ...props }, ref) {
6666
+ const rootRef = (0, react.useRef)(null);
6667
+ const refs = useComposedRefs(rootRef, ref);
6668
+ const getItems = () => rootRef.current ? Array.from(rootRef.current.querySelectorAll(ITEM_SELECTOR)) : [];
6669
+ (0, react.useEffect)(() => {
6670
+ const items = getItems();
6671
+ if (items.length === 0) return;
6672
+ const current = items.find((el) => el.getAttribute("tabindex") === "0");
6673
+ items.forEach((el, i) => {
6674
+ el.tabIndex = (current ? el === current : i === 0) ? 0 : -1;
6675
+ });
6676
+ });
6677
+ const handleFocus = (event) => {
6678
+ const items = getItems();
6679
+ const target = event.target;
6680
+ if (items.includes(target)) items.forEach((el) => {
6681
+ el.tabIndex = el === target ? 0 : -1;
6682
+ });
6683
+ onFocus?.(event);
6684
+ };
6685
+ const handleKeyDown = (event) => {
6686
+ onKeyDown?.(event);
6687
+ if (event.defaultPrevented) return;
6688
+ const nextKey = orientation === "vertical" ? Keys.ArrowDown : Keys.ArrowRight;
6689
+ const prevKey = orientation === "vertical" ? Keys.ArrowUp : Keys.ArrowLeft;
6690
+ const items = getItems();
6691
+ if (items.length === 0) return;
6692
+ const currentIndex = items.indexOf(document.activeElement);
6693
+ if (currentIndex === -1) return;
6694
+ let nextIndex = -1;
6695
+ if (event.key === nextKey) nextIndex = (currentIndex + 1) % items.length;
6696
+ else if (event.key === prevKey) nextIndex = (currentIndex - 1 + items.length) % items.length;
6697
+ else if (event.key === Keys.Home) nextIndex = 0;
6698
+ else if (event.key === Keys.End) nextIndex = items.length - 1;
6699
+ if (nextIndex >= 0) {
6700
+ event.preventDefault();
6701
+ items[nextIndex].focus();
6702
+ }
6703
+ };
6704
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
6705
+ ref: refs,
6706
+ role: "toolbar",
6707
+ "aria-orientation": orientation,
6708
+ className: cx("pf-toolbar", `pf-toolbar--${orientation}`, className),
6709
+ onKeyDown: handleKeyDown,
6710
+ onFocus: handleFocus,
6711
+ ...props,
6712
+ children
6713
+ });
6714
+ });
6715
+ Toolbar.displayName = "Toolbar";
6716
+ var ToolbarSeparator = (0, react.forwardRef)(function ToolbarSeparator({ className, ...props }, ref) {
6717
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6718
+ ref,
6719
+ role: "separator",
6720
+ className: cx("pf-toolbar__separator", className),
6721
+ ...props
6722
+ });
6723
+ });
6724
+ ToolbarSeparator.displayName = "ToolbarSeparator";
6725
+ //#endregion
5971
6726
  //#region src/components/Tooltip/Tooltip.tsx
5972
6727
  var GAP = 10;
5973
6728
  var VIEWPORT_MARGIN = 8;
@@ -6387,6 +7142,21 @@ var VideoPlayer = (0, react.forwardRef)(({ id, label, description, error, aspect
6387
7142
  });
6388
7143
  VideoPlayer.displayName = "VideoPlayer";
6389
7144
  //#endregion
7145
+ //#region src/components/VisuallyHidden/VisuallyHidden.tsx
7146
+ /**
7147
+ * Hides content visually while keeping it available to screen readers and other
7148
+ * assistive technology. Use for labels, instructions, and status text that are
7149
+ * implied visually but need to be announced.
7150
+ */
7151
+ var VisuallyHidden = (0, react.forwardRef)(function VisuallyHidden({ as = "span", focusable = false, className, ...props }, ref) {
7152
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(as, {
7153
+ ref,
7154
+ className: cx("pf-visually-hidden", focusable && "pf-visually-hidden--focusable", className),
7155
+ ...props
7156
+ });
7157
+ });
7158
+ VisuallyHidden.displayName = "VisuallyHidden";
7159
+ //#endregion
6390
7160
  exports.Accordion = Accordion;
6391
7161
  exports.Alert = Alert;
6392
7162
  exports.AreaChart = AreaChart;
@@ -6406,9 +7176,11 @@ exports.CardHeader = CardHeader;
6406
7176
  exports.Carousel = Carousel;
6407
7177
  exports.Checkbox = Checkbox;
6408
7178
  exports.CodeSnippet = CodeSnippet;
7179
+ exports.Collapsible = Collapsible;
6409
7180
  exports.Combobox = Combobox;
6410
7181
  exports.CommandPalette = CommandPalette;
6411
7182
  exports.ContentDivider = ContentDivider;
7183
+ exports.ContextMenu = ContextMenu;
6412
7184
  exports.CreditCard = CreditCard;
6413
7185
  exports.DatePicker = DatePicker;
6414
7186
  exports.DateRangePicker = DateRangePicker;
@@ -6450,7 +7222,9 @@ exports.RadioButton = RadioButton;
6450
7222
  exports.RadioGroup = RadioGroup;
6451
7223
  exports.RatingBadge = RatingBadge;
6452
7224
  exports.RatingStars = RatingStars;
7225
+ exports.Resizable = Resizable;
6453
7226
  exports.RichTextEditor = RichTextEditor;
7227
+ exports.ScrollArea = ScrollArea;
6454
7228
  exports.SectionFooter = SectionFooter;
6455
7229
  exports.SectionHeader = SectionHeader;
6456
7230
  exports.Select = Select;
@@ -6462,12 +7236,18 @@ exports.Switch = Switch;
6462
7236
  exports.Table = Table;
6463
7237
  exports.Tabs = Tabs;
6464
7238
  exports.Tag = Tag;
7239
+ exports.TagInput = TagInput;
6465
7240
  exports.Textarea = Textarea;
7241
+ exports.TimePicker = TimePicker;
7242
+ exports.Timeline = Timeline;
6466
7243
  exports.ToastProvider = ToastProvider;
7244
+ exports.Toolbar = Toolbar;
7245
+ exports.ToolbarSeparator = ToolbarSeparator;
6467
7246
  exports.Tooltip = Tooltip;
6468
7247
  exports.TreeView = TreeView;
6469
7248
  exports.UtilityButton = UtilityButton;
6470
7249
  exports.VideoPlayer = VideoPlayer;
7250
+ exports.VisuallyHidden = VisuallyHidden;
6471
7251
  exports.composeDescribedBy = composeDescribedBy;
6472
7252
  exports.getAvailableIconNames = getAvailableIconNames;
6473
7253
  exports.getCustomIconNames = getCustomIconNames;