@deque/cauldron-react 7.1.0-canary.d4fda8b7 → 7.1.0-canary.d6d44789

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 (106) 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/ClickOutsideListener/index.d.ts +1 -1
  25. package/lib/components/Combobox/Combobox.d.ts +1 -1
  26. package/lib/components/Dialog/DialogContext.d.ts +1 -1
  27. package/lib/components/Dialog/index.d.ts +1 -1
  28. package/lib/components/Drawer/index.d.ts +1 -1
  29. package/lib/components/ExpandCollapsePanel/ExpandCollapsePanel.d.ts +1 -1
  30. package/lib/components/Listbox/Listbox.d.ts +7 -2
  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 +252 -97
  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.js +1 -1
  89. package/lib/step-back.js +1 -1
  90. package/lib/step-forward.js +1 -1
  91. package/lib/sun.js +1 -1
  92. package/lib/table-sort-ascending.js +1 -1
  93. package/lib/table-sort-descending.js +1 -1
  94. package/lib/tag.js +1 -1
  95. package/lib/target.js +1 -1
  96. package/lib/trash.js +1 -1
  97. package/lib/triangle.js +1 -1
  98. package/lib/twitter.js +1 -1
  99. package/lib/types.d.ts +1 -1
  100. package/lib/upload.js +1 -1
  101. package/lib/utils/getChildRef.d.ts +2 -0
  102. package/lib/utils/polymorphicComponent.d.ts +1 -1
  103. package/lib/utils/useFocusTrap.d.ts +1 -1
  104. package/lib/utils/useMnemonics.d.ts +2 -2
  105. package/lib/utils/useSharedRef.d.ts +3 -3
  106. package/package.json +28 -27
package/lib/index.js CHANGED
@@ -495,24 +495,25 @@ var Accordion = function (_a) {
495
495
  var childrenArray = React__default["default"].Children.toArray(children);
496
496
  var trigger = childrenArray.find(function (child) {
497
497
  return typeof child === 'string' ||
498
- child.type === AccordionTrigger;
498
+ (React__default["default"].isValidElement(child) && child.type === AccordionTrigger);
499
499
  });
500
500
  var panelElement = childrenArray.find(function (child) {
501
501
  return typeof child === 'string' ||
502
- child.type === AccordionContent;
502
+ (React__default["default"].isValidElement(child) && child.type === AccordionContent);
503
503
  });
504
- var isValid = !!(React__default["default"].isValidElement(trigger) && React__default["default"].isValidElement(panelElement));
505
- if (!isValid) {
504
+ if (!React__default["default"].isValidElement(trigger) ||
505
+ !React__default["default"].isValidElement(panelElement)) {
506
506
  console.warn('Must provide <AccordionTrigger /> and <AccordionContent /> element(s). You provided:', {
507
507
  trigger: trigger,
508
508
  panelElement: panelElement,
509
- isValid: isValid
509
+ isValid: false
510
510
  });
511
511
  return null;
512
512
  }
513
+ var panelProps = panelElement.props;
513
514
  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),
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),
516
517
  panelElement)));
517
518
  };
518
519
  Accordion.displayName = 'Accordion';
@@ -578,7 +579,9 @@ var Scrim = /** @class */ (function (_super) {
578
579
  if (destroy) {
579
580
  return null;
580
581
  }
581
- 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) }));
582
585
  };
583
586
  return Scrim;
584
587
  }(React__default["default"].Component));
@@ -807,9 +810,16 @@ function resolveElement(elementOrRef) {
807
810
  return null;
808
811
  }
809
812
 
