@astryxdesign/core 0.7.7-canary.867728f → 0.7.7-canary.871bc3d

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 (160) hide show
  1. package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
  2. package/dist/BottomSheet/BottomSheet.js +76 -6
  3. package/dist/BottomSheet/BottomSheetPanel.d.ts.map +1 -1
  4. package/dist/BottomSheet/BottomSheetPanel.js +23 -4
  5. package/dist/BottomSheet/bottomSheetStack.d.ts.map +1 -1
  6. package/dist/BottomSheet/bottomSheetStack.js +5 -4
  7. package/dist/Button/Button.d.ts.map +1 -1
  8. package/dist/Button/Button.js +30 -2
  9. package/dist/ComplexSelector/ComplexSelector.d.ts +4 -1
  10. package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
  11. package/dist/ComplexSelector/ComplexSelector.js +14 -4
  12. package/dist/DateInput/MonthScroller.d.ts.map +1 -1
  13. package/dist/DateInput/MonthScroller.js +13 -27
  14. package/dist/DateInput/Wheel.d.ts.map +1 -1
  15. package/dist/DateInput/Wheel.js +22 -41
  16. package/dist/Field/Field.js +2 -2
  17. package/dist/HoverCard/HoverCard.d.ts.map +1 -1
  18. package/dist/HoverCard/HoverCard.js +27 -2
  19. package/dist/Layer/layerAnimations.stylex.d.ts +7 -8
  20. package/dist/Layer/layerAnimations.stylex.d.ts.map +1 -1
  21. package/dist/Layer/layerAnimations.stylex.js +25 -20
  22. package/dist/Layer/usePressPin.d.ts +17 -5
  23. package/dist/Layer/usePressPin.d.ts.map +1 -1
  24. package/dist/Layer/usePressPin.js +62 -12
  25. package/dist/PowerSearch/PowerSearch.d.ts +36 -3
  26. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  27. package/dist/PowerSearch/PowerSearch.js +522 -269
  28. package/dist/PowerSearch/PowerSearchBottomSheet.d.ts +100 -0
  29. package/dist/PowerSearch/PowerSearchBottomSheet.d.ts.map +1 -0
  30. package/dist/PowerSearch/PowerSearchBottomSheet.js +1913 -0
  31. package/dist/PowerSearch/PowerSearchEditPopover.d.ts +32 -1
  32. package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
  33. package/dist/PowerSearch/PowerSearchEditPopover.js +17 -6
  34. package/dist/PowerSearch/PowerSearchValueEditor.d.ts +38 -3
  35. package/dist/PowerSearch/PowerSearchValueEditor.d.ts.map +1 -1
  36. package/dist/PowerSearch/PowerSearchValueEditor.js +170 -61
  37. package/dist/PowerSearch/formatFilterValue.d.ts +7 -0
  38. package/dist/PowerSearch/formatFilterValue.d.ts.map +1 -1
  39. package/dist/PowerSearch/formatFilterValue.js +11 -1
  40. package/dist/PowerSearch/formatTokenValue.d.ts +28 -0
  41. package/dist/PowerSearch/formatTokenValue.d.ts.map +1 -0
  42. package/dist/PowerSearch/formatTokenValue.js +160 -0
  43. package/dist/PowerSearch/powerSearchSheetUtils.d.ts +65 -0
  44. package/dist/PowerSearch/powerSearchSheetUtils.d.ts.map +1 -0
  45. package/dist/PowerSearch/powerSearchSheetUtils.js +168 -0
  46. package/dist/RadioList/RadioList.d.ts.map +1 -1
  47. package/dist/RadioList/RadioList.js +3 -2
  48. package/dist/RadioList/RadioListItem.d.ts +1 -1
  49. package/dist/RadioList/RadioListItem.d.ts.map +1 -1
  50. package/dist/RadioList/RadioListItem.js +5 -3
  51. package/dist/SegmentedControl/useSegmentedSelectionMotion.d.ts.map +1 -1
  52. package/dist/SegmentedControl/useSegmentedSelectionMotion.js +3 -3
  53. package/dist/Slider/sliderTouchController.js +2 -2
  54. package/dist/Switch/useSwitchTouch.js +4 -4
  55. package/dist/Table/BaseTable.d.ts.map +1 -1
  56. package/dist/Table/BaseTable.js +29 -8
  57. package/dist/TextInput/TextInput.d.ts +2 -2
  58. package/dist/TextInput/TextInput.d.ts.map +1 -1
  59. package/dist/TextInput/TextInput.js +10 -7
  60. package/dist/Token/Token.d.ts +2 -2
  61. package/dist/Token/Token.d.ts.map +1 -1
  62. package/dist/Token/Token.js +12 -4
  63. package/dist/Token/TokenNamingContext.d.ts +14 -0
  64. package/dist/Token/TokenNamingContext.d.ts.map +1 -0
  65. package/dist/Token/TokenNamingContext.js +23 -0
  66. package/dist/Tooltip/useTooltip.d.ts +19 -1
  67. package/dist/Tooltip/useTooltip.d.ts.map +1 -1
  68. package/dist/Tooltip/useTooltip.js +24 -7
  69. package/dist/animator/createAnimator.d.ts +98 -0
  70. package/dist/animator/createAnimator.d.ts.map +1 -0
  71. package/dist/animator/createAnimator.js +259 -0
  72. package/dist/astryx.css +16 -4
  73. package/dist/gestures/GestureHost.d.ts +27 -1
  74. package/dist/gestures/GestureHost.d.ts.map +1 -1
  75. package/dist/gestures/GestureHost.js +90 -8
  76. package/dist/hooks/index.d.ts +1 -0
  77. package/dist/hooks/index.d.ts.map +1 -1
  78. package/dist/hooks/index.js +1 -0
  79. package/dist/hooks/useAnimator.d.ts +41 -0
  80. package/dist/hooks/useAnimator.d.ts.map +1 -0
  81. package/dist/hooks/useAnimator.js +70 -0
  82. package/dist/hooks/useAttachment.d.ts +1 -1
  83. package/dist/hooks/useAttachment.js +1 -1
  84. package/dist/hooks/useInputStatusIcon.d.ts +1 -1
  85. package/dist/hooks/useInputStatusIcon.d.ts.map +1 -1
  86. package/dist/hooks/useInputStatusIcon.js +2 -2
  87. package/dist/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.d.ts +8 -0
  88. package/dist/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.d.ts.map +1 -0
  89. package/dist/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.js +42 -0
  90. package/dist/i18n/generated-english/PowerSearch/PowerSearchValueEditor.generated.d.ts.map +1 -1
  91. package/dist/i18n/generated-english/PowerSearch/PowerSearchValueEditor.generated.js +6 -0
  92. package/dist/i18n/generated-english/PowerSearch/formatTokenValue.generated.d.ts +8 -0
  93. package/dist/i18n/generated-english/PowerSearch/formatTokenValue.generated.d.ts.map +1 -0
  94. package/dist/i18n/generated-english/PowerSearch/formatTokenValue.generated.js +14 -0
  95. package/dist/i18n/generated-locales/en.generated.d.ts.map +1 -1
  96. package/dist/i18n/generated-locales/en.generated.js +30 -0
  97. package/dist/i18n/generated-locales/pseudo.generated.d.ts.map +1 -1
  98. package/dist/i18n/generated-locales/pseudo.generated.js +30 -0
  99. package/dist/index.d.ts +1 -0
  100. package/dist/index.d.ts.map +1 -1
  101. package/dist/index.js +4 -0
  102. package/dist/motion/animator.d.ts +14 -14
  103. package/dist/motion/animator.d.ts.map +1 -1
  104. package/dist/motion/animator.js +41 -18
  105. package/dist/motion/reducedMotion.d.ts +24 -0
  106. package/dist/motion/reducedMotion.d.ts.map +1 -1
  107. package/dist/motion/reducedMotion.js +78 -1
  108. package/dist/utils/dateParser.d.ts.map +1 -1
  109. package/dist/utils/dateParser.js +12 -0
  110. package/locales/en.json +120 -0
  111. package/locales/pseudo.json +90 -0
  112. package/package.json +4 -4
  113. package/src/BottomSheet/BottomSheet.tsx +85 -5
  114. package/src/BottomSheet/BottomSheetPanel.tsx +40 -5
  115. package/src/BottomSheet/bottomSheetStack.ts +8 -4
  116. package/src/Button/Button.tsx +37 -1
  117. package/src/ComplexSelector/ComplexSelector.tsx +20 -5
  118. package/src/DateInput/MonthScroller.tsx +18 -22
  119. package/src/DateInput/Wheel.tsx +30 -32
  120. package/src/Field/Field.tsx +2 -2
  121. package/src/HoverCard/HoverCard.tsx +31 -1
  122. package/src/Layer/layerAnimations.stylex.ts +24 -16
  123. package/src/Layer/usePressPin.ts +81 -15
  124. package/src/PowerSearch/PowerSearch.doc.mjs +54 -5
  125. package/src/PowerSearch/PowerSearch.tsx +734 -288
  126. package/src/PowerSearch/PowerSearchBottomSheet.tsx +2515 -0
  127. package/src/PowerSearch/PowerSearchEditPopover.tsx +28 -6
  128. package/src/PowerSearch/PowerSearchValueEditor.tsx +203 -38
  129. package/src/PowerSearch/formatFilterValue.ts +18 -1
  130. package/src/PowerSearch/formatTokenValue.ts +215 -0
  131. package/src/PowerSearch/powerSearchSheetUtils.ts +224 -0
  132. package/src/RadioList/RadioList.tsx +3 -2
  133. package/src/RadioList/RadioListItem.tsx +5 -3
  134. package/src/SegmentedControl/useSegmentedSelectionMotion.ts +6 -3
  135. package/src/Slider/sliderTouchController.ts +2 -2
  136. package/src/Switch/useSwitchTouch.ts +4 -4
  137. package/src/Table/BaseTable.tsx +46 -12
  138. package/src/TextInput/TextInput.tsx +11 -10
  139. package/src/Token/Token.tsx +13 -4
  140. package/src/Token/TokenNamingContext.ts +28 -0
  141. package/src/Tooltip/useTooltip.doc.mjs +24 -0
  142. package/src/Tooltip/useTooltip.tsx +51 -6
  143. package/src/animator/createAnimator.doc.mjs +153 -0
  144. package/src/animator/createAnimator.ts +324 -0
  145. package/src/gestures/GestureHost.ts +105 -10
  146. package/src/hooks/index.ts +2 -0
  147. package/src/hooks/useAnimator.doc.mjs +109 -0
  148. package/src/hooks/useAnimator.ts +67 -0
  149. package/src/hooks/useAttachment.ts +1 -1
  150. package/src/hooks/useInputStatusIcon.tsx +3 -2
  151. package/src/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.ts +43 -0
  152. package/src/i18n/generated-english/PowerSearch/PowerSearchValueEditor.generated.ts +6 -0
  153. package/src/i18n/generated-english/PowerSearch/formatTokenValue.generated.ts +15 -0
  154. package/src/i18n/generated-locales/en.generated.ts +41 -0
  155. package/src/i18n/generated-locales/pseudo.generated.ts +42 -0
  156. package/src/index.ts +13 -0
  157. package/src/motion/README.md +7 -5
  158. package/src/motion/animator.ts +61 -29
  159. package/src/motion/reducedMotion.ts +79 -1
  160. package/src/utils/dateParser.ts +16 -0
@@ -1 +1 @@
1
- {"version":3,"file":"BottomSheet.d.ts","sourceRoot":"","sources":["../../src/BottomSheet/BottomSheet.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAuBH,OAAO,EAOL,KAAK,SAAS,EACd,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAIf,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,WAAW,CAAC;AAC7C,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,gBAAgB,CAAC;AAuDhD,YAAY,EAAC,iBAAiB,EAAE,oBAAoB,EAAC,MAAM,oBAAoB,CAAC;AAChF,OAAO,KAAK,EAAC,iBAAiB,EAAE,oBAAoB,EAAC,MAAM,oBAAoB,CAAC;AA6JhF,UAAU,sBAAuB,SAAQ,SAAS,CAAC,cAAc,CAAC;IAChE,qDAAqD;IACrD,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAEhC,sCAAsC;IACtC,KAAK,EAAE,MAAM,CAAC;IAEd,0EAA0E;IAC1E,QAAQ,EAAE,SAAS,CAAC;IAEpB;;;;;;;;OAQG;IACH,OAAO,CAAC,EAAE,WAAW,CAAC;IAEtB,wGAAwG;IACxG,MAAM,CAAC,EAAE,iBAAiB,GAAG,MAAM,GAAG,MAAM,CAAC;IAE7C;;;;;;;OAOG;IACH,UAAU,CAAC,EAAE,aAAa,CAAC,oBAAoB,CAAC,CAAC;IAEjD;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB;AAED,UAAU,0BAA2B,SAAQ,sBAAsB;IACjE,MAAM,EAAE,OAAO,CAAC;IAChB,YAAY,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IACxC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAC9C,OAAO,CAAC,EAAE,KAAK,CAAC;CACjB;AAED,UAAU,wBAAyB,SAAQ,sBAAsB;IAC/D;;;;OAIG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,KAAK,CAAC;IACf,YAAY,CAAC,EAAE,KAAK,CAAC;IACrB,QAAQ,CAAC,EAAE,KAAK,CAAC;CAClB;AAED,MAAM,MAAM,gBAAgB,GAC1B,0BAA0B,GAAG,wBAAwB,CAAC;AA21BxD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,+BA6BlD;yBA7Be,WAAW"}
1
+ {"version":3,"file":"BottomSheet.d.ts","sourceRoot":"","sources":["../../src/BottomSheet/BottomSheet.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAuBH,OAAO,EAOL,KAAK,SAAS,EACd,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAIf,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,WAAW,CAAC;AAC7C,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,gBAAgB,CAAC;AAwDhD,YAAY,EAAC,iBAAiB,EAAE,oBAAoB,EAAC,MAAM,oBAAoB,CAAC;AAChF,OAAO,KAAK,EAAC,iBAAiB,EAAE,oBAAoB,EAAC,MAAM,oBAAoB,CAAC;AAmLhF,UAAU,sBAAuB,SAAQ,SAAS,CAAC,cAAc,CAAC;IAChE,qDAAqD;IACrD,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAEhC,sCAAsC;IACtC,KAAK,EAAE,MAAM,CAAC;IAEd,0EAA0E;IAC1E,QAAQ,EAAE,SAAS,CAAC;IAEpB;;;;;;;;OAQG;IACH,OAAO,CAAC,EAAE,WAAW,CAAC;IAEtB,wGAAwG;IACxG,MAAM,CAAC,EAAE,iBAAiB,GAAG,MAAM,GAAG,MAAM,CAAC;IAE7C;;;;;;;OAOG;IACH,UAAU,CAAC,EAAE,aAAa,CAAC,oBAAoB,CAAC,CAAC;IAEjD;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB;AAED,UAAU,0BAA2B,SAAQ,sBAAsB;IACjE,MAAM,EAAE,OAAO,CAAC;IAChB,YAAY,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IACxC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAC9C,OAAO,CAAC,EAAE,KAAK,CAAC;CACjB;AAED,UAAU,wBAAyB,SAAQ,sBAAsB;IAC/D;;;;OAIG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,KAAK,CAAC;IACf,YAAY,CAAC,EAAE,KAAK,CAAC;IACrB,QAAQ,CAAC,EAAE,KAAK,CAAC;CAClB;AAED,MAAM,MAAM,gBAAgB,GAC1B,0BAA0B,GAAG,wBAAwB,CAAC;AAo5BxD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,+BA6BlD;yBA7Be,WAAW"}
@@ -58,6 +58,7 @@ import { colorVars, durationVars, easeVars, spacingVars } from "../theme/tokens.
58
58
  import { useDevWarning } from "../hooks/useDevWarning.js";
59
59
  import { useScrollLock } from "../hooks/useScrollLock.js";
60
60
  import { useMergedRefs } from "../hooks/useMergedRefs.js";
61
+ import { observeMutations } from "../utils/sharedMutationObserver.js";
61
62
  import { mergeProps } from "../utils/mergeProps.js";
62
63
  import { LayerDepthProvider } from "../Layer/LayerDepthContext.js";
63
64
  import { ModalAnnounceProvider } from "../hooks/ModalAnnounceProvider.js";
@@ -135,6 +136,10 @@ const styles = {
135
136
  kb4ib: "x1cz9k3x",
136
137
  $$css: true
137
138
  },
139
+ exitHoldingFocus: {
140
+ kfzvcC: "x47corl",
141
+ $$css: true
142
+ },
138
143
  positioner: {
139
144
  kVAEAm: "x10l6tqk",
140
145
  kkqhue: "x17y0mx6",
@@ -176,6 +181,23 @@ function stackPositionerStyles(view) {
176
181
  }
177
182
 
178
183
  /** The `data-sheet-stack` value for a host: only set while sheets stack. */
184
+ /** Stops a click, from any input, before it reaches its target. */
185
+ function ignoreActivation(event) {
186
+ event.preventDefault();
187
+ event.stopPropagation();
188
+ }
189
+
190
+ /**
191
+ * Stops every key except Tab before it reaches the focused control, so no
192
+ * key handler runs and no text changes (a search field's Enter, a typed
193
+ * letter, Backspace, an arrow that reopens a list). Tab still moves focus.
194
+ */
195
+ function ignoreKeyDuringExit(event) {
196
+ if (event.key !== 'Tab') {
197
+ event.preventDefault();
198
+ event.stopPropagation();
199
+ }
200
+ }
179
201
  function stackStateAttribute(view, isOpen) {
180
202
  if (!view.isStacked) {
181
203
  return undefined;
@@ -291,10 +313,14 @@ function StandaloneBottomSheet({
291
313
  // `isOpen` restarts the flag during render, and the layout effect below
292
314
  // settles a close.
293
315
  const [isCloseSettled, setIsCloseSettled] = useState(false);
316
+ // Whether focus was inside the sheet when it closed. Such a sheet stays out
317
+ // of `inert` and `aria-hidden` until its exit ends and focus has left.
318
+ const [isExitFocusHeld, setIsExitFocusHeld] = useState(false);
294
319
  const [settledIsOpen, setSettledIsOpen] = useState(isOpen);
295
320
  if (settledIsOpen !== isOpen) {
296
321
  setSettledIsOpen(isOpen);
297
322
  setIsCloseSettled(false);
323
+ setIsExitFocusHeld(false);
298
324
  }
299
325
  const panelState = isOpen ? {
300
326
  kind: 'open',
@@ -408,9 +434,8 @@ function StandaloneBottomSheet({
408
434
  }, [hasScrim, shouldPresent, writeScrim]);
409
435
  useLayoutEffect(() => {
410
436
  if (!isOpen) {
411
- // Read before the browser's focus fixup for the exiting sheet's
412
- // `inert` runs (at the next rendering opportunity), so this is where
413
- // focus was when the person closed the sheet.
437
+ // Where focus was when the person closed the sheet. The closing sheet
438
+ // is not inert yet, so focus has not moved.
414
439
  const dialog = dialogRef.current;
415
440
  hadFocusAtCloseRef.current = dialog != null && dialog.contains(dialog.ownerDocument.activeElement);
416
441
  }
@@ -422,6 +447,8 @@ function StandaloneBottomSheet({
422
447
  // that was not paired as a replace is an exit from here on.
423
448
  // eslint-disable-next-line @eslint-react/set-state-in-effect -- settles the close once the registry has answered
424
449
  setIsCloseSettled(true);
450
+ // Read with the close, before the sheet can go inert.
451
+ setIsExitFocusHeld(hadFocusAtCloseRef.current);
425
452
  }
426
453
  }, [hasScrim, isOpen, shouldPresent]);
427
454
 
@@ -507,7 +534,36 @@ function StandaloneBottomSheet({
507
534
  const {
508
535
  ref: modalityRef
509
536
  } = useInteractionModalityTracking();
510
- const dialogComposedRef = useMergedRefs(dialogRef, modalityRef);
537
+ // Ends the exit hold once focus has left the sheet: moved elsewhere, or
538
+ // dropped to the page because the focused control was removed or disabled.
539
+ // Native listeners, because React drops the `focusout` a browser sends while
540
+ // React removes the focused element, and Firefox and WebKit send no
541
+ // `focusout` for a removed element at all, so a subtree change is read too.
542
+ // Each reads the focus after the event. They attach only while a closing
543
+ // sheet holds focus, so a closed or open sheet observes nothing.
544
+ const isWatchingExitFocus = !isOpen && isPresented && !isReplaced && isExitFocusHeld;
545
+ const exitFocusRef = useCallback(dialog => {
546
+ if (dialog == null || !isWatchingExitFocus) {
547
+ return;
548
+ }
549
+ const releaseIfFocusLeft = () => {
550
+ if (!dialog.contains(dialog.ownerDocument.activeElement)) {
551
+ setIsExitFocusHeld(false);
552
+ }
553
+ };
554
+ const onFocusOut = () => queueMicrotask(releaseIfFocusLeft);
555
+ dialog.addEventListener('focusout', onFocusOut);
556
+ const unobserve = observeMutations(dialog, {
557
+ childList: true,
558
+ subtree: true,
559
+ attributeFilter: ['disabled', 'hidden', 'inert']
560
+ }, releaseIfFocusLeft);
561
+ return () => {
562
+ dialog.removeEventListener('focusout', onFocusOut);
563
+ unobserve();
564
+ };
565
+ }, [isWatchingExitFocus]);
566
+ const dialogComposedRef = useMergedRefs(dialogRef, modalityRef, exitFocusRef);
511
567
  useScrollLock(shouldPresent && hasScrim);
512
568
  useDevWarning('BottomSheet', 'requires a non-empty `label` for an accessible name; the open sheet ' + 'has no built-in heading to derive one from.', isOpen && !label);
513
569
 
@@ -563,13 +619,21 @@ function StandaloneBottomSheet({
563
619
  // that contains no presented sheet is marked inert and hidden as well, so
564
620
  // the state is explicit; one that does contain the top sheet is left alone,
565
621
  // because inert on it would reach the top sheet too.
566
- const isInert = isExiting || stackView.isBlocked;
622
+ // A sheet that closes with focus inside it is neither inert nor hidden
623
+ // while that focus stays: `inert` would drop the focus to the page, and
624
+ // `aria-hidden` would hide the focused control. When the exit ends, the
625
+ // dialog closes and focus returns in the same task. When focus leaves the
626
+ // sheet first (into a sheet opened above it, for example), the sheet goes
627
+ // inert at once. Until the close settles, no closing sheet is inert, so the
628
+ // first commit of a close never hides focus.
629
+ const isExitHoldingFocus = isExiting && !isReplaced && (!isCloseSettled || isExitFocusHeld);
630
+ const isInert = isExiting && !isExitHoldingFocus || stackView.isBlocked;
567
631
  return /*#__PURE__*/_jsxs("dialog", {
568
632
  ...stylex.props(styles.dialog, shouldPresent && styles.dialogOpen, shouldPresent && styles.dialogPanelHost,
569
633
  // The dialog is the panel's positioner, so the stack's recede
570
634
  // transforms the dialog: panel, grabber and all shrink and lift as
571
635
  // one. The backdrop is not a descendant and stays put.
572
- ...stackPositionerStyles(stackView), hasScrim && styles.scrim, hasScrim && isEntrySettled && styles.scrimSettled, hasScrim && isExiting && styles.scrimClosing, !hasScrim && styles.dialogNonModal),
636
+ ...stackPositionerStyles(stackView), hasScrim && styles.scrim, hasScrim && isEntrySettled && styles.scrimSettled, hasScrim && isExiting && styles.scrimClosing, isExitHoldingFocus && styles.exitHoldingFocus, !hasScrim && styles.dialogNonModal),
573
637
  ref: dialogComposedRef
574
638
  // A non-modal sheet is hosted in the top layer as a manual popover
575
639
  // (no light dismiss, no backdrop), so sheets order by presentation
@@ -586,6 +650,12 @@ function StandaloneBottomSheet({
586
650
  "data-sheet-stack": hasScrim ? stackStateAttribute(stackView, isOpen) : undefined,
587
651
  "data-sheet-stack-depth": hasScrim && stackView.depth > 0 ? stackView.depth : undefined,
588
652
  onCancel: handleCancel
653
+ // A closing sheet that keeps focus takes no activation during its
654
+ // exit: no click and no key but Tab reaches the control that has focus.
655
+ ,
656
+ onClickCapture: isExitHoldingFocus ? ignoreActivation : undefined,
657
+ onKeyDownCapture: isExitHoldingFocus ? ignoreKeyDuringExit : undefined,
658
+ onKeyUpCapture: isExitHoldingFocus ? ignoreKeyDuringExit : undefined
589
659
  // Presses inside the sheet do not reach handlers around where it is
590
660
  // written. The dialog, not the panel, is the root, as in a switcher.
591
661
  ,
@@ -1 +1 @@
1
- {"version":3,"file":"BottomSheetPanel.d.ts","sourceRoot":"","sources":["../../src/BottomSheet/BottomSheetPanel.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAOL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AA+B5C,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAGL,KAAK,oBAAoB,EAC1B,MAAM,eAAe,CAAC;AAQvB,QAAA,MAAM,cAAc;;;;CAIV,CAAC;AAEX,MAAM,MAAM,iBAAiB,GAAG,MAAM,OAAO,cAAc,CAAC;AAC5D,YAAY,EAAC,oBAAoB,EAAC,CAAC;AA4CnC,eAAO,MAAM,2BAA2B,2DACkB,CAAC;AAsM3D,MAAM,MAAM,sBAAsB,GAChC,UAAU,GAAG,UAAU,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEjD,MAAM,MAAM,qBAAqB,GAC7B;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAC,GAChB;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAC,GACjC;IACE,IAAI,EAAE,UAAU,CAAC;IACjB,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,QAAQ,CAAC;IAC1C,eAAe,EAAE,MAAM,CAAC;CACzB,GACD;IAAC,IAAI,EAAE,SAAS,CAAA;CAAC,CAAC;AAEtB,UAAU,qBAAsB,SAAQ,SAAS,CAAC,cAAc,CAAC;IAC/D,+CAA+C;IAC/C,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAChC,KAAK,EAAE,qBAAqB,CAAC;IAC7B;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B;;;;;OAKG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,MAAM,EAAE,iBAAiB,GAAG,MAAM,GAAG,MAAM,CAAC;IAC5C,mEAAmE;IACnE,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,SAAS,CAAC;IACpB;;;OAGG;IACH,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,UAAU,CAAC,EAAE,aAAa,CAAC,oBAAoB,CAAC,CAAC;IACjD,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,gFAAgF;IAChF,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,cAAc,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,KAAK,IAAI,CAAC;IAC3D,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,sBAAsB,KAAK,IAAI,CAAC;IACzD,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE,sBAAsB,KAAK,IAAI,CAAC;CAC7D;AA2HD,4EAA4E;AAC5E,wBAAgB,gBAAgB,CAAC,EAC/B,GAAG,EACH,KAAK,EACL,eAAe,EACf,MAAM,EACN,KAAK,EACL,QAAQ,EACR,OAAO,EACP,UAAU,EACV,SAAS,EACT,KAAK,EACL,QAAQ,EACR,MAAM,EACN,cAAsB,EACtB,cAAc,EACd,eAAe,EACf,qBAA4B,EAC5B,kBAA0B,EAC1B,SAAS,EACT,cAAc,EACd,eAAe,EACf,aAAa,EACb,gBAAgB,EAChB,GAAG,KAAK,EACT,EAAE,qBAAqB,+BAyZvB;yBAjbe,gBAAgB"}
1
+ {"version":3,"file":"BottomSheetPanel.d.ts","sourceRoot":"","sources":["../../src/BottomSheet/BottomSheetPanel.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAOL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AA+B5C,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAGL,KAAK,oBAAoB,EAC1B,MAAM,eAAe,CAAC;AAQvB,QAAA,MAAM,cAAc;;;;CAIV,CAAC;AAEX,MAAM,MAAM,iBAAiB,GAAG,MAAM,OAAO,cAAc,CAAC;AAC5D,YAAY,EAAC,oBAAoB,EAAC,CAAC;AA4CnC,eAAO,MAAM,2BAA2B,2DACkB,CAAC;AA2M3D,MAAM,MAAM,sBAAsB,GAChC,UAAU,GAAG,UAAU,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEjD,MAAM,MAAM,qBAAqB,GAC7B;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAC,GAChB;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAC,GACjC;IACE,IAAI,EAAE,UAAU,CAAC;IACjB,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,QAAQ,CAAC;IAC1C,eAAe,EAAE,MAAM,CAAC;CACzB,GACD;IAAC,IAAI,EAAE,SAAS,CAAA;CAAC,CAAC;AAEtB,UAAU,qBAAsB,SAAQ,SAAS,CAAC,cAAc,CAAC;IAC/D,+CAA+C;IAC/C,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAChC,KAAK,EAAE,qBAAqB,CAAC;IAC7B;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B;;;;;OAKG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,MAAM,EAAE,iBAAiB,GAAG,MAAM,GAAG,MAAM,CAAC;IAC5C,mEAAmE;IACnE,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,SAAS,CAAC;IACpB;;;OAGG;IACH,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,UAAU,CAAC,EAAE,aAAa,CAAC,oBAAoB,CAAC,CAAC;IACjD,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,gFAAgF;IAChF,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,cAAc,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,KAAK,IAAI,CAAC;IAC3D,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,sBAAsB,KAAK,IAAI,CAAC;IACzD,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE,sBAAsB,KAAK,IAAI,CAAC;CAC7D;AAyJD,4EAA4E;AAC5E,wBAAgB,gBAAgB,CAAC,EAC/B,GAAG,EACH,KAAK,EACL,eAAe,EACf,MAAM,EACN,KAAK,EACL,QAAQ,EACR,OAAO,EACP,UAAU,EACV,SAAS,EACT,KAAK,EACL,QAAQ,EACR,MAAM,EACN,cAAsB,EACtB,cAAc,EACd,eAAe,EACf,qBAA4B,EAC5B,kBAA0B,EAC1B,SAAS,EACT,cAAc,EACd,eAAe,EACf,aAAa,EACb,gBAAgB,EAChB,GAAG,KAAK,EACT,EAAE,qBAAqB,+BAyZvB;yBAjbe,gBAAgB"}
@@ -156,7 +156,7 @@ const styles = {
156
156
  k1xSpc: "xufnvkl",
157
157
  kB7OPa: "x9f619",
158
158
  kZKoxP: "x5yr21d",
159
- kAzted: "x121v3j4",
159
+ kAzted: "x1lh6h5t",
160
160
  $$css: true
161
161
  },
162
162
  tallKeyboardBody: {
@@ -204,6 +204,7 @@ function waitForTransition(element, propertyName, complete) {
204
204
  }
205
205
  let done = false;
206
206
  let timer = null;
207
+ let backstopMs = 0;
207
208
  const finish = () => {
208
209
  if (done) {
209
210
  return;
@@ -217,9 +218,21 @@ function waitForTransition(element, propertyName, complete) {
217
218
  complete();
218
219
  };
219
220
  const handleTransitionEnd = event => {
220
- if (event.target === element && event.propertyName === propertyName) {
221
- finish();
221
+ if (event.target !== element || event.propertyName !== propertyName) {
222
+ return;
223
+ }
224
+ // The engine cancels a transition whose end value changes mid-flight. A
225
+ // percentage transform does when the closing frame moves the height by a
226
+ // fraction of a pixel. A replacement runs on from where it was. That one
227
+ // ends the motion, not the cancel.
228
+ if (event.type === 'transitioncancel' && hasRunningTransition(element, propertyName)) {
229
+ if (timer != null) {
230
+ clearTimeout(timer);
231
+ timer = setTimeout(finish, backstopMs);
232
+ }
233
+ return;
222
234
  }
235
+ finish();
223
236
  };
224
237
  element.addEventListener('transitionend', handleTransitionEnd);
225
238
  element.addEventListener('transitioncancel', handleTransitionEnd);
@@ -257,7 +270,8 @@ function waitForTransition(element, propertyName, complete) {
257
270
  finish();
258
271
  return () => {};
259
272
  }
260
- timer = setTimeout(finish, transitionMs + TRANSITION_BACKSTOP_BUFFER_MS);
273
+ backstopMs = transitionMs + TRANSITION_BACKSTOP_BUFFER_MS;
274
+ timer = setTimeout(finish, backstopMs);
261
275
  return () => {
262
276
  if (timer != null) {
263
277
  clearTimeout(timer);
@@ -266,6 +280,11 @@ function waitForTransition(element, propertyName, complete) {
266
280
  element.removeEventListener('transitioncancel', handleTransitionEnd);
267
281
  };
268
282
  }
283
+
284
+ // Whether a CSS transition of `propertyName` still runs on `element`.
285
+ function hasRunningTransition(element, propertyName) {
286
+ return (element.getAnimations?.() ?? []).some(animation => animation.transitionProperty === propertyName && (animation.playState === 'running' || animation.playState === 'paused'));
287
+ }
269
288
  function parseTransitionTime(value) {
270
289
  const normalizedValue = value.trim();
271
290
  if (!/^-?(?:\d+|\d*\.\d+)(?:ms|s)$/.test(normalizedValue)) {
@@ -1 +1 @@
1
- {"version":3,"file":"bottomSheetStack.d.ts","sourceRoot":"","sources":["../../src/BottomSheet/bottomSheetStack.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bottomSheetStack.d.ts","sourceRoot":"","sources":["../../src/BottomSheet/bottomSheetStack.ts"],"names":[],"mappings":"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"}
@@ -593,10 +593,11 @@ function openModalsOutside(element) {
593
593
  if (dialog === element || dialog.contains(element)) {
594
594
  continue;
595
595
  }
596
- // A modal on its way out (a closing sheet keeps its dialog modal through
597
- // the exit animation, inert and hidden) blocks nothing any more: it is
598
- // gone for this decision.
599
- if (dialog.hasAttribute('inert') || dialog.getAttribute('aria-hidden') === 'true') {
596
+ // A modal on its way out blocks nothing any more: it is gone for this
597
+ // decision. A closing sheet keeps its dialog modal through the exit
598
+ // animation; it is inert and hidden then, unless focus was inside it at
599
+ // the close, so the registry's own record of the close counts too.
600
+ if (dialog.hasAttribute('inert') || dialog.getAttribute('aria-hidden') === 'true' || state.entries.some(entry => !entry.isOpen && entry.getElement() === dialog)) {
600
601
  continue;
601
602
  }
602
603
  if (isModalDialog(dialog)) {
@@ -1 +1 @@
1
- {"version":3,"file":"Button.d.ts","sourceRoot":"","sources":["../../src/Button/Button.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Button.d.ts","sourceRoot":"","sources":["../../src/Button/Button.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAOL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAC,SAAS,EAAE,SAAS,EAAC,MAAM,gBAAgB,CAAC;AACzD,OAAO,KAAK,MAAM,MAAM,kBAAkB,CAAC;AAiC3C,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,eAAe,CAAC;AAKrD,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,SAAS,CAAC;AAwI9C,QAAA,MAAM,UAAU;;;;;;;;;;EAUd,CAAC;AAuDH;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,gBAAgB,CAAC;AAEnD;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,MAAM,OAAO,UAAU,CAAC;AAQjD,MAAM,WAAW,WAAY,SAAQ,SAAS,CAAC,iBAAiB,CAAC;IAC/D,wCAAwC;IACxC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IACnC,oDAAoD;IACpD,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;IACrC,+CAA+C;IAC/C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gDAAgD;IAChD,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IAChD,uDAAuD;IACvD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB;;;OAGG;IACH,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB;;;;OAIG;IACH,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;OAIG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;;;;;;OAQG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;OAGG;IACH,OAAO,CAAC,EAAE,KAAK,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,CAAC;IACrD;;OAEG;IACH,WAAW,CAAC,EAAE,CACZ,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,iBAAiB,CAAC,KACnC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B;;OAEG;IACH,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB;;;;OAIG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;OAIG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB;;;OAGG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,EAAE,CAAC,EAAE,iBAAiB,CAAC;IACvB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AA6KD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,MAAM,CAAC,EACrB,KAAK,EACL,OAAqB,EACrB,IAAI,EAAE,QAAQ,EACd,IAAe,EACf,UAAkB,EAClB,SAAiB,EACjB,eAAuB,EACvB,WAAW,EACX,IAAI,EACJ,UAAkB,EAClB,KAAK,EACL,SAAkB,EAClB,QAAQ,EACR,UAAU,EACV,OAAO,EACP,IAAI,EACJ,EAAE,EACF,MAAM,EACN,GAAG,EACH,MAAM,EACN,SAAS,EACT,KAAK,EACL,GAAG,EACH,GAAG,KAAK,EACT,EAAE,WAAW,GAAG,SAAS,CAwUzB;yBAjWe,MAAM"}
@@ -17,12 +17,13 @@
17
17
  *
18
18
  * Last synced props: label, variant, size, isDisabled, isLoading, isInterruptible, clickAction, icon, isIconOnly, width, children, tooltip, endContent, href, as, target, rel
19
19
  */
20
- import { use, useEffect, useRef, useState, useTransition } from 'react';
20
+ import { isValidElement, use, useEffect, useRef, useState, useTransition } from 'react';
21
21
  import * as stylex from '@stylexjs/stylex';
22
22
  import { useTooltip } from "../Tooltip/useTooltip.js";
23
23
  import "../theme/tokens.stylex.js";
24
24
  import { colorVars, sizeVars, spacingVars, radiusVars, borderVars, durationVars, easeVars, fontWeightVars, typeScaleVars, shadowVars, focusVars } from "../theme/tokens.stylex.js";
25
25
  import { Spinner } from "../Spinner/Spinner.js";
26
+ import { Icon } from "../Icon/Icon.js";
26
27
  import { VisuallyHidden } from "../VisuallyHidden/VisuallyHidden.js";
27
28
  import { IconDefaultSizeProvider } from "../Icon/IconDefaultSizeContext.js";
28
29
  import { iconBoxSizeStyles } from "../Icon/IconSize.stylex.js";
@@ -307,6 +308,23 @@ const groupStyles = {
307
308
  }
308
309
  };
309
310
 
311
+ /**
312
+ * Whether `node` adds nothing to a content name: nothing renders, or an Icon
313
+ * with no label. Any other node can add text.
314
+ */
315
+ function addsNoName(node) {
316
+ if (!isRenderable(node)) {
317
+ return true;
318
+ }
319
+ if (! /*#__PURE__*/isValidElement(node) || node.type !== Icon) {
320
+ return false;
321
+ }
322
+ const {
323
+ label
324
+ } = node.props;
325
+ return typeof label !== 'string' || label.trim() === '';
326
+ }
327
+
310
328
  /**
311
329
  * A versatile button component with multiple variants.
312
330
  *
@@ -547,9 +565,19 @@ export function Button({
547
565
  'aria-label': label
548
566
  } : null;
549
567
 
568
+ // The Button's accessible name when props decide it: the derived
569
+ // aria-label, else a caller aria-label, else the label text alone. It is
570
+ // not known here when a caller aria-labelledby names the Button from other
571
+ // elements, or when `icon` or `endContent` can add text to its content
572
+ // name (a count, for example). A decorative Icon in either slot adds none.
573
+ const accessibleName = props['aria-labelledby'] != null ? undefined : needsAriaLabel ? label : props['aria-label'] ?? (addsNoName(icon) && addsNoName(endContent) ? label : undefined);
574
+ // A tooltip that repeats the name adds nothing to the description, so a
575
+ // screen reader does not read the same words twice.
576
+ const isTooltipName = tooltip != null && accessibleName != null && tooltip.trim() === accessibleName.trim();
577
+
550
578
  // When a tooltip is attached via the hook, point aria-describedby at the
551
579
  // tooltip content (composing with any consumer-provided value).
552
- const describedByProp = tooltip != null ? {
580
+ const describedByProp = tooltip != null && !isTooltipName ? {
553
581
  'aria-describedby': [props['aria-describedby'], tooltipHook.describedBy].filter(Boolean).join(' ') || undefined
554
582
  } : null;
555
583
 
@@ -82,7 +82,10 @@ export interface ComplexSelectorRenderState {
82
82
  export interface ComplexSelectorHandle {
83
83
  /** Open the selector surface. No-op when disabled or already open. */
84
84
  open(): void;
85
- /** Close the selector surface. Restores focus to the trigger. */
85
+ /**
86
+ * Close the selector surface. Focus returns to the trigger only when it
87
+ * would otherwise be lost; a caller-rendered trigger always gets it back.
88
+ */
86
89
  close(): void;
87
90
  /** Toggle the selector surface open or closed. */
88
91
  toggle(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"ComplexSelector.d.ts","sourceRoot":"","sources":["../../src/ComplexSelector/ComplexSelector.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ComplexSelector.d.ts","sourceRoot":"","sources":["../../src/ComplexSelector/ComplexSelector.tsx"],"names":[],"mappings":"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"}
@@ -20,6 +20,7 @@ import * as stylex from '@stylexjs/stylex';
20
20
  import { useFieldInputStyling } from "../Field/fieldParts.js";
21
21
  import { useDevWarning } from "../hooks/useDevWarning.js";
22
22
  import { mergeRefs } from "../utils/mergeRefs.js";
23
+ import { isFocusLost } from "../utils/focusReturn.js";
23
24
  import { useMergedRefs } from "../hooks/useMergedRefs.js";
24
25
  import { useBusyAnnouncement } from "../hooks/useBusyAnnouncement.js";
25
26
  import { Field, inputWrapperStyles } from "../Field/index.js";
@@ -312,12 +313,20 @@ export function ComplexSelector({
312
313
  const handlePopoverShow = useCallback(() => {
313
314
  onOpenChange?.(true);
314
315
  }, [onOpenChange]);
316
+
317
+ // The popup's content element, read when it closes.
318
+ const popupContentRef = useRef(null);
319
+ const hasCallerTrigger = renderTrigger != null;
315
320
  const handlePopoverHide = useCallback(() => {
316
- // Focus is restored first so a consumer that moves focus elsewhere from
317
- // the callback wins, instead of being overwritten a line later.
318
- triggerRef.current?.focus();
321
+ const trigger = triggerRef.current;
322
+ // A press that moved focus to another control keeps it there. A caller's
323
+ // control always gets focus back. Focus moves before the callback, so a
324
+ // consumer that moves it from the callback wins.
325
+ if (hasCallerTrigger || isFocusLost(popupContentRef.current, trigger?.ownerDocument)) {
326
+ trigger?.focus();
327
+ }
319
328
  onOpenChange?.(false);
320
- }, [onOpenChange]);
329
+ }, [hasCallerTrigger, onOpenChange]);
321
330
  const popover = usePopover({
322
331
  dialogLabel: label,
323
332
  hasCloseButton: false,
@@ -326,6 +335,7 @@ export function ComplexSelector({
326
335
  onShow: handlePopoverShow,
327
336
  onHide: handlePopoverHide
328
337
  });
338
+ popupContentRef.current = popover.contentRef.current;
329
339
  const isOpen = popover.isOpen;
330
340
  const handleTriggerClick = useCallback(() => {
331
341
  if (isDisabled) {
@@ -1 +1 @@
1
- {"version":3,"file":"MonthScroller.d.ts","sourceRoot":"","sources":["../../src/DateInput/MonthScroller.tsx"],"names":[],"mappings":"AAqDA,OAAO,EACL,KAAK,SAAS,EACd,KAAK,aAAa,EAClB,KAAK,SAAS,EAOf,MAAM,UAAU,CAAC;AAiNlB,MAAM,WAAW,mBAAmB;IAClC,0DAA0D;IAC1D,aAAa,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,cAAc,KAAK,IAAI,CAAC;CACxE;AAED,MAAM,WAAW,kBAAkB;IACjC,yEAAyE;IACzE,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAAC;IACxD,+CAA+C;IAC/C,aAAa,EAAE,MAAM,CAAC;IACtB,8CAA8C;IAC9C,aAAa,EAAE,MAAM,CAAC;IACtB,iCAAiC;IACjC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,+DAA+D;IAC/D,oBAAoB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IACnD,+BAA+B;IAC/B,YAAY,EAAE,SAAS,GAAG,IAAI,CAAC;IAC/B,4CAA4C;IAC5C,KAAK,EAAE,SAAS,CAAC;IACjB,2DAA2D;IAC3D,cAAc,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,OAAO,CAAC;IAC7C,gCAAgC;IAChC,YAAY,EAAE,SAAS,CAAC;IACxB,kCAAkC;IAClC,QAAQ,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;CAC1C;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAC5B,SAAS,EACT,aAAa,EACb,aAAa,EACb,iBAAiB,EACjB,oBAAoB,EACpB,YAAY,EACZ,KAAK,EACL,cAAc,EACd,YAAY,EACZ,QAAQ,GACT,EAAE,kBAAkB,+BAmjBpB;yBA9jBe,aAAa"}
1
+ {"version":3,"file":"MonthScroller.d.ts","sourceRoot":"","sources":["../../src/DateInput/MonthScroller.tsx"],"names":[],"mappings":"AAsDA,OAAO,EACL,KAAK,SAAS,EACd,KAAK,aAAa,EAClB,KAAK,SAAS,EAOf,MAAM,UAAU,CAAC;AAqNlB,MAAM,WAAW,mBAAmB;IAClC,0DAA0D;IAC1D,aAAa,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,cAAc,KAAK,IAAI,CAAC;CACxE;AAED,MAAM,WAAW,kBAAkB;IACjC,yEAAyE;IACzE,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAAC;IACxD,+CAA+C;IAC/C,aAAa,EAAE,MAAM,CAAC;IACtB,8CAA8C;IAC9C,aAAa,EAAE,MAAM,CAAC;IACtB,iCAAiC;IACjC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,+DAA+D;IAC/D,oBAAoB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IACnD,+BAA+B;IAC/B,YAAY,EAAE,SAAS,GAAG,IAAI,CAAC;IAC/B,4CAA4C;IAC5C,KAAK,EAAE,SAAS,CAAC;IACjB,2DAA2D;IAC3D,cAAc,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,OAAO,CAAC;IAC7C,gCAAgC;IAChC,YAAY,EAAE,SAAS,CAAC;IACxB,kCAAkC;IAClC,QAAQ,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;CAC1C;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAC5B,SAAS,EACT,aAAa,EACb,aAAa,EACb,iBAAiB,EACjB,oBAAoB,EACpB,YAAY,EACZ,KAAK,EACL,cAAc,EACd,YAAY,EACZ,QAAQ,GACT,EAAE,kBAAkB,+BA0iBpB;yBArjBe,aAAa"}
@@ -30,6 +30,7 @@
30
30
  * - /packages/core/src/DateInput/DateInputTouch.test.tsx
31
31
  */
32
32
  import { useCallback, useEffect, useImperativeHandle, useLayoutEffect, useRef, useState } from 'react';
33
+ import { flushSync } from 'react-dom';
33
34
  import * as stylex from '@stylexjs/stylex';
34
35
  import { useCalendarDays } from "../Calendar/index.js";
35
36
  import { useDirection, useLocale } from "../i18n/index.js";
@@ -38,7 +39,7 @@ import { colorVars, radiusVars, fontWeightVars, typeScaleVars, durationVars, bor
38
39
  import { focusOutlineStyles } from "../utils/index.js";
39
40
  import { plainDateFormatStandaloneMonthYear } from "../utils/plainDate.js";
40
41
  import { plainDateAddDays, plainDateDayOfWeek, plainDateFormat, plainDateIsEqual, plainDateToISO, DATE_FORMAT_WITH_WEEKDAY } from "../utils/index.js";
41
- import { reducedMotionFade } from "../motion/reducedMotion.js";
42
+ import { playReducedMotionDip, reducedMotionFade } from "../motion/reducedMotion.js";
42
43
  import "./tokens.stylex.js";
43
44
  import { dateInputTouchSizes, dateInputTouchGeometry } from "./tokens.stylex.js";
44
45
  import { useOwnScrollGesture } from "./useOwnScrollGesture.js";
@@ -257,15 +258,10 @@ export function MonthScroller({
257
258
  // second step or the unmount clears it.
258
259
  const dipRef = useRef(null);
259
260
  const stopDip = useCallback(() => {
260
- const dip = dipRef.current;
261
- if (dip != null) {
262
- window.clearTimeout(dip.timer);
263
- dip.animation.cancel();
264
- dipRef.current = null;
265
- }
261
+ dipRef.current?.cancel();
262
+ dipRef.current = null;
266
263
  }, []);
267
- // Synchronizes with the dip's timer and animation: neither outlives the
268
- // scroller.
264
+ // Synchronizes with the dip's animations: they do not outlive the scroller.
269
265
  useEffect(() => stopDip, [stopDip]);
270
266
  const scrollToMonth = useCallback((monthIndex, behavior = 'smooth') => {
271
267
  // Every step replaces a running dip, whichever way it moves. Otherwise
@@ -324,24 +320,14 @@ export function MonthScroller({
324
320
  land();
325
321
  return;
326
322
  }
327
- // A second step within the dip has replaced the first (above): only
328
- // its scroll lands, at its own dip's middle.
329
- dipRef.current = {
330
- animation: scroller.animate([{
331
- opacity: 1
332
- }, {
333
- opacity: 0
334
- }, {
335
- opacity: 1
336
- }], {
337
- duration: fade.duration,
338
- easing: fade.easing
339
- }),
340
- timer: window.setTimeout(() => {
341
- dipRef.current = null;
342
- land();
343
- }, fade.duration / 2)
344
- };
323
+ // A newer step replaces this one: only its scroll lands.
324
+ dipRef.current = playReducedMotionDip(scroller, fade, () => {
325
+ dipRef.current = null;
326
+ // The fade-in starts as soon as this returns. So render now: the
327
+ // scroll lands in the layout effect, before the fade-in.
328
+ // eslint-disable-next-line @eslint-react/dom-no-flush-sync -- the month must change before the dip's fade-in starts
329
+ flushSync(land);
330
+ });
345
331
  return;
346
332
  }
347
333
  steeredRowRef.current = row;
@@ -1 +1 @@
1
- {"version":3,"file":"Wheel.d.ts","sourceRoot":"","sources":["../../src/DateInput/Wheel.tsx"],"names":[],"mappings":"AAoNA,MAAM,WAAW,WAAW;IAC1B,oEAAoE;IACpE,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB;IAChB,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,oDAAoD;IACpD,KAAK,EAAE,MAAM,CAAC;IACd,2BAA2B;IAC3B,OAAO,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC;IACpC,wDAAwD;IACxD,KAAK,EAAE,MAAM,CAAC;IACd,sEAAsE;IACtE,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,aAAa,CAAC,WAAW,CAAC,EACnC,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,GAClB,MAAM,CAsBR;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,KAAK,CAAC,EACpB,KAAK,EACL,OAAO,EACP,KAAK,EACL,QAAQ,EACR,QAAe,GAChB,EAAE,UAAU,+BAkVZ;yBAxVe,KAAK"}
1
+ {"version":3,"file":"Wheel.d.ts","sourceRoot":"","sources":["../../src/DateInput/Wheel.tsx"],"names":[],"mappings":"AAwNA,MAAM,WAAW,WAAW;IAC1B,oEAAoE;IACpE,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB;IAChB,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,oDAAoD;IACpD,KAAK,EAAE,MAAM,CAAC;IACd,2BAA2B;IAC3B,OAAO,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC;IACpC,wDAAwD;IACxD,KAAK,EAAE,MAAM,CAAC;IACd,sEAAsE;IACtE,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,aAAa,CAAC,WAAW,CAAC,EACnC,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,GAClB,MAAM,CAsBR;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,KAAK,CAAC,EACpB,KAAK,EACL,OAAO,EACP,KAAK,EACL,QAAQ,EACR,QAAe,GAChB,EAAE,UAAU,+BA4UZ;yBAlVe,KAAK"}
@@ -42,7 +42,7 @@ import * as stylex from '@stylexjs/stylex';
42
42
  import "../theme/tokens.stylex.js";
43
43
  import { colorVars, radiusVars, fontWeightVars, typeScaleVars, spacingVars, durationVars } from "../theme/tokens.stylex.js";
44
44
  import { focusOutlineStyles } from "../utils/index.js";
45
- import { reducedMotionFade } from "../motion/reducedMotion.js";
45
+ import { playReducedMotionDip, reducedMotionFade } from "../motion/reducedMotion.js";
46
46
  import "./tokens.stylex.js";
47
47
  import { dateInputTouchSizes, dateInputTouchGeometry } from "./tokens.stylex.js";
48
48
  import { useOwnScrollGesture } from "./useOwnScrollGesture.js";
@@ -163,18 +163,18 @@ export function Wheel({
163
163
  // once on a fine one.
164
164
  const lastPointerRef = useRef(null);
165
165
 
166
- // A reduced-motion dip whose rows have not landed yet: its timer and the
167
- // row it lands on. While one is pending the rows stay put for it, so they
168
- // never move at full opacity, and a further step retargets it.
166
+ // A reduced-motion dip whose rows have not landed yet: the row they land
167
+ // on. While one is pending the rows stay put for it, so they never move at
168
+ // full opacity, and a further step retargets it.
169
169
  const pendingFadeRef = useRef(null);
170
170
  // The running dip, so a step during its fade-in starts the next one where
171
171
  // the column is.
172
172
  const dipRef = useRef(null);
173
+ // Synchronizes with the dip's animations: an unmounted wheel lands nothing.
173
174
  useEffect(() => () => {
174
- if (pendingFadeRef.current != null) {
175
- window.clearTimeout(pendingFadeRef.current.timer);
176
- pendingFadeRef.current = null;
177
- }
175
+ pendingFadeRef.current = null;
176
+ dipRef.current?.cancel();
177
+ dipRef.current = null;
178
178
  }, []);
179
179
  const scrollToIndex = useCallback((index, behavior, {
180
180
  touchRelease = false
@@ -192,11 +192,10 @@ export function Wheel({
192
192
  touchRelease
193
193
  }) : null;
194
194
  const pending = pendingFadeRef.current;
195
+ // A change that lands now replaces a pending landing. Its dip goes on
196
+ // and fades back in.
195
197
  if (fadeTiming == null) {
196
- if (pending != null) {
197
- window.clearTimeout(pending.timer);
198
- pendingFadeRef.current = null;
199
- }
198
+ pendingFadeRef.current = null;
200
199
  scroller.scrollTo({
201
200
  top,
202
201
  behavior
@@ -204,10 +203,7 @@ export function Wheel({
204
203
  return;
205
204
  }
206
205
  if (fadeTiming.duration === 0 || typeof scroller.animate !== 'function') {
207
- if (pending != null) {
208
- window.clearTimeout(pending.timer);
209
- pendingFadeRef.current = null;
210
- }
206
+ pendingFadeRef.current = null;
211
207
  scroller.scrollTo({
212
208
  top,
213
209
  behavior: 'auto'
@@ -219,39 +215,24 @@ export function Wheel({
219
215
  pending.top = top;
220
216
  return;
221
217
  }
222
- const {
223
- duration,
224
- easing
225
- } = fadeTiming;
226
218
  // A step during the last dip's fade-in starts the new dip at the
227
219
  // column's current opacity, not at full opacity. A leaving element fades
228
220
  // out from where it is.
229
221
  const shown = Number.parseFloat(getComputedStyle(scroller).opacity);
230
222
  dipRef.current?.cancel();
231
- dipRef.current = scroller.animate([{
232
- opacity: Number.isFinite(shown) ? shown : 1,
233
- easing
234
- }, {
235
- opacity: 0,
236
- easing
237
- }, {
238
- opacity: 1
239
- }], {
240
- duration,
241
- easing: 'linear'
242
- });
243
223
  const landing = {
244
- top,
245
- timer: 0
224
+ top
246
225
  };
247
- landing.timer = window.setTimeout(() => {
248
- pendingFadeRef.current = null;
249
- scroller.scrollTo({
250
- top: landing.top,
251
- behavior: 'auto'
252
- });
253
- }, duration / 2);
254
226
  pendingFadeRef.current = landing;
227
+ dipRef.current = playReducedMotionDip(scroller, fadeTiming, () => {
228
+ if (pendingFadeRef.current === landing) {
229
+ pendingFadeRef.current = null;
230
+ scroller.scrollTo({
231
+ top: landing.top,
232
+ behavior: 'auto'
233
+ });
234
+ }
235
+ }, Number.isFinite(shown) ? shown : 1);
255
236
  }, [itemBlockSize]);
256
237
 
257
238
  // Commit on rest. A wheel that stops on a disabled row travels on to the
@@ -22,11 +22,11 @@ import { FieldStatus } from "../FieldStatus/FieldStatus.js";
22
22
  import { useFieldStatusAnnouncement } from "../FieldStatus/useFieldStatusAnnouncement.js";
23
23
  import "../theme/tokens.stylex.js";
24
24
  import { spacingVars, borderVars, sizeVars } from "../theme/tokens.stylex.js";
25
- import { mergeProps } from "../utils/index.js";
25
+ import { mergeProps } from "../utils/mergeProps.js";
26
26
  import { useDevWarning } from "../hooks/useDevWarning.js";
27
27
  import { FormLayoutContext } from "../FormLayout/FormLayoutContext.js";
28
28
  import { Text } from "../Text/Text.js";
29
- import { VisuallyHidden } from "../VisuallyHidden/index.js";
29
+ import { VisuallyHidden } from "../VisuallyHidden/VisuallyHidden.js";
30
30
  import { themeProps } from "../utils/themeProps.js";
31
31
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
32
32
  const styles = {