@deque/cauldron-react 7.0.0 → 7.1.0-canary.038917f6

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 (112) hide show
  1. package/lib/add-user.js +1 -1
  2. package/lib/arrow-circle.js +1 -1
  3. package/lib/arrow.js +1 -1
  4. package/lib/arrows-alt.js +1 -1
  5. package/lib/bolt.js +1 -1
  6. package/lib/broken-image.js +1 -1
  7. package/lib/caution.js +1 -1
  8. package/lib/check-circle.js +1 -1
  9. package/lib/check-shield.js +1 -1
  10. package/lib/check-solid.js +1 -1
  11. package/lib/check.js +1 -1
  12. package/lib/checkbox-checked.js +1 -1
  13. package/lib/checkbox-unchecked.js +1 -1
  14. package/lib/chevron-double.js +1 -1
  15. package/lib/chevron.js +1 -1
  16. package/lib/clipboard.js +1 -1
  17. package/lib/clock.js +1 -1
  18. package/lib/close.js +1 -1
  19. package/lib/code.js +1 -1
  20. package/lib/components/Accordion/Accordion.d.ts +1 -1
  21. package/lib/components/ActionList/ActionList.d.ts +1 -1
  22. package/lib/components/ActionMenu/ActionMenu.d.ts +14 -8
  23. package/lib/components/AnchoredOverlay/index.d.ts +2 -2
  24. package/lib/components/Checkbox/index.d.ts +2 -0
  25. package/lib/components/ClickOutsideListener/index.d.ts +1 -1
  26. package/lib/components/Combobox/Combobox.d.ts +1 -1
  27. package/lib/components/Dialog/DialogContext.d.ts +1 -1
  28. package/lib/components/Dialog/index.d.ts +1 -1
  29. package/lib/components/Drawer/index.d.ts +1 -1
  30. package/lib/components/ExpandCollapsePanel/ExpandCollapsePanel.d.ts +1 -1
  31. package/lib/components/Listbox/Listbox.d.ts +7 -2
  32. package/lib/components/MenuBar/index.d.ts +1 -0
  33. package/lib/components/MenuItem/index.d.ts +1 -6
  34. package/lib/components/Popover/index.d.ts +2 -2
  35. package/lib/components/Table/TableContext.d.ts +1 -1
  36. package/lib/components/Tabs/Tab.d.ts +1 -1
  37. package/lib/components/Toast/index.d.ts +7 -27
  38. package/lib/components/Tooltip/index.d.ts +2 -2
  39. package/lib/components/TreeView/TreeViewItem.d.ts +7 -0
  40. package/lib/components/TreeView/helpers.d.ts +33 -0
  41. package/lib/components/TreeView/index.d.ts +19 -0
  42. package/lib/components/TreeView/types.d.ts +8 -0
  43. package/lib/copy.js +1 -1
  44. package/lib/download.js +1 -1
  45. package/lib/dropper.js +1 -1
  46. package/lib/exchange.js +1 -1
  47. package/lib/export-solid.js +1 -1
  48. package/lib/external-link.js +1 -1
  49. package/lib/eye.js +1 -1
  50. package/lib/filter.js +1 -1
  51. package/lib/flag.js +1 -1
  52. package/lib/gears.js +1 -1
  53. package/lib/github.js +1 -1
  54. package/lib/grid.js +1 -1
  55. package/lib/hamburger-menu.js +1 -1
  56. package/lib/hashtag.js +1 -1
  57. package/lib/highlight.js +1 -1
  58. package/lib/images.js +1 -1
  59. package/lib/index.d.ts +1 -0
  60. package/lib/index.js +413 -227
  61. package/lib/info-circle-alt.js +1 -1
  62. package/lib/info-circle.js +1 -1
  63. package/lib/info-square.js +1 -1
  64. package/lib/kabob.js +1 -1
  65. package/lib/link.js +1 -1
  66. package/lib/linkedin.js +1 -1
  67. package/lib/list.js +1 -1
  68. package/lib/lock.js +1 -1
  69. package/lib/magnifying-glass.js +1 -1
  70. package/lib/menu.js +1 -1
  71. package/lib/minus.js +1 -1
  72. package/lib/new-releases.js +1 -1
  73. package/lib/new.js +1 -1
  74. package/lib/no.js +1 -1
  75. package/lib/pause.js +1 -1
  76. package/lib/pencil.js +1 -1
  77. package/lib/person-running.js +1 -1
  78. package/lib/play.js +1 -1
  79. package/lib/plus.js +1 -1
  80. package/lib/question-circle-alt.js +1 -1
  81. package/lib/question-circle.js +1 -1
  82. package/lib/radio-checked.js +1 -1
  83. package/lib/radio-unchecked.js +1 -1
  84. package/lib/recycle-square.js +1 -1
  85. package/lib/recycle.js +1 -1
  86. package/lib/resend.js +1 -1
  87. package/lib/robot.js +1 -1
  88. package/lib/run-again.js +1 -1
  89. package/lib/save.js +1 -1
  90. package/lib/share-nodes.js +1 -1
  91. package/lib/share.js +1 -1
  92. package/lib/sort-triangle.js +1 -1
  93. package/lib/sort.js +1 -1
  94. package/lib/star.js +1 -1
  95. package/lib/step-back.js +1 -1
  96. package/lib/step-forward.js +1 -1
  97. package/lib/sun.js +1 -1
  98. package/lib/table-sort-ascending.js +1 -1
  99. package/lib/table-sort-descending.js +1 -1
  100. package/lib/tag.js +1 -1
  101. package/lib/target.js +1 -1
  102. package/lib/trash.js +1 -1
  103. package/lib/triangle.js +1 -1
  104. package/lib/twitter.js +1 -1
  105. package/lib/types.d.ts +1 -1
  106. package/lib/upload.js +1 -1
  107. package/lib/utils/getChildRef.d.ts +2 -0
  108. package/lib/utils/polymorphicComponent.d.ts +1 -1
  109. package/lib/utils/useFocusTrap.d.ts +1 -1
  110. package/lib/utils/useMnemonics.d.ts +2 -2
  111. package/lib/utils/useSharedRef.d.ts +3 -3
  112. package/package.json +36 -29
package/lib/index.js CHANGED
@@ -16,6 +16,7 @@ var js = require('react-syntax-highlighter/dist/cjs/languages/hljs/javascript');
16
16
  var css = require('react-syntax-highlighter/dist/cjs/languages/hljs/css');
17
17
  var xml = require('react-syntax-highlighter/dist/cjs/languages/hljs/xml');
18
18
  var yaml = require('react-syntax-highlighter/dist/cjs/languages/hljs/yaml');
19
+ var reactAriaComponents = require('react-aria-components');
19
20
 
20
21
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
21
22
 