813
+ function getChildRef(child, version) {
814
+ if (version === void 0) { version = React__default["default"].version; }
815
+ return parseInt(version, 10) >= 19
816
+ ? child.props.ref
817
+ : child.ref;
818
+ }
819
+
810
820
  function ClickOutsideListener(_a, ref) {
811
821
  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();
822
+ var childElementRef = React.useRef(null);
813
823
  var handleEvent = function (event) {
814
824
  if (event.defaultPrevented) {
815
825
  return;
@@ -832,9 +842,8 @@ function ClickOutsideListener(_a, ref) {
832
842
  childElementRef.current = node;
833
843
  // Ref for this component should pass-through to the child node
834
844
  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;
845
+ // Forward the child's own ref. In React 19 ref lives in props; in 16–18 it's element.ref.
846
+ var childRef = getChildRef(children);
838
847
  setRef(childRef, node);
839
848
  };
840
849
  React.useEffect(function () {
@@ -1343,7 +1352,7 @@ var AriaIsolate = /** @class */ (function () {
1343
1352
 
1344
1353
  /**
1345
1354
  * 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
1355
+ * forwarded ref, useSharedRef will return a RefObject<T | null> that will
1347
1356
  * correctly invoke the parent ref as well providing an internal ref.
1348
1357
  *
1349
1358
  * @example
@@ -1356,7 +1365,7 @@ var AriaIsolate = /** @class */ (function () {
1356
1365
  * })
1357
1366
  */
1358
1367
  function useSharedRef(ref) {
1359
- var internalRef = React.useRef();
1368
+ var internalRef = React.useRef(null);
1360
1369
  React.useEffect(function () {
1361
1370
  setRef(ref, internalRef.current);
1362
1371
  return function () { return setRef(ref, null); };
@@ -1489,7 +1498,7 @@ function useFocusTrap(target, options) {
1489
1498
  if (options === void 0) { options = {}; }
1490
1499
  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
1500
  var focusTrap = React.useRef(null);
1492
- var returnFocusElementRef = React.useRef();
1501
+ var returnFocusElementRef = React.useRef(null);
1493
1502
  function restoreFocusToReturnFocusElement() {
1494
1503
  var _a;
1495
1504
  var resolvedReturnFocusElement = resolveElement(returnFocusElement);
@@ -1539,7 +1548,7 @@ var Dialog = React.forwardRef(function (_a, ref) {
1539
1548
  var dialogRef = useSharedRef(dialogRefProp || ref);
1540
1549
  var _g = tslib.__read(nextId.useId(1, 'dialog-title-'), 1), headingId = _g[0];
1541
1550
  var headingRef = React.useRef(null);
1542
- var isolatorRef = React.useRef();
1551
+ var isolatorRef = React.useRef(null);
1543
1552
  var headingLevel = typeof heading === 'object' && 'level' in heading && heading.level
1544
1553
  ? heading.level
1545
1554
  : 2;
@@ -2134,7 +2143,7 @@ var looksLikeLink = function (props) {
2134
2143
  };
2135
2144
  var IconButton = React.forwardRef(function (_a, ref) {
2136
2145
  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();
2146
+ var internalRef = React.useRef(null);
2138
2147
  React.useImperativeHandle(ref, function () { return internalRef.current; });
2139
2148
  // Configure additional properties based on the type of the Component
2140
2149
  // for accessibility
@@ -2696,7 +2705,7 @@ Checkbox.displayName = 'Checkbox';
2696
2705
  */
2697
2706
  function TooltipTabstop(_a) {
2698
2707
  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();
2708
+ var buttonRef = React.useRef(null);
2700
2709
  return (React__default["default"].createElement(React__default["default"].Fragment, null,
2701
2710
  React__default["default"].createElement("button", tslib.__assign({ type: "button", ref: buttonRef, "aria-disabled": "true", className: classNames__default["default"]('TooltipTabstop', className) }, buttonProps), children),
2702
2711
  React__default["default"].createElement(Tooltip, { target: buttonRef, variant: variant, association: association, show: show, placement: placement, portal: portal, hideElementOnHidden: hideElementOnHidden }, tooltip)));
@@ -3540,7 +3549,7 @@ var TwoColumnPanel = React.forwardRef(function (_a, ref) {
3540
3549
  var closeButtonRef = React.useRef(null);
3541
3550
  var columnLeftRef = React.useRef(null);
3542
3551
  var columnRightRef = React.useRef(null);
3543
- var columnLeft = React__default["default"].Children.toArray(children).find(function (child) { return child.type === ColumnLeft; });
3552
+ var columnLeft = React__default["default"].Children.toArray(children).find(function (child) { return React__default["default"].isValidElement(child) && child.type === ColumnLeft; });
3544
3553
  var togglePanel = function () {
3545
3554
  var prefersReducedMotion = 'matchMedia' in window &&
3546
3555
  typeof matchMedia === 'function' &&
@@ -3573,16 +3582,17 @@ var TwoColumnPanel = React.forwardRef(function (_a, ref) {
3573
3582
  var ColumnLeftComponent;
3574
3583
  var columnLeftId;
3575
3584
  if (React.isValidElement(columnLeft)) {
3576
- var ref_1 = columnLeft.props.ref || columnLeftRef;
3585
+ var columnLeftProps = columnLeft.props;
3586
+ var ref_1 = columnLeftProps.ref || columnLeftRef;
3577
3587
  var id = (columnLeftId =
3578
- columnLeft.props.id || nextId.useId(undefined, 'sidebar-')[0]);
3588
+ columnLeftProps.id || nextId.useId(undefined, 'sidebar-')[0]);
3579
3589
  var CloseButton = (React__default["default"].createElement("div", { className: "TwoColumnPanel__Close" },
3580
3590
  React__default["default"].createElement("button", { type: "button", onClick: togglePanel, ref: closeButtonRef, "aria-label": hideCollapsedPanelLabel },
3581
3591
  React__default["default"].createElement(Icon, { type: "close" })),
3582
3592
  React__default["default"].createElement(Tooltip, { target: closeButtonRef, association: "aria-labelledby", hideElementOnHidden: true }, hideCollapsedPanelLabel)));
3583
3593
  var children_1 = tslib.__spreadArray([
3584
3594
  CloseButton
3585
- ], tslib.__read(React__default["default"].Children.toArray(columnLeft.props.children)), false);
3595
+ ], tslib.__read(React__default["default"].Children.toArray(columnLeftProps.children)), false);
3586
3596
  ColumnLeftComponent = React.cloneElement(columnLeft, { id: id, ref: ref_1, tabIndex: -1 }, children_1.map(function (child, index) {
3587
3597
  return React.cloneElement(child, {
3588
3598
  key: child.key
@@ -3591,17 +3601,18 @@ var TwoColumnPanel = React.forwardRef(function (_a, ref) {
3591
3601
  });
3592
3602
  }));
3593
3603
  }
3594
- var columnRight = React__default["default"].Children.toArray(children).find(function (child) { return child.type === ColumnRight; });
3604
+ var columnRight = React__default["default"].Children.toArray(children).find(function (child) { return React__default["default"].isValidElement(child) && child.type === ColumnRight; });
3595
3605
  var ColumnRightComponent;
3596
3606
  if (React.isValidElement(columnRight)) {
3597
- var ref_2 = columnRight.props.ref || columnRightRef;
3607
+ var columnRightProps = columnRight.props;
3608
+ var ref_2 = columnRightProps.ref || columnRightRef;
3598
3609
  var ToggleButton = (React__default["default"].createElement("div", { className: "TwoColumnPanel__ButtonToggle" },
3599
3610
  React__default["default"].createElement("button", { type: "button", onClick: togglePanel, ref: toggleButtonRef, "aria-label": !isCollapsed ? hideCollapsedPanelLabel : showCollapsedPanelLabel, "aria-expanded": !isCollapsed, "aria-controls": columnLeftId },
3600
3611
  React__default["default"].createElement(Icon, { type: !isCollapsed ? 'chevron-double-left' : 'chevron-double-right' })),
3601
3612
  React__default["default"].createElement(Tooltip, { target: toggleButtonRef, association: "aria-labelledby", hideElementOnHidden: true }, !isCollapsed ? hideCollapsedPanelLabel : showCollapsedPanelLabel)));
3602
3613
  var children_2 = tslib.__spreadArray([
3603
3614
  ToggleButton
3604
- ], tslib.__read(React__default["default"].Children.toArray(columnRight.props.children)), false);
3615
+ ], tslib.__read(React__default["default"].Children.toArray(columnRightProps.children)), false);
3605
3616
  ColumnRightComponent = React.cloneElement(columnRight, { ref: ref_2, tabIndex: -1 }, children_2.map(function (child, index) {
3606
3617
  return React.cloneElement(child, {
3607
3618
  key: child.key
@@ -3787,7 +3798,8 @@ var Listbox = React.forwardRef(function (_a, ref) {
3787
3798
  }
3788
3799
  }, [activeOption]);
3789
3800
  React.useEffect(function () {
3790
- if (isActiveControlled && controlledActiveOption !== activeOption) {
3801
+ if (isActiveControlled &&
3802
+ (controlledActiveOption === null || controlledActiveOption === void 0 ? void 0 : controlledActiveOption.element) !== (activeOption === null || activeOption === void 0 ? void 0 : activeOption.element)) {
3791
3803
  setActiveOption(controlledActiveOption || null);
3792
3804
  }
3793
3805
  }, [isActiveControlled, controlledActiveOption]);
@@ -3933,11 +3945,11 @@ function isElementPreceding(a, b) {
3933
3945
  }
3934
3946
  var ListboxOption = React.forwardRef(function (_a, ref) {
3935
3947
  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;
3948
+ var _c, _d;
3949
+ 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"]);
3950
+ var _g = useListboxContext(), active = _g.active, selected = _g.selected, setOptions = _g.setOptions, onSelect = _g.onSelect;
3939
3951
  var listboxOptionRef = useSharedRef(ref);
3940
- var _g = tslib.__read(propId ? [propId] : nextId.useId(1, 'listbox-option'), 1), id = _g[0];
3952
+ var _h = tslib.__read(propId ? [propId] : nextId.useId(1, 'listbox-option'), 1), id = _h[0];
3941
3953
  var isActive = (active === null || active === void 0 ? void 0 : active.element) === listboxOptionRef.current;
3942
3954
  var isSelected = typeof selectedProp === 'boolean'
3943
3955
  ? selectedProp
@@ -3945,15 +3957,15 @@ var ListboxOption = React.forwardRef(function (_a, ref) {
3945
3957
  !!selected.find(function (option) { return option.element === listboxOptionRef.current; });
3946
3958
  var optionValue = typeof value !== 'undefined'
3947
3959
  ? value
3948
- : (_c = listboxOptionRef.current) === null || _c === void 0 ? void 0 : _c.innerText;
3960
+ : ((_d = (_c = listboxOptionRef.current) === null || _c === void 0 ? void 0 : _c.textContent) !== null && _d !== void 0 ? _d : undefined);
3949
3961
  React.useEffect(function () {
3950
3962
  var element = listboxOptionRef.current;
3951
3963
  setOptions(function (options) {
3952
3964
  var e_1, _a;
3953
- var option = { element: element, value: optionValue };
3954
3965
  // istanbul ignore next
3955
3966
  if (!element)
3956
3967
  return options;
3968
+ var option = { element: element, value: optionValue };
3957
3969
  // Elements are frequently appended, so check to see if the newly rendered
3958
3970
  // element follows the last element first before any other checks
3959
3971
  if (!options.length ||
@@ -4140,7 +4152,7 @@ var ComboboxOption = React.forwardRef(function (_a, ref) {
4140
4152
  // istanbul ignore next
4141
4153
  React.useLayoutEffect(function () {
4142
4154
  var intersectionEntry = intersectionRef.current;
4143
- if (!intersectionEntry || !isActive) {
4155
+ if (!intersectionEntry || !isActive || !comboboxOptionRef.current) {
4144
4156
  return;
4145
4157
  }
4146
4158
  var rect = comboboxOptionRef.current.getBoundingClientRect();
@@ -4156,10 +4168,10 @@ var ComboboxOption = React.forwardRef(function (_a, ref) {
4156
4168
  }
4157
4169
  }, [isActive]);
4158
4170
  React.useEffect(function () {
4159
- var _a;
4171
+ var _a, _b;
4160
4172
  var comboboxValue = typeof propValue !== 'undefined'
4161
4173
  ? propValue
4162
- : (_a = comboboxOptionRef.current) === null || _a === void 0 ? void 0 : _a.innerText;
4174
+ : ((_b = (_a = comboboxOptionRef.current) === null || _a === void 0 ? void 0 : _a.textContent) !== null && _b !== void 0 ? _b : undefined);
4163
4175
  var value = typeof formValue === 'undefined' ? comboboxValue : formValue;
4164
4176
  setFormValues(function (prev) {
4165
4177
  var formValues = prev.filter(function (fv) { return fv !== value; });
@@ -4178,12 +4190,14 @@ var ComboboxOption = React.forwardRef(function (_a, ref) {
4178
4190
  });
4179
4191
  }, [selectedValues, formValue]);
4180
4192
  React.useEffect(function () {
4181
- var _a;
4193
+ var _a, _b;
4182
4194
  if (isMatching) {
4183
4195
  var comboboxValue_1 = typeof propValue !== 'undefined'
4184
4196
  ? propValue
4185
- : (_a = comboboxOptionRef.current) === null || _a === void 0 ? void 0 : _a.innerText;
4197
+ : ((_b = (_a = comboboxOptionRef.current) === null || _a === void 0 ? void 0 : _a.textContent) !== null && _b !== void 0 ? _b : undefined);
4186
4198
  setMatchingOptions(function (options) {
4199
+ if (!comboboxOptionRef.current)
4200
+ return options;
4187
4201
  return new Map(options.set(comboboxOptionRef.current, {
4188
4202
  value: comboboxValue_1,
4189
4203
  displayValue: children,
@@ -4323,6 +4337,17 @@ var Combobox = React.forwardRef(function (_a, ref) {
4323
4337
  return value === lastSelectedValue;
4324
4338
  }) || [], 2), element = _a[0], option = _a[1];
4325
4339
  if (autocomplete === 'manual') {
4340
+ // In multiselect, the listbox manages its own active option via
4341
+ // keyboard navigation. When the last-selected value no longer
4342
+ // matches any option (e.g. after deselecting the only selected
4343
+ // option), preserve the existing active descendant so the next
4344
+ // Enter keypress can re-toggle the highlighted option.
4345
+ if (multiselect &&
4346
+ !element &&
4347
+ activeDescendant &&
4348
+ matchingOptions.has(activeDescendant.element)) {
4349
+ return;
4350
+ }
4326
4351
  setActiveDescendant(!element ? null : tslib.__assign({ element: element }, option));
4327
4352
  }
4328
4353
  else if (autocomplete === 'automatic' &&
@@ -4502,6 +4527,7 @@ var Combobox = React.forwardRef(function (_a, ref) {
4502
4527
  });
4503
4528
  }, [disabled, selectedValues, onSelectionChange]);
4504
4529
  var handlePillKeyDown = React.useCallback(function (event) {
4530
+ var _a, _b;
4505
4531
  if (!PillKeys.includes(event.key)) {
4506
4532
  return;
4507
4533
  }
@@ -4519,7 +4545,7 @@ var Combobox = React.forwardRef(function (_a, ref) {
4519
4545
  handleRemovePill(pillsRef.current[focusedIndex], selectedValues[focusedIndex]);
4520
4546
  var nextIndex = focusedIndex + 1;
4521
4547
  if (nextIndex == pillsLength) {
4522
- inputRef.current.focus();
4548
+ (_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.focus();
4523
4549
  }
4524
4550
  else {
4525
4551
  pillsRef.current[nextIndex].focus();
@@ -4528,7 +4554,7 @@ var Combobox = React.forwardRef(function (_a, ref) {
4528
4554
  else if (isArrowLeft || isArrowRight) {
4529
4555
  var nextIndex = Math.max(focusedIndex + (isArrowLeft ? -1 : 1), 0);
4530
4556
  if (isArrowRight && nextIndex === pillsLength) {
4531
- inputRef.current.focus();
4557
+ (_b = inputRef.current) === null || _b === void 0 ? void 0 : _b.focus();
4532
4558
  }
4533
4559
  else {
4534
4560
  pillsRef.current[nextIndex].focus();
@@ -4816,10 +4842,12 @@ var TextEllipsis = React__default["default"].forwardRef(function (_a, ref) {
4816
4842
  : overflowElement.clientWidth < overflowElement.scrollWidth);
4817
4843
  });
4818
4844
  };
4845
+ if (!sharedRef.current)
4846
+ return;
4819
4847
  var observer = new ResizeObserver(listener);
4820
4848
  observer.observe(sharedRef.current);
4821
4849
  return function () {
4822
- observer === null || observer === void 0 ? void 0 : observer.disconnect();
4850
+ observer.disconnect();
4823
4851
  };
4824
4852
  }, []);
4825
4853
  React.useEffect(function () {
@@ -4864,7 +4892,7 @@ var Drawer = React.forwardRef(function (_a, ref) {
4864
4892
  openRef.current = open;
4865
4893
  }, [open, setIsTransitioning]);
4866
4894
  React.useEffect(function () {
4867
- if (!isModal) {
4895
+ if (!isModal || !drawerRef.current) {
4868
4896
  return;
4869
4897
  }
4870
4898
  var isolator = new AriaIsolate(drawerRef.current);
@@ -5045,7 +5073,7 @@ function getActiveElement(root) {
5045
5073
  */
5046
5074
  function useMnemonics(_a) {
5047
5075
  var elementOrRef = _a.elementOrRef, matchingElementsSelector = _a.matchingElementsSelector, onMatch = _a.onMatch, _b = _a.enabled, enabled = _b === void 0 ? true : _b;
5048
- var containerRef = React.useRef();
5076
+ var containerRef = React.useRef(null);
5049
5077
  React.useEffect(function () {
5050
5078
  if (elementOrRef instanceof HTMLElement) {
5051
5079
  containerRef.current = elementOrRef;
@@ -5055,7 +5083,8 @@ function useMnemonics(_a) {
5055
5083
  }
5056
5084
  }, [elementOrRef]);
5057
5085
  React.useEffect(function () {
5058
- if (!enabled || !containerRef.current) {
5086
+ var listenerTarget = containerRef.current;
5087
+ if (!enabled || !listenerTarget) {
5059
5088
  return;
5060
5089
  }
5061
5090
  var keyboardHandler = function (event) {
@@ -5068,14 +5097,14 @@ function useMnemonics(_a) {
5068
5097
  if (event.key.length !== 1 || !/[a-z\d]/i.test(event.key)) {
5069
5098
  return;
5070
5099
  }
5071
- var container = containerRef.current;
5072
- if (!container) {
5100
+ var currentContainer = containerRef.current;
5101
+ if (!currentContainer) {
5073
5102
  return;
5074
5103
  }
5075
5104
  // Prevent default behavior and stop propagation for mnemonic keys
5076
5105
  event.preventDefault();
5077
5106
  event.stopPropagation();
5078
- var elements = Array.from(container.querySelectorAll(matchingElementsSelector !== null && matchingElementsSelector !== void 0 ? matchingElementsSelector : focusable__default["default"]));
5107
+ var elements = Array.from(currentContainer.querySelectorAll(matchingElementsSelector !== null && matchingElementsSelector !== void 0 ? matchingElementsSelector : focusable__default["default"]));
5079
5108
  var matchingElements = elements.filter(function (element) {
5080
5109
  return getAccessibleLabel(element).toLowerCase()[0] ===
5081
5110
  event.key.toLowerCase();
@@ -5083,7 +5112,7 @@ function useMnemonics(_a) {
5083
5112
  if (!matchingElements.length) {
5084
5113
  return;
5085
5114
  }
5086
- var currentActiveElement = getActiveElement(containerRef.current);
5115
+ var currentActiveElement = getActiveElement(currentContainer);
5087
5116
  var nextActiveElement = null;
5088
5117
  if (currentActiveElement) {
5089
5118
  nextActiveElement = matchingElements.find(function (element) {
@@ -5097,17 +5126,15 @@ function useMnemonics(_a) {
5097
5126
  onMatch(nextActiveElement !== null && nextActiveElement !== void 0 ? nextActiveElement : matchingElements[0]);
5098
5127
  }
5099
5128
  };
5100
- var container = containerRef.current;
5101
- container.addEventListener('keydown', keyboardHandler);
5102
- return function () { return container.removeEventListener('keydown', keyboardHandler); };
5129
+ listenerTarget.addEventListener('keydown', keyboardHandler);
5130
+ return function () { return listenerTarget.removeEventListener('keydown', keyboardHandler); };
5103
5131
  }, [enabled, containerRef, matchingElementsSelector, onMatch]);
5104
5132
  return containerRef;
5105
5133
  }
5106
5134
 
5107
5135
  var ActionList = React.forwardRef(function (_a, ref) {
5108
5136
  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"]);
5109
- var actionListContext = useActionListContext();
5110
- var activeElement = React.useRef();
5137
+ var activeElement = React.useRef(null);
5111
5138
  var _c = tslib.__read(React.useState(), 2), activeOption = _c[0], setActiveOption = _c[1];
5112
5139
  var handleActiveChange = React.useCallback(function (value) {
5113
5140
  activeElement.current = value === null || value === void 0 ? void 0 : value.element;
@@ -5118,22 +5145,18 @@ var ActionList = React.forwardRef(function (_a, ref) {
5118
5145
  onAction(key, event);
5119
5146
  }
5120
5147
  }, [onAction]);
5148
+ var handleMnemonicMatch = React.useCallback(function (element) {
5149
+ setActiveOption(function (prev) {
5150
+ return (prev === null || prev === void 0 ? void 0 : prev.element) === element ? prev : { element: element };
5151
+ });
5152
+ }, []);
5121
5153
  var containerRef = useMnemonics({
5122
- onMatch: function (element) {
5123
- setActiveOption({
5124
- element: element
5125
- });
5126
- },
5154
+ onMatch: handleMnemonicMatch,
5127
5155
  matchingElementsSelector: props.role === 'menu'
5128
5156
  ? '[role=menuitem],[role=menuitemcheckbox],[role=menuitemradio]'
5129
5157
  : '[role=option]'
5130
5158
  });
5131
- return (
5132
- // Note: we should be able to use listbox without passing a prop
5133
- // value for "multiselect"
5134
- // see: https://github.com/dequelabs/cauldron/issues/1890
5135
- // @ts-expect-error this should be allowed
5136
- React__default["default"].createElement(Listbox, tslib.__assign({ ref: function (element) {
5159
+ return (React__default["default"].createElement(Listbox, tslib.__assign({ ref: function (element) {
5137
5160
  if (ref) {
5138
5161
  setRef(ref, element);
5139
5162
  }
@@ -5142,7 +5165,7 @@ var ActionList = React.forwardRef(function (_a, ref) {
5142
5165
  /* Listbox comes with an explicit role of "listbox", but we want to either
5143
5166
  * use the role from props, or default to the intrinsic role */
5144
5167
  // eslint-disable-next-line jsx-a11y/aria-role
5145
- role: undefined, "aria-multiselectable": actionListContext.role === 'listbox' ? undefined : null, className: classNames__default["default"]('ActionList', className), activeOption: activeOption }, props, { onActiveChange: handleActiveChange, navigation: "bound" }),
5168
+ role: undefined, "aria-multiselectable": undefined, className: classNames__default["default"]('ActionList', className), activeOption: activeOption }, props, { onActiveChange: handleActiveChange, navigation: "bound" }),
5146
5169
  React__default["default"].createElement(ActionListProvider, { role: props.role || 'list', onAction: handleAction, selectionType: selectionType }, children)));
5147
5170
  });
5148
5171
  ActionList.displayName = 'ActionList';
@@ -5160,7 +5183,7 @@ var ActionListItem = React.forwardRef(function (_a, ref) {
5160
5183
  });
5161
5184
  var isActive = !!(active === null || active === void 0 ? void 0 : active.element) && active.element === actionListItemRef.current;
5162
5185
  var handleAction = React.useCallback(function (event) {
5163
- var _a;
5186
+ var _a, _b;
5164
5187
  if (event.defaultPrevented) {
5165
5188
  return;
5166
5189
  }
@@ -5173,7 +5196,7 @@ var ActionListItem = React.forwardRef(function (_a, ref) {
5173
5196
  }
5174
5197
  // istanbul ignore else
5175
5198
  if (typeof onActionListAction === 'function') {
5176
- onActionListAction(actionKey || ((_a = labelRef === null || labelRef === void 0 ? void 0 : labelRef.current) === null || _a === void 0 ? void 0 : _a.innerText.trim()) || '', event);
5199
+ onActionListAction(actionKey || ((_b = (_a = labelRef.current) === null || _a === void 0 ? void 0 : _a.textContent) === null || _b === void 0 ? void 0 : _b.trim()) || '', event);
5177
5200
  }
5178
5201
  }, [onAction, onActionListAction, selectionType, actionKey]);
5179
5202
  var listItemRole = undefined;
@@ -5197,7 +5220,7 @@ var ActionListItem = React.forwardRef(function (_a, ref) {
5197
5220
  // istanbul ignore next
5198
5221
  React.useLayoutEffect(function () {
5199
5222
  var intersectionEntry = intersectionRef.current;
5200
- if (!intersectionEntry || !isActive) {
5223
+ if (!intersectionEntry || !isActive || !actionListItemRef.current) {
5201
5224
  return;
5202
5225
  }
5203
5226
  var rect = actionListItemRef.current.getBoundingClientRect();
@@ -5296,9 +5319,10 @@ var ActionMenu = React.forwardRef(function (_a, ref) {
5296
5319
  var _e = tslib.__read(React.useState('first'), 2), focusStrategy = _e[0], setFocusStrategy = _e[1];
5297
5320
  var triggerRef = React.useRef(null);
5298
5321
  var actionMenuRef = useSharedRef(ref);
5299
- var actionMenuListRef = useSharedRef(actionMenuList.props.ref);
5300
- var _f = tslib.__read(nextId.useId(1, 'menu-trigger'), 1), triggerId = _f[0];
5301
- var _g = tslib.__read(nextId.useId(1, 'menu'), 1), menuId = _g[0];
5322
+ var _f = actionMenuList.props, actionListRef = _f.ref, actionListOnAction = _f.onAction;
5323
+ var actionMenuListRef = useSharedRef(actionListRef !== null && actionListRef !== void 0 ? actionListRef : null);
5324
+ var _g = tslib.__read(nextId.useId(1, 'menu-trigger'), 1), triggerId = _g[0];
5325
+ var _h = tslib.__read(nextId.useId(1, 'menu'), 1), menuId = _h[0];
5302
5326
  var handleTriggerClick = React.useCallback(function (event) {
5303
5327
  // istanbul ignore else
5304
5328
  if (!event.defaultPrevented) {
@@ -5345,11 +5369,10 @@ var ActionMenu = React.forwardRef(function (_a, ref) {
5345
5369
  if (!event.defaultPrevented) {
5346
5370
  setOpen(false);
5347
5371
  }
5348
- var onAction = actionMenuList.props.onAction;
5349
- if (typeof onAction === 'function') {
5350
- onAction(key, event);
5372
+ if (typeof actionListOnAction === 'function') {
5373
+ actionListOnAction(key, event);
5351
5374
  }
5352
- }, [actionMenuList.props.onAction]);
5375
+ }, [actionListOnAction]);
5353
5376
  React.useEffect(function () {
5354
5377
  var _a, _b;
5355
5378
  if (open) {
@@ -5415,49 +5438,181 @@ var TreeViewItem = function (_a) {
5415
5438
  var checkboxId = React.useMemo(function () { return nextId__default["default"]('tree-view-item-'); }, []);
5416
5439
  return (React__default["default"].createElement(reactAriaComponents.TreeItem, { id: id, textValue: textValue, className: "TreeView__item" },
5417
5440
  React__default["default"].createElement(reactAriaComponents.TreeItemContent, null, function (_a) {
5418
- var selectionMode = _a.selectionMode, isSelected = _a.isSelected;
5441
+ var selectionMode = _a.selectionMode, isSelected = _a.isSelected, isDisabled = _a.isDisabled;
5419
5442
  return (React__default["default"].createElement(React__default["default"].Fragment, null,
5420
5443
  React__default["default"].createElement(reactAriaComponents.Button, { slot: "chevron", className: "TreeView__chevron" },
5421
5444
  React__default["default"].createElement(Icon, { type: "chevron-right" })),
5422
- 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))));
5445
+ 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))));
5423
5446
  }),
5424
5447
  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))); })))));
5425
5448
  };
5426
5449
  TreeViewItem.displayName = 'TreeViewItem';
5427
5450
 
5451
+ /** Every node id in the tree, flattened depth-first. */
5428
5452
  function collectAllKeys(nodes) {
5429
5453
  return nodes.flatMap(function (node) { return tslib.__spreadArray([
5430
5454
  node.id
5431
5455
  ], tslib.__read((node.children ? collectAllKeys(node.children) : [])), false); });
5432
5456
  }
5433
- var TreeView = React.forwardRef(function (_a, ref) {
5434
- 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"]);
5435
- var _c = tslib.__read(React.useState(new Set()), 2), selectedKeys = _c[0], setSelectedKeys = _c[1];
5436
- var handleAction = function (key) {
5437
- setSelectedKeys(function (prev) {
5438
- var prevSet = prev === 'all' ? new Set(collectAllKeys(items)) : new Set(prev);
5439
- var next = new Set(prevSet);
5440
- if (next.has(key)) {
5441
- next.delete(key);
5457
+ /** Normalize react-aria's `Selection` ("all" | Set) into a concrete Set of keys. */
5458
+ function toKeySet(selection, nodes) {
5459
+ if (selection !== 'all') {
5460
+ return new Set(selection);
5461
+ }
5462
+ // "Select all" only includes selectable (non-disabled) nodes.
5463
+ var disabled = new Set(collectDisabledKeys(nodes));
5464
+ return new Set(collectAllKeys(nodes).filter(function (key) { return !disabled.has(key); }));
5465
+ }
5466
+ /** Locate a node anywhere in the tree by its id. */
5467
+ function findNode(nodes, key) {
5468
+ var e_1, _a;
5469
+ try {
5470
+ for (var nodes_1 = tslib.__values(nodes), nodes_1_1 = nodes_1.next(); !nodes_1_1.done; nodes_1_1 = nodes_1.next()) {
5471
+ var node = nodes_1_1.value;
5472
+ if (node.id === key) {
5473
+ return node;
5442
5474
  }
5443
- else {
5444
- if (selectionMode === 'single') {
5445
- next.clear();
5475
+ if (node.children) {
5476
+ var found = findNode(node.children, key);
5477
+ if (found) {
5478
+ return found;
5446
5479
  }
5447
- next.add(key);
5448
5480
  }
5449
- return next;
5481
+ }
5482
+ }
5483
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
5484
+ finally {
5485
+ try {
5486
+ if (nodes_1_1 && !nodes_1_1.done && (_a = nodes_1.return)) _a.call(nodes_1);
5487
+ }
5488
+ finally { if (e_1) throw e_1.error; }
5489
+ }
5490
+ return undefined;
5491
+ }
5492
+ /** All descendant ids of a node (not including the node itself). */
5493
+ function collectDescendantKeys(node) {
5494
+ if (!node.children) {
5495
+ return [];
5496
+ }
5497
+ return node.children.flatMap(function (child) { return tslib.__spreadArray([
5498
+ child.id
5499
+ ], tslib.__read(collectDescendantKeys(child)), false); });
5500
+ }
5501
+ /** Ids of all disabled nodes (rendered disabled / non-selectable). */
5502
+ function collectDisabledKeys(nodes) {
5503
+ 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); });
5504
+ }
5505
+ /**
5506
+ * Toggle a single node, applying cascade per the options (multiple mode only):
5507
+ * - selecting + `cascadeSelect`: also selects all (non-disabled) descendants.
5508
+ * - deselecting + `cascadeDeselect`: also deselects all descendants.
5509
+ *
5510
+ * In `single` mode only the clicked node is selected (clicking it again clears
5511
+ * it); cascade does not apply.
5512
+ */
5513
+ function toggleSelection(nodes, previous, key, selectionMode, _a) {
5514
+ var cascadeSelect = _a.cascadeSelect, cascadeDeselect = _a.cascadeDeselect;
5515
+ if (selectionMode === 'single') {
5516
+ var result_1 = new Set();
5517
+ if (!previous.has(key)) {
5518
+ result_1.add(key);
5519
+ }
5520
+ return result_1;
5521
+ }
5522
+ var result = new Set(previous);
5523
+ var node = findNode(nodes, key);
5524
+ var descendants = node ? collectDescendantKeys(node) : [];
5525
+ var disabled = new Set(collectDisabledKeys(nodes));
5526
+ if (!previous.has(key)) {
5527
+ result.add(key);
5528
+ if (cascadeSelect) {
5529
+ descendants.forEach(function (k) {
5530
+ if (!disabled.has(k)) {
5531
+ result.add(k);
5532
+ }
5533
+ });
5534
+ }
5535
+ }
5536
+ else {
5537
+ result.delete(key);
5538
+ if (cascadeDeselect) {
5539
+ descendants.forEach(function (k) { return result.delete(k); });
5540
+ }
5541
+ }
5542
+ return result;
5543
+ }
5544
+ /**
5545
+ * Apply react-aria's proposed selection while enforcing cascade. Each key
5546
+ * react-aria added cascades to its descendants when `cascadeSelect` is set; each
5547
+ * key it removed cascades when `cascadeDeselect` is set. In non-multiple modes
5548
+ * (or with both toggles off) the proposed selection is used as-is.
5549
+ */
5550
+ function applyCascade(nodes, previous, next, selectionMode, _a) {
5551
+ var cascadeSelect = _a.cascadeSelect, cascadeDeselect = _a.cascadeDeselect;
5552
+ if (selectionMode !== 'multiple' || (!cascadeSelect && !cascadeDeselect)) {
5553
+ return next;
5554
+ }
5555
+ var result = new Set(previous);
5556
+ var added = tslib.__spreadArray([], tslib.__read(next), false).filter(function (key) { return !previous.has(key); });
5557
+ var removed = tslib.__spreadArray([], tslib.__read(previous), false).filter(function (key) { return !next.has(key); });
5558
+ var disabled = new Set(collectDisabledKeys(nodes));
5559
+ added.forEach(function (key) {
5560
+ result.add(key);
5561
+ if (cascadeSelect) {
5562
+ var node = findNode(nodes, key);
5563
+ (node ? collectDescendantKeys(node) : []).forEach(function (k) {
5564
+ if (!disabled.has(k)) {
5565
+ result.add(k);
5566
+ }
5567
+ });
5568
+ }
5569
+ });
5570
+ removed.forEach(function (key) {
5571
+ result.delete(key);
5572
+ if (cascadeDeselect) {
5573
+ var node = findNode(nodes, key);
5574
+ (node ? collectDescendantKeys(node) : []).forEach(function (k) {
5575
+ return result.delete(k);
5576
+ });
5577
+ }
5578
+ });
5579
+ return result;
5580
+ }
5581
+
5582
+ var TreeView = React.forwardRef(function (_a, ref) {
5583
+ 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"]);
5584
+ var _e = tslib.__read(React.useState(new Set()), 2), selectedKeys = _e[0], setSelectedKeys = _e[1];
5585
+ var cascade = { cascadeSelect: cascadeSelect, cascadeDeselect: cascadeDeselect };
5586
+ // Cascade only applies to multiple selection.
5587
+ var isCascade = selectionMode === 'multiple' && (cascadeSelect || cascadeDeselect);
5588
+ // Selection driven by react-aria (row/checkbox press, keyboard). When
5589
+ // cascading, reconcile the proposed change; otherwise store react-aria's
5590
+ // selection as-is so the `'all'` sentinel (Ctrl+A) is preserved.
5591
+ var handleSelectionChange = function (selection) {
5592
+ setSelectedKeys(function (prev) {
5593
+ return isCascade
5594
+ ? applyCascade(items, toKeySet(prev, items), toKeySet(selection, items), selectionMode, cascade)
5595
+ : selection;
5450
5596
  });
5451
- onAction === null || onAction === void 0 ? void 0 : onAction(key);
5452
5597
  };
5453
- var actionProps = onAction
5454
- ? {
5455
- onAction: handleAction,
5456
- selectedKeys: selectedKeys,
5457
- onSelectionChange: setSelectedKeys
5598
+ // When `onAction` is set, react-aria treats a row press as an action rather
5599
+ // than a selection, so we toggle selection here ourselves.
5600
+ var handleAction = function (key) {
5601
+ if (selectionMode !== 'none') {
5602
+ setSelectedKeys(function (prev) {
5603
+ return toggleSelection(items, toKeySet(prev, items), key, selectionMode, cascade);
5604
+ });
5458
5605
  }
5606
+ onAction === null || onAction === void 0 ? void 0 : onAction(key);
5607
+ };
5608
+ // Disabled nodes are non-selectable; react-aria disables them via disabledKeys.
5609
+ var disabledKeys = React.useMemo(function () { return collectDisabledKeys(items); }, [items]);
5610
+ // Cascade requires controlling selection. Without it, preserve the original
5611
+ // behavior: selection is only controlled when an `onAction` handler is set.
5612
+ var selectionProps = selectionMode !== 'none' && (isCascade || onAction)
5613
+ ? { selectedKeys: selectedKeys, onSelectionChange: handleSelectionChange }
5459
5614
  : {};
5460
- 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))); })));
5615
+ 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))); })));
5461
5616
  });
5462
5617
  TreeView.displayName = 'TreeView';
5463
5618