@proyecto-viviana/solidaria 0.2.4 → 0.2.8
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/LICENSE +21 -0
- package/dist/actiongroup/createActionGroup.d.ts +29 -0
- package/dist/actiongroup/createActionGroup.d.ts.map +1 -0
- package/dist/actiongroup/index.d.ts +2 -0
- package/dist/actiongroup/index.d.ts.map +1 -0
- package/dist/autocomplete/createAutocomplete.d.ts +6 -2
- package/dist/autocomplete/createAutocomplete.d.ts.map +1 -1
- package/dist/breadcrumbs/createBreadcrumbs.d.ts +2 -0
- package/dist/breadcrumbs/createBreadcrumbs.d.ts.map +1 -1
- package/dist/button/createToggleButtonGroup.d.ts +32 -0
- package/dist/button/createToggleButtonGroup.d.ts.map +1 -0
- package/dist/button/index.d.ts +2 -0
- package/dist/button/index.d.ts.map +1 -1
- package/dist/calendar/createCalendarCell.d.ts +2 -0
- package/dist/calendar/createCalendarCell.d.ts.map +1 -1
- package/dist/calendar/createCalendarGrid.d.ts.map +1 -1
- package/dist/calendar/createRangeCalendarCell.d.ts +3 -1
- package/dist/calendar/createRangeCalendarCell.d.ts.map +1 -1
- package/dist/checkbox/createCheckboxGroup.d.ts +5 -1
- package/dist/checkbox/createCheckboxGroup.d.ts.map +1 -1
- package/dist/collections/index.d.ts +56 -0
- package/dist/collections/index.d.ts.map +1 -0
- package/dist/color/createColorArea.d.ts.map +1 -1
- package/dist/color/createColorSlider.d.ts.map +1 -1
- package/dist/color/createColorWheel.d.ts.map +1 -1
- package/dist/combobox/createComboBox.d.ts +6 -0
- package/dist/combobox/createComboBox.d.ts.map +1 -1
- package/dist/datepicker/createDatePicker.d.ts +6 -0
- package/dist/datepicker/createDatePicker.d.ts.map +1 -1
- package/dist/datepicker/createDateRangePicker.d.ts +40 -0
- package/dist/datepicker/createDateRangePicker.d.ts.map +1 -0
- package/dist/datepicker/createDateSegment.d.ts +1 -1
- package/dist/datepicker/createDateSegment.d.ts.map +1 -1
- package/dist/datepicker/createTimeSegment.d.ts +29 -0
- package/dist/datepicker/createTimeSegment.d.ts.map +1 -0
- package/dist/datepicker/index.d.ts +2 -0
- package/dist/datepicker/index.d.ts.map +1 -1
- package/dist/disclosure/createDisclosureGroup.d.ts +2 -1
- package/dist/disclosure/createDisclosureGroup.d.ts.map +1 -1
- package/dist/dnd/createDrag.d.ts.map +1 -1
- package/dist/dnd/createDraggableCollection.d.ts +4 -0
- package/dist/dnd/createDraggableCollection.d.ts.map +1 -1
- package/dist/dnd/createDraggableItem.d.ts.map +1 -1
- package/dist/dnd/createDrop.d.ts.map +1 -1
- package/dist/dnd/createDroppableCollection.d.ts +32 -1
- package/dist/dnd/createDroppableCollection.d.ts.map +1 -1
- package/dist/dnd/createDroppableItem.d.ts.map +1 -1
- package/dist/dnd/index.d.ts +1 -1
- package/dist/dnd/index.d.ts.map +1 -1
- package/dist/grid/createGrid.d.ts.map +1 -1
- package/dist/gridlist/createGridList.d.ts.map +1 -1
- package/dist/index.d.ts +6 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4659 -3452
- package/dist/index.js.map +1 -7
- package/dist/index.ssr.js +4659 -3452
- package/dist/index.ssr.js.map +1 -7
- package/dist/interactions/createFocus.d.ts.map +1 -1
- package/dist/interactions/createFocusWithin.d.ts.map +1 -1
- package/dist/link/createLink.d.ts +10 -0
- package/dist/link/createLink.d.ts.map +1 -1
- package/dist/listbox/createListBox.d.ts +1 -0
- package/dist/listbox/createListBox.d.ts.map +1 -1
- package/dist/listbox/createOption.d.ts.map +1 -1
- package/dist/menu/createMenu.d.ts +1 -0
- package/dist/menu/createMenu.d.ts.map +1 -1
- package/dist/meter/createMeter.d.ts.map +1 -1
- package/dist/numberfield/createNumberField.d.ts +18 -0
- package/dist/numberfield/createNumberField.d.ts.map +1 -1
- package/dist/overlays/createModal.d.ts +16 -0
- package/dist/overlays/createModal.d.ts.map +1 -1
- package/dist/overlays/createOverlay.d.ts.map +1 -1
- package/dist/overlays/index.d.ts +1 -1
- package/dist/overlays/index.d.ts.map +1 -1
- package/dist/popover/createOverlayPosition.d.ts.map +1 -1
- package/dist/popover/createPopover.d.ts.map +1 -1
- package/dist/progress/createProgressBar.d.ts.map +1 -1
- package/dist/radio/createRadioGroup.d.ts +2 -2
- package/dist/radio/createRadioGroup.d.ts.map +1 -1
- package/dist/searchfield/createSearchField.d.ts.map +1 -1
- package/dist/select/createHiddenSelect.d.ts.map +1 -1
- package/dist/select/createSelect.d.ts.map +1 -1
- package/dist/slider/createSlider.d.ts.map +1 -1
- package/dist/table/createTable.d.ts.map +1 -1
- package/dist/tabs/createTabs.d.ts +1 -1
- package/dist/tabs/createTabs.d.ts.map +1 -1
- package/dist/tag/createTag.d.ts.map +1 -1
- package/dist/tag/createTagGroup.d.ts.map +1 -1
- package/dist/toast/createToast.d.ts +4 -0
- package/dist/toast/createToast.d.ts.map +1 -1
- package/dist/toast/createToastRegion.d.ts.map +1 -1
- package/dist/toolbar/createToolbar.d.ts.map +1 -1
- package/dist/tooltip/createTooltipTrigger.d.ts.map +1 -1
- package/dist/tree/createTree.d.ts.map +1 -1
- package/dist/tree/createTreeItem.d.ts.map +1 -1
- package/dist/tree/types.d.ts +4 -0
- package/dist/tree/types.d.ts.map +1 -1
- package/dist/utils/env.d.ts +1 -1
- package/dist/utils/env.d.ts.map +1 -1
- package/dist/utils/platform.d.ts.map +1 -1
- package/dist/visually-hidden/createVisuallyHidden.d.ts.map +1 -1
- package/package.json +8 -6
- package/src/actiongroup/createActionGroup.ts +324 -0
- package/src/actiongroup/index.ts +8 -0
- package/src/autocomplete/createAutocomplete.ts +32 -9
- package/src/breadcrumbs/createBreadcrumbs.ts +10 -15
- package/src/button/createButton.ts +1 -1
- package/src/button/createToggleButtonGroup.ts +128 -0
- package/src/button/index.ts +9 -0
- package/src/calendar/createCalendarCell.ts +6 -4
- package/src/calendar/createCalendarGrid.ts +27 -18
- package/src/calendar/createRangeCalendarCell.ts +26 -9
- package/src/checkbox/createCheckboxGroup.ts +21 -4
- package/src/collections/index.ts +242 -0
- package/src/color/createColorArea.ts +380 -314
- package/src/color/createColorField.ts +137 -137
- package/src/color/createColorSlider.ts +286 -197
- package/src/color/createColorSwatch.ts +40 -40
- package/src/color/createColorWheel.ts +218 -208
- package/src/color/index.ts +24 -24
- package/src/color/types.ts +116 -116
- package/src/combobox/createComboBox.ts +670 -647
- package/src/combobox/index.ts +6 -6
- package/src/datepicker/createDatePicker.ts +54 -16
- package/src/datepicker/createDateRangePicker.ts +246 -0
- package/src/datepicker/createDateSegment.ts +185 -31
- package/src/datepicker/createTimeSegment.ts +370 -0
- package/src/datepicker/index.ts +14 -0
- package/src/dialog/createDialog.ts +120 -120
- package/src/dialog/index.ts +2 -2
- package/src/dialog/types.ts +19 -19
- package/src/disclosure/createDisclosureGroup.ts +5 -2
- package/src/dnd/createDrag.ts +224 -209
- package/src/dnd/createDraggableCollection.ts +96 -63
- package/src/dnd/createDraggableItem.ts +259 -243
- package/src/dnd/createDrop.ts +322 -321
- package/src/dnd/createDroppableCollection.ts +682 -293
- package/src/dnd/createDroppableItem.ts +215 -213
- package/src/dnd/index.ts +55 -47
- package/src/dnd/types.ts +89 -89
- package/src/dnd/utils.ts +294 -294
- package/src/focus/createAutoFocus.ts +321 -321
- package/src/focus/createFocusRestore.ts +313 -313
- package/src/focus/createVirtualFocus.ts +396 -396
- package/src/form/createFormValidation.ts +224 -224
- package/src/form/index.ts +11 -11
- package/src/grid/createGrid.ts +3 -1
- package/src/gridlist/createGridList.ts +16 -0
- package/src/gridlist/createGridListItem.ts +1 -1
- package/src/i18n/NumberFormatter.ts +266 -266
- package/src/i18n/createCollator.ts +79 -79
- package/src/i18n/createDateFormatter.ts +83 -83
- package/src/i18n/createFilter.ts +131 -131
- package/src/i18n/createNumberFormatter.ts +52 -52
- package/src/i18n/index.ts +40 -40
- package/src/i18n/locale.tsx +188 -188
- package/src/i18n/utils.ts +99 -99
- package/src/index.ts +51 -0
- package/src/interactions/createFocus.ts +6 -5
- package/src/interactions/createFocusWithin.ts +6 -5
- package/src/interactions/createLongPress.ts +174 -174
- package/src/interactions/createMove.ts +289 -289
- package/src/interactions/createPress.ts +5 -5
- package/src/landmark/createLandmark.ts +377 -377
- package/src/landmark/index.ts +8 -8
- package/src/link/createLink.ts +23 -8
- package/src/listbox/createListBox.ts +308 -269
- package/src/listbox/createOption.ts +162 -151
- package/src/listbox/index.ts +12 -12
- package/src/live-announcer/announce.ts +322 -322
- package/src/live-announcer/index.ts +9 -9
- package/src/menu/createMenu.ts +405 -396
- package/src/menu/createMenuItem.ts +149 -149
- package/src/menu/createMenuTrigger.ts +88 -88
- package/src/menu/index.ts +18 -18
- package/src/meter/createMeter.ts +1 -6
- package/src/numberfield/createNumberField.ts +311 -268
- package/src/numberfield/index.ts +5 -5
- package/src/overlays/ariaHideOutside.ts +219 -219
- package/src/overlays/createInteractOutside.ts +149 -149
- package/src/overlays/createModal.tsx +238 -202
- package/src/overlays/createOverlay.ts +165 -155
- package/src/overlays/createOverlayTrigger.ts +85 -85
- package/src/overlays/createPreventScroll.ts +266 -266
- package/src/overlays/index.ts +48 -44
- package/src/popover/calculatePosition.ts +6 -6
- package/src/popover/createOverlayPosition.ts +7 -4
- package/src/popover/createPopover.ts +21 -7
- package/src/progress/createProgressBar.ts +6 -1
- package/src/radio/createRadioGroup.ts +88 -14
- package/src/searchfield/createSearchField.ts +241 -186
- package/src/searchfield/index.ts +2 -2
- package/src/select/createHiddenSelect.tsx +263 -236
- package/src/select/createSelect.ts +373 -395
- package/src/select/index.ts +14 -14
- package/src/slider/createSlider.ts +364 -349
- package/src/slider/index.ts +2 -2
- package/src/ssr/index.tsx +370 -370
- package/src/table/createTable.ts +3 -1
- package/src/table/createTableColumnHeader.ts +1 -1
- package/src/table/createTableRow.ts +1 -1
- package/src/tabs/createTabs.ts +80 -51
- package/src/tag/createTag.ts +135 -6
- package/src/tag/createTagGroup.ts +7 -2
- package/src/toast/createToast.ts +8 -2
- package/src/toast/createToastRegion.ts +0 -1
- package/src/toolbar/createToolbar.ts +75 -1
- package/src/tooltip/createTooltip.ts +79 -79
- package/src/tooltip/createTooltipTrigger.ts +226 -222
- package/src/tooltip/index.ts +6 -6
- package/src/tree/createTree.ts +261 -246
- package/src/tree/createTreeItem.ts +282 -233
- package/src/tree/createTreeSelectionCheckbox.ts +68 -68
- package/src/tree/index.ts +16 -16
- package/src/tree/types.ts +91 -87
- package/src/utils/env.ts +55 -54
- package/src/utils/platform.ts +16 -6
- package/src/visually-hidden/createVisuallyHidden.ts +139 -124
- package/src/visually-hidden/index.ts +6 -6
|
@@ -1,174 +1,174 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* createLongPress - Handles long press interactions across mouse and touch.
|
|
3
|
-
*
|
|
4
|
-
* Port of @react-aria/interactions useLongPress, adapted for SolidJS.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { JSX, onCleanup } from 'solid-js';
|
|
8
|
-
import { createPress, type PressEvent } from './createPress';
|
|
9
|
-
import { mergeProps, focusWithoutScrolling, createGlobalListeners } from '../utils';
|
|
10
|
-
import { createDescription } from '../utils/createDescription';
|
|
11
|
-
import { type MaybeAccessor } from '../utils/reactivity';
|
|
12
|
-
|
|
13
|
-
export interface LongPressEvent {
|
|
14
|
-
/** The type of long press event being fired. */
|
|
15
|
-
type: 'longpressstart' | 'longpressend' | 'longpress';
|
|
16
|
-
/** The pointer type that triggered the long press. */
|
|
17
|
-
pointerType: PressEvent['pointerType'];
|
|
18
|
-
/** The target element of the long press event. */
|
|
19
|
-
target: Element;
|
|
20
|
-
/** Whether the shift keyboard modifier was held during the long press event. */
|
|
21
|
-
shiftKey: boolean;
|
|
22
|
-
/** Whether the ctrl keyboard modifier was held during the long press event. */
|
|
23
|
-
ctrlKey: boolean;
|
|
24
|
-
/** Whether the meta keyboard modifier was held during the long press event. */
|
|
25
|
-
metaKey: boolean;
|
|
26
|
-
/** Whether the alt keyboard modifier was held during the long press event. */
|
|
27
|
-
altKey: boolean;
|
|
28
|
-
/** X position relative to the target. */
|
|
29
|
-
x: number;
|
|
30
|
-
/** Y position relative to the target. */
|
|
31
|
-
y: number;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export interface LongPressProps {
|
|
35
|
-
/** Whether long press events should be disabled. */
|
|
36
|
-
isDisabled?: MaybeAccessor<boolean>;
|
|
37
|
-
/** Handler that is called when a long press interaction starts. */
|
|
38
|
-
onLongPressStart?: (e: LongPressEvent) => void;
|
|
39
|
-
/**
|
|
40
|
-
* Handler that is called when a long press interaction ends, either
|
|
41
|
-
* over the target or when the pointer leaves the target.
|
|
42
|
-
*/
|
|
43
|
-
onLongPressEnd?: (e: LongPressEvent) => void;
|
|
44
|
-
/**
|
|
45
|
-
* Handler that is called when the threshold time is met while
|
|
46
|
-
* the press is over the target.
|
|
47
|
-
*/
|
|
48
|
-
onLongPress?: (e: LongPressEvent) => void;
|
|
49
|
-
/**
|
|
50
|
-
* The amount of time in milliseconds to wait before triggering a long press.
|
|
51
|
-
* @default 500ms
|
|
52
|
-
*/
|
|
53
|
-
threshold?: number;
|
|
54
|
-
/**
|
|
55
|
-
* A description for assistive technology users indicating that a long press
|
|
56
|
-
* action is available, e.g. "Long press to open menu".
|
|
57
|
-
*/
|
|
58
|
-
accessibilityDescription?: string;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
export interface LongPressResult {
|
|
62
|
-
/** Props to spread on the target element. */
|
|
63
|
-
longPressProps: JSX.HTMLAttributes<HTMLElement>;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
const DEFAULT_THRESHOLD = 500;
|
|
67
|
-
|
|
68
|
-
function isDisabledValue(isDisabled: MaybeAccessor<boolean> | undefined): boolean {
|
|
69
|
-
return typeof isDisabled === 'function' ? isDisabled() : !!isDisabled;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
function createLongPressEvent(type: LongPressEvent['type'], e: PressEvent): LongPressEvent {
|
|
73
|
-
return {
|
|
74
|
-
type,
|
|
75
|
-
pointerType: e.pointerType,
|
|
76
|
-
target: e.target,
|
|
77
|
-
shiftKey: e.shiftKey,
|
|
78
|
-
ctrlKey: e.ctrlKey,
|
|
79
|
-
metaKey: e.metaKey,
|
|
80
|
-
altKey: e.altKey,
|
|
81
|
-
x: e.x,
|
|
82
|
-
y: e.y,
|
|
83
|
-
};
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
/**
|
|
87
|
-
* Handles long press interactions across mouse and touch devices.
|
|
88
|
-
*/
|
|
89
|
-
export function createLongPress(props: LongPressProps = {}): LongPressResult {
|
|
90
|
-
const {
|
|
91
|
-
isDisabled,
|
|
92
|
-
onLongPressStart,
|
|
93
|
-
onLongPressEnd,
|
|
94
|
-
onLongPress,
|
|
95
|
-
threshold = DEFAULT_THRESHOLD,
|
|
96
|
-
accessibilityDescription,
|
|
97
|
-
} = props;
|
|
98
|
-
|
|
99
|
-
let timeoutId: ReturnType<typeof setTimeout> | undefined;
|
|
100
|
-
const { addGlobalListener } = createGlobalListeners();
|
|
101
|
-
|
|
102
|
-
const { pressProps } = createPress({
|
|
103
|
-
isDisabled,
|
|
104
|
-
onPressStart(e) {
|
|
105
|
-
e.continuePropagation();
|
|
106
|
-
if (e.pointerType === 'mouse' || e.pointerType === 'touch') {
|
|
107
|
-
onLongPressStart?.(createLongPressEvent('longpressstart', e));
|
|
108
|
-
|
|
109
|
-
timeoutId = setTimeout(() => {
|
|
110
|
-
// Prevent other press handlers from also handling this event.
|
|
111
|
-
e.target.dispatchEvent(new PointerEvent('pointercancel', { bubbles: true }));
|
|
112
|
-
|
|
113
|
-
// Ensure target is focused. On touch devices, browsers typically focus on pointer up.
|
|
114
|
-
if (document.activeElement !== e.target) {
|
|
115
|
-
focusWithoutScrolling(e.target as HTMLElement);
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
onLongPress?.(createLongPressEvent('longpress', e));
|
|
119
|
-
timeoutId = undefined;
|
|
120
|
-
}, threshold);
|
|
121
|
-
|
|
122
|
-
if (e.pointerType === 'touch') {
|
|
123
|
-
const onContextMenu = (event: Event) => {
|
|
124
|
-
event.preventDefault();
|
|
125
|
-
};
|
|
126
|
-
const target = e.target as HTMLElement;
|
|
127
|
-
target.addEventListener('contextmenu', onContextMenu, { once: true });
|
|
128
|
-
|
|
129
|
-
addGlobalListener(
|
|
130
|
-
'pointerup',
|
|
131
|
-
() => {
|
|
132
|
-
setTimeout(() => {
|
|
133
|
-
target.removeEventListener('contextmenu', onContextMenu);
|
|
134
|
-
}, 30);
|
|
135
|
-
},
|
|
136
|
-
{ isWindow: true, once: true }
|
|
137
|
-
);
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
},
|
|
141
|
-
onPressEnd(e) {
|
|
142
|
-
if (timeoutId) {
|
|
143
|
-
clearTimeout(timeoutId);
|
|
144
|
-
timeoutId = undefined;
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
if (onLongPressEnd && (e.pointerType === 'mouse' || e.pointerType === 'touch')) {
|
|
148
|
-
onLongPressEnd(createLongPressEvent('longpressend', e));
|
|
149
|
-
}
|
|
150
|
-
},
|
|
151
|
-
});
|
|
152
|
-
|
|
153
|
-
const descriptionProps = createDescription(() =>
|
|
154
|
-
onLongPress && !isDisabledValue(isDisabled) ? accessibilityDescription : undefined
|
|
155
|
-
);
|
|
156
|
-
|
|
157
|
-
onCleanup(() => {
|
|
158
|
-
if (timeoutId) {
|
|
159
|
-
clearTimeout(timeoutId);
|
|
160
|
-
timeoutId = undefined;
|
|
161
|
-
}
|
|
162
|
-
});
|
|
163
|
-
|
|
164
|
-
const longPressProps = mergeProps(pressProps) as JSX.HTMLAttributes<HTMLElement>;
|
|
165
|
-
Object.defineProperty(longPressProps, 'aria-describedby', {
|
|
166
|
-
get: () => descriptionProps['aria-describedby'],
|
|
167
|
-
enumerable: true,
|
|
168
|
-
configurable: true,
|
|
169
|
-
});
|
|
170
|
-
|
|
171
|
-
return {
|
|
172
|
-
longPressProps,
|
|
173
|
-
};
|
|
174
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* createLongPress - Handles long press interactions across mouse and touch.
|
|
3
|
+
*
|
|
4
|
+
* Port of @react-aria/interactions useLongPress, adapted for SolidJS.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { JSX, onCleanup } from 'solid-js';
|
|
8
|
+
import { createPress, type PressEvent } from './createPress';
|
|
9
|
+
import { mergeProps, focusWithoutScrolling, createGlobalListeners } from '../utils';
|
|
10
|
+
import { createDescription } from '../utils/createDescription';
|
|
11
|
+
import { type MaybeAccessor } from '../utils/reactivity';
|
|
12
|
+
|
|
13
|
+
export interface LongPressEvent {
|
|
14
|
+
/** The type of long press event being fired. */
|
|
15
|
+
type: 'longpressstart' | 'longpressend' | 'longpress';
|
|
16
|
+
/** The pointer type that triggered the long press. */
|
|
17
|
+
pointerType: PressEvent['pointerType'];
|
|
18
|
+
/** The target element of the long press event. */
|
|
19
|
+
target: Element;
|
|
20
|
+
/** Whether the shift keyboard modifier was held during the long press event. */
|
|
21
|
+
shiftKey: boolean;
|
|
22
|
+
/** Whether the ctrl keyboard modifier was held during the long press event. */
|
|
23
|
+
ctrlKey: boolean;
|
|
24
|
+
/** Whether the meta keyboard modifier was held during the long press event. */
|
|
25
|
+
metaKey: boolean;
|
|
26
|
+
/** Whether the alt keyboard modifier was held during the long press event. */
|
|
27
|
+
altKey: boolean;
|
|
28
|
+
/** X position relative to the target. */
|
|
29
|
+
x: number;
|
|
30
|
+
/** Y position relative to the target. */
|
|
31
|
+
y: number;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export interface LongPressProps {
|
|
35
|
+
/** Whether long press events should be disabled. */
|
|
36
|
+
isDisabled?: MaybeAccessor<boolean>;
|
|
37
|
+
/** Handler that is called when a long press interaction starts. */
|
|
38
|
+
onLongPressStart?: (e: LongPressEvent) => void;
|
|
39
|
+
/**
|
|
40
|
+
* Handler that is called when a long press interaction ends, either
|
|
41
|
+
* over the target or when the pointer leaves the target.
|
|
42
|
+
*/
|
|
43
|
+
onLongPressEnd?: (e: LongPressEvent) => void;
|
|
44
|
+
/**
|
|
45
|
+
* Handler that is called when the threshold time is met while
|
|
46
|
+
* the press is over the target.
|
|
47
|
+
*/
|
|
48
|
+
onLongPress?: (e: LongPressEvent) => void;
|
|
49
|
+
/**
|
|
50
|
+
* The amount of time in milliseconds to wait before triggering a long press.
|
|
51
|
+
* @default 500ms
|
|
52
|
+
*/
|
|
53
|
+
threshold?: number;
|
|
54
|
+
/**
|
|
55
|
+
* A description for assistive technology users indicating that a long press
|
|
56
|
+
* action is available, e.g. "Long press to open menu".
|
|
57
|
+
*/
|
|
58
|
+
accessibilityDescription?: string;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export interface LongPressResult {
|
|
62
|
+
/** Props to spread on the target element. */
|
|
63
|
+
longPressProps: JSX.HTMLAttributes<HTMLElement>;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const DEFAULT_THRESHOLD = 500;
|
|
67
|
+
|
|
68
|
+
function isDisabledValue(isDisabled: MaybeAccessor<boolean> | undefined): boolean {
|
|
69
|
+
return typeof isDisabled === 'function' ? isDisabled() : !!isDisabled;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function createLongPressEvent(type: LongPressEvent['type'], e: PressEvent): LongPressEvent {
|
|
73
|
+
return {
|
|
74
|
+
type,
|
|
75
|
+
pointerType: e.pointerType,
|
|
76
|
+
target: e.target,
|
|
77
|
+
shiftKey: e.shiftKey,
|
|
78
|
+
ctrlKey: e.ctrlKey,
|
|
79
|
+
metaKey: e.metaKey,
|
|
80
|
+
altKey: e.altKey,
|
|
81
|
+
x: e.x,
|
|
82
|
+
y: e.y,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Handles long press interactions across mouse and touch devices.
|
|
88
|
+
*/
|
|
89
|
+
export function createLongPress(props: LongPressProps = {}): LongPressResult {
|
|
90
|
+
const {
|
|
91
|
+
isDisabled,
|
|
92
|
+
onLongPressStart,
|
|
93
|
+
onLongPressEnd,
|
|
94
|
+
onLongPress,
|
|
95
|
+
threshold = DEFAULT_THRESHOLD,
|
|
96
|
+
accessibilityDescription,
|
|
97
|
+
} = props;
|
|
98
|
+
|
|
99
|
+
let timeoutId: ReturnType<typeof setTimeout> | undefined;
|
|
100
|
+
const { addGlobalListener } = createGlobalListeners();
|
|
101
|
+
|
|
102
|
+
const { pressProps } = createPress({
|
|
103
|
+
isDisabled,
|
|
104
|
+
onPressStart(e) {
|
|
105
|
+
e.continuePropagation();
|
|
106
|
+
if (e.pointerType === 'mouse' || e.pointerType === 'touch') {
|
|
107
|
+
onLongPressStart?.(createLongPressEvent('longpressstart', e));
|
|
108
|
+
|
|
109
|
+
timeoutId = setTimeout(() => {
|
|
110
|
+
// Prevent other press handlers from also handling this event.
|
|
111
|
+
e.target.dispatchEvent(new PointerEvent('pointercancel', { bubbles: true }));
|
|
112
|
+
|
|
113
|
+
// Ensure target is focused. On touch devices, browsers typically focus on pointer up.
|
|
114
|
+
if (document.activeElement !== e.target) {
|
|
115
|
+
focusWithoutScrolling(e.target as HTMLElement);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
onLongPress?.(createLongPressEvent('longpress', e));
|
|
119
|
+
timeoutId = undefined;
|
|
120
|
+
}, threshold);
|
|
121
|
+
|
|
122
|
+
if (e.pointerType === 'touch') {
|
|
123
|
+
const onContextMenu = (event: Event) => {
|
|
124
|
+
event.preventDefault();
|
|
125
|
+
};
|
|
126
|
+
const target = e.target as HTMLElement;
|
|
127
|
+
target.addEventListener('contextmenu', onContextMenu, { once: true });
|
|
128
|
+
|
|
129
|
+
addGlobalListener(
|
|
130
|
+
'pointerup',
|
|
131
|
+
() => {
|
|
132
|
+
setTimeout(() => {
|
|
133
|
+
target.removeEventListener('contextmenu', onContextMenu);
|
|
134
|
+
}, 30);
|
|
135
|
+
},
|
|
136
|
+
{ isWindow: true, once: true }
|
|
137
|
+
);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
},
|
|
141
|
+
onPressEnd(e) {
|
|
142
|
+
if (timeoutId) {
|
|
143
|
+
clearTimeout(timeoutId);
|
|
144
|
+
timeoutId = undefined;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
if (onLongPressEnd && (e.pointerType === 'mouse' || e.pointerType === 'touch')) {
|
|
148
|
+
onLongPressEnd(createLongPressEvent('longpressend', e));
|
|
149
|
+
}
|
|
150
|
+
},
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
const descriptionProps = createDescription(() =>
|
|
154
|
+
onLongPress && !isDisabledValue(isDisabled) ? accessibilityDescription : undefined
|
|
155
|
+
);
|
|
156
|
+
|
|
157
|
+
onCleanup(() => {
|
|
158
|
+
if (timeoutId) {
|
|
159
|
+
clearTimeout(timeoutId);
|
|
160
|
+
timeoutId = undefined;
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
const longPressProps = mergeProps(pressProps) as JSX.HTMLAttributes<HTMLElement>;
|
|
165
|
+
Object.defineProperty(longPressProps, 'aria-describedby', {
|
|
166
|
+
get: () => descriptionProps['aria-describedby'],
|
|
167
|
+
enumerable: true,
|
|
168
|
+
configurable: true,
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
return {
|
|
172
|
+
longPressProps,
|
|
173
|
+
};
|
|
174
|
+
}
|