@@ -494,24 +495,25 @@ var Accordion = function (_a) {
494
495
  var childrenArray = React__default["default"].Children.toArray(children);
495
496
  var trigger = childrenArray.find(function (child) {
496
497
  return typeof child === 'string' ||
497
- child.type === AccordionTrigger;
498
+ (React__default["default"].isValidElement(child) && child.type === AccordionTrigger);
498
499
  });
499
500
  var panelElement = childrenArray.find(function (child) {
500
501
  return typeof child === 'string' ||
501
- child.type === AccordionContent;
502
+ (React__default["default"].isValidElement(child) && child.type === AccordionContent);
502
503
  });
503
- var isValid = !!(React__default["default"].isValidElement(trigger) && React__default["default"].isValidElement(panelElement));
504
- if (!isValid) {
504
+ if (!React__default["default"].isValidElement(trigger) ||
505
+ !React__default["default"].isValidElement(panelElement)) {
505
506
  console.warn('Must provide <AccordionTrigger /> and <AccordionContent /> element(s). You provided:', {
506
507
  trigger: trigger,
507
508
  panelElement: panelElement,
508
- isValid: isValid
509
+ isValid: false
509
510
  });
510
511
  return null;
511
512
  }
513
+ var panelProps = panelElement.props;
512
514
  return (React__default["default"].createElement("div", tslib.__assign({ className: "Accordion" }, props),
513
- React__default["default"].createElement(ExpandCollapsePanel, tslib.__assign({ id: panelElement.props.id || "".concat(elementId, "-panel"), open: open, onToggle: onToggle, animationTiming: animationTiming }, panelElement.props),
514
- React__default["default"].createElement(PanelTrigger$1, tslib.__assign({ iconCollapsed: "triangle-right", iconExpanded: "triangle-down", className: classNames__default["default"]('Accordion__trigger', trigger.props.className), "aria-controls": panelElement.props.id || "".concat(elementId, "-panel"), heading: trigger.props.heading }, trigger.props), trigger),
515
+ React__default["default"].createElement(ExpandCollapsePanel, tslib.__assign({ id: panelProps.id || "".concat(elementId, "-panel"), open: open, onToggle: onToggle, animationTiming: animationTiming }, panelProps),
516
+ React__default["default"].createElement(PanelTrigger$1, tslib.__assign({ iconCollapsed: "triangle-right", iconExpanded: "triangle-down", className: classNames__default["default"]('Accordion__trigger', trigger.props.className), "aria-controls": panelProps.id || "".concat(elementId, "-panel"), heading: trigger.props.heading }, trigger.props), trigger),
515
517
  panelElement)));
516
518
  };
517
519
  Accordion.displayName = 'Accordion';
@@ -577,7 +579,9 @@ var Scrim = /** @class */ (function (_super) {
577
579
  if (destroy) {
578
580
  return null;
579
581
  }
580
- return (React__default["default"].createElement("div", { ref: function (el) { return (_this.el = el); }, className: "Scrim ".concat(animationClass) }));
582
+ return (React__default["default"].createElement("div", { ref: function (el) {
583
+ _this.el = el;
584
+ }, className: "Scrim ".concat(animationClass) }));
581
585
  };
582
586
  return Scrim;
583
587
  }(React__default["default"].Component));
@@ -619,16 +623,16 @@ var MenuItem = /** @class */ (function (_super) {
619
623
  if (autoClickLink) {
620
624
  clickLink(e.target, this.item);
621
625
  }
622
- onClick(e);
626
+ onClick === null || onClick === void 0 ? void 0 : onClick(e);
623
627
  };
624
628
  MenuItem.prototype.onKeyDown = function (e) {
625
- var _a;
629
+ var _a, _b, _c;
626
630
  var key = keyname__default["default"](e.which);
627
631
  if (key === 'enter' || key === 'space') {
628
632
  e.preventDefault();
629
633
  (_a = this.item) === null || _a === void 0 ? void 0 : _a.click();
630
634
  }
631
- this.props.onKeyDown(e);
635
+ (_c = (_b = this.props).onKeyDown) === null || _c === void 0 ? void 0 : _c.call(_b, e);
632
636
  };
633
637
  MenuItem.prototype.render = function () {
634
638
  var _this = this;
@@ -641,12 +645,6 @@ var MenuItem = /** @class */ (function (_super) {
641
645
  };
642
646
  MenuItem.displayName = 'MenuItem';
643
647
  MenuItem.defaultProps = {
644
- // eslint-disable-next-line @typescript-eslint/no-empty-function
645
- menuItemRef: function () { },
646
- // eslint-disable-next-line @typescript-eslint/no-empty-function
647
- onClick: function () { },
648
- // eslint-disable-next-line @typescript-eslint/no-empty-function
649
- onKeyDown: function () { },
650
648
  autoClickLink: true
651
649
  };
652
650
  return MenuItem;
@@ -671,6 +669,7 @@ var TopBar$1 = /** @class */ (function (_super) {
671
669
  tslib.__extends(TopBar, _super);
672
670
  function TopBar(props) {
673
671
  var _this = _super.call(this, props) || this;
672
+ _this.menuBarRef = React__default["default"].createRef();
674
673
  _this.onResize = function () {
675
674
  var wide = isWide();
676
675
  if (wide === _this.state.wide) {
@@ -719,10 +718,10 @@ var TopBar$1 = /** @class */ (function (_super) {
719
718
  };
720
719
  TopBar.prototype.onKeyDown = function (e) {
721
720
  var key = keyname__default["default"](e.which);
722
- // This is a temporary workaround until have an opportunity to refactor or replace menubar
723
- // see: https://github.com/dequelabs/cauldron/issues/1934
724
- // eslint-disable-next-line react/no-find-dom-node
725
- var menuBarElement = reactDom.findDOMNode(this);
721
+ var menuBarElement = this.menuBarRef.current;
722
+ if (!menuBarElement) {
723
+ return;
724
+ }
726
725
  var menuItems = Array.from(menuBarElement.children);
727
726
  // account for hidden side bar trigger (hamburger)
728
727
  if (this.state.wide && this.props.hasTrigger) {
@@ -749,7 +748,7 @@ var TopBar$1 = /** @class */ (function (_super) {
749
748
  // disabling no-unused-vars to prevent thin/hasTrigger from being passed through to div
750
749
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
751
750
  var _a = this.props, children = _a.children, className = _a.className; _a.thin; _a.hasTrigger; tslib.__rest(_a, ["children", "className", "thin", "hasTrigger"]);
752
- return (React__default["default"].createElement("ul", { role: "menubar", onKeyDown: this.onKeyDown, className: className }, React.Children.map(children, this.renderChild)));
751
+ return (React__default["default"].createElement("ul", { role: "menubar", onKeyDown: this.onKeyDown, className: className, ref: this.menuBarRef }, React.Children.map(children, this.renderChild)));
753
752
  };
754
753
  TopBar.defaultProps = {
755
754
  thin: false,
@@ -805,9 +804,16 @@ function resolveElement(elementOrRef) {
805
804
  return null;
806
805
  }
807
806
 
807
+ function getChildRef(child, version) {
808
+ if (version === void 0) { version = React__default["default"].version; }
809
+ return parseInt(version, 10) >= 19
810
+ ? child.props.ref
811
+ : child.ref;
812
+ }
813
+
808
814
  function ClickOutsideListener(_a, ref) {
809
815
  var children = _a.children, _b = _a.mouseEvent, mouseEvent = _b === void 0 ? 'click' : _b, _c = _a.touchEvent, touchEvent = _c === void 0 ? 'touchend' : _c, target = _a.target, _d = _a.onClickOutside, onClickOutside = _d === void 0 ? function () { return null; } : _d;
810
- var childElementRef = React.useRef();
816
+ var childElementRef = React.useRef(null);
811
817
  var handleEvent = function (event) {
812
818
  if (event.defaultPrevented) {
813
819
  return;
@@ -830,9 +836,8 @@ function ClickOutsideListener(_a, ref) {
830
836
  childElementRef.current = node;
831
837
  // Ref for this component should pass-through to the child node
832
838
  setRef(ref, node);
833
- // If child has its own ref, we want to update
834
- // its ref with the newly cloned node
835
- var childRef = children.ref;
839
+ // Forward the child's own ref. In React 19 ref lives in props; in 16–18 it's element.ref.
840
+ var childRef = getChildRef(children);
836
841
  setRef(childRef, node);
837
842
  };
838
843
  React.useEffect(function () {
@@ -1341,7 +1346,7 @@ var AriaIsolate = /** @class */ (function () {
1341
1346
 
1342
1347
  /**
1343
1348
  * When a component needs to track an internal ref on a component that has a
1344
- * forwarded ref, useSharedRef will return a MutableRefObject<T> that will
1349
+ * forwarded ref, useSharedRef will return a RefObject<T | null> that will
1345
1350
  * correctly invoke the parent ref as well providing an internal ref.
1346
1351
  *
1347
1352
  * @example
@@ -1354,9 +1359,10 @@ var AriaIsolate = /** @class */ (function () {
1354
1359
  * })
1355
1360
  */
1356
1361
  function useSharedRef(ref) {
1357
- var internalRef = React.useRef();
1362
+ var internalRef = React.useRef(null);
1358
1363
  React.useEffect(function () {
1359
1364
  setRef(ref, internalRef.current);
1365
+ return function () { return setRef(ref, null); };
1360
1366
  }, [ref]);
1361
1367
  return internalRef;
1362
1368
  }
@@ -1486,7 +1492,7 @@ function useFocusTrap(target, options) {
1486
1492
  if (options === void 0) { options = {}; }
1487
1493
  var _a = options.disabled, disabled = _a === void 0 ? false : _a, _b = options.returnFocus, returnFocus = _b === void 0 ? true : _b, initialFocusElementOrRef = options.initialFocusElement, returnFocusElement = options.returnFocusElement;
1488
1494
  var focusTrap = React.useRef(null);
1489
- var returnFocusElementRef = React.useRef();
1495
+ var returnFocusElementRef = React.useRef(null);
1490
1496
  function restoreFocusToReturnFocusElement() {
1491
1497
  var _a;
1492
1498
  var resolvedReturnFocusElement = resolveElement(returnFocusElement);
@@ -1536,7 +1542,7 @@ var Dialog = React.forwardRef(function (_a, ref) {
1536
1542
  var dialogRef = useSharedRef(dialogRefProp || ref);
1537
1543
  var _g = tslib.__read(nextId.useId(1, 'dialog-title-'), 1), headingId = _g[0];
1538
1544
  var headingRef = React.useRef(null);
1539
- var isolatorRef = React.useRef();
1545
+ var isolatorRef = React.useRef(null);
1540
1546
  var headingLevel = typeof heading === 'object' && 'level' in heading && heading.level
1541
1547
  ? heading.level
1542
1548
  : 2;
@@ -2033,10 +2039,17 @@ function Tooltip(_a) {
2033
2039
  fireCustomEvent(false, targetElement);
2034
2040
  }, TIP_HIDE_DELAY);
2035
2041
  }
2042
+ }, [target]);
2043
+ // Cancel any pending hide timeout when the Tooltip unmounts so it
2044
+ // does not fire setShowTooltip on an unmounted component.
2045
+ React.useEffect(function () {
2036
2046
  return function () {
2037
- clearTimeout(hideTimeoutRef.current);
2047
+ if (hideTimeoutRef.current) {
2048
+ clearTimeout(hideTimeoutRef.current);
2049
+ hideTimeoutRef.current = null;
2050
+ }
2038
2051
  };
2039
- }, [target]);
2052
+ }, []);
2040
2053
  React.useEffect(function () {
2041
2054
  if (typeof showProp === 'boolean') {
2042
2055
  setShowTooltip(showProp);
@@ -2124,7 +2137,7 @@ var looksLikeLink = function (props) {
2124
2137
  };
2125
2138
  var IconButton = React.forwardRef(function (_a, ref) {
2126
2139
  var _b = _a.as, Component = _b === void 0 ? 'button' : _b, icon = _a.icon, label = _a.label, _c = _a.tooltipProps, tooltipPropsProp = _c === void 0 ? {} : _c, className = _a.className, _d = _a.variant, variant = _d === void 0 ? 'secondary' : _d, disabled = _a.disabled, _e = _a.tabIndex, tabIndex = _e === void 0 ? 0 : _e, large = _a.large, other = tslib.__rest(_a, ["as", "icon", "label", "tooltipProps", "className", "variant", "disabled", "tabIndex", "large"]);
2127
- var internalRef = React.useRef();
2140
+ var internalRef = React.useRef(null);
2128
2141
  React.useImperativeHandle(ref, function () { return internalRef.current; });
2129
2142
  // Configure additional properties based on the type of the Component
2130
2143
  // for accessibility
@@ -2199,7 +2212,7 @@ var typeMap = {
2199
2212
  };
2200
2213
  var tabIndexHandler = function (reset, toast) {
2201
2214
  if (reset) {
2202
- // restore tab indicies that we clobbered
2215
+ // restore tab indices that we clobbered
2203
2216
  return queryAll('[data-cached-tabindex]').forEach(function (el) {
2204
2217
  el.tabIndex = Number(el.getAttribute('data-cached-tabindex'));
2205
2218
  });
@@ -2213,126 +2226,118 @@ var tabIndexHandler = function (reset, toast) {
2213
2226
  };
2214
2227
 
2215
2228
  /**
2216
- * The cauldron toast notification component
2229
+ * Hook to be used similarly to the React.Component#componentDidMount.
2230
+ * Executes the provided `effect` when `dependencies` change but does not
2231
+ * execute the effect initially (on mount) - only on update.
2232
+ *
2233
+ * @param effect {Function} function to be executed when dependencies update
2234
+ * @param dependencies {Any} any valid dependency argument to React.useEffect
2217
2235
  */
2218
- var Toast = /** @class */ (function (_super) {
2219
- tslib.__extends(Toast, _super);
2220
- function Toast(props) {
2221
- var _this = _super.call(this, props) || this;
2222
- _this.state = {
2223
- animationClass: props.show ? 'FadeIn--flex' : 'is--hidden'
2224
- };
2225
- _this.dismissToast = _this.dismissToast.bind(_this);
2226
- _this.showToast = _this.showToast.bind(_this);
2227
- return _this;
2228
- }
2229
- Toast.prototype.componentDidMount = function () {
2230
- var show = this.props.show;
2231
- if (show) {
2232
- // Timeout because CSS display: none/block and opacity:
2233
- // 0/1 properties cannot be toggled in the same tick
2234
- // see: https://codepen.io/isnerms/pen/eyQaLP
2235
- setTimeout(this.showToast);
2236
+ var useDidUpdate = function (effect, dependencies) {
2237
+ var mounted = React__default["default"].useRef(false);
2238
+ React__default["default"].useEffect(function () {
2239
+ if (!mounted.current) {
2240
+ mounted.current = true;
2241
+ return;
2236
2242
  }
2243
+ effect();
2244
+ }, dependencies);
2245
+ };
2246
+
2247
+ /**
2248
+ * The cauldron toast notification component
2249
+ */
2250
+ var Toast = React.forwardRef(function (_a, ref) {
2251
+ var type = _a.type, children = _a.children, _b = _a.onDismiss, onDismiss = _b === void 0 ? function () {
2252
+ // noop
2253
+ } : _b, _c = _a.dismissText, dismissText = _c === void 0 ? 'Dismiss' : _c, toastRef = _a.toastRef, _d = _a.focus, focus = _d === void 0 ? true : _d, _e = _a.show, show = _e === void 0 ? false : _e, _f = _a.dismissible, dismissible = _f === void 0 ? true : _f, className = _a.className, otherProps = tslib.__rest(_a, ["type", "children", "onDismiss", "dismissText", "toastRef", "focus", "show", "dismissible", "className"]);
2254
+ var elRef = useSharedRef(ref);
2255
+ var isolatorRef = React.useRef(null);
2256
+ var timeoutsRef = React.useRef(new Set());
2257
+ var _g = tslib.__read(React.useState(show ? 'FadeIn--flex' : 'is--hidden'), 2), animationClass = _g[0], setAnimationClass = _g[1];
2258
+ // Backwards-compat: propagate to the deprecated toastRef prop as well
2259
+ React.useEffect(function () {
2260
+ var _a;
2261
+ if (!toastRef)
2262
+ return;
2263
+ setRef(toastRef, (_a = elRef.current) !== null && _a !== void 0 ? _a : null);
2264
+ return function () { return setRef(toastRef, null); };
2265
+ }, [toastRef]);
2266
+ // Timeout because CSS display: none/block and opacity:
2267
+ // 0/1 properties cannot be toggled in the same tick
2268
+ // see: https://codepen.io/isnerms/pen/eyQaLP
2269
+ var scheduleNextTick = function (fn) {
2270
+ var id = setTimeout(function () {
2271
+ timeoutsRef.current.delete(id);
2272
+ fn();
2273
+ });
2274
+ timeoutsRef.current.add(id);
2237
2275
  };
2238
- Toast.prototype.componentDidUpdate = function (prevProps) {
2239
- var _this = this;
2240
- var show = this.props.show;
2241
- if (prevProps.show !== show) {
2242
- if (show) {
2243
- this.setState({ animationClass: 'FadeIn--flex' }, function () {
2244
- setTimeout(_this.showToast);
2245
- });
2246
- }
2247
- else {
2248
- this.dismissToast();
2249
- }
2276
+ var showToast = React.useCallback(function () {
2277
+ setAnimationClass('FadeIn--flex FadeIn');
2278
+ if (type === 'action-needed' && elRef.current) {
2279
+ var isolator = new AriaIsolate(elRef.current);
2280
+ tabIndexHandler(false, elRef.current);
2281
+ isolatorRef.current = isolator;
2282
+ isolator.activate();
2250
2283
  }
2251
- };
2252
- Toast.prototype.componentWillUnmount = function () {
2253
- var isolator = this.state.isolator;
2254
- isolator === null || isolator === void 0 ? void 0 : isolator.deactivate();
2255
- };
2256
- Toast.prototype.render = function () {
2257
- var _this = this;
2258
- var animationClass = this.state.animationClass;
2259
- var _a = this.props, type = _a.type, children = _a.children;
2260
- // prevent `onDismiss` from being passed-through to DOM
2261
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
2262
- _a.onDismiss; var dismissText = _a.dismissText, toastRef = _a.toastRef, focus = _a.focus, show = _a.show, dismissible = _a.dismissible, className = _a.className, otherProps = tslib.__rest(_a, ["type", "children", "onDismiss", "dismissText", "toastRef", "focus", "show", "dismissible", "className"]);
2263
- var scrim = type === 'action-needed' && show ? (React__default["default"].createElement("div", { className: "Scrim--light Scrim--show Scrim--fade-in" })) : null;
2264
- var defaultProps = {
2265
- tabIndex: -1,
2266
- className: classNames__default["default"]('Toast', "Toast--".concat(typeMap[type].className), animationClass, { 'Toast--non-dismissible': !dismissible }, className)
2267
- };
2268
- if (!focus) {
2269
- defaultProps.role = 'alert';
2284
+ if (elRef.current && !!focus) {
2285
+ elRef.current.focus();
2270
2286
  }
2271
- return (React__default["default"].createElement(React__default["default"].Fragment, null,
2272
- React__default["default"].createElement("div", tslib.__assign({ ref: function (el) {
2273
- _this.el = el;
2274
- setRef(toastRef, el);
2275
- } }, defaultProps, otherProps),
2276
- React__default["default"].createElement("div", { className: "Toast__message" },
2277
- React__default["default"].createElement(Icon, { type: typeMap[type].icon }),
2278
- React__default["default"].createElement("div", { className: "Toast__message-content" }, children)),
2279
- type !== 'action-needed' && dismissible && (React__default["default"].createElement("button", { type: "button", className: 'Toast__dismiss', "aria-label": dismissText, onClick: this.dismissToast },
2280
- React__default["default"].createElement(Icon, { type: "close" })))),
2281
- scrim));
2282
- };
2283
- Toast.prototype.dismissToast = function () {
2284
- var _this = this;
2285
- if (!this.el) {
2287
+ }, [type, focus]);
2288
+ var dismissToast = React.useCallback(function () {
2289
+ if (!elRef.current) {
2286
2290
  return;
2287
2291
  }
2288
- var _a = this.props, onDismiss = _a.onDismiss, type = _a.type;
2289
- var isolator = this.state.isolator;
2290
- this.setState({
2291
- animationClass: 'FadeIn--flex'
2292
- }, function () {
2293
- // Timeout because CSS display: none/block and opacity:
2294
- // 0/1 properties cannot be toggled in the same tick
2295
- // see: https://codepen.io/isnerms/pen/eyQaLP
2296
- setTimeout(function () {
2297
- if (type === 'action-needed') {
2298
- tabIndexHandler(true, _this.el);
2299
- isolator === null || isolator === void 0 ? void 0 : isolator.deactivate();
2300
- }
2301
- _this.setState({ animationClass: 'is--hidden' }, onDismiss);
2302
- });
2303
- });
2304
- };
2305
- Toast.prototype.showToast = function () {
2306
- var _this = this;
2307
- var _a = this.props, type = _a.type, focus = _a.focus;
2308
- this.setState({
2309
- animationClass: 'FadeIn--flex FadeIn'
2310
- }, function () {
2292
+ setAnimationClass('FadeIn--flex');
2293
+ scheduleNextTick(function () {
2294
+ var _a;
2311
2295
  if (type === 'action-needed') {
2312
- var isolator = new AriaIsolate(_this.el);
2313
- tabIndexHandler(false, _this.el);
2314
- _this.setState({ isolator: isolator });
2315
- isolator.activate();
2316
- }
2317
- if (_this.el && !!focus) {
2318
- // focus the toast
2319
- _this.el.focus();
2296
+ tabIndexHandler(true, elRef.current);
2297
+ (_a = isolatorRef.current) === null || _a === void 0 ? void 0 : _a.deactivate();
2320
2298
  }
2299
+ setAnimationClass('is--hidden');
2300
+ onDismiss();
2321
2301
  });
2302
+ }, [type, onDismiss]);
2303
+ React.useEffect(function () {
2304
+ if (show) {
2305
+ scheduleNextTick(showToast);
2306
+ }
2307
+ return function () {
2308
+ var _a;
2309
+ timeoutsRef.current.forEach(clearTimeout);
2310
+ timeoutsRef.current.clear();
2311
+ (_a = isolatorRef.current) === null || _a === void 0 ? void 0 : _a.deactivate();
2312
+ };
2313
+ }, []);
2314
+ useDidUpdate(function () {
2315
+ if (show) {
2316
+ setAnimationClass('FadeIn--flex');
2317
+ scheduleNextTick(showToast);
2318
+ }
2319
+ else {
2320
+ dismissToast();
2321
+ }
2322
+ }, [show]);
2323
+ var scrim = type === 'action-needed' && show ? (React__default["default"].createElement("div", { className: "Scrim--light Scrim--show Scrim--fade-in" })) : null;
2324
+ var defaultProps = {
2325
+ tabIndex: -1,
2326
+ className: classNames__default["default"]('Toast', "Toast--".concat(typeMap[type].className), animationClass, { 'Toast--non-dismissible': !dismissible }, className)
2322
2327
  };
2323
- Toast.defaultProps = {
2324
- dismissText: 'Dismiss',
2325
- // eslint-disable-next-line @typescript-eslint/no-empty-function
2326
- onDismiss: function () { },
2327
- // eslint-disable-next-line @typescript-eslint/no-empty-function
2328
- toastRef: function () { },
2329
- focus: true,
2330
- show: false,
2331
- dismissible: true
2332
- };
2333
- Toast.displayName = 'Toast';
2334
- return Toast;
2335
- }(React__default["default"].Component));
2328
+ if (!focus) {
2329
+ defaultProps.role = 'alert';
2330
+ }
2331
+ return (React__default["default"].createElement(React__default["default"].Fragment, null,
2332
+ React__default["default"].createElement("div", tslib.__assign({ ref: elRef }, defaultProps, otherProps),
2333
+ React__default["default"].createElement("div", { className: "Toast__message" },
2334
+ React__default["default"].createElement(Icon, { type: typeMap[type].icon }),
2335
+ React__default["default"].createElement("div", { className: "Toast__message-content" }, children)),
2336
+ type !== 'action-needed' && dismissible && (React__default["default"].createElement("button", { type: "button", className: "Toast__dismiss", "aria-label": dismissText, onClick: dismissToast },
2337
+ React__default["default"].createElement(Icon, { type: "close" })))),
2338
+ scrim));
2339
+ });
2340
+ Toast.displayName = 'Toast';
2336
2341
 
2337
2342
  var Link = React.forwardRef(function (_a, ref) {
2338
2343
  var children = _a.children, linkRef = _a.linkRef, className = _a.className, variant = _a.variant, thin = _a.thin, other = tslib.__rest(_a, ["children", "linkRef", "className", "variant", "thin"]);
@@ -2599,10 +2604,10 @@ var RadioCardGroup = function (_a) {
2599
2604
  RadioCardGroup.displayName = 'RadioCardGroup';
2600
2605
 
2601
2606
  var Checkbox = React.forwardRef(function (_a, ref) {
2602
- var id = _a.id, label = _a.label, labelDescription = _a.labelDescription, error = _a.error, checkboxRef = _a.checkboxRef, className = _a.className, onChange = _a.onChange, onFocus = _a.onFocus, onBlur = _a.onBlur, ariaDescribedby = _a["aria-describedby"], _b = _a.disabled, disabled = _b === void 0 ? false : _b, _c = _a.checked, checked = _c === void 0 ? false : _c, _d = _a.indeterminate, indeterminate = _d === void 0 ? false : _d; _a.children; var other = tslib.__rest(_a, ["id", "label", "labelDescription", "error", "checkboxRef", "className", "onChange", "onFocus", "onBlur", 'aria-describedby', "disabled", "checked", "indeterminate", "children"]);
2603
- var _e = tslib.__read(React.useState(checked), 2), isChecked = _e[0], setIsChecked = _e[1];
2604
- var _f = tslib.__read(React.useState(indeterminate), 2), isIndeterminate = _f[0], setIsIndeterminate = _f[1];
2605
- var _g = tslib.__read(React.useState(false), 2), focused = _g[0], setFocused = _g[1];
2607
+ var id = _a.id, label = _a.label, labelDescription = _a.labelDescription, error = _a.error, checkboxRef = _a.checkboxRef, className = _a.className, onChange = _a.onChange, _b = _a.controlled, controlled = _b === void 0 ? false : _b, onFocus = _a.onFocus, onBlur = _a.onBlur, ariaDescribedby = _a["aria-describedby"], _c = _a.disabled, disabled = _c === void 0 ? false : _c, _d = _a.checked, checked = _d === void 0 ? false : _d, _e = _a.indeterminate, indeterminate = _e === void 0 ? false : _e; _a.children; var other = tslib.__rest(_a, ["id", "label", "labelDescription", "error", "checkboxRef", "className", "onChange", "controlled", "onFocus", "onBlur", 'aria-describedby', "disabled", "checked", "indeterminate", "children"]);
2608
+ var _f = tslib.__read(React.useState(checked), 2), isChecked = _f[0], setIsChecked = _f[1];
2609
+ var _g = tslib.__read(React.useState(indeterminate), 2), isIndeterminate = _g[0], setIsIndeterminate = _g[1];
2610
+ var _h = tslib.__read(React.useState(false), 2), focused = _h[0], setFocused = _h[1];
2606
2611
  var checkRef = React.useRef(null);
2607
2612
  React.useEffect(function () {
2608
2613
  setIsChecked(checked);
@@ -2614,12 +2619,12 @@ var Checkbox = React.forwardRef(function (_a, ref) {
2614
2619
  if (typeof refProp === 'function') {
2615
2620
  refProp(checkRef.current);
2616
2621
  }
2617
- var _h = React.useMemo(function () {
2622
+ var _j = React.useMemo(function () {
2618
2623
  return {
2619
2624
  labelDescriptionId: nextId__default["default"](),
2620
2625
  errorId: nextId__default["default"]()
2621
2626
  };
2622
- }, []), errorId = _h.errorId, labelDescriptionId = _h.labelDescriptionId;
2627
+ }, []), errorId = _j.errorId, labelDescriptionId = _j.labelDescriptionId;
2623
2628
  var ariaDescribedbyId = ariaDescribedby;
2624
2629
  if (error) {
2625
2630
  ariaDescribedbyId = addIdRef(ariaDescribedbyId, errorId);
@@ -2658,7 +2663,9 @@ var Checkbox = React.forwardRef(function (_a, ref) {
2658
2663
  if (isIndeterminate) {
2659
2664
  setIsIndeterminate(false);
2660
2665
  }
2661
- setIsChecked(e.target.checked);
2666
+ if (!controlled) {
2667
+ setIsChecked(e.target.checked);
2668
+ }
2662
2669
  if (onChange) {
2663
2670
  onChange(e);
2664
2671
  }
@@ -2692,7 +2699,7 @@ Checkbox.displayName = 'Checkbox';
2692
2699
  */
2693
2700
  function TooltipTabstop(_a) {
2694
2701
  var children = _a.children, className = _a.className, tooltip = _a.tooltip, variant = _a.variant, association = _a.association, show = _a.show, placement = _a.placement, portal = _a.portal, hideElementOnHidden = _a.hideElementOnHidden, buttonProps = tslib.__rest(_a, ["children", "className", "tooltip", "variant", "association", "show", "placement", "portal", "hideElementOnHidden"]);
2695
- var buttonRef = React.useRef();
2702
+ var buttonRef = React.useRef(null);
2696
2703
  return (React__default["default"].createElement(React__default["default"].Fragment, null,
2697
2704
  React__default["default"].createElement("button", tslib.__assign({ type: "button", ref: buttonRef, "aria-disabled": "true", className: classNames__default["default"]('TooltipTabstop', className) }, buttonProps), children),
2698
2705
  React__default["default"].createElement(Tooltip, { target: buttonRef, variant: variant, association: association, show: show, placement: placement, portal: portal, hideElementOnHidden: hideElementOnHidden }, tooltip)));
@@ -3231,25 +3238,6 @@ var Tab = React__default["default"].forwardRef(function (_a, ref) {
3231
3238
  });
3232
3239
  Tab.displayName = 'Tab';
3233
3240
 
3234
- /**
3235
- * Hook to be used similarly to the React.Component#componentDidMount.
3236
- * Executes the provided `effect` when `dependencies` change but does not
3237
- * execute the effect initially (on mount) - only on update.
3238
- *
3239
- * @param effect {Function} function to be executed when dependencies update
3240
- * @param dependencies {Any} any valid dependency argument to React.useEffect
3241
- */
3242
- var useDidUpdate = function (effect, dependencies) {
3243
- var mounted = React__default["default"].useRef(false);
3244
- React__default["default"].useEffect(function () {
3245
- if (!mounted.current) {
3246
- mounted.current = true;
3247
- return;
3248
- }
3249
- effect();
3250
- }, dependencies);
3251
- };
3252
-
3253
3241
  var Tabs = function (_a) {
3254
3242
  var children = _a.children, thin = _a.thin, _b = _a.orientation, orientation = _b === void 0 ? 'horizontal' : _b, _c = _a.initialActiveIndex, initialActiveIndex = _c === void 0 ? 0 : _c, className = _a.className, onChange = _a.onChange, labelProp = tslib.__rest(_a, ["children", "thin", "orientation", "initialActiveIndex", "className", "onChange"]);
3255
3243
  var _d = tslib.__read(React.useState(initialActiveIndex), 2), activeIndex = _d[0], setActiveIndex = _d[1];
@@ -3555,7 +3543,7 @@ var TwoColumnPanel = React.forwardRef(function (_a, ref) {
3555
3543
  var closeButtonRef = React.useRef(null);
3556
3544
  var columnLeftRef = React.useRef(null);
3557
3545
  var columnRightRef = React.useRef(null);
3558
- var columnLeft = React__default["default"].Children.toArray(children).find(function (child) { return child.type === ColumnLeft; });
3546
+ var columnLeft = React__default["default"].Children.toArray(children).find(function (child) { return React__default["default"].isValidElement(child) && child.type === ColumnLeft; });
3559
3547
  var togglePanel = function () {
3560
3548
  var prefersReducedMotion = 'matchMedia' in window &&
3561
3549
  typeof matchMedia === 'function' &&
@@ -3588,16 +3576,17 @@ var TwoColumnPanel = React.forwardRef(function (_a, ref) {
3588
3576
  var ColumnLeftComponent;
3589
3577
  var columnLeftId;
3590
3578
  if (React.isValidElement(columnLeft)) {
3591
- var ref_1 = columnLeft.props.ref || columnLeftRef;
3579
+ var columnLeftProps = columnLeft.props;
3580
+ var ref_1 = columnLeftProps.ref || columnLeftRef;
3592
3581
  var id = (columnLeftId =
3593
- columnLeft.props.id || nextId.useId(undefined, 'sidebar-')[0]);
3582
+ columnLeftProps.id || nextId.useId(undefined, 'sidebar-')[0]);
3594
3583
  var CloseButton = (React__default["default"].createElement("div", { className: "TwoColumnPanel__Close" },
3595
3584
  React__default["default"].createElement("button", { type: "button", onClick: togglePanel, ref: closeButtonRef, "aria-label": hideCollapsedPanelLabel },
3596
3585
  React__default["default"].createElement(Icon, { type: "close" })),
3597
3586
  React__default["default"].createElement(Tooltip, { target: closeButtonRef, association: "aria-labelledby", hideElementOnHidden: true }, hideCollapsedPanelLabel)));
3598
3587
  var children_1 = tslib.__spreadArray([
3599
3588
  CloseButton
3600
- ], tslib.__read(React__default["default"].Children.toArray(columnLeft.props.children)), false);
3589
+ ], tslib.__read(React__default["default"].Children.toArray(columnLeftProps.children)), false);
3601
3590
  ColumnLeftComponent = React.cloneElement(columnLeft, { id: id, ref: ref_1, tabIndex: -1 }, children_1.map(function (child, index) {
3602
3591
  return React.cloneElement(child, {
3603
3592
  key: child.key
@@ -3606,17 +3595,18 @@ var TwoColumnPanel = React.forwardRef(function (_a, ref) {
3606
3595
  });
3607
3596
  }));
3608
3597
  }
3609
- var columnRight = React__default["default"].Children.toArray(children).find(function (child) { return child.type === ColumnRight; });
3598
+ var columnRight = React__default["default"].Children.toArray(children).find(function (child) { return React__default["default"].isValidElement(child) && child.type === ColumnRight; });
3610
3599
  var ColumnRightComponent;
3611
3600
  if (React.isValidElement(columnRight)) {
3612
- var ref_2 = columnRight.props.ref || columnRightRef;
3601
+ var columnRightProps = columnRight.props;
3602
+ var ref_2 = columnRightProps.ref || columnRightRef;
3613
3603
  var ToggleButton = (React__default["default"].createElement("div", { className: "TwoColumnPanel__ButtonToggle" },
3614
3604
  React__default["default"].createElement("button", { type: "button", onClick: togglePanel, ref: toggleButtonRef, "aria-label": !isCollapsed ? hideCollapsedPanelLabel : showCollapsedPanelLabel, "aria-expanded": !isCollapsed, "aria-controls": columnLeftId },
3615
3605
  React__default["default"].createElement(Icon, { type: !isCollapsed ? 'chevron-double-left' : 'chevron-double-right' })),
3616
3606
  React__default["default"].createElement(Tooltip, { target: toggleButtonRef, association: "aria-labelledby", hideElementOnHidden: true }, !isCollapsed ? hideCollapsedPanelLabel : showCollapsedPanelLabel)));
3617
3607
  var children_2 = tslib.__spreadArray([
3618
3608
  ToggleButton
3619
- ], tslib.__read(React__default["default"].Children.toArray(columnRight.props.children)), false);
3609
+ ], tslib.__read(React__default["default"].Children.toArray(columnRightProps.children)), false);
3620
3610
  ColumnRightComponent = React.cloneElement(columnRight, { ref: ref_2, tabIndex: -1 }, children_2.map(function (child, index) {
3621
3611
  return React.cloneElement(child, {
3622
3612
  key: child.key
@@ -3638,7 +3628,7 @@ var TwoColumnPanel = React.forwardRef(function (_a, ref) {
3638
3628
  (_a = columnLeftRef.current) === null || _a === void 0 ? void 0 : _a.removeEventListener('transitionend', handleTransitionEnd);
3639
3629
  };
3640
3630
  }, [columnLeftRef.current, isCollapsed]);
3641
- // When the collapsable panel starts to overlay content, it needs to become a focus trap and collapsed by default
3631
+ // When the collapsible panel starts to overlay content, it needs to become a focus trap and collapsed by default
3642
3632
  React.useLayoutEffect(function () {
3643
3633
  var mediaQueryList = matchMedia(collapsedMediaQuery);
3644
3634
  var handleMatch = function (matches) {
@@ -3802,7 +3792,8 @@ var Listbox = React.forwardRef(function (_a, ref) {
3802
3792
  }
3803
3793
  }, [activeOption]);
3804
3794
  React.useEffect(function () {
3805
- if (isActiveControlled && controlledActiveOption !== activeOption) {
3795
+ if (isActiveControlled &&
3796
+ (controlledActiveOption === null || controlledActiveOption === void 0 ? void 0 : controlledActiveOption.element) !== (activeOption === null || activeOption === void 0 ? void 0 : activeOption.element)) {
3806
3797
  setActiveOption(controlledActiveOption || null);
3807
3798
  }
3808
3799
  }, [isActiveControlled, controlledActiveOption]);
@@ -3948,11 +3939,11 @@ function isElementPreceding(a, b) {
3948
3939
  }
3949
3940
  var ListboxOption = React.forwardRef(function (_a, ref) {
3950
3941
  var _b;
3951
- var _c;
3952
- var propId = _a.id, className = _a.className, _d = _a.as, Component = _d === void 0 ? 'li' : _d, children = _a.children, value = _a.value, disabled = _a.disabled, selectedProp = _a.selected, _e = _a.activeClass, activeClass = _e === void 0 ? 'ListboxOption--active' : _e, onClick = _a.onClick, props = tslib.__rest(_a, ["id", "className", "as", "children", "value", "disabled", "selected", "activeClass", "onClick"]);
3953
- var _f = useListboxContext(), active = _f.active, selected = _f.selected, setOptions = _f.setOptions, onSelect = _f.onSelect;
3942
+ var _c, _d;
3943
+ var propId = _a.id, className = _a.className, _e = _a.as, Component = _e === void 0 ? 'li' : _e, children = _a.children, value = _a.value, disabled = _a.disabled, selectedProp = _a.selected, _f = _a.activeClass, activeClass = _f === void 0 ? 'ListboxOption--active' : _f, onClick = _a.onClick, props = tslib.__rest(_a, ["id", "className", "as", "children", "value", "disabled", "selected", "activeClass", "onClick"]);
3944
+ var _g = useListboxContext(), active = _g.active, selected = _g.selected, setOptions = _g.setOptions, onSelect = _g.onSelect;
3954
3945
  var listboxOptionRef = useSharedRef(ref);
3955
- var _g = tslib.__read(propId ? [propId] : nextId.useId(1, 'listbox-option'), 1), id = _g[0];
3946
+ var _h = tslib.__read(propId ? [propId] : nextId.useId(1, 'listbox-option'), 1), id = _h[0];
3956
3947
  var isActive = (active === null || active === void 0 ? void 0 : active.element) === listboxOptionRef.current;
3957
3948
  var isSelected = typeof selectedProp === 'boolean'
3958
3949
  ? selectedProp
@@ -3960,15 +3951,15 @@ var ListboxOption = React.forwardRef(function (_a, ref) {
3960
3951
  !!selected.find(function (option) { return option.element === listboxOptionRef.current; });
3961
3952
  var optionValue = typeof value !== 'undefined'
3962
3953
  ? value
3963
- : (_c = listboxOptionRef.current) === null || _c === void 0 ? void 0 : _c.innerText;
3954
+ : ((_d = (_c = listboxOptionRef.current) === null || _c === void 0 ? void 0 : _c.textContent) !== null && _d !== void 0 ? _d : undefined);
3964
3955
  React.useEffect(function () {
3965
3956
  var element = listboxOptionRef.current;
3966
3957
  setOptions(function (options) {
3967
3958
  var e_1, _a;
3968
- var option = { element: element, value: optionValue };
3969
3959
  // istanbul ignore next
3970
3960
  if (!element)
3971
3961
  return options;
3962
+ var option = { element: element, value: optionValue };
3972
3963
  // Elements are frequently appended, so check to see if the newly rendered
3973
3964
  // element follows the last element first before any other checks
3974
3965
  if (!options.length ||
@@ -4155,7 +4146,7 @@ var ComboboxOption = React.forwardRef(function (_a, ref) {
4155
4146
  // istanbul ignore next
4156
4147
  React.useLayoutEffect(function () {
4157
4148
  var intersectionEntry = intersectionRef.current;
4158
- if (!intersectionEntry || !isActive) {
4149
+ if (!intersectionEntry || !isActive || !comboboxOptionRef.current) {
4159
4150
  return;
4160
4151
  }
4161
4152
  var rect = comboboxOptionRef.current.getBoundingClientRect();
@@ -4171,10 +4162,10 @@ var ComboboxOption = React.forwardRef(function (_a, ref) {
4171
4162
  }
4172
4163
  }, [isActive]);
4173
4164
  React.useEffect(function () {
4174
- var _a;
4165
+ var _a, _b;
4175
4166
  var comboboxValue = typeof propValue !== 'undefined'
4176
4167
  ? propValue
4177
- : (_a = comboboxOptionRef.current) === null || _a === void 0 ? void 0 : _a.innerText;
4168
+ : ((_b = (_a = comboboxOptionRef.current) === null || _a === void 0 ? void 0 : _a.textContent) !== null && _b !== void 0 ? _b : undefined);
4178
4169
  var value = typeof formValue === 'undefined' ? comboboxValue : formValue;
4179
4170
  setFormValues(function (prev) {
4180
4171
  var formValues = prev.filter(function (fv) { return fv !== value; });
@@ -4193,12 +4184,14 @@ var ComboboxOption = React.forwardRef(function (_a, ref) {
4193
4184
  });
4194
4185
  }, [selectedValues, formValue]);
4195
4186
  React.useEffect(function () {
4196
- var _a;
4187
+ var _a, _b;
4197
4188
  if (isMatching) {
4198
4189
  var comboboxValue_1 = typeof propValue !== 'undefined'
4199
4190
  ? propValue
4200
- : (_a = comboboxOptionRef.current) === null || _a === void 0 ? void 0 : _a.innerText;
4191
+ : ((_b = (_a = comboboxOptionRef.current) === null || _a === void 0 ? void 0 : _a.textContent) !== null && _b !== void 0 ? _b : undefined);
4201
4192
  setMatchingOptions(function (options) {
4193
+ if (!comboboxOptionRef.current)
4194
+ return options;
4202
4195
  return new Map(options.set(comboboxOptionRef.current, {
4203
4196
  value: comboboxValue_1,
4204
4197
  displayValue: children,
@@ -4338,6 +4331,17 @@ var Combobox = React.forwardRef(function (_a, ref) {
4338
4331
  return value === lastSelectedValue;
4339
4332
  }) || [], 2), element = _a[0], option = _a[1];
4340
4333
  if (autocomplete === 'manual') {
4334
+ // In multiselect, the listbox manages its own active option via
4335
+ // keyboard navigation. When the last-selected value no longer
4336
+ // matches any option (e.g. after deselecting the only selected
4337
+ // option), preserve the existing active descendant so the next
4338
+ // Enter keypress can re-toggle the highlighted option.
4339
+ if (multiselect &&
4340
+ !element &&
4341
+ activeDescendant &&
4342
+ matchingOptions.has(activeDescendant.element)) {
4343
+ return;
4344
+ }
4341
4345
  setActiveDescendant(!element ? null : tslib.__assign({ element: element }, option));
4342
4346
  }
4343
4347
  else if (autocomplete === 'automatic' &&
@@ -4517,6 +4521,7 @@ var Combobox = React.forwardRef(function (_a, ref) {
4517
4521
  });
4518
4522
  }, [disabled, selectedValues, onSelectionChange]);
4519
4523
  var handlePillKeyDown = React.useCallback(function (event) {
4524
+ var _a, _b;
4520
4525
  if (!PillKeys.includes(event.key)) {
4521
4526
  return;
4522
4527
  }
@@ -4534,7 +4539,7 @@ var Combobox = React.forwardRef(function (_a, ref) {
4534
4539
  handleRemovePill(pillsRef.current[focusedIndex], selectedValues[focusedIndex]);
4535
4540
  var nextIndex = focusedIndex + 1;
4536
4541
  if (nextIndex == pillsLength) {
4537
- inputRef.current.focus();
4542
+ (_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.focus();
4538
4543
  }
4539
4544
  else {
4540
4545
  pillsRef.current[nextIndex].focus();
@@ -4543,7 +4548,7 @@ var Combobox = React.forwardRef(function (_a, ref) {
4543
4548
  else if (isArrowLeft || isArrowRight) {
4544
4549
  var nextIndex = Math.max(focusedIndex + (isArrowLeft ? -1 : 1), 0);
4545
4550
  if (isArrowRight && nextIndex === pillsLength) {
4546
- inputRef.current.focus();
4551
+ (_b = inputRef.current) === null || _b === void 0 ? void 0 : _b.focus();
4547
4552
  }
4548
4553
  else {
4549
4554
  pillsRef.current[nextIndex].focus();
@@ -4831,10 +4836,12 @@ var TextEllipsis = React__default["default"].forwardRef(function (_a, ref) {
4831
4836
  : overflowElement.clientWidth < overflowElement.scrollWidth);
4832
4837
  });
4833
4838
  };
4839
+ if (!sharedRef.current)
4840
+ return;
4834
4841
  var observer = new ResizeObserver(listener);
4835
4842
  observer.observe(sharedRef.current);
4836
4843
  return function () {
4837
- observer === null || observer === void 0 ? void 0 : observer.disconnect();
4844
+ observer.disconnect();
4838
4845
  };
4839
4846
  }, []);
4840
4847
  React.useEffect(function () {
@@ -4879,7 +4886,7 @@ var Drawer = React.forwardRef(function (_a, ref) {
4879
4886
  openRef.current = open;
4880
4887
  }, [open, setIsTransitioning]);
4881
4888
  React.useEffect(function () {
4882
- if (!isModal) {
4889
+ if (!isModal || !drawerRef.current) {
4883
4890
  return;
4884
4891
  }
4885
4892
  var isolator = new AriaIsolate(drawerRef.current);
@@ -5060,7 +5067,7 @@ function getActiveElement(root) {
5060
5067
  */
5061
5068
  function useMnemonics(_a) {
5062
5069
  var elementOrRef = _a.elementOrRef, matchingElementsSelector = _a.matchingElementsSelector, onMatch = _a.onMatch, _b = _a.enabled, enabled = _b === void 0 ? true : _b;
5063
- var containerRef = React.useRef();
5070
+ var containerRef = React.useRef(null);
5064
5071
  React.useEffect(function () {
5065
5072
  if (elementOrRef instanceof HTMLElement) {
5066
5073
  containerRef.current = elementOrRef;
@@ -5070,7 +5077,8 @@ function useMnemonics(_a) {
5070
5077
  }
5071
5078
  }, [elementOrRef]);
5072
5079
  React.useEffect(function () {
5073
- if (!enabled || !containerRef.current) {
5080
+ var listenerTarget = containerRef.current;
5081
+ if (!enabled || !listenerTarget) {
5074
5082
  return;
5075
5083
  }
5076
5084
  var keyboardHandler = function (event) {
@@ -5083,14 +5091,14 @@ function useMnemonics(_a) {
5083
5091
  if (event.key.length !== 1 || !/[a-z\d]/i.test(event.key)) {
5084
5092
  return;
5085
5093
  }
5086
- var container = containerRef.current;
5087
- if (!container) {
5094
+ var currentContainer = containerRef.current;
5095
+ if (!currentContainer) {
5088
5096
  return;
5089
5097
  }
5090
5098
  // Prevent default behavior and stop propagation for mnemonic keys
5091
5099
  event.preventDefault();
5092
5100
  event.stopPropagation();
5093
- var elements = Array.from(container.querySelectorAll(matchingElementsSelector !== null && matchingElementsSelector !== void 0 ? matchingElementsSelector : focusable__default["default"]));
5101
+ var elements = Array.from(currentContainer.querySelectorAll(matchingElementsSelector !== null && matchingElementsSelector !== void 0 ? matchingElementsSelector : focusable__default["default"]));
5094
5102
  var matchingElements = elements.filter(function (element) {
5095
5103
  return getAccessibleLabel(element).toLowerCase()[0] ===
5096
5104
  event.key.toLowerCase();
@@ -5098,7 +5106,7 @@ function useMnemonics(_a) {
5098
5106
  if (!matchingElements.length) {
5099
5107
  return;
5100
5108
  }
5101
- var currentActiveElement = getActiveElement(containerRef.current);
5109
+ var currentActiveElement = getActiveElement(currentContainer);
5102
5110
  var nextActiveElement = null;
5103
5111
  if (currentActiveElement) {
5104
5112
  nextActiveElement = matchingElements.find(function (element) {
@@ -5112,17 +5120,15 @@ function useMnemonics(_a) {
5112
5120
  onMatch(nextActiveElement !== null && nextActiveElement !== void 0 ? nextActiveElement : matchingElements[0]);
5113
5121
  }
5114
5122
  };
5115
- var container = containerRef.current;
5116
- container.addEventListener('keydown', keyboardHandler);
5117
- return function () { return container.removeEventListener('keydown', keyboardHandler); };
5123
+ listenerTarget.addEventListener('keydown', keyboardHandler);
5124
+ return function () { return listenerTarget.removeEventListener('keydown', keyboardHandler); };
5118
5125
  }, [enabled, containerRef, matchingElementsSelector, onMatch]);
5119
5126
  return containerRef;
5120
5127
  }
5121
5128
 
5122
5129
  var ActionList = React.forwardRef(function (_a, ref) {
5123
5130
  var _b = _a.selectionType, selectionType = _b === void 0 ? null : _b, onAction = _a.onAction, className = _a.className, children = _a.children, props = tslib.__rest(_a, ["selectionType", "onAction", "className", "children"]);
5124
- var actionListContext = useActionListContext();
5125
- var activeElement = React.useRef();
5131
+ var activeElement = React.useRef(null);
5126
5132
  var _c = tslib.__read(React.useState(), 2), activeOption = _c[0], setActiveOption = _c[1];
5127
5133
  var handleActiveChange = React.useCallback(function (value) {
5128
5134
  activeElement.current = value === null || value === void 0 ? void 0 : value.element;
@@ -5133,22 +5139,18 @@ var ActionList = React.forwardRef(function (_a, ref) {
5133
5139
  onAction(key, event);
5134
5140
  }
5135
5141
  }, [onAction]);
5142
+ var handleMnemonicMatch = React.useCallback(function (element) {
5143
+ setActiveOption(function (prev) {
5144
+ return (prev === null || prev === void 0 ? void 0 : prev.element) === element ? prev : { element: element };
5145
+ });
5146
+ }, []);
5136
5147
  var containerRef = useMnemonics({
5137
- onMatch: function (element) {
5138
- setActiveOption({
5139
- element: element
5140
- });
5141
- },
5148
+ onMatch: handleMnemonicMatch,
5142
5149
  matchingElementsSelector: props.role === 'menu'
5143
5150
  ? '[role=menuitem],[role=menuitemcheckbox],[role=menuitemradio]'
5144
5151
  : '[role=option]'
5145
5152
  });
5146
- return (
5147
- // Note: we should be able to use listbox without passing a prop
5148
- // value for "multiselect"
5149
- // see: https://github.com/dequelabs/cauldron/issues/1890
5150
- // @ts-expect-error this should be allowed
5151
- React__default["default"].createElement(Listbox, tslib.__assign({ ref: function (element) {
5153
+ return (React__default["default"].createElement(Listbox, tslib.__assign({ ref: function (element) {
5152
5154
  if (ref) {
5153
5155
  setRef(ref, element);
5154
5156
  }
@@ -5157,7 +5159,7 @@ var ActionList = React.forwardRef(function (_a, ref) {
5157
5159
  /* Listbox comes with an explicit role of "listbox", but we want to either
5158
5160
  * use the role from props, or default to the intrinsic role */
5159
5161
  // eslint-disable-next-line jsx-a11y/aria-role
5160
- role: undefined, "aria-multiselectable": actionListContext.role === 'listbox' ? undefined : null, className: classNames__default["default"]('ActionList', className), activeOption: activeOption }, props, { onActiveChange: handleActiveChange, navigation: "bound" }),
5162
+ role: undefined, "aria-multiselectable": undefined, className: classNames__default["default"]('ActionList', className), activeOption: activeOption }, props, { onActiveChange: handleActiveChange, navigation: "bound" }),
5161
5163
  React__default["default"].createElement(ActionListProvider, { role: props.role || 'list', onAction: handleAction, selectionType: selectionType }, children)));
5162
5164
  });
5163
5165
  ActionList.displayName = 'ActionList';
@@ -5175,7 +5177,7 @@ var ActionListItem = React.forwardRef(function (_a, ref) {
5175
5177
  });
5176
5178
  var isActive = !!(active === null || active === void 0 ? void 0 : active.element) && active.element === actionListItemRef.current;
5177
5179
  var handleAction = React.useCallback(function (event) {
5178
- var _a;
5180
+ var _a, _b;
5179
5181
  if (event.defaultPrevented) {
5180
5182
  return;
5181
5183
  }
@@ -5188,7 +5190,7 @@ var ActionListItem = React.forwardRef(function (_a, ref) {
5188
5190
  }
5189
5191
  // istanbul ignore else
5190
5192
  if (typeof onActionListAction === 'function') {
5191
- onActionListAction(actionKey || ((_a = labelRef === null || labelRef === void 0 ? void 0 : labelRef.current) === null || _a === void 0 ? void 0 : _a.innerText.trim()) || '', event);
5193
+ onActionListAction(actionKey || ((_b = (_a = labelRef.current) === null || _a === void 0 ? void 0 : _a.textContent) === null || _b === void 0 ? void 0 : _b.trim()) || '', event);
5192
5194
  }
5193
5195
  }, [onAction, onActionListAction, selectionType, actionKey]);
5194
5196
  var listItemRole = undefined;
@@ -5212,7 +5214,7 @@ var ActionListItem = React.forwardRef(function (_a, ref) {
5212
5214
  // istanbul ignore next
5213
5215
  React.useLayoutEffect(function () {
5214
5216
  var intersectionEntry = intersectionRef.current;
5215
- if (!intersectionEntry || !isActive) {
5217
+ if (!intersectionEntry || !isActive || !actionListItemRef.current) {
5216
5218
  return;
5217
5219
  }
5218
5220
  var rect = actionListItemRef.current.getBoundingClientRect();
@@ -5311,9 +5313,10 @@ var ActionMenu = React.forwardRef(function (_a, ref) {
5311
5313
  var _e = tslib.__read(React.useState('first'), 2), focusStrategy = _e[0], setFocusStrategy = _e[1];
5312
5314
  var triggerRef = React.useRef(null);
5313
5315
  var actionMenuRef = useSharedRef(ref);
5314
- var actionMenuListRef = useSharedRef(actionMenuList.props.ref);
5315
- var _f = tslib.__read(nextId.useId(1, 'menu-trigger'), 1), triggerId = _f[0];
5316
- var _g = tslib.__read(nextId.useId(1, 'menu'), 1), menuId = _g[0];
5316
+ var _f = actionMenuList.props, actionListRef = _f.ref, actionListOnAction = _f.onAction;
5317
+ var actionMenuListRef = useSharedRef(actionListRef !== null && actionListRef !== void 0 ? actionListRef : null);
5318
+ var _g = tslib.__read(nextId.useId(1, 'menu-trigger'), 1), triggerId = _g[0];
5319
+ var _h = tslib.__read(nextId.useId(1, 'menu'), 1), menuId = _h[0];
5317
5320
  var handleTriggerClick = React.useCallback(function (event) {
5318
5321
  // istanbul ignore else
5319
5322
  if (!event.defaultPrevented) {
@@ -5360,11 +5363,10 @@ var ActionMenu = React.forwardRef(function (_a, ref) {
5360
5363
  if (!event.defaultPrevented) {
5361
5364
  setOpen(false);
5362
5365
  }
5363
- var onAction = actionMenuList.props.onAction;
5364
- if (typeof onAction === 'function') {
5365
- onAction(key, event);
5366
+ if (typeof actionListOnAction === 'function') {
5367
+ actionListOnAction(key, event);
5366
5368
  }
5367
- }, [actionMenuList.props.onAction]);
5369
+ }, [actionListOnAction]);
5368
5370
  React.useEffect(function () {
5369
5371
  var _a, _b;
5370
5372
  if (open) {
@@ -5425,6 +5427,189 @@ var ActionMenu = React.forwardRef(function (_a, ref) {
5425
5427
  });
5426
5428
  ActionMenu.displayName = 'ActionMenu';
5427
5429
 
5430
+ var TreeViewItem = function (_a) {
5431
+ var id = _a.id, textValue = _a.textValue, children = _a.children;
5432
+ var checkboxId = React.useMemo(function () { return nextId__default["default"]('tree-view-item-'); }, []);
5433
+ return (React__default["default"].createElement(reactAriaComponents.TreeItem, { id: id, textValue: textValue, className: "TreeView__item" },
5434
+ React__default["default"].createElement(reactAriaComponents.TreeItemContent, null, function (_a) {
5435
+ var selectionMode = _a.selectionMode, isSelected = _a.isSelected, isDisabled = _a.isDisabled;
5436
+ return (React__default["default"].createElement(React__default["default"].Fragment, null,
5437
+ React__default["default"].createElement(reactAriaComponents.Button, { slot: "chevron", className: "TreeView__chevron" },
5438
+ React__default["default"].createElement(Icon, { type: "chevron-right" })),
5439
+ selectionMode !== 'none' ? (React__default["default"].createElement(Checkbox, { id: checkboxId, label: textValue, checked: isSelected, disabled: isDisabled, controlled: true, tabIndex: -1 })) : (React__default["default"].createElement(React__default["default"].Fragment, null, textValue))));
5440
+ }),
5441
+ children && children.length > 0 && (React__default["default"].createElement(reactAriaComponents.Collection, null, children.map(function (child) { return (React__default["default"].createElement(TreeViewItem, tslib.__assign({ key: child.id }, child))); })))));
5442
+ };
5443
+ TreeViewItem.displayName = 'TreeViewItem';
5444
+
5445
+ /** Every node id in the tree, flattened depth-first. */
5446
+ function collectAllKeys(nodes) {
5447
+ return nodes.flatMap(function (node) { return tslib.__spreadArray([
5448
+ node.id
5449
+ ], tslib.__read((node.children ? collectAllKeys(node.children) : [])), false); });
5450
+ }
5451
+ /** Normalize react-aria's `Selection` ("all" | Set) into a concrete Set of keys. */
5452
+ function toKeySet(selection, nodes) {
5453
+ if (selection !== 'all') {
5454
+ return new Set(selection);
5455
+ }
5456
+ // "Select all" only includes selectable (non-disabled) nodes.
5457
+ var disabled = new Set(collectDisabledKeys(nodes));
5458
+ return new Set(collectAllKeys(nodes).filter(function (key) { return !disabled.has(key); }));
5459
+ }
5460
+ /** Locate a node anywhere in the tree by its id. */
5461
+ function findNode(nodes, key) {
5462
+ var e_1, _a;
5463
+ try {
5464
+ for (var nodes_1 = tslib.__values(nodes), nodes_1_1 = nodes_1.next(); !nodes_1_1.done; nodes_1_1 = nodes_1.next()) {
5465
+ var node = nodes_1_1.value;
5466
+ if (node.id === key) {
5467
+ return node;
5468
+ }
5469
+ if (node.children) {
5470
+ var found = findNode(node.children, key);
5471
+ if (found) {
5472
+ return found;
5473
+ }
5474
+ }
5475
+ }
5476
+ }
5477
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
5478
+ finally {
5479
+ try {
5480
+ if (nodes_1_1 && !nodes_1_1.done && (_a = nodes_1.return)) _a.call(nodes_1);
5481
+ }
5482
+ finally { if (e_1) throw e_1.error; }
5483
+ }
5484
+ return undefined;
5485
+ }
5486
+ /** All descendant ids of a node (not including the node itself). */
5487
+ function collectDescendantKeys(node) {
5488
+ if (!node.children) {
5489
+ return [];
5490
+ }
5491
+ return node.children.flatMap(function (child) { return tslib.__spreadArray([
5492
+ child.id
5493
+ ], tslib.__read(collectDescendantKeys(child)), false); });
5494
+ }
5495
+ /** Ids of all disabled nodes (rendered disabled / non-selectable). */
5496
+ function collectDisabledKeys(nodes) {
5497
+ return nodes.flatMap(function (node) { return tslib.__spreadArray(tslib.__spreadArray([], tslib.__read((node.disabled ? [node.id] : [])), false), tslib.__read((node.children ? collectDisabledKeys(node.children) : [])), false); });
5498
+ }
5499
+ /**
5500
+ * Toggle a single node, applying cascade per the options (multiple mode only):
5501
+ * - selecting + `cascadeSelect`: also selects all (non-disabled) descendants.
5502
+ * - deselecting + `cascadeDeselect`: also deselects all descendants.
5503
+ *
5504
+ * In `single` mode only the clicked node is selected (clicking it again clears
5505
+ * it); cascade does not apply.
5506
+ */
5507
+ function toggleSelection(nodes, previous, key, selectionMode, _a) {
5508
+ var cascadeSelect = _a.cascadeSelect, cascadeDeselect = _a.cascadeDeselect;
5509
+ if (selectionMode === 'single') {
5510
+ var result_1 = new Set();
5511
+ if (!previous.has(key)) {
5512
+ result_1.add(key);
5513
+ }
5514
+ return result_1;
5515
+ }
5516
+ var result = new Set(previous);
5517
+ var node = findNode(nodes, key);
5518
+ var descendants = node ? collectDescendantKeys(node) : [];
5519
+ var disabled = new Set(collectDisabledKeys(nodes));
5520
+ if (!previous.has(key)) {
5521
+ result.add(key);
5522
+ if (cascadeSelect) {
5523
+ descendants.forEach(function (k) {
5524
+ if (!disabled.has(k)) {
5525
+ result.add(k);
5526
+ }
5527
+ });
5528
+ }
5529
+ }
5530
+ else {
5531
+ result.delete(key);
5532
+ if (cascadeDeselect) {
5533
+ descendants.forEach(function (k) { return result.delete(k); });
5534
+ }
5535
+ }
5536
+ return result;
5537
+ }
5538
+ /**
5539
+ * Apply react-aria's proposed selection while enforcing cascade. Each key
5540
+ * react-aria added cascades to its descendants when `cascadeSelect` is set; each
5541
+ * key it removed cascades when `cascadeDeselect` is set. In non-multiple modes
5542
+ * (or with both toggles off) the proposed selection is used as-is.
5543
+ */
5544
+ function applyCascade(nodes, previous, next, selectionMode, _a) {
5545
+ var cascadeSelect = _a.cascadeSelect, cascadeDeselect = _a.cascadeDeselect;
5546
+ if (selectionMode !== 'multiple' || (!cascadeSelect && !cascadeDeselect)) {
5547
+ return next;
5548
+ }
5549
+ var result = new Set(previous);
5550
+ var added = tslib.__spreadArray([], tslib.__read(next), false).filter(function (key) { return !previous.has(key); });
5551
+ var removed = tslib.__spreadArray([], tslib.__read(previous), false).filter(function (key) { return !next.has(key); });
5552
+ var disabled = new Set(collectDisabledKeys(nodes));
5553
+ added.forEach(function (key) {
5554
+ result.add(key);
5555
+ if (cascadeSelect) {
5556
+ var node = findNode(nodes, key);
5557
+ (node ? collectDescendantKeys(node) : []).forEach(function (k) {
5558
+ if (!disabled.has(k)) {
5559
+ result.add(k);
5560
+ }
5561
+ });
5562
+ }
5563
+ });
5564
+ removed.forEach(function (key) {
5565
+ result.delete(key);
5566
+ if (cascadeDeselect) {
5567
+ var node = findNode(nodes, key);
5568
+ (node ? collectDescendantKeys(node) : []).forEach(function (k) {
5569
+ return result.delete(k);
5570
+ });
5571
+ }
5572
+ });
5573
+ return result;
5574
+ }
5575
+
5576
+ var TreeView = React.forwardRef(function (_a, ref) {
5577
+ var items = _a.items, onAction = _a.onAction, _b = _a.selectionMode, selectionMode = _b === void 0 ? 'none' : _b, _c = _a.cascadeSelect, cascadeSelect = _c === void 0 ? false : _c, _d = _a.cascadeDeselect, cascadeDeselect = _d === void 0 ? false : _d, defaultExpandedKeys = _a.defaultExpandedKeys, className = _a.className, other = tslib.__rest(_a, ["items", "onAction", "selectionMode", "cascadeSelect", "cascadeDeselect", "defaultExpandedKeys", "className"]);
5578
+ var _e = tslib.__read(React.useState(new Set()), 2), selectedKeys = _e[0], setSelectedKeys = _e[1];
5579
+ var cascade = { cascadeSelect: cascadeSelect, cascadeDeselect: cascadeDeselect };
5580
+ // Cascade only applies to multiple selection.
5581
+ var isCascade = selectionMode === 'multiple' && (cascadeSelect || cascadeDeselect);
5582
+ // Selection driven by react-aria (row/checkbox press, keyboard). When
5583
+ // cascading, reconcile the proposed change; otherwise store react-aria's
5584
+ // selection as-is so the `'all'` sentinel (Ctrl+A) is preserved.
5585
+ var handleSelectionChange = function (selection) {
5586
+ setSelectedKeys(function (prev) {
5587
+ return isCascade
5588
+ ? applyCascade(items, toKeySet(prev, items), toKeySet(selection, items), selectionMode, cascade)
5589
+ : selection;
5590
+ });
5591
+ };
5592
+ // When `onAction` is set, react-aria treats a row press as an action rather
5593
+ // than a selection, so we toggle selection here ourselves.
5594
+ var handleAction = function (key) {
5595
+ if (selectionMode !== 'none') {
5596
+ setSelectedKeys(function (prev) {
5597
+ return toggleSelection(items, toKeySet(prev, items), key, selectionMode, cascade);
5598
+ });
5599
+ }
5600
+ onAction === null || onAction === void 0 ? void 0 : onAction(key);
5601
+ };
5602
+ // Disabled nodes are non-selectable; react-aria disables them via disabledKeys.
5603
+ var disabledKeys = React.useMemo(function () { return collectDisabledKeys(items); }, [items]);
5604
+ // Cascade requires controlling selection. Without it, preserve the original
5605
+ // behavior: selection is only controlled when an `onAction` handler is set.
5606
+ var selectionProps = selectionMode !== 'none' && (isCascade || onAction)
5607
+ ? { selectedKeys: selectedKeys, onSelectionChange: handleSelectionChange }
5608
+ : {};
5609
+ return (React__default["default"].createElement(reactAriaComponents.Tree, tslib.__assign({ ref: ref, className: classNames__default["default"]('TreeView', className), selectionMode: selectionMode, defaultExpandedKeys: defaultExpandedKeys }, (disabledKeys.length > 0 ? { disabledKeys: disabledKeys } : {}), (onAction ? { onAction: handleAction } : {}), selectionProps, other), items.map(function (item) { return (React__default["default"].createElement(TreeViewItem, tslib.__assign({ key: item.id }, item))); })));
5610
+ });
5611
+ TreeView.displayName = 'TreeView';
5612
+
5428
5613
  var LIGHT_THEME_CLASS = 'cauldron--theme-light';
5429
5614
  var DARK_THEME_CLASS = 'cauldron--theme-dark';
5430
5615
  var ThemeContext = React.createContext({
@@ -5620,6 +5805,7 @@ exports.TopBar = TopBar;
5620
5805
  exports.TopBarItem = MenuItem;
5621
5806
  exports.TopBarMenu = TopBarMenu;
5622
5807
  exports.TopBarTrigger = TopBarTrigger;
5808
+ exports.TreeView = TreeView;
5623
5809
  exports.TwoColumnPanel = TwoColumnPanel;
5624
5810
  exports.Workspace = Workspace;
5625
5811
  exports.focusableSelector = focusableSelector;