@deque/cauldron-react 7.1.0-canary.df3401c2 → 7.1.0-canary.e47d2a2d

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 (107) 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/ActionMenu/ActionMenu.d.ts +14 -8
  22. package/lib/components/AnchoredOverlay/index.d.ts +2 -2
  23. package/lib/components/ClickOutsideListener/index.d.ts +1 -1
  24. package/lib/components/Combobox/Combobox.d.ts +1 -1
  25. package/lib/components/Dialog/DialogContext.d.ts +1 -1
  26. package/lib/components/Dialog/index.d.ts +1 -1
  27. package/lib/components/Drawer/index.d.ts +1 -1
  28. package/lib/components/ExpandCollapsePanel/ExpandCollapsePanel.d.ts +1 -1
  29. package/lib/components/Icon/types.d.ts +1 -1
  30. package/lib/components/MenuItem/index.d.ts +1 -6
  31. package/lib/components/Popover/index.d.ts +2 -2
  32. package/lib/components/Table/TableContext.d.ts +1 -1
  33. package/lib/components/Tabs/Tab.d.ts +1 -1
  34. package/lib/components/Tooltip/index.d.ts +2 -2
  35. package/lib/components/TreeView/helpers.d.ts +33 -0
  36. package/lib/components/TreeView/index.d.ts +6 -0
  37. package/lib/components/TreeView/types.d.ts +3 -0
  38. package/lib/copy.js +1 -1
  39. package/lib/download.js +1 -1
  40. package/lib/dropper.js +1 -1
  41. package/lib/exchange.js +1 -1
  42. package/lib/export-solid.js +1 -1
  43. package/lib/external-link.js +1 -1
  44. package/lib/eye.js +1 -1
  45. package/lib/filter.js +1 -1
  46. package/lib/flag.js +1 -1
  47. package/lib/gears.js +1 -1
  48. package/lib/github.js +1 -1
  49. package/lib/grid.js +1 -1
  50. package/lib/hamburger-menu.js +1 -1
  51. package/lib/hashtag.js +1 -1
  52. package/lib/highlight.js +1 -1
  53. package/lib/images.js +1 -1
  54. package/lib/index.js +246 -100
  55. package/lib/info-circle-alt.js +1 -1
  56. package/lib/info-circle.js +1 -1
  57. package/lib/info-square.js +1 -1
  58. package/lib/kabob.js +1 -1
  59. package/lib/link.js +1 -1
  60. package/lib/linkedin.js +1 -1
  61. package/lib/list.js +1 -1
  62. package/lib/lock.js +1 -1
  63. package/lib/magnifying-glass.js +1 -1
  64. package/lib/menu.js +1 -1
  65. package/lib/minus.js +1 -1
  66. package/lib/new-releases.js +1 -1
  67. package/lib/new.js +1 -1
  68. package/lib/no.js +1 -1
  69. package/lib/pause.js +1 -1
  70. package/lib/pencil.js +1 -1
  71. package/lib/person-running.js +1 -1
  72. package/lib/play.js +1 -1
  73. package/lib/plus.js +1 -1
  74. package/lib/question-circle-alt.js +1 -1
  75. package/lib/question-circle.js +1 -1
  76. package/lib/radio-checked.js +1 -1
  77. package/lib/radio-unchecked.js +1 -1
  78. package/lib/recycle-square.js +1 -1
  79. package/lib/recycle.js +1 -1
  80. package/lib/resend.js +1 -1
  81. package/lib/robot.js +1 -1
  82. package/lib/run-again.js +1 -1
  83. package/lib/save.js +1 -1
  84. package/lib/share-nodes.js +1 -1
  85. package/lib/share.js +1 -1
  86. package/lib/sort-triangle.js +1 -1
  87. package/lib/sort.js +1 -1
  88. package/lib/star-outline.js +36 -0
  89. package/lib/star.js +4 -7
  90. package/lib/step-back.js +1 -1
  91. package/lib/step-forward.js +1 -1
  92. package/lib/sun.js +1 -1
  93. package/lib/table-sort-ascending.js +1 -1
  94. package/lib/table-sort-descending.js +1 -1
  95. package/lib/tag.js +1 -1
  96. package/lib/target.js +1 -1
  97. package/lib/trash.js +1 -1
  98. package/lib/triangle.js +1 -1
  99. package/lib/twitter.js +1 -1
  100. package/lib/types.d.ts +1 -1
  101. package/lib/upload.js +1 -1
  102. package/lib/utils/getChildRef.d.ts +2 -0
  103. package/lib/utils/polymorphicComponent.d.ts +1 -1
  104. package/lib/utils/useFocusTrap.d.ts +1 -1
  105. package/lib/utils/useMnemonics.d.ts +2 -2
  106. package/lib/utils/useSharedRef.d.ts +3 -3
  107. package/package.json +34 -32
