@astryxdesign/core 0.7.7-canary.4a8a76e → 0.7.7-canary.4e495ec
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/useCloseMobileDrawerOnActivate.d.ts +13 -0
- package/dist/AppShell/useCloseMobileDrawerOnActivate.d.ts.map +1 -0
- package/dist/AppShell/useCloseMobileDrawerOnActivate.js +45 -0
- package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheet.js +79 -9
- package/dist/BottomSheet/BottomSheetPanel.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheetPanel.js +1 -1
- package/dist/BottomSheet/bottomSheetStack.d.ts.map +1 -1
- package/dist/BottomSheet/bottomSheetStack.js +5 -4
- package/dist/Breadcrumbs/BreadcrumbItem.d.ts +2 -1
- package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
- package/dist/Breadcrumbs/BreadcrumbItem.js +7 -3
- package/dist/CheckboxList/CheckboxList.d.ts.map +1 -1
- package/dist/CheckboxList/CheckboxList.js +7 -1
- package/dist/CheckboxList/CheckboxListContext.d.ts +6 -0
- package/dist/CheckboxList/CheckboxListContext.d.ts.map +1 -1
- package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
- package/dist/CheckboxList/CheckboxListItem.js +10 -2
- package/dist/DateInput/DateInput.d.ts.map +1 -1
- package/dist/DateInput/DateInput.js +5 -2
- package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.js +5 -2
- package/dist/Dialog/Dialog.d.ts.map +1 -1
- package/dist/Dialog/Dialog.js +16 -14
- package/dist/Drawer/Drawer.d.ts.map +1 -1
- package/dist/Drawer/Drawer.js +15 -11
- package/dist/Drawer/useDrawerDialogPresence.d.ts.map +1 -1
- package/dist/Drawer/useDrawerDialogPresence.js +5 -1
- package/dist/Field/PanelSearchInput.d.ts +9 -1
- package/dist/Field/PanelSearchInput.d.ts.map +1 -1
- package/dist/Field/PanelSearchInput.js +3 -1
- package/dist/InfoTip/InfoTip.d.ts +2 -2
- package/dist/InfoTip/InfoTip.js +4 -4
- package/dist/Layer/layerAnimations.stylex.d.ts +7 -8
- package/dist/Layer/layerAnimations.stylex.d.ts.map +1 -1
- package/dist/Layer/layerAnimations.stylex.js +25 -20
- package/dist/Layer/useBackdropPress.d.ts +27 -0
- package/dist/Layer/useBackdropPress.d.ts.map +1 -0
- package/dist/Layer/useBackdropPress.js +53 -0
- package/dist/Layer/usePressPin.d.ts +3 -5
- package/dist/Layer/usePressPin.d.ts.map +1 -1
- package/dist/Layer/usePressPin.js +4 -6
- package/dist/MobileNav/MobileNav.js +0 -1
- package/dist/MultiSelector/hooks.d.ts.map +1 -1
- package/dist/MultiSelector/hooks.js +2 -4
- package/dist/Outline/Outline.d.ts +2 -4
- package/dist/Outline/Outline.d.ts.map +1 -1
- package/dist/Outline/Outline.js +4 -52
- package/dist/Outline/useOutlineFromMarkdown.d.ts.map +1 -1
- package/dist/Outline/useOutlineFromMarkdown.js +1 -0
- package/dist/Outline/useScrollSpy.js +3 -3
- package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearch.js +134 -179
- package/dist/RadioList/RadioList.d.ts.map +1 -1
- package/dist/RadioList/RadioList.js +5 -0
- package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
- package/dist/Resizable/ResizeHandle.js +118 -260
- package/dist/Resizable/resizeGesture.d.ts +91 -0
- package/dist/Resizable/resizeGesture.d.ts.map +1 -0
- package/dist/Resizable/resizeGesture.js +251 -0
- package/dist/SegmentedControl/SegmentedControl.d.ts +3 -1
- package/dist/SegmentedControl/SegmentedControl.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControl.js +115 -8
- package/dist/SegmentedControl/SegmentedControlContext.d.ts +6 -0
- package/dist/SegmentedControl/SegmentedControlContext.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.d.ts +1 -0
- package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.js +8 -1
- package/dist/SegmentedControl/useSegmentedSelectionMotion.d.ts +357 -0
- package/dist/SegmentedControl/useSegmentedSelectionMotion.d.ts.map +1 -0
- package/dist/SegmentedControl/useSegmentedSelectionMotion.js +1349 -0
- package/dist/SegmentedControl/useSegmentedTouchTracking.d.ts +70 -0
- package/dist/SegmentedControl/useSegmentedTouchTracking.d.ts.map +1 -0
- package/dist/SegmentedControl/useSegmentedTouchTracking.js +264 -0
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +96 -67
- package/dist/Selector/optionShape.d.ts +24 -0
- package/dist/Selector/optionShape.d.ts.map +1 -0
- package/dist/Selector/optionShape.js +48 -0
- package/dist/Selector/selectableOptionEntries.d.ts +20 -0
- package/dist/Selector/selectableOptionEntries.d.ts.map +1 -0
- package/dist/Selector/selectableOptionEntries.js +38 -0
- package/dist/Selector/utils.d.ts +2 -17
- package/dist/Selector/utils.d.ts.map +1 -1
- package/dist/Selector/utils.js +3 -51
- package/dist/SideNav/SideNavItem.d.ts.map +1 -1
- package/dist/SideNav/SideNavItem.js +3 -9
- package/dist/Switch/switchTouch.d.ts +0 -7
- package/dist/Switch/switchTouch.d.ts.map +1 -1
- package/dist/Switch/switchTouch.js +2 -10
- package/dist/Switch/useSwitchTouch.d.ts +2 -11
- package/dist/Switch/useSwitchTouch.d.ts.map +1 -1
- package/dist/Switch/useSwitchTouch.js +26 -85
- package/dist/Token/Token.d.ts +2 -2
- package/dist/Token/Token.d.ts.map +1 -1
- package/dist/Token/Token.js +12 -4
- package/dist/Token/TokenNamingContext.d.ts +14 -0
- package/dist/Token/TokenNamingContext.d.ts.map +1 -0
- package/dist/Token/TokenNamingContext.js +23 -0
- package/dist/Tokenizer/Tokenizer.d.ts +46 -59
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +35 -58
- package/dist/Tokenizer/TokenizerBottomSheet.d.ts +25 -28
- package/dist/Tokenizer/TokenizerBottomSheet.d.ts.map +1 -1
- package/dist/Tokenizer/TokenizerBottomSheet.js +157 -54
- package/dist/Tokenizer/TokenizerItemRemovableContext.d.ts.map +1 -1
- package/dist/Tokenizer/TokenizerItemRemovableContext.js +5 -3
- package/dist/Tooltip/Tooltip.d.ts +25 -30
- package/dist/Tooltip/Tooltip.d.ts.map +1 -1
- package/dist/Tooltip/Tooltip.js +24 -5
- package/dist/Tooltip/index.d.ts +1 -1
- package/dist/Tooltip/index.d.ts.map +1 -1
- package/dist/Tooltip/useTooltip.d.ts +28 -29
- package/dist/Tooltip/useTooltip.d.ts.map +1 -1
- package/dist/Tooltip/useTooltip.js +20 -8
- package/dist/TopNav/TopNavItem.d.ts.map +1 -1
- package/dist/TopNav/TopNavItem.js +4 -7
- package/dist/TopNav/TopNavMegaMenuItem.d.ts.map +1 -1
- package/dist/TopNav/TopNavMegaMenuItem.js +4 -7
- package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMenu.js +4 -7
- package/dist/astryx.css +76 -5
- package/dist/gestures/GestureHost.d.ts.map +1 -1
- package/dist/gestures/GestureHost.js +53 -5
- package/dist/hooks/actionGroupTracker.d.ts +3 -3
- package/dist/hooks/actionGroupTracker.d.ts.map +1 -1
- package/dist/hooks/actionGroupTracker.js +6 -53
- package/dist/hooks/useHighlightedOptionScroll.d.ts +11 -1
- package/dist/hooks/useHighlightedOptionScroll.d.ts.map +1 -1
- package/dist/hooks/useHighlightedOptionScroll.js +112 -11
- package/dist/hooks/useMediaQuery.d.ts +2 -1
- package/dist/hooks/useMediaQuery.d.ts.map +1 -1
- package/dist/hooks/useMediaQuery.js +7 -4
- package/dist/hooks/useMenuPress.d.ts.map +1 -1
- package/dist/hooks/useMenuPress.js +4 -2
- package/dist/i18n/generated-english/PowerSearch/PowerSearch.generated.d.ts.map +1 -1
- package/dist/i18n/generated-english/PowerSearch/PowerSearch.generated.js +1 -0
- package/dist/i18n/generated-english/Tokenizer/TokenizerBottomSheet.generated.d.ts.map +1 -1
- package/dist/i18n/generated-english/Tokenizer/TokenizerBottomSheet.generated.js +7 -1
- package/dist/i18n/generated-locales/en.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/en.generated.js +1 -0
- package/dist/i18n/generated-locales/pseudo.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/pseudo.generated.js +1 -0
- package/dist/internal/SheetConfirmation.d.ts +11 -0
- package/dist/internal/SheetConfirmation.d.ts.map +1 -0
- package/dist/internal/SheetConfirmation.js +92 -0
- package/dist/internal/sheetDraft.d.ts +35 -0
- package/dist/internal/sheetDraft.d.ts.map +1 -0
- package/dist/internal/sheetDraft.js +65 -0
- package/dist/internal/touch-sheet.d.ts +21 -0
- package/dist/internal/touch-sheet.d.ts.map +1 -0
- package/dist/internal/touch-sheet.js +19 -0
- package/dist/internal/useDismissSearchOnTouchDrag.d.ts +24 -0
- package/dist/internal/useDismissSearchOnTouchDrag.d.ts.map +1 -0
- package/dist/internal/useDismissSearchOnTouchDrag.js +56 -0
- package/dist/motion/roles.d.ts +7 -1
- package/dist/motion/roles.d.ts.map +1 -1
- package/dist/motion/roles.js +20 -1
- package/dist/motion/uikit/index.d.ts +6 -5
- package/dist/motion/uikit/index.d.ts.map +1 -1
- package/dist/motion/uikit/index.js +6 -5
- package/dist/motion/uikit/segmented.d.ts +55 -0
- package/dist/motion/uikit/segmented.d.ts.map +1 -0
- package/dist/motion/uikit/segmented.js +77 -0
- package/dist/motion/uikit/springs.d.ts +0 -18
- package/dist/motion/uikit/springs.d.ts.map +1 -1
- package/dist/motion/uikit/springs.js +5 -21
- package/dist/privateAttributes/segmentTitle.stylex.d.ts +5 -0
- package/dist/privateAttributes/segmentTitle.stylex.d.ts.map +1 -0
- package/dist/privateAttributes/segmentTitle.stylex.js +22 -0
- package/dist/utils/browserClickWait.d.ts +35 -0
- package/dist/utils/browserClickWait.d.ts.map +1 -0
- package/dist/utils/browserClickWait.js +123 -0
- package/dist/utils/clickGuard.d.ts +8 -1
- package/dist/utils/clickGuard.d.ts.map +1 -1
- package/dist/utils/clickGuard.js +24 -1
- package/locales/en.json +4 -0
- package/locales/pseudo.json +3 -0
- package/package.json +8 -8
- package/src/AppShell/useCloseMobileDrawerOnActivate.ts +52 -0
- package/src/BottomSheet/BottomSheet.tsx +95 -10
- package/src/BottomSheet/BottomSheetPanel.tsx +7 -2
- package/src/BottomSheet/bottomSheetStack.ts +8 -4
- package/src/Breadcrumbs/BreadcrumbItem.tsx +13 -3
- package/src/CheckboxList/CheckboxList.doc.mjs +4 -2
- package/src/CheckboxList/CheckboxList.tsx +6 -0
- package/src/CheckboxList/CheckboxListContext.tsx +6 -0
- package/src/CheckboxList/CheckboxListItem.tsx +11 -2
- package/src/DateInput/DateInput.tsx +8 -2
- package/src/DateTimeInput/DateTimeInput.tsx +8 -2
- package/src/Dialog/Dialog.tsx +44 -14
- package/src/Drawer/Drawer.tsx +28 -11
- package/src/Drawer/useDrawerDialogPresence.ts +5 -1
- package/src/Field/PanelSearchInput.tsx +11 -0
- package/src/InfoTip/InfoTip.doc.mjs +3 -3
- package/src/InfoTip/InfoTip.tsx +5 -5
- package/src/Layer/layerAnimations.stylex.ts +24 -16
- package/src/Layer/useBackdropPress.ts +81 -0
- package/src/Layer/usePressPin.ts +5 -11
- package/src/MobileNav/MobileNav.tsx +1 -1
- package/src/MultiSelector/hooks.ts +2 -4
- package/src/Outline/Outline.doc.mjs +177 -51
- package/src/Outline/Outline.tsx +5 -57
- package/src/Outline/useOutlineFromMarkdown.doc.mjs +157 -0
- package/src/Outline/useOutlineFromMarkdown.ts +1 -0
- package/src/Outline/useScrollSpy.ts +3 -3
- package/src/PowerSearch/PowerSearch.doc.mjs +3 -3
- package/src/PowerSearch/PowerSearch.tsx +196 -183
- package/src/RadioList/RadioList.doc.mjs +4 -2
- package/src/RadioList/RadioList.tsx +4 -0
- package/src/Resizable/ResizeHandle.tsx +133 -328
- package/src/Resizable/resizeGesture.ts +368 -0
- package/src/SegmentedControl/SegmentedControl.doc.mjs +3 -3
- package/src/SegmentedControl/SegmentedControl.tsx +179 -5
- package/src/SegmentedControl/SegmentedControlContext.ts +6 -0
- package/src/SegmentedControl/SegmentedControlItem.tsx +12 -1
- package/src/SegmentedControl/useSegmentedSelectionMotion.ts +1637 -0
- package/src/SegmentedControl/useSegmentedTouchTracking.ts +308 -0
- package/src/Selector/Selector.tsx +136 -89
- package/src/Selector/optionShape.ts +64 -0
- package/src/Selector/selectableOptionEntries.ts +39 -0
- package/src/Selector/utils.ts +9 -68
- package/src/SideNav/SideNavItem.tsx +3 -7
- package/src/Switch/switchTouch.ts +2 -10
- package/src/Switch/useSwitchTouch.ts +26 -96
- package/src/Token/Token.tsx +13 -4
- package/src/Token/TokenNamingContext.ts +28 -0
- package/src/Tokenizer/Tokenizer.doc.mjs +16 -0
- package/src/Tokenizer/Tokenizer.tsx +81 -86
- package/src/Tokenizer/TokenizerBottomSheet.tsx +219 -93
- package/src/Tokenizer/TokenizerItemRemovableContext.ts +5 -3
- package/src/Tooltip/Tooltip.doc.mjs +123 -54
- package/src/Tooltip/Tooltip.tsx +36 -39
- package/src/Tooltip/index.ts +0 -1
- package/src/Tooltip/useTooltip.doc.mjs +147 -33
- package/src/Tooltip/useTooltip.tsx +39 -32
- package/src/TopNav/TopNavItem.tsx +6 -5
- package/src/TopNav/TopNavMegaMenuItem.tsx +6 -5
- package/src/TopNav/TopNavMenu.tsx +6 -5
- package/src/gestures/GestureHost.ts +73 -4
- package/src/hooks/actionGroupTracker.ts +12 -56
- package/src/hooks/useHighlightedOptionScroll.ts +123 -15
- package/src/hooks/useMediaQuery.doc.mjs +2 -2
- package/src/hooks/useMediaQuery.ts +13 -4
- package/src/hooks/useMenuPress.ts +8 -2
- package/src/i18n/generated-english/PowerSearch/PowerSearch.generated.ts +1 -0
- package/src/i18n/generated-english/Tokenizer/TokenizerBottomSheet.generated.ts +7 -1
- package/src/i18n/generated-locales/en.generated.ts +1 -0
- package/src/i18n/generated-locales/pseudo.generated.ts +1 -0
- package/src/internal/SheetConfirmation.tsx +101 -0
- package/src/internal/sheetDraft.ts +80 -0
- package/src/internal/touch-sheet.ts +21 -0
- package/src/internal/useDismissSearchOnTouchDrag.ts +69 -0
- package/src/motion/MEASUREMENTS.md +7 -0
- package/src/motion/README.md +1 -0
- package/src/motion/roles.ts +20 -1
- package/src/motion/uikit/index.ts +5 -5
- package/src/motion/uikit/segmented.ts +74 -0
- package/src/motion/uikit/springs.ts +5 -21
- package/src/privateAttributes/segmentTitle.stylex.ts +22 -0
- package/src/utils/browserClickWait.ts +133 -0
- package/src/utils/clickGuard.ts +37 -1
- package/dist/internal/tokenizer-presentation.d.ts +0 -21
- package/dist/internal/tokenizer-presentation.d.ts.map +0 -1
- package/dist/internal/tokenizer-presentation.js +0 -21
- package/src/internal/tokenizer-presentation.ts +0 -25
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file browserClickWait.ts
|
|
5
|
+
* @input An element a tap's lift released on, and the control that acts on
|
|
6
|
+
* its click
|
|
7
|
+
* @output BROWSER_CLICK_WAIT_MS, awaitBrowserClick, clickForLift and
|
|
8
|
+
* clickAndReport
|
|
9
|
+
* @position The one wait for the browser's click after a tap, shared by
|
|
10
|
+
* Switch/useSwitchTouch.ts and SegmentedControl/useSegmentedTouchTracking.ts.
|
|
11
|
+
* It swallows nothing: utils/clickGuard.ts is the one guard for a late click.
|
|
12
|
+
*
|
|
13
|
+
* SYNC: When modified, update browserClickWait.test.ts.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import {armClickGuard, withoutClickGuard} from './clickGuard';
|
|
17
|
+
import {subscribeInput} from './inputStream';
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* How long a tap's lift waits for the browser's own click, ms. The browser
|
|
21
|
+
* sends that click with the lift when the page has no double-tap delay. The
|
|
22
|
+
* wait runs out for a lift that the browser does not count as a click, such
|
|
23
|
+
* as a hold. It also runs out when a busy main thread holds the click back.
|
|
24
|
+
*/
|
|
25
|
+
export const BROWSER_CLICK_WAIT_MS = 300;
|
|
26
|
+
|
|
27
|
+
/** What a control does when the browser's click comes, or does not. */
|
|
28
|
+
export interface BrowserClickWaitHandlers {
|
|
29
|
+
/** The browser's click ran its handlers. `isCancelled`: one cancelled it. */
|
|
30
|
+
readonly onClicked: (isCancelled: boolean) => void;
|
|
31
|
+
/** No browser click came in time. */
|
|
32
|
+
readonly onNoClick: () => void;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Waits for the browser's own click inside `target` after a tap's lift. That
|
|
37
|
+
* click is the activation: `onClicked` runs once its handlers have run. With
|
|
38
|
+
* no click in time, `onNoClick` runs. The returned call ends the wait at once
|
|
39
|
+
* and leaves no listener or timer behind.
|
|
40
|
+
*/
|
|
41
|
+
export function awaitBrowserClick(
|
|
42
|
+
target: Element,
|
|
43
|
+
{onClicked, onNoClick}: BrowserClickWaitHandlers,
|
|
44
|
+
): () => void {
|
|
45
|
+
const view = target.ownerDocument.defaultView;
|
|
46
|
+
if (view == null) {
|
|
47
|
+
// A document with no window gets no click: the wait runs out at once.
|
|
48
|
+
let isEnded = false;
|
|
49
|
+
queueMicrotask(() => {
|
|
50
|
+
if (!isEnded) {
|
|
51
|
+
onNoClick();
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
return () => {
|
|
55
|
+
isEnded = true;
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
let isDone = false;
|
|
59
|
+
let report: number | null = null;
|
|
60
|
+
let timer: number | null = null;
|
|
61
|
+
let stopListening: (() => void) | null = null;
|
|
62
|
+
const stop = () => {
|
|
63
|
+
isDone = true;
|
|
64
|
+
stopListening?.();
|
|
65
|
+
stopListening = null;
|
|
66
|
+
if (timer != null) {
|
|
67
|
+
view.clearTimeout(timer);
|
|
68
|
+
timer = null;
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
stopListening = subscribeInput(view, 'click', event => {
|
|
72
|
+
if (
|
|
73
|
+
isDone ||
|
|
74
|
+
!event.isTrusted ||
|
|
75
|
+
!target.contains(event.target as Node | null)
|
|
76
|
+
) {
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
stop();
|
|
80
|
+
// After every handler has run: was it cancelled?
|
|
81
|
+
report = view.setTimeout(() => {
|
|
82
|
+
report = null;
|
|
83
|
+
onClicked(event.defaultPrevented);
|
|
84
|
+
}, 0);
|
|
85
|
+
});
|
|
86
|
+
timer = view.setTimeout(() => {
|
|
87
|
+
if (isDone) {
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
stop();
|
|
91
|
+
onNoClick();
|
|
92
|
+
}, BROWSER_CLICK_WAIT_MS);
|
|
93
|
+
return () => {
|
|
94
|
+
stop();
|
|
95
|
+
if (report != null) {
|
|
96
|
+
view.clearTimeout(report);
|
|
97
|
+
report = null;
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Click `element` (its own `click()`, so its activation behavior and every
|
|
104
|
+
* handler run as for any click) and report whether a handler cancelled it.
|
|
105
|
+
* The event is read from a capture listener that exists only for the call.
|
|
106
|
+
*/
|
|
107
|
+
export function clickAndReport(element: HTMLElement): boolean {
|
|
108
|
+
const view = element.ownerDocument.defaultView;
|
|
109
|
+
let clicked: Event | null = null;
|
|
110
|
+
const grab = (event: Event) => {
|
|
111
|
+
if (clicked == null && event.target === element) {
|
|
112
|
+
clicked = event;
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
view?.addEventListener('click', grab, true);
|
|
116
|
+
try {
|
|
117
|
+
element.click();
|
|
118
|
+
} finally {
|
|
119
|
+
view?.removeEventListener('click', grab, true);
|
|
120
|
+
}
|
|
121
|
+
return (clicked as Event | null)?.defaultPrevented === true;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Clicks `element` for a lift the control decided itself, and reports
|
|
126
|
+
* whether a handler cancelled the click. The shared click guard swallows the
|
|
127
|
+
* browser's own click for the same lift, if it comes later, so the lift
|
|
128
|
+
* activates once.
|
|
129
|
+
*/
|
|
130
|
+
export function clickForLift(element: HTMLElement): boolean {
|
|
131
|
+
armClickGuard(element.ownerDocument);
|
|
132
|
+
return withoutClickGuard(() => clickAndReport(element));
|
|
133
|
+
}
|
package/src/utils/clickGuard.ts
CHANGED
|
@@ -26,6 +26,11 @@
|
|
|
26
26
|
// `touchend`, aimed at whatever is under the finger by then. They go with
|
|
27
27
|
// the click, the next `pointerdown` or the window, as the guard does.
|
|
28
28
|
//
|
|
29
|
+
// The menu press model's arm at a finger's release also cancels that touch's
|
|
30
|
+
// `touchend`, so the browser creates no click and no compatibility mouse
|
|
31
|
+
// events. A busy main thread can otherwise hold that click past the window,
|
|
32
|
+
// when a drill-in has put another row under the finger.
|
|
33
|
+
//
|
|
29
34
|
// Some clicks always pass:
|
|
30
35
|
// - a click with `detail` 0: a keyboard's, a screen reader's, or one that the
|
|
31
36
|
// page dispatches;
|
|
@@ -56,6 +61,13 @@ export interface ClickGuardOptions {
|
|
|
56
61
|
* @default false
|
|
57
62
|
*/
|
|
58
63
|
readonly takesLateMouse?: boolean;
|
|
64
|
+
/**
|
|
65
|
+
* The menu press model's arm at a finger's release: the guard also cancels
|
|
66
|
+
* that touch's `touchend`, so the browser creates no click for it. A
|
|
67
|
+
* cancelled `touchend` disarms the guard.
|
|
68
|
+
* @default false
|
|
69
|
+
*/
|
|
70
|
+
readonly cancelsTouchEnd?: boolean;
|
|
59
71
|
}
|
|
60
72
|
|
|
61
73
|
interface Guard {
|
|
@@ -89,7 +101,11 @@ function listenForClicks(view: Window): () => void {
|
|
|
89
101
|
/** Swallow the browser's next click on `doc` (see the file header). */
|
|
90
102
|
export function armClickGuard(
|
|
91
103
|
doc: Document,
|
|
92
|
-
{
|
|
104
|
+
{
|
|
105
|
+
staysInstalled = false,
|
|
106
|
+
takesLateMouse = false,
|
|
107
|
+
cancelsTouchEnd = false,
|
|
108
|
+
}: ClickGuardOptions = {},
|
|
93
109
|
): void {
|
|
94
110
|
const view = doc.defaultView;
|
|
95
111
|
if (view == null) {
|
|
@@ -116,6 +132,26 @@ export function armClickGuard(
|
|
|
116
132
|
);
|
|
117
133
|
}
|
|
118
134
|
}
|
|
135
|
+
if (cancelsTouchEnd) {
|
|
136
|
+
// A touch sends its pointerup before its touchend, so the next touchend is
|
|
137
|
+
// that touch's own. The next pointerdown disarms the guard first.
|
|
138
|
+
const stopTouchEnd = subscribeInput(
|
|
139
|
+
view,
|
|
140
|
+
'touchend',
|
|
141
|
+
event => {
|
|
142
|
+
stopTouchEnd();
|
|
143
|
+
// A touchend that the browser took for a scroll is not cancelable.
|
|
144
|
+
// The guard stays armed for a click that may follow it.
|
|
145
|
+
if (event.cancelable) {
|
|
146
|
+
event.preventDefault();
|
|
147
|
+
// No click follows a cancelled touchend.
|
|
148
|
+
disarmClickGuard(doc);
|
|
149
|
+
}
|
|
150
|
+
},
|
|
151
|
+
{cancels: true},
|
|
152
|
+
);
|
|
153
|
+
guard.unsubscribers.push(stopTouchEnd);
|
|
154
|
+
}
|
|
119
155
|
guard.timer = setTimeout(() => disarmClickGuard(doc), CLICK_GUARD_WINDOW_MS);
|
|
120
156
|
}
|
|
121
157
|
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @file tokenizer-presentation.ts
|
|
3
|
-
* @input Tokenizer's sheet-capable signature
|
|
4
|
-
* @output `@astryxdesign/core/internal/tokenizer-presentation`: the Tokenizer
|
|
5
|
-
* with its `presentation` options reachable, for Astryx's own packages
|
|
6
|
-
* @position An internal entry reserved for Astryx's own packages:
|
|
7
|
-
* undocumented, outside the public API and its compatibility promise
|
|
8
|
-
* (spec:AST-017 FR21), versioned in lockstep with Core, and allowed only in
|
|
9
|
-
* Core and Lab by the `@astryx/no-core-internal-import` lint rule
|
|
10
|
-
* (architecture:react-component-runtime INV13). The sheet presentation is
|
|
11
|
-
* implemented but not yet exposed: the public `TokenizerProps` offers no
|
|
12
|
-
* `experimental.presentation` while its user experience is being finished
|
|
13
|
-
* (`component:Tokenizer` DEC-3, implementation gap), and every public field
|
|
14
|
-
* renders the popover presentation. Named re-exports only.
|
|
15
|
-
*
|
|
16
|
-
* SYNC: When modified, update tokenizer-presentation.test.ts and
|
|
17
|
-
* scripts/sync-exports.js.
|
|
18
|
-
*/
|
|
19
|
-
export { TokenizerWithPresentation } from '../Tokenizer/Tokenizer.js';
|
|
20
|
-
export type { TokenizerPresentationOptions, TokenizerWithPresentationProps, } from '../Tokenizer/Tokenizer.js';
|
|
21
|
-
//# sourceMappingURL=tokenizer-presentation.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tokenizer-presentation.d.ts","sourceRoot":"","sources":["../../src/internal/tokenizer-presentation.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAC,yBAAyB,EAAC,MAAM,wBAAwB,CAAC;AACjE,YAAY,EACV,4BAA4B,EAC5B,8BAA8B,GAC/B,MAAM,wBAAwB,CAAC"}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* @file tokenizer-presentation.ts
|
|
5
|
-
* @input Tokenizer's sheet-capable signature
|
|
6
|
-
* @output `@astryxdesign/core/internal/tokenizer-presentation`: the Tokenizer
|
|
7
|
-
* with its `presentation` options reachable, for Astryx's own packages
|
|
8
|
-
* @position An internal entry reserved for Astryx's own packages:
|
|
9
|
-
* undocumented, outside the public API and its compatibility promise
|
|
10
|
-
* (spec:AST-017 FR21), versioned in lockstep with Core, and allowed only in
|
|
11
|
-
* Core and Lab by the `@astryx/no-core-internal-import` lint rule
|
|
12
|
-
* (architecture:react-component-runtime INV13). The sheet presentation is
|
|
13
|
-
* implemented but not yet exposed: the public `TokenizerProps` offers no
|
|
14
|
-
* `experimental.presentation` while its user experience is being finished
|
|
15
|
-
* (`component:Tokenizer` DEC-3, implementation gap), and every public field
|
|
16
|
-
* renders the popover presentation. Named re-exports only.
|
|
17
|
-
*
|
|
18
|
-
* SYNC: When modified, update tokenizer-presentation.test.ts and
|
|
19
|
-
* scripts/sync-exports.js.
|
|
20
|
-
*/
|
|
21
|
-
export { TokenizerWithPresentation } from "../Tokenizer/Tokenizer.js";
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* @file tokenizer-presentation.ts
|
|
5
|
-
* @input Tokenizer's sheet-capable signature
|
|
6
|
-
* @output `@astryxdesign/core/internal/tokenizer-presentation`: the Tokenizer
|
|
7
|
-
* with its `presentation` options reachable, for Astryx's own packages
|
|
8
|
-
* @position An internal entry reserved for Astryx's own packages:
|
|
9
|
-
* undocumented, outside the public API and its compatibility promise
|
|
10
|
-
* (spec:AST-017 FR21), versioned in lockstep with Core, and allowed only in
|
|
11
|
-
* Core and Lab by the `@astryx/no-core-internal-import` lint rule
|
|
12
|
-
* (architecture:react-component-runtime INV13). The sheet presentation is
|
|
13
|
-
* implemented but not yet exposed: the public `TokenizerProps` offers no
|
|
14
|
-
* `experimental.presentation` while its user experience is being finished
|
|
15
|
-
* (`component:Tokenizer` DEC-3, implementation gap), and every public field
|
|
16
|
-
* renders the popover presentation. Named re-exports only.
|
|
17
|
-
*
|
|
18
|
-
* SYNC: When modified, update tokenizer-presentation.test.ts and
|
|
19
|
-
* scripts/sync-exports.js.
|
|
20
|
-
*/
|
|
21
|
-
export {TokenizerWithPresentation} from '../Tokenizer/Tokenizer';
|
|
22
|
-
export type {
|
|
23
|
-
TokenizerPresentationOptions,
|
|
24
|
-
TokenizerWithPresentationProps,
|
|
25
|
-
} from '../Tokenizer/Tokenizer';
|