@astryxdesign/core 0.7.6 → 0.7.7-canary.0eb44a2
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.
- package/dist/AppShell/AppShell.d.ts.map +1 -1
- package/dist/AppShell/AppShell.js +23 -3
- package/dist/Avatar/Avatar.d.ts.map +1 -1
- package/dist/Avatar/Avatar.js +1 -1
- package/dist/BottomSheet/BottomSheetPanel.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheetPanel.js +16 -9
- package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
- package/dist/Breadcrumbs/BreadcrumbItem.js +2 -1
- package/dist/Button/Button.d.ts.map +1 -1
- package/dist/Button/Button.js +3 -2
- package/dist/Chat/ChatComposerInput.d.ts +9 -0
- package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
- package/dist/Chat/ChatComposerInput.js +2 -0
- package/dist/Chat/ChatMessage.js +2 -2
- package/dist/Chat/chatMessage.vars.stylex.d.ts +8 -8
- package/dist/Chat/chatMessage.vars.stylex.js +8 -8
- package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteInput.js +8 -1
- package/dist/DateInput/MonthScroller.d.ts.map +1 -1
- package/dist/DateInput/MonthScroller.js +72 -2
- package/dist/DateInput/Wheel.d.ts +17 -1
- package/dist/DateInput/Wheel.d.ts.map +1 -1
- package/dist/DateInput/Wheel.js +179 -19
- package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
- package/dist/DateRangeInput/DateRangeInput.js +63 -49
- package/dist/Dialog/Dialog.d.ts.map +1 -1
- package/dist/Dialog/Dialog.js +37 -1
- package/dist/Drawer/Drawer.d.ts.map +1 -1
- package/dist/Drawer/Drawer.js +6 -0
- package/dist/Drawer/useDrawerDialogPresence.d.ts.map +1 -1
- package/dist/Drawer/useDrawerDialogPresence.js +4 -0
- package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenu.js +20 -4
- package/dist/DropdownMenu/useMenuOverflow.d.ts +13 -3
- package/dist/DropdownMenu/useMenuOverflow.d.ts.map +1 -1
- package/dist/DropdownMenu/useMenuOverflow.js +31 -8
- package/dist/Field/PanelSearchInput.d.ts.map +1 -1
- package/dist/Field/PanelSearchInput.js +8 -1
- package/dist/Field/textEntryTraits.d.ts +6 -6
- package/dist/Field/textEntryTraits.js +6 -6
- package/dist/Layer/layerClickBoundary.d.ts +7 -1
- package/dist/Layer/layerClickBoundary.d.ts.map +1 -1
- package/dist/Layer/layerClickBoundary.js +2 -2
- package/dist/Layer/usePressPin.d.ts +95 -0
- package/dist/Layer/usePressPin.d.ts.map +1 -0
- package/dist/Layer/usePressPin.js +365 -0
- package/dist/Layer/useTouchTrigger.d.ts +23 -1
- package/dist/Layer/useTouchTrigger.d.ts.map +1 -1
- package/dist/Layer/useTouchTrigger.js +45 -7
- package/dist/Lightbox/Lightbox.d.ts.map +1 -1
- package/dist/Lightbox/Lightbox.js +2 -1
- package/dist/Link/Link.d.ts.map +1 -1
- package/dist/Link/Link.js +1 -0
- package/dist/Popover/usePopover.d.ts.map +1 -1
- package/dist/Popover/usePopover.js +56 -7
- package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearch.js +38 -30
- package/dist/ProgressBar/ProgressBar.d.ts +1 -1
- package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
- package/dist/ProgressBar/ProgressBar.js +52 -14
- package/dist/ProgressBar/ProgressBarTouch.d.ts +29 -0
- package/dist/ProgressBar/ProgressBarTouch.d.ts.map +1 -0
- package/dist/ProgressBar/ProgressBarTouch.js +91 -0
- package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.js +2 -1
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +25 -13
- package/dist/Slider/Slider.d.ts.map +1 -1
- package/dist/Slider/Slider.js +404 -131
- package/dist/Slider/sliderTouchController.d.ts +189 -0
- package/dist/Slider/sliderTouchController.d.ts.map +1 -0
- package/dist/Slider/sliderTouchController.js +1017 -0
- package/dist/Slider/useSliderTouch.d.ts +22 -0
- package/dist/Slider/useSliderTouch.d.ts.map +1 -0
- package/dist/Slider/useSliderTouch.js +56 -0
- package/dist/Switch/Switch.d.ts +1 -1
- package/dist/Switch/Switch.d.ts.map +1 -1
- package/dist/Switch/Switch.js +200 -46
- package/dist/Switch/switchFill.d.ts +31 -0
- package/dist/Switch/switchFill.d.ts.map +1 -0
- package/dist/Switch/switchFill.js +88 -0
- package/dist/Switch/switchTouch.d.ts +81 -0
- package/dist/Switch/switchTouch.d.ts.map +1 -0
- package/dist/Switch/switchTouch.js +133 -0
- package/dist/Switch/useSwitchTouch.d.ts +285 -0
- package/dist/Switch/useSwitchTouch.d.ts.map +1 -0
- package/dist/Switch/useSwitchTouch.js +998 -0
- package/dist/TabList/Tab.d.ts.map +1 -1
- package/dist/TabList/Tab.js +4 -3
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +12 -5
- package/dist/Tokenizer/TokenizerItemRemovableContext.d.ts +3 -0
- package/dist/Tokenizer/TokenizerItemRemovableContext.d.ts.map +1 -0
- package/dist/Tokenizer/TokenizerItemRemovableContext.js +17 -0
- package/dist/Tooltip/Tooltip.d.ts +30 -6
- package/dist/Tooltip/Tooltip.d.ts.map +1 -1
- package/dist/Tooltip/Tooltip.js +5 -0
- package/dist/Tooltip/index.d.ts +1 -1
- package/dist/Tooltip/index.d.ts.map +1 -1
- package/dist/Tooltip/useTooltip.d.ts +31 -5
- package/dist/Tooltip/useTooltip.d.ts.map +1 -1
- package/dist/Tooltip/useTooltip.js +59 -18
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +19 -9
- package/dist/Typeahead/Typeahead.d.ts.map +1 -1
- package/dist/Typeahead/Typeahead.js +26 -15
- package/dist/astryx.css +91 -8
- package/dist/gestures/GestureArena.d.ts +21 -2
- package/dist/gestures/GestureArena.d.ts.map +1 -1
- package/dist/gestures/GestureArena.js +23 -3
- package/dist/gestures/GestureHost.d.ts +123 -3
- package/dist/gestures/GestureHost.d.ts.map +1 -1
- package/dist/gestures/GestureHost.js +797 -15
- package/dist/gestures/GestureRecognizer.d.ts +15 -1
- package/dist/gestures/GestureRecognizer.d.ts.map +1 -1
- package/dist/gestures/GestureRecognizer.js +12 -0
- package/dist/gestures/PanGestureRecognizer.d.ts +8 -0
- package/dist/gestures/PanGestureRecognizer.d.ts.map +1 -1
- package/dist/gestures/PinchGestureRecognizer.d.ts +5 -1
- package/dist/gestures/PinchGestureRecognizer.d.ts.map +1 -1
- package/dist/gestures/PinchGestureRecognizer.js +10 -0
- package/dist/gestures/PressTracker.d.ts +6 -0
- package/dist/gestures/PressTracker.d.ts.map +1 -1
- package/dist/gestures/PressTracker.js +3 -0
- package/dist/gestures/ScreenEdgePanGestureRecognizer.d.ts +3 -3
- package/dist/gestures/ScreenEdgePanGestureRecognizer.d.ts.map +1 -1
- package/dist/gestures/ScreenEdgePanGestureRecognizer.js +7 -5
- package/dist/gestures/nativeScroll.d.ts +16 -2
- package/dist/gestures/nativeScroll.d.ts.map +1 -1
- package/dist/gestures/nativeScroll.js +39 -8
- package/dist/gestures/recognizerInternals.d.ts +4 -2
- package/dist/gestures/recognizerInternals.d.ts.map +1 -1
- package/dist/gestures/types.d.ts +17 -0
- package/dist/gestures/types.d.ts.map +1 -1
- package/dist/gestures/types.js +7 -0
- package/dist/gestures/usePressTracker.d.ts.map +1 -1
- package/dist/gestures/usePressTracker.js +1 -0
- package/dist/gestures/wheelSegmenter.d.ts +56 -0
- package/dist/gestures/wheelSegmenter.d.ts.map +1 -0
- package/dist/gestures/wheelSegmenter.js +122 -0
- package/dist/hooks/useAttachment.d.ts +16 -8
- package/dist/hooks/useAttachment.d.ts.map +1 -1
- package/dist/hooks/useAttachment.js +35 -15
- package/dist/hooks/useFocusTrap.d.ts +15 -0
- package/dist/hooks/useFocusTrap.d.ts.map +1 -1
- package/dist/hooks/useFocusTrap.js +13 -2
- package/dist/hooks/usePager.d.ts +261 -0
- package/dist/hooks/usePager.d.ts.map +1 -0
- package/dist/hooks/usePager.js +1169 -0
- package/dist/motion/animator.d.ts.map +1 -1
- package/dist/motion/animator.js +140 -19
- package/dist/motion/paging.d.ts +69 -0
- package/dist/motion/paging.d.ts.map +1 -0
- package/dist/motion/paging.js +148 -0
- package/dist/motion/uikit/index.d.ts +8 -4
- package/dist/motion/uikit/index.d.ts.map +1 -1
- package/dist/motion/uikit/index.js +8 -4
- package/dist/motion/uikit/paging.d.ts +171 -0
- package/dist/motion/uikit/paging.d.ts.map +1 -0
- package/dist/motion/uikit/paging.js +192 -0
- package/dist/motion/uikit/progressBar.d.ts +79 -0
- package/dist/motion/uikit/progressBar.d.ts.map +1 -0
- package/dist/motion/uikit/progressBar.js +102 -0
- package/dist/motion/uikit/scroll.d.ts +0 -19
- package/dist/motion/uikit/scroll.d.ts.map +1 -1
- package/dist/motion/uikit/scroll.js +2 -21
- package/dist/motion/uikit/slider.d.ts +97 -0
- package/dist/motion/uikit/slider.d.ts.map +1 -0
- package/dist/motion/uikit/slider.js +111 -0
- package/dist/motion/uikit/springs.d.ts +59 -30
- package/dist/motion/uikit/springs.d.ts.map +1 -1
- package/dist/motion/uikit/springs.js +64 -34
- package/dist/motion/uikit/switch.d.ts +166 -0
- package/dist/motion/uikit/switch.d.ts.map +1 -0
- package/dist/motion/uikit/switch.js +186 -0
- package/dist/privateAttributes/pressHoldsDrag.stylex.d.ts +18 -0
- package/dist/privateAttributes/pressHoldsDrag.stylex.d.ts.map +1 -0
- package/dist/privateAttributes/pressHoldsDrag.stylex.js +28 -0
- package/dist/utils/pressFeedback.d.ts.map +1 -1
- package/dist/utils/pressFeedback.js +5 -0
- package/dist/utils/selectionLock.d.ts +43 -0
- package/dist/utils/selectionLock.d.ts.map +1 -1
- package/dist/utils/selectionLock.js +394 -6
- package/package.json +5 -5
- package/src/AppShell/AppShell.doc.mjs +10 -0
- package/src/AppShell/AppShell.tsx +48 -2
- package/src/Avatar/Avatar.tsx +3 -1
- package/src/BottomSheet/BottomSheetPanel.tsx +16 -9
- package/src/Breadcrumbs/BreadcrumbItem.tsx +4 -1
- package/src/Button/Button.tsx +3 -2
- package/src/Chat/Chat.doc.mjs +1 -0
- package/src/Chat/ChatComposerInput.doc.mjs +11 -0
- package/src/Chat/ChatComposerInput.tsx +11 -0
- package/src/Chat/ChatMessage.tsx +2 -2
- package/src/Chat/chatMessage.vars.stylex.ts +8 -8
- package/src/CommandPalette/CommandPaletteInput.tsx +6 -0
- package/src/DateInput/MonthScroller.tsx +63 -5
- package/src/DateInput/Wheel.tsx +174 -14
- package/src/DateRangeInput/DateRangeInput.doc.mjs +3 -2
- package/src/DateRangeInput/DateRangeInput.tsx +117 -71
- package/src/Dialog/Dialog.tsx +37 -1
- package/src/Drawer/Drawer.tsx +6 -0
- package/src/Drawer/useDrawerDialogPresence.ts +4 -0
- package/src/DropdownMenu/DropdownMenu.tsx +28 -6
- package/src/DropdownMenu/useMenuOverflow.ts +44 -8
- package/src/Field/PanelSearchInput.tsx +6 -0
- package/src/Field/textEntryTraits.ts +6 -6
- package/src/Layer/layerClickBoundary.ts +2 -2
- package/src/Layer/usePressPin.ts +516 -0
- package/src/Layer/useTouchTrigger.ts +56 -6
- package/src/Lightbox/Lightbox.tsx +2 -1
- package/src/Link/Link.tsx +3 -0
- package/src/Popover/usePopover.tsx +71 -9
- package/src/PowerSearch/PowerSearch.tsx +38 -31
- package/src/ProgressBar/ProgressBar.doc.mjs +7 -5
- package/src/ProgressBar/ProgressBar.tsx +147 -16
- package/src/ProgressBar/ProgressBarTouch.ts +109 -0
- package/src/SegmentedControl/SegmentedControlItem.tsx +2 -1
- package/src/Selector/Selector.tsx +29 -2
- package/src/Slider/Slider.doc.mjs +11 -7
- package/src/Slider/Slider.tsx +539 -132
- package/src/Slider/sliderTouchController.ts +1209 -0
- package/src/Slider/useSliderTouch.ts +78 -0
- package/src/Switch/Switch.doc.mjs +3 -3
- package/src/Switch/Switch.tsx +412 -86
- package/src/Switch/switchFill.ts +106 -0
- package/src/Switch/switchTouch.ts +194 -0
- package/src/Switch/useSwitchTouch.ts +1121 -0
- package/src/TabList/Tab.tsx +5 -3
- package/src/Tokenizer/Tokenizer.tsx +15 -5
- package/src/Tokenizer/TokenizerItemRemovableContext.ts +22 -0
- package/src/Tooltip/Tooltip.doc.mjs +21 -6
- package/src/Tooltip/Tooltip.tsx +42 -5
- package/src/Tooltip/index.ts +1 -0
- package/src/Tooltip/useTooltip.doc.mjs +4 -2
- package/src/Tooltip/useTooltip.tsx +84 -21
- package/src/Typeahead/BaseTypeahead.tsx +16 -8
- package/src/Typeahead/Typeahead.tsx +29 -15
- package/src/gestures/GestureArena.ts +45 -4
- package/src/gestures/GestureHost.ts +958 -15
- package/src/gestures/GestureRecognizer.ts +28 -0
- package/src/gestures/PanGestureRecognizer.ts +8 -0
- package/src/gestures/PinchGestureRecognizer.ts +16 -1
- package/src/gestures/PressTracker.ts +10 -0
- package/src/gestures/README.md +82 -3
- package/src/gestures/ScreenEdgePanGestureRecognizer.ts +7 -5
- package/src/gestures/nativeScroll.ts +49 -9
- package/src/gestures/recognizerInternals.ts +9 -2
- package/src/gestures/types.ts +18 -0
- package/src/gestures/usePressTracker.ts +2 -0
- package/src/gestures/wheelSegmenter.ts +143 -0
- package/src/hooks/useAttachment.ts +56 -14
- package/src/hooks/useFocusTrap.ts +26 -2
- package/src/hooks/usePager.ts +1446 -0
- package/src/motion/MEASUREMENTS.md +36 -27
- package/src/motion/README.md +7 -3
- package/src/motion/animator.ts +193 -25
- package/src/motion/paging.ts +161 -0
- package/src/motion/uikit/index.ts +7 -4
- package/src/motion/uikit/paging.ts +193 -0
- package/src/motion/uikit/progressBar.ts +102 -0
- package/src/motion/uikit/scroll.ts +2 -18
- package/src/motion/uikit/slider.ts +105 -0
- package/src/motion/uikit/springs.ts +53 -32
- package/src/motion/uikit/switch.ts +174 -0
- package/src/privateAttributes/pressHoldsDrag.stylex.ts +28 -0
- package/src/utils/pressFeedback.ts +5 -0
- package/src/utils/selectionLock.ts +501 -6
- package/dist/motion/selectPage.d.ts +0 -26
- package/dist/motion/selectPage.d.ts.map +0 -1
- package/dist/motion/selectPage.js +0 -55
- package/src/motion/selectPage.ts +0 -55
|
@@ -538,26 +538,40 @@ export function Typeahead<T extends SearchableItem>({
|
|
|
538
538
|
[editingValue, isEditing],
|
|
539
539
|
);
|
|
540
540
|
|
|
541
|
+
// Focus the token's button once it renders (the next cycle), so keyboard
|
|
542
|
+
// users stay in the component after edit mode ends.
|
|
543
|
+
const focusTokenNextFrame = useCallback(() => {
|
|
544
|
+
requestAnimationFrame(() => {
|
|
545
|
+
const tokenEl = tokenRef.current;
|
|
546
|
+
if (tokenEl) {
|
|
547
|
+
const button = tokenEl.querySelector('button');
|
|
548
|
+
(button ?? tokenEl).focus();
|
|
549
|
+
}
|
|
550
|
+
});
|
|
551
|
+
}, []);
|
|
552
|
+
|
|
541
553
|
// Handle selection from dropdown — clears edit mode
|
|
542
554
|
const handleChange = useCallback(
|
|
543
555
|
(item: T | null) => {
|
|
544
556
|
setIsEditing(false);
|
|
545
557
|
setEditingValue(null);
|
|
546
558
|
onChange(item);
|
|
547
|
-
// After selection, focus the token so keyboard users stay in the component.
|
|
548
|
-
// Use requestAnimationFrame because the token renders on the next cycle.
|
|
549
559
|
if (item) {
|
|
550
|
-
|
|
551
|
-
const tokenEl = tokenRef.current;
|
|
552
|
-
if (tokenEl) {
|
|
553
|
-
// Focus the internal button inside the token
|
|
554
|
-
const button = tokenEl.querySelector('button');
|
|
555
|
-
(button ?? tokenEl).focus();
|
|
556
|
-
}
|
|
557
|
-
});
|
|
560
|
+
focusTokenNextFrame();
|
|
558
561
|
}
|
|
559
562
|
},
|
|
560
|
-
[onChange],
|
|
563
|
+
[onChange, focusTokenNextFrame],
|
|
564
|
+
);
|
|
565
|
+
|
|
566
|
+
// Whether the base's list is shown: Escape then hides the list first, and
|
|
567
|
+
// edit mode stays.
|
|
568
|
+
const isListOpenRef = useRef(false);
|
|
569
|
+
const handleOpenChange = useCallback(
|
|
570
|
+
(isOpen: boolean) => {
|
|
571
|
+
isListOpenRef.current = isOpen;
|
|
572
|
+
onOpenChange?.(isOpen);
|
|
573
|
+
},
|
|
574
|
+
[onOpenChange],
|
|
561
575
|
);
|
|
562
576
|
|
|
563
577
|
// Handle clear (explicit X button on token). Edit mode copied the label into
|
|
@@ -593,14 +607,14 @@ export function Typeahead<T extends SearchableItem>({
|
|
|
593
607
|
if (isImeKeyEvent(e.nativeEvent)) {
|
|
594
608
|
return;
|
|
595
609
|
}
|
|
596
|
-
if (e.key === 'Escape' && editingValue) {
|
|
610
|
+
if (e.key === 'Escape' && editingValue && !isListOpenRef.current) {
|
|
597
611
|
e.preventDefault();
|
|
598
612
|
setIsEditing(false);
|
|
599
613
|
setEditingValue(null);
|
|
600
|
-
|
|
614
|
+
focusTokenNextFrame();
|
|
601
615
|
}
|
|
602
616
|
},
|
|
603
|
-
[editingValue],
|
|
617
|
+
[editingValue, focusTokenNextFrame],
|
|
604
618
|
);
|
|
605
619
|
|
|
606
620
|
// Click wrapper to focus input or enter edit mode
|
|
@@ -738,7 +752,7 @@ export function Typeahead<T extends SearchableItem>({
|
|
|
738
752
|
// aria-required / aria-invalid still applies.
|
|
739
753
|
aria-invalid={status?.type === 'error' || rest['aria-invalid']}
|
|
740
754
|
onChangeQuery={onChangeQuery}
|
|
741
|
-
onOpenChange={
|
|
755
|
+
onOpenChange={handleOpenChange}
|
|
742
756
|
debounceMs={debounceMs}
|
|
743
757
|
anchorRef={wrapperRef}
|
|
744
758
|
onKeyDown={handleKeyDown}
|
|
@@ -90,8 +90,18 @@ export interface ArenaBeganInput extends TouchBeganInput {
|
|
|
90
90
|
export interface GestureArenaOptions {
|
|
91
91
|
clock?: GestureClock;
|
|
92
92
|
environment?: GestureEnvironment;
|
|
93
|
-
/**
|
|
94
|
-
|
|
93
|
+
/**
|
|
94
|
+
* Touches a recognizer now owns, and the recognizer that claimed them. A
|
|
95
|
+
* claim comes in any state: a recognizer that waits on another's failure
|
|
96
|
+
* claims while `possible`, and a swipe claims as `ended`. Each claim is
|
|
97
|
+
* reported once.
|
|
98
|
+
*/
|
|
99
|
+
onClaim?: (
|
|
100
|
+
touchIds: ReadonlyArray<number>,
|
|
101
|
+
claimer: GestureRecognizer,
|
|
102
|
+
) => void;
|
|
103
|
+
/** Claimed touches given back to the browser (releaseClaim). */
|
|
104
|
+
onRelease?: (touchIds: ReadonlyArray<number>) => void;
|
|
95
105
|
/** A click deferred at touch end resolved: replay it, or drop it. */
|
|
96
106
|
onDeferredClick?: (touch: GestureTouch, allowed: boolean) => void;
|
|
97
107
|
/**
|
|
@@ -100,6 +110,13 @@ export interface GestureArenaOptions {
|
|
|
100
110
|
* listening now (`spec:AST-094` FR24).
|
|
101
111
|
*/
|
|
102
112
|
onIdle?: () => void;
|
|
113
|
+
/**
|
|
114
|
+
* Whether the browser keeps a contact for itself while it is down. Then no
|
|
115
|
+
* claiming recognizer recognizes with it before its lift. So a mouse or pen
|
|
116
|
+
* drag that starts on selectable text selects that text. A recognition at
|
|
117
|
+
* the lift, such as a tap's, is unaffected.
|
|
118
|
+
*/
|
|
119
|
+
refusesClaim?: (touch: GestureTouch) => boolean;
|
|
103
120
|
/** Every recognizer transition, for debugging and tests. */
|
|
104
121
|
onTransition?: (
|
|
105
122
|
recognizer: GestureRecognizer,
|
|
@@ -228,6 +245,7 @@ export class GestureArena {
|
|
|
228
245
|
target: input.target,
|
|
229
246
|
scroll: input.scroll ?? null,
|
|
230
247
|
takenByBrowser: false,
|
|
248
|
+
...(input.scrollType == null ? {} : {scrollType: input.scrollType}),
|
|
231
249
|
};
|
|
232
250
|
const participants: GestureRecognizer[] = [];
|
|
233
251
|
for (const [depth, recognizer] of input.recognizers.entries()) {
|
|
@@ -552,7 +570,8 @@ export class GestureArena {
|
|
|
552
570
|
): void {
|
|
553
571
|
if (
|
|
554
572
|
!internals(recognizer).shouldBegin() ||
|
|
555
|
-
this.isVetoedByConsumer(recognizer)
|
|
573
|
+
this.isVetoedByConsumer(recognizer) ||
|
|
574
|
+
this.isRefusedByBrowser(recognizer)
|
|
556
575
|
) {
|
|
557
576
|
this.fail(recognizer);
|
|
558
577
|
return;
|
|
@@ -634,6 +653,23 @@ export class GestureArena {
|
|
|
634
653
|
return winner.canPrevent(other) && other.canBePrevented(winner);
|
|
635
654
|
}
|
|
636
655
|
|
|
656
|
+
/**
|
|
657
|
+
* Whether a recognizer that claims touches would take a contact the
|
|
658
|
+
* browser keeps while it is down (`refusesClaim`).
|
|
659
|
+
*/
|
|
660
|
+
private isRefusedByBrowser(recognizer: GestureRecognizer): boolean {
|
|
661
|
+
const refuses = this.options.refusesClaim;
|
|
662
|
+
if (refuses == null || !recognizer.claimsTouches) {
|
|
663
|
+
return false;
|
|
664
|
+
}
|
|
665
|
+
return recognizer.trackedTouches.some(
|
|
666
|
+
touch =>
|
|
667
|
+
touch.phase !== 'ended' &&
|
|
668
|
+
touch.phase !== 'cancelled' &&
|
|
669
|
+
refuses(touch),
|
|
670
|
+
);
|
|
671
|
+
}
|
|
672
|
+
|
|
637
673
|
/** UIControl's rule: a control may veto an overlapping ancestor recognizer. */
|
|
638
674
|
private isVetoedByConsumer(recognizer: GestureRecognizer): boolean {
|
|
639
675
|
for (const id of internals(recognizer).seenTouchIds) {
|
|
@@ -673,6 +709,7 @@ export class GestureArena {
|
|
|
673
709
|
recognizer: GestureRecognizer,
|
|
674
710
|
keep: ReadonlySet<number> = new Set(),
|
|
675
711
|
): void {
|
|
712
|
+
const released: number[] = [];
|
|
676
713
|
for (const touch of recognizer.trackedTouches) {
|
|
677
714
|
const record = this.records.get(touch.id);
|
|
678
715
|
if (record == null || !record.isClaimed || keep.has(touch.id)) {
|
|
@@ -691,8 +728,12 @@ export class GestureArena {
|
|
|
691
728
|
);
|
|
692
729
|
if (!isOwned) {
|
|
693
730
|
record.isClaimed = false;
|
|
731
|
+
released.push(touch.id);
|
|
694
732
|
}
|
|
695
733
|
}
|
|
734
|
+
if (released.length > 0) {
|
|
735
|
+
this.options.onRelease?.(released);
|
|
736
|
+
}
|
|
696
737
|
}
|
|
697
738
|
|
|
698
739
|
private apply(recognizer: GestureRecognizer, next: GestureState): void {
|
|
@@ -767,7 +808,7 @@ export class GestureArena {
|
|
|
767
808
|
}
|
|
768
809
|
}
|
|
769
810
|
if (claimed.length > 0) {
|
|
770
|
-
this.options.onClaim?.(claimed);
|
|
811
|
+
this.options.onClaim?.(claimed, recognizer);
|
|
771
812
|
}
|
|
772
813
|
}
|
|
773
814
|
|