package/lib/index.js CHANGED
@@ -185,6 +185,7 @@ var iconTypes = [
185
185
  'share',
186
186
  'sort-triangle',
187
187
  'sort',
188
+ 'star-outline',
188
189
  'star',
189
190
  'step-back',
190
191
  'step-forward',
@@ -273,6 +274,7 @@ function __variableDynamicImportRuntime0__(path) {
273
274
  case './icons/share.svg': return Promise.resolve().then(function () { return require('./share.js'); });
274
275
  case './icons/sort-triangle.svg': return Promise.resolve().then(function () { return require('./sort-triangle.js'); });
275
276
  case './icons/sort.svg': return Promise.resolve().then(function () { return require('./sort.js'); });
277
+ case './icons/star-outline.svg': return Promise.resolve().then(function () { return require('./star-outline.js'); });
276
278
  case './icons/star.svg': return Promise.resolve().then(function () { return require('./star.js'); });
277
279
  case './icons/step-back.svg': return Promise.resolve().then(function () { return require('./step-back.js'); });
278
280
  case './icons/step-forward.svg': return Promise.resolve().then(function () { return require('./step-forward.js'); });
@@ -495,24 +497,25 @@ var Accordion = function (_a) {
495
497
  var childrenArray = React__default["default"].Children.toArray(children);
496
498
  var trigger = childrenArray.find(function (child) {
497
499
  return typeof child === 'string' ||
498
- child.type === AccordionTrigger;
500
+ (React__default["default"].isValidElement(child) && child.type === AccordionTrigger);
499
501
  });
500
502
  var panelElement = childrenArray.find(function (child) {
501
503
  return typeof child === 'string' ||
502
- child.type === AccordionContent;
504
+ (React__default["default"].isValidElement(child) && child.type === AccordionContent);
503
505
  });
504
- var isValid = !!(React__default["default"].isValidElement(trigger) && React__default["default"].isValidElement(panelElement));
505
- if (!isValid) {
506
+ if (!React__default["default"].isValidElement(trigger) ||
507
+ !React__default["default"].isValidElement(panelElement)) {
506
508
  console.warn('Must provide <AccordionTrigger /> and <AccordionContent /> element(s). You provided:', {
507
509
  trigger: trigger,
508
510
  panelElement: panelElement,
509
- isValid: isValid
511
+ isValid: false
510
512
  });
511
513
  return null;
512
514
  }
515
+ var panelProps = panelElement.props;
513
516
  return (React__default["default"].createElement("div", tslib.__assign({ className: "Accordion" }, props),
514
- React__default["default"].createElement(ExpandCollapsePanel, tslib.__assign({ id: panelElement.props.id || "".concat(elementId, "-panel"), open: open, onToggle: onToggle, animationTiming: animationTiming }, panelElement.props),
515
- 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),
517
+ React__default["default"].createElement(ExpandCollapsePanel, tslib.__assign({ id: panelProps.id || "".concat(elementId, "-panel"), open: open, onToggle: onToggle, animationTiming: animationTiming }, panelProps),
518
+ 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),
516
519
  panelElement)));
517
520
  };
518
521
  Accordion.displayName = 'Accordion';
@@ -578,7 +581,9 @@ var Scrim = /** @class */ (function (_super) {
578
581
  if (destroy) {
579
582
  return null;
580
583
  }
581
- return (React__default["default"].createElement("div", { ref: function (el) { return (_this.el = el); }, className: "Scrim ".concat(animationClass) }));
584
+ return (React__default["default"].createElement("div", { ref: function (el) {
585
+ _this.el = el;
586
+ }, className: "Scrim ".concat(animationClass) }));
582
587
  };
583
588
  return Scrim;
584
589
  }(React__default["default"].Component));
@@ -620,16 +625,16 @@ var MenuItem = /** @class */ (function (_super) {
620
625
  if (autoClickLink) {
621
626
  clickLink(e.target, this.item);
622
627
  }
623
- onClick(e);
628
+ onClick === null || onClick === void 0 ? void 0 : onClick(e);
624
629
  };
625
630
  MenuItem.prototype.onKeyDown = function (e) {
626
- var _a;
631
+ var _a, _b, _c;
627
632
  var key = keyname__default["default"](e.which);
628
633
  if (key === 'enter' || key === 'space') {
629
634
  e.preventDefault();
630
635
  (_a = this.item) === null || _a === void 0 ? void 0 : _a.click();
631
636
  }
632
- this.props.onKeyDown(e);
637
+ (_c = (_b = this.props).onKeyDown) === null || _c === void 0 ? void 0 : _c.call(_b, e);
633
638
  };
634
639
  MenuItem.prototype.render = function () {
635
640
  var _this = this;
@@ -642,12 +647,6 @@ var MenuItem = /** @class */ (function (_super) {
642
647
  };
643
648
  MenuItem.displayName = 'MenuItem';
644
649
  MenuItem.defaultProps = {
645
- // eslint-disable-next-line @typescript-eslint/no-empty-function
646
- menuItemRef: function () { },
647
- // eslint-disable-next-line @typescript-eslint/no-empty-function
648
- onClick: function () { },
649
- // eslint-disable-next-line @typescript-eslint/no-empty-function
650
- onKeyDown: function () { },
651
650
  autoClickLink: true
652
651
  };
653
652
  return MenuItem;
@@ -807,9 +806,16 @@ function resolveElement(elementOrRef) {
807
806
  return null;
808
807
  }
809
808
 
809
+ function getChildRef(child, version) {
810
+ if (version === void 0) { version = React__default["default"].version; }
811
+ return parseInt(version, 10) >= 19
812
+ ? child.props.ref
813
+ : child.ref;
814
+ }
815
+
810
816
  function ClickOutsideListener(_a, ref) {
811
817
  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;
812
- var childElementRef = React.useRef();
818
+ var childElementRef = React.useRef(null);
813
819
  var handleEvent = function (event) {
814
820
  if (event.defaultPrevented) {
815
821
  return;
@@ -832,9 +838,8 @@ function ClickOutsideListener(_a, ref) {
832
838
  childElementRef.current = node;
833
839
  // Ref for this component should pass-through to the child node
834
840
  setRef(ref, node);
835
- // If child has its own ref, we want to update
836
- // its ref with the newly cloned node
837
- var childRef = children.ref;
841
+ // Forward the child's own ref. In React 19 ref lives in props; in 16–18 it's element.ref.
842
+ var childRef = getChildRef(children);
838
843
  setRef(childRef, node);
839
844
  };
840
845
  React.useEffect(function () {
@@ -1343,7 +1348,7 @@ var AriaIsolate = /** @class */ (function () {
1343
1348
 
1344
1349
  /**
1345
1350
  * When a component needs to track an internal ref on a component that has a
1346
- * forwarded ref, useSharedRef will return a MutableRefObject<T> that will
1351
+ * forwarded ref, useSharedRef will return a RefObject<T | null> that will
1347
1352
  * correctly invoke the parent ref as well providing an internal ref.
1348
1353
  *
1349
1354
  * @example
@@ -1356,7 +1361,7 @@ var AriaIsolate = /** @class */ (function () {
1356
1361
  * })
1357
1362
  */
1358
1363
  function useSharedRef(ref) {
1359
- var internalRef = React.useRef();
1364
+ var internalRef = React.useRef(null);
1360
1365
  React.useEffect(function () {
1361
1366
  setRef(ref, internalRef.current);
1362
1367
  return function () { return setRef(ref, null); };
@@ -1489,7 +1494,7 @@ function useFocusTrap(target, options) {
1489
1494
  if (options === void 0) { options = {}; }
1490
1495
  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;
1491
1496
  var focusTrap = React.useRef(null);
1492
- var returnFocusElementRef = React.useRef();
1497
+ var returnFocusElementRef = React.useRef(null);
1493
1498
  function restoreFocusToReturnFocusElement() {
1494
1499
  var _a;
1495
1500
  var resolvedReturnFocusElement = resolveElement(returnFocusElement);
@@ -1539,7 +1544,7 @@ var Dialog = React.forwardRef(function (_a, ref) {
1539
1544
  var dialogRef = useSharedRef(dialogRefProp || ref);
1540
1545
  var _g = tslib.__read(nextId.useId(1, 'dialog-title-'), 1), headingId = _g[0];
1541
1546
  var headingRef = React.useRef(null);
1542
- var isolatorRef = React.useRef();
1547
+ var isolatorRef = React.useRef(null);
1543
1548
  var headingLevel = typeof heading === 'object' && 'level' in heading && heading.level
1544
1549
  ? heading.level
1545
1550
  : 2;
@@ -2134,7 +2139,7 @@ var looksLikeLink = function (props) {
2134
2139
  };
2135
2140
  var IconButton = React.forwardRef(function (_a, ref) {
2136
2141
  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"]);
2137
- var internalRef = React.useRef();
2142
+ var internalRef = React.useRef(null);
2138
2143
  React.useImperativeHandle(ref, function () { return internalRef.current; });
2139
2144
  // Configure additional properties based on the type of the Component
2140
2145
  // for accessibility
@@ -2209,7 +2214,7 @@ var typeMap = {
2209
2214
  };
2210
2215
  var tabIndexHandler = function (reset, toast) {
2211
2216
  if (reset) {
2212
- // restore tab indicies that we clobbered
2217
+ // restore tab indices that we clobbered
2213
2218
  return queryAll('[data-cached-tabindex]').forEach(function (el) {
2214
2219
  el.tabIndex = Number(el.getAttribute('data-cached-tabindex'));
2215
2220
  });
@@ -2696,7 +2701,7 @@ Checkbox.displayName = 'Checkbox';
2696
2701
  */
2697
2702
  function TooltipTabstop(_a) {
2698
2703
  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"]);
2699
- var buttonRef = React.useRef();
2704
+ var buttonRef = React.useRef(null);
2700
2705
  return (React__default["default"].createElement(React__default["default"].Fragment, null,
2701
2706
  React__default["default"].createElement("button", tslib.__assign({ type: "button", ref: buttonRef, "aria-disabled": "true", className: classNames__default["default"]('TooltipTabstop', className) }, buttonProps), children),
2702
2707
  React__default["default"].createElement(Tooltip, { target: buttonRef, variant: variant, association: association, show: show, placement: placement, portal: portal, hideElementOnHidden: hideElementOnHidden }, tooltip)));
@@ -3540,7 +3545,7 @@ var TwoColumnPanel = React.forwardRef(function (_a, ref) {
3540
3545
  var closeButtonRef = React.useRef(null);
3541
3546
  var columnLeftRef = React.useRef(null);
3542
3547
  var columnRightRef = React.useRef(null);
3543
- var columnLeft = React__default["default"].Children.toArray(children).find(function (child) { return child.type === ColumnLeft; });
3548
+ var columnLeft = React__default["default"].Children.toArray(children).find(function (child) { return React__default["default"].isValidElement(child) && child.type === ColumnLeft; });
3544
3549
  var togglePanel = function () {
3545
3550
  var prefersReducedMotion = 'matchMedia' in window &&
3546
3551
  typeof matchMedia === 'function' &&
@@ -3573,16 +3578,17 @@ var TwoColumnPanel = React.forwardRef(function (_a, ref) {
3573
3578
  var ColumnLeftComponent;
3574
3579
  var columnLeftId;
3575
3580
  if (React.isValidElement(columnLeft)) {
3576
- var ref_1 = columnLeft.props.ref || columnLeftRef;
3581
+ var columnLeftProps = columnLeft.props;
3582
+ var ref_1 = columnLeftProps.ref || columnLeftRef;
3577
3583
  var id = (columnLeftId =
3578
- columnLeft.props.id || nextId.useId(undefined, 'sidebar-')[0]);
3584
+ columnLeftProps.id || nextId.useId(undefined, 'sidebar-')[0]);
3579
3585
  var CloseButton = (React__default["default"].createElement("div", { className: "TwoColumnPanel__Close" },
3580
3586
  React__default["default"].createElement("button", { type: "button", onClick: togglePanel, ref: closeButtonRef, "aria-label": hideCollapsedPanelLabel },
3581
3587
  React__default["default"].createElement(Icon, { type: "close" })),
3582
3588
  React__default["default"].createElement(Tooltip, { target: closeButtonRef, association: "aria-labelledby", hideElementOnHidden: true }, hideCollapsedPanelLabel)));
3583
3589
  var children_1 = tslib.__spreadArray([
3584
3590
  CloseButton
3585
- ], tslib.__read(React__default["default"].Children.toArray(columnLeft.props.children)), false);
3591
+ ], tslib.__read(React__default["default"].Children.toArray(columnLeftProps.children)), false);
3586
3592
  ColumnLeftComponent = React.cloneElement(columnLeft, { id: id, ref: ref_1, tabIndex: -1 }, children_1.map(function (child, index) {
3587
3593
  return React.cloneElement(child, {
3588
3594
  key: child.key
@@ -3591,17 +3597,18 @@ var TwoColumnPanel = React.forwardRef(function (_a, ref) {
3591
3597
  });
3592
3598
  }));
3593
3599
  }
3594
- var columnRight = React__default["default"].Children.toArray(children).find(function (child) { return child.type === ColumnRight; });
3600
+ var columnRight = React__default["default"].Children.toArray(children).find(function (child) { return React__default["default"].isValidElement(child) && child.type === ColumnRight; });
3595
3601
  var ColumnRightComponent;
3596
3602
  if (React.isValidElement(columnRight)) {
3597
- var ref_2 = columnRight.props.ref || columnRightRef;
3603
+ var columnRightProps = columnRight.props;
3604
+ var ref_2 = columnRightProps.ref || columnRightRef;
3598
3605
  var ToggleButton = (React__default["default"].createElement("div", { className: "TwoColumnPanel__ButtonToggle" },
3599
3606
  React__default["default"].createElement("button", { type: "button", onClick: togglePanel, ref: toggleButtonRef, "aria-label": !isCollapsed ? hideCollapsedPanelLabel : showCollapsedPanelLabel, "aria-expanded": !isCollapsed, "aria-controls": columnLeftId },
3600
3607
  React__default["default"].createElement(Icon, { type: !isCollapsed ? 'chevron-double-left' : 'chevron-double-right' })),
3601
3608
  React__default["default"].createElement(Tooltip, { target: toggleButtonRef, association: "aria-labelledby", hideElementOnHidden: true }, !isCollapsed ? hideCollapsedPanelLabel : showCollapsedPanelLabel)));
3602
3609
  var children_2 = tslib.__spreadArray([
3603
3610
  ToggleButton
3604
- ], tslib.__read(React__default["default"].Children.toArray(columnRight.props.children)), false);
3611
+ ], tslib.__read(React__default["default"].Children.toArray(columnRightProps.children)), false);
3605
3612
  ColumnRightComponent = React.cloneElement(columnRight, { ref: ref_2, tabIndex: -1 }, children_2.map(function (child, index) {
3606
3613
  return React.cloneElement(child, {
3607
3614
  key: child.key
@@ -3623,7 +3630,7 @@ var TwoColumnPanel = React.forwardRef(function (_a, ref) {
3623
3630
  (_a = columnLeftRef.current) === null || _a === void 0 ? void 0 : _a.removeEventListener('transitionend', handleTransitionEnd);
3624
3631
  };
3625
3632
  }, [columnLeftRef.current, isCollapsed]);
3626
- // When the collapsable panel starts to overlay content, it needs to become a focus trap and collapsed by default
3633
+ // When the collapsible panel starts to overlay content, it needs to become a focus trap and collapsed by default
3627
3634
  React.useLayoutEffect(function () {
3628
3635
  var mediaQueryList = matchMedia(collapsedMediaQuery);
3629
3636
  var handleMatch = function (matches) {
@@ -3787,7 +3794,8 @@ var Listbox = React.forwardRef(function (_a, ref) {
3787
3794
  }
3788
3795
  }, [activeOption]);
3789
3796
  React.useEffect(function () {
3790
- if (isActiveControlled && controlledActiveOption !== activeOption) {
3797
+ if (isActiveControlled &&
3798
+ (controlledActiveOption === null || controlledActiveOption === void 0 ? void 0 : controlledActiveOption.element) !== (activeOption === null || activeOption === void 0 ? void 0 : activeOption.element)) {
3791
3799
  setActiveOption(controlledActiveOption || null);
3792
3800
  }
3793
3801
  }, [isActiveControlled, controlledActiveOption]);
@@ -3933,11 +3941,11 @@ function isElementPreceding(a, b) {
3933
3941
  }
3934
3942
  var ListboxOption = React.forwardRef(function (_a, ref) {
3935
3943
  var _b;
3936
- var _c;
3937
- 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"]);
3938
- var _f = useListboxContext(), active = _f.active, selected = _f.selected, setOptions = _f.setOptions, onSelect = _f.onSelect;
3944
+ var _c, _d;
3945
+ 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"]);
3946
+ var _g = useListboxContext(), active = _g.active, selected = _g.selected, setOptions = _g.setOptions, onSelect = _g.onSelect;
3939
3947
  var listboxOptionRef = useSharedRef(ref);
3940
- var _g = tslib.__read(propId ? [propId] : nextId.useId(1, 'listbox-option'), 1), id = _g[0];
3948
+ var _h = tslib.__read(propId ? [propId] : nextId.useId(1, 'listbox-option'), 1), id = _h[0];
3941
3949
  var isActive = (active === null || active === void 0 ? void 0 : active.element) === listboxOptionRef.current;
3942
3950
  var isSelected = typeof selectedProp === 'boolean'
3943
3951
  ? selectedProp
@@ -3945,15 +3953,15 @@ var ListboxOption = React.forwardRef(function (_a, ref) {
3945
3953
  !!selected.find(function (option) { return option.element === listboxOptionRef.current; });
3946
3954
  var optionValue = typeof value !== 'undefined'
3947
3955
  ? value
3948
- : (_c = listboxOptionRef.current) === null || _c === void 0 ? void 0 : _c.innerText;
3956
+ : ((_d = (_c = listboxOptionRef.current) === null || _c === void 0 ? void 0 : _c.textContent) !== null && _d !== void 0 ? _d : undefined);
3949
3957
  React.useEffect(function () {
3950
3958
  var element = listboxOptionRef.current;
3951
3959
  setOptions(function (options) {
3952
3960
  var e_1, _a;
3953
- var option = { element: element, value: optionValue };
3954
3961
  // istanbul ignore next
3955
3962
  if (!element)
3956
3963
  return options;
3964
+ var option = { element: element, value: optionValue };
3957
3965
  // Elements are frequently appended, so check to see if the newly rendered
3958
3966
  // element follows the last element first before any other checks
3959
3967
  if (!options.length ||
@@ -4140,7 +4148,7 @@ var ComboboxOption = React.forwardRef(function (_a, ref) {
4140
4148
  // istanbul ignore next
4141
4149
  React.useLayoutEffect(function () {
4142
4150
  var intersectionEntry = intersectionRef.current;
4143
- if (!intersectionEntry || !isActive) {
4151
+ if (!intersectionEntry || !isActive || !comboboxOptionRef.current) {
4144
4152
  return;
4145
4153
  }
4146
4154
  var rect = comboboxOptionRef.current.getBoundingClientRect();
@@ -4156,10 +4164,10 @@ var ComboboxOption = React.forwardRef(function (_a, ref) {
4156
4164
  }
4157
4165
  }, [isActive]);
4158
4166
  React.useEffect(function () {
4159
- var _a;
4167
+ var _a, _b;
4160
4168
  var comboboxValue = typeof propValue !== 'undefined'
4161
4169
  ? propValue
4162
- : (_a = comboboxOptionRef.current) === null || _a === void 0 ? void 0 : _a.innerText;
4170
+ : ((_b = (_a = comboboxOptionRef.current) === null || _a === void 0 ? void 0 : _a.textContent) !== null && _b !== void 0 ? _b : undefined);
4163
4171
  var value = typeof formValue === 'undefined' ? comboboxValue : formValue;
4164
4172
  setFormValues(function (prev) {
4165
4173
  var formValues = prev.filter(function (fv) { return fv !== value; });
@@ -4178,12 +4186,14 @@ var ComboboxOption = React.forwardRef(function (_a, ref) {
4178
4186
  });
4179
4187
  }, [selectedValues, formValue]);
4180
4188
  React.useEffect(function () {
4181
- var _a;
4189
+ var _a, _b;
4182
4190
  if (isMatching) {
4183
4191
  var comboboxValue_1 = typeof propValue !== 'undefined'
4184
4192
  ? propValue
4185
- : (_a = comboboxOptionRef.current) === null || _a === void 0 ? void 0 : _a.innerText;
4193
+ : ((_b = (_a = comboboxOptionRef.current) === null || _a === void 0 ? void 0 : _a.textContent) !== null && _b !== void 0 ? _b : undefined);
4186
4194
  setMatchingOptions(function (options) {
4195
+ if (!comboboxOptionRef.current)
4196
+ return options;
4187
4197
  return new Map(options.set(comboboxOptionRef.current, {
4188
4198
  value: comboboxValue_1,
4189
4199
  displayValue: children,
@@ -4513,6 +4523,7 @@ var Combobox = React.forwardRef(function (_a, ref) {
4513
4523
  });
4514
4524
  }, [disabled, selectedValues, onSelectionChange]);
4515
4525
  var handlePillKeyDown = React.useCallback(function (event) {
4526
+ var _a, _b;
4516
4527
  if (!PillKeys.includes(event.key)) {
4517
4528
  return;
4518
4529
  }
@@ -4530,7 +4541,7 @@ var Combobox = React.forwardRef(function (_a, ref) {
4530
4541
  handleRemovePill(pillsRef.current[focusedIndex], selectedValues[focusedIndex]);
4531
4542
  var nextIndex = focusedIndex + 1;
4532
4543
  if (nextIndex == pillsLength) {
4533
- inputRef.current.focus();
4544
+ (_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.focus();
4534
4545
  }
4535
4546
  else {
4536
4547
  pillsRef.current[nextIndex].focus();
@@ -4539,7 +4550,7 @@ var Combobox = React.forwardRef(function (_a, ref) {
4539
4550
  else if (isArrowLeft || isArrowRight) {
4540
4551
  var nextIndex = Math.max(focusedIndex + (isArrowLeft ? -1 : 1), 0);
4541
4552
  if (isArrowRight && nextIndex === pillsLength) {
4542
- inputRef.current.focus();
4553
+ (_b = inputRef.current) === null || _b === void 0 ? void 0 : _b.focus();
4543
4554
  }
4544
4555
  else {
4545
4556
  pillsRef.current[nextIndex].focus();
@@ -4827,10 +4838,12 @@ var TextEllipsis = React__default["default"].forwardRef(function (_a, ref) {
4827
4838
  : overflowElement.clientWidth < overflowElement.scrollWidth);
4828
4839
  });
4829
4840
  };
4841
+ if (!sharedRef.current)
4842
+ return;
4830
4843
  var observer = new ResizeObserver(listener);
4831
4844
  observer.observe(sharedRef.current);
4832
4845
  return function () {
4833
- observer === null || observer === void 0 ? void 0 : observer.disconnect();
4846
+ observer.disconnect();
4834
4847
  };
4835
4848
  }, []);
4836
4849
  React.useEffect(function () {
@@ -4875,7 +4888,7 @@ var Drawer = React.forwardRef(function (_a, ref) {
4875
4888
  openRef.current = open;
4876
4889
  }, [open, setIsTransitioning]);
4877
4890
  React.useEffect(function () {
4878
- if (!isModal) {
4891
+ if (!isModal || !drawerRef.current) {
4879
4892
  return;
4880
4893
  }
4881
4894
  var isolator = new AriaIsolate(drawerRef.current);
@@ -5056,7 +5069,7 @@ function getActiveElement(root) {
5056
5069
  */
5057
5070
  function useMnemonics(_a) {
5058
5071
  var elementOrRef = _a.elementOrRef, matchingElementsSelector = _a.matchingElementsSelector, onMatch = _a.onMatch, _b = _a.enabled, enabled = _b === void 0 ? true : _b;
5059
- var containerRef = React.useRef();
5072
+ var containerRef = React.useRef(null);
5060
5073
  React.useEffect(function () {
5061
5074
  if (elementOrRef instanceof HTMLElement) {
5062
5075
  containerRef.current = elementOrRef;
@@ -5066,7 +5079,8 @@ function useMnemonics(_a) {
5066
5079
  }
5067
5080
  }, [elementOrRef]);
5068
5081
  React.useEffect(function () {
5069
- if (!enabled || !containerRef.current) {
5082
+ var listenerTarget = containerRef.current;
5083
+ if (!enabled || !listenerTarget) {
5070
5084
  return;
5071
5085
  }
5072
5086
  var keyboardHandler = function (event) {
@@ -5079,14 +5093,14 @@ function useMnemonics(_a) {
5079
5093
  if (event.key.length !== 1 || !/[a-z\d]/i.test(event.key)) {
5080
5094
  return;
5081
5095
  }
5082
- var container = containerRef.current;
5083
- if (!container) {
5096
+ var currentContainer = containerRef.current;
5097
+ if (!currentContainer) {
5084
5098
  return;
5085
5099
  }
5086
5100
  // Prevent default behavior and stop propagation for mnemonic keys
5087
5101
  event.preventDefault();
5088
5102
  event.stopPropagation();
5089
- var elements = Array.from(container.querySelectorAll(matchingElementsSelector !== null && matchingElementsSelector !== void 0 ? matchingElementsSelector : focusable__default["default"]));
5103
+ var elements = Array.from(currentContainer.querySelectorAll(matchingElementsSelector !== null && matchingElementsSelector !== void 0 ? matchingElementsSelector : focusable__default["default"]));
5090
5104
  var matchingElements = elements.filter(function (element) {
5091
5105
  return getAccessibleLabel(element).toLowerCase()[0] ===
5092
5106
  event.key.toLowerCase();
@@ -5094,7 +5108,7 @@ function useMnemonics(_a) {
5094
5108
  if (!matchingElements.length) {
5095
5109
  return;
5096
5110
  }
5097
- var currentActiveElement = getActiveElement(containerRef.current);
5111
+ var currentActiveElement = getActiveElement(currentContainer);
5098
5112
  var nextActiveElement = null;
5099
5113
  if (currentActiveElement) {
5100
5114
  nextActiveElement = matchingElements.find(function (element) {
@@ -5108,16 +5122,15 @@ function useMnemonics(_a) {
5108
5122
  onMatch(nextActiveElement !== null && nextActiveElement !== void 0 ? nextActiveElement : matchingElements[0]);
5109
5123
  }
5110
5124
  };
5111
- var container = containerRef.current;
5112
- container.addEventListener('keydown', keyboardHandler);
5113
- return function () { return container.removeEventListener('keydown', keyboardHandler); };
5125
+ listenerTarget.addEventListener('keydown', keyboardHandler);
5126
+ return function () { return listenerTarget.removeEventListener('keydown', keyboardHandler); };
5114
5127
  }, [enabled, containerRef, matchingElementsSelector, onMatch]);
5115
5128
  return containerRef;
5116
5129
  }
5117
5130
 
5118
5131
  var ActionList = React.forwardRef(function (_a, ref) {
5119
5132
  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"]);
5120
- var activeElement = React.useRef();
5133
+ var activeElement = React.useRef(null);
5121
5134
  var _c = tslib.__read(React.useState(), 2), activeOption = _c[0], setActiveOption = _c[1];
5122
5135
  var handleActiveChange = React.useCallback(function (value) {
5123
5136
  activeElement.current = value === null || value === void 0 ? void 0 : value.element;
@@ -5128,12 +5141,13 @@ var ActionList = React.forwardRef(function (_a, ref) {
5128
5141
  onAction(key, event);
5129
5142
  }
5130
5143
  }, [onAction]);
5144
+ var handleMnemonicMatch = React.useCallback(function (element) {
5145
+ setActiveOption(function (prev) {
5146
+ return (prev === null || prev === void 0 ? void 0 : prev.element) === element ? prev : { element: element };
5147
+ });
5148
+ }, []);
5131
5149
  var containerRef = useMnemonics({
5132
- onMatch: function (element) {
5133
- setActiveOption({
5134
- element: element
5135
- });
5136
- },
5150
+ onMatch: handleMnemonicMatch,
5137
5151
  matchingElementsSelector: props.role === 'menu'
5138
5152
  ? '[role=menuitem],[role=menuitemcheckbox],[role=menuitemradio]'
5139
5153
  : '[role=option]'
@@ -5165,7 +5179,7 @@ var ActionListItem = React.forwardRef(function (_a, ref) {
5165
5179
  });
5166
5180
  var isActive = !!(active === null || active === void 0 ? void 0 : active.element) && active.element === actionListItemRef.current;
5167
5181
  var handleAction = React.useCallback(function (event) {
5168
- var _a;
5182
+ var _a, _b;
5169
5183
  if (event.defaultPrevented) {
5170
5184
  return;
5171
5185
  }
@@ -5178,7 +5192,7 @@ var ActionListItem = React.forwardRef(function (_a, ref) {
5178
5192
  }
5179
5193
  // istanbul ignore else
5180
5194
  if (typeof onActionListAction === 'function') {
5181
- onActionListAction(actionKey || ((_a = labelRef === null || labelRef === void 0 ? void 0 : labelRef.current) === null || _a === void 0 ? void 0 : _a.innerText.trim()) || '', event);
5195
+ onActionListAction(actionKey || ((_b = (_a = labelRef.current) === null || _a === void 0 ? void 0 : _a.textContent) === null || _b === void 0 ? void 0 : _b.trim()) || '', event);
5182
5196
  }
5183
5197
  }, [onAction, onActionListAction, selectionType, actionKey]);
5184
5198
  var listItemRole = undefined;
@@ -5202,7 +5216,7 @@ var ActionListItem = React.forwardRef(function (_a, ref) {
5202
5216
  // istanbul ignore next
5203
5217
  React.useLayoutEffect(function () {
5204
5218
  var intersectionEntry = intersectionRef.current;
5205
- if (!intersectionEntry || !isActive) {
5219
+ if (!intersectionEntry || !isActive || !actionListItemRef.current) {
5206
5220
  return;
5207
5221
  }
5208
5222
  var rect = actionListItemRef.current.getBoundingClientRect();
@@ -5301,9 +5315,10 @@ var ActionMenu = React.forwardRef(function (_a, ref) {
5301
5315
  var _e = tslib.__read(React.useState('first'), 2), focusStrategy = _e[0], setFocusStrategy = _e[1];
5302
5316
  var triggerRef = React.useRef(null);
5303
5317
  var actionMenuRef = useSharedRef(ref);
5304
- var actionMenuListRef = useSharedRef(actionMenuList.props.ref);
5305
- var _f = tslib.__read(nextId.useId(1, 'menu-trigger'), 1), triggerId = _f[0];
5306
- var _g = tslib.__read(nextId.useId(1, 'menu'), 1), menuId = _g[0];
5318
+ var _f = actionMenuList.props, actionListRef = _f.ref, actionListOnAction = _f.onAction;
5319
+ var actionMenuListRef = useSharedRef(actionListRef !== null && actionListRef !== void 0 ? actionListRef : null);
5320
+ var _g = tslib.__read(nextId.useId(1, 'menu-trigger'), 1), triggerId = _g[0];
5321
+ var _h = tslib.__read(nextId.useId(1, 'menu'), 1), menuId = _h[0];
5307
5322
  var handleTriggerClick = React.useCallback(function (event) {
5308
5323
  // istanbul ignore else
5309
5324
  if (!event.defaultPrevented) {
@@ -5350,11 +5365,10 @@ var ActionMenu = React.forwardRef(function (_a, ref) {
5350
5365
  if (!event.defaultPrevented) {
5351
5366
  setOpen(false);
5352
5367
  }
5353
- var onAction = actionMenuList.props.onAction;
5354
- if (typeof onAction === 'function') {
5355
- onAction(key, event);
5368
+ if (typeof actionListOnAction === 'function') {
5369
+ actionListOnAction(key, event);
5356
5370
  }
5357
- }, [actionMenuList.props.onAction]);
5371
+ }, [actionListOnAction]);
5358
5372
  React.useEffect(function () {
5359
5373
  var _a, _b;
5360
5374
  if (open) {
@@ -5420,49 +5434,181 @@ var TreeViewItem = function (_a) {
5420
5434
  var checkboxId = React.useMemo(function () { return nextId__default["default"]('tree-view-item-'); }, []);
5421
5435
  return (React__default["default"].createElement(reactAriaComponents.TreeItem, { id: id, textValue: textValue, className: "TreeView__item" },
5422
5436
  React__default["default"].createElement(reactAriaComponents.TreeItemContent, null, function (_a) {
5423
- var selectionMode = _a.selectionMode, isSelected = _a.isSelected;
5437
+ var selectionMode = _a.selectionMode, isSelected = _a.isSelected, isDisabled = _a.isDisabled;
5424
5438
  return (React__default["default"].createElement(React__default["default"].Fragment, null,
5425
5439
  React__default["default"].createElement(reactAriaComponents.Button, { slot: "chevron", className: "TreeView__chevron" },
5426
5440
  React__default["default"].createElement(Icon, { type: "chevron-right" })),
5427
- selectionMode !== 'none' ? (React__default["default"].createElement(Checkbox, { id: checkboxId, label: textValue, checked: isSelected, controlled: true, tabIndex: -1 })) : (React__default["default"].createElement(React__default["default"].Fragment, null, textValue))));
5441
+ 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))));
5428
5442
  }),
5429
5443
  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))); })))));
5430
5444
  };
5431
5445
  TreeViewItem.displayName = 'TreeViewItem';
5432
5446
 
5447
+ /** Every node id in the tree, flattened depth-first. */
5433
5448
  function collectAllKeys(nodes) {
5434
5449
  return nodes.flatMap(function (node) { return tslib.__spreadArray([
5435
5450
  node.id
5436
5451
  ], tslib.__read((node.children ? collectAllKeys(node.children) : [])), false); });
5437
5452
  }
5438
- var TreeView = React.forwardRef(function (_a, ref) {
5439
- var items = _a.items, onAction = _a.onAction, _b = _a.selectionMode, selectionMode = _b === void 0 ? 'none' : _b, defaultExpandedKeys = _a.defaultExpandedKeys, className = _a.className, other = tslib.__rest(_a, ["items", "onAction", "selectionMode", "defaultExpandedKeys", "className"]);
5440
- var _c = tslib.__read(React.useState(new Set()), 2), selectedKeys = _c[0], setSelectedKeys = _c[1];
5441
- var handleAction = function (key) {
5442
- setSelectedKeys(function (prev) {
5443
- var prevSet = prev === 'all' ? new Set(collectAllKeys(items)) : new Set(prev);
5444
- var next = new Set(prevSet);
5445
- if (next.has(key)) {
5446
- next.delete(key);
5453
+ /** Normalize react-aria's `Selection` ("all" | Set) into a concrete Set of keys. */
5454
+ function toKeySet(selection, nodes) {
5455
+ if (selection !== 'all') {
5456
+ return new Set(selection);
5457
+ }
5458
+ // "Select all" only includes selectable (non-disabled) nodes.
5459
+ var disabled = new Set(collectDisabledKeys(nodes));
5460
+ return new Set(collectAllKeys(nodes).filter(function (key) { return !disabled.has(key); }));
5461
+ }
5462
+ /** Locate a node anywhere in the tree by its id. */
5463
+ function findNode(nodes, key) {
5464
+ var e_1, _a;
5465
+ try {
5466
+ for (var nodes_1 = tslib.__values(nodes), nodes_1_1 = nodes_1.next(); !nodes_1_1.done; nodes_1_1 = nodes_1.next()) {
5467
+ var node = nodes_1_1.value;
5468
+ if (node.id === key) {
5469
+ return node;
5447
5470
  }
5448
- else {
5449
- if (selectionMode === 'single') {
5450
- next.clear();
5471
+ if (node.children) {
5472
+ var found = findNode(node.children, key);
5473
+ if (found) {
5474
+ return found;
5451
5475
  }
5452
- next.add(key);
5453
5476
  }
5454
- return next;
5477
+ }
5478
+ }
5479
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
5480
+ finally {
5481
+ try {
5482
+ if (nodes_1_1 && !nodes_1_1.done && (_a = nodes_1.return)) _a.call(nodes_1);
5483
+ }
5484
+ finally { if (e_1) throw e_1.error; }
5485
+ }
5486
+ return undefined;
5487
+ }
5488
+ /** All descendant ids of a node (not including the node itself). */
5489
+ function collectDescendantKeys(node) {
5490
+ if (!node.children) {
5491
+ return [];
5492
+ }
5493
+ return node.children.flatMap(function (child) { return tslib.__spreadArray([
5494
+ child.id
5495
+ ], tslib.__read(collectDescendantKeys(child)), false); });
5496
+ }
5497
+ /** Ids of all disabled nodes (rendered disabled / non-selectable). */
5498
+ function collectDisabledKeys(nodes) {
5499
+ 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); });
5500
+ }
5501
+ /**
5502
+ * Toggle a single node, applying cascade per the options (multiple mode only):
5503
+ * - selecting + `cascadeSelect`: also selects all (non-disabled) descendants.
5504
+ * - deselecting + `cascadeDeselect`: also deselects all descendants.
5505
+ *
5506
+ * In `single` mode only the clicked node is selected (clicking it again clears
5507
+ * it); cascade does not apply.
5508
+ */
5509
+ function toggleSelection(nodes, previous, key, selectionMode, _a) {
5510
+ var cascadeSelect = _a.cascadeSelect, cascadeDeselect = _a.cascadeDeselect;
5511
+ if (selectionMode === 'single') {
5512
+ var result_1 = new Set();
5513
+ if (!previous.has(key)) {
5514
+ result_1.add(key);
5515
+ }
5516
+ return result_1;
5517
+ }
5518
+ var result = new Set(previous);
5519
+ var node = findNode(nodes, key);
5520
+ var descendants = node ? collectDescendantKeys(node) : [];
5521
+ var disabled = new Set(collectDisabledKeys(nodes));
5522
+ if (!previous.has(key)) {
5523
+ result.add(key);
5524
+ if (cascadeSelect) {
5525
+ descendants.forEach(function (k) {
5526
+ if (!disabled.has(k)) {
5527
+ result.add(k);
5528
+ }
5529
+ });
5530
+ }
5531
+ }
5532
+ else {
5533
+ result.delete(key);
5534
+ if (cascadeDeselect) {
5535
+ descendants.forEach(function (k) { return result.delete(k); });
5536
+ }
5537
+ }
5538
+ return result;
5539
+ }
5540
+ /**
5541
+ * Apply react-aria's proposed selection while enforcing cascade. Each key
5542
+ * react-aria added cascades to its descendants when `cascadeSelect` is set; each
5543
+ * key it removed cascades when `cascadeDeselect` is set. In non-multiple modes
5544
+ * (or with both toggles off) the proposed selection is used as-is.
5545
+ */
5546
+ function applyCascade(nodes, previous, next, selectionMode, _a) {
5547
+ var cascadeSelect = _a.cascadeSelect, cascadeDeselect = _a.cascadeDeselect;
5548
+ if (selectionMode !== 'multiple' || (!cascadeSelect && !cascadeDeselect)) {
5549
+ return next;
5550
+ }
5551
+ var result = new Set(previous);
5552
+ var added = tslib.__spreadArray([], tslib.__read(next), false).filter(function (key) { return !previous.has(key); });
5553
+ var removed = tslib.__spreadArray([], tslib.__read(previous), false).filter(function (key) { return !next.has(key); });
5554
+ var disabled = new Set(collectDisabledKeys(nodes));
5555
+ added.forEach(function (key) {
5556
+ result.add(key);
5557
+ if (cascadeSelect) {
5558
+ var node = findNode(nodes, key);
5559
+ (node ? collectDescendantKeys(node) : []).forEach(function (k) {
5560
+ if (!disabled.has(k)) {
5561
+ result.add(k);
5562
+ }
5563
+ });
5564
+ }
5565
+ });
5566
+ removed.forEach(function (key) {
5567
+ result.delete(key);
5568
+ if (cascadeDeselect) {
5569
+ var node = findNode(nodes, key);
5570
+ (node ? collectDescendantKeys(node) : []).forEach(function (k) {
5571
+ return result.delete(k);
5572
+ });
5573
+ }
5574
+ });
5575
+ return result;
5576
+ }
5577
+
5578
+ var TreeView = React.forwardRef(function (_a, ref) {
5579
+ 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"]);
5580
+ var _e = tslib.__read(React.useState(new Set()), 2), selectedKeys = _e[0], setSelectedKeys = _e[1];
5581
+ var cascade = { cascadeSelect: cascadeSelect, cascadeDeselect: cascadeDeselect };
5582
+ // Cascade only applies to multiple selection.
5583
+ var isCascade = selectionMode === 'multiple' && (cascadeSelect || cascadeDeselect);
5584
+ // Selection driven by react-aria (row/checkbox press, keyboard). When
5585
+ // cascading, reconcile the proposed change; otherwise store react-aria's
5586
+ // selection as-is so the `'all'` sentinel (Ctrl+A) is preserved.
5587
+ var handleSelectionChange = function (selection) {
5588
+ setSelectedKeys(function (prev) {
5589
+ return isCascade
5590
+ ? applyCascade(items, toKeySet(prev, items), toKeySet(selection, items), selectionMode, cascade)
5591
+ : selection;
5455
5592
  });
5456
- onAction === null || onAction === void 0 ? void 0 : onAction(key);
5457
5593
  };
5458
- var actionProps = onAction
5459
- ? {
5460
- onAction: handleAction,
5461
- selectedKeys: selectedKeys,
5462
- onSelectionChange: setSelectedKeys
5594
+ // When `onAction` is set, react-aria treats a row press as an action rather
5595
+ // than a selection, so we toggle selection here ourselves.
5596
+ var handleAction = function (key) {
5597
+ if (selectionMode !== 'none') {
5598
+ setSelectedKeys(function (prev) {
5599
+ return toggleSelection(items, toKeySet(prev, items), key, selectionMode, cascade);
5600
+ });
5463
5601
  }
5602
+ onAction === null || onAction === void 0 ? void 0 : onAction(key);
5603
+ };
5604
+ // Disabled nodes are non-selectable; react-aria disables them via disabledKeys.
5605
+ var disabledKeys = React.useMemo(function () { return collectDisabledKeys(items); }, [items]);
5606
+ // Cascade requires controlling selection. Without it, preserve the original
5607
+ // behavior: selection is only controlled when an `onAction` handler is set.
5608
+ var selectionProps = selectionMode !== 'none' && (isCascade || onAction)
5609
+ ? { selectedKeys: selectedKeys, onSelectionChange: handleSelectionChange }
5464
5610
  : {};
5465
- return (React__default["default"].createElement(reactAriaComponents.Tree, tslib.__assign({ ref: ref, className: classNames__default["default"]('TreeView', className), selectionMode: selectionMode, defaultExpandedKeys: defaultExpandedKeys }, actionProps, other), items.map(function (item) { return (React__default["default"].createElement(TreeViewItem, tslib.__assign({ key: item.id }, item))); })));
5611
+ 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))); })));
5466
5612
  });
5467
5613
  TreeView.displayName = 'TreeView';
5468
5614