@astryxdesign/core 0.7.8 → 0.7.9-canary.048476f
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/BottomSheet/BottomSheet.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheet.js +5 -0
- package/dist/Calendar/styles.d.ts +1 -1
- package/dist/ClickableCard/ClickableCard.d.ts +1 -1
- package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
- package/dist/ClickableCard/ClickableCard.js +5 -1
- package/dist/DateInput/PickerWheel.d.ts.map +1 -1
- package/dist/DateInput/PickerWheel.js +7 -1
- package/dist/DateRangeInput/DateRangeInput.js +1 -1
- package/dist/Dialog/Dialog.d.ts +2 -1
- package/dist/Dialog/Dialog.d.ts.map +1 -1
- package/dist/Dialog/Dialog.js +12 -1
- package/dist/Drawer/useDrawerDialogPresence.d.ts +2 -1
- package/dist/Drawer/useDrawerDialogPresence.d.ts.map +1 -1
- package/dist/Drawer/useDrawerDialogPresence.js +11 -2
- package/dist/DropdownMenu/DropdownMenu.d.ts +9 -1
- package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenu.js +9 -4
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.js +3 -2
- package/dist/DropdownMenu/DropdownMenuItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuItem.js +3 -2
- package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuRadioItem.js +3 -2
- package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuSubMenu.js +3 -2
- package/dist/Field/inputDisabledFocus.d.ts +4 -4
- package/dist/Field/inputStyles.stylex.d.ts +1 -1
- package/dist/FileInput/FileInput.d.ts.map +1 -1
- package/dist/FileInput/FileInput.js +16 -2
- package/dist/Icon/Icon.d.ts +1 -1
- package/dist/InfoTip/InfoTip.d.ts +1 -0
- package/dist/InfoTip/InfoTip.d.ts.map +1 -1
- package/dist/InfoTip/InfoTip.js +1 -0
- package/dist/Item/Item.d.ts +2 -1
- package/dist/Item/Item.d.ts.map +1 -1
- package/dist/Item/Item.js +29 -6
- package/dist/Layer/holdEntranceInput.d.ts +24 -0
- package/dist/Layer/holdEntranceInput.d.ts.map +1 -0
- package/dist/Layer/holdEntranceInput.js +65 -0
- package/dist/Layer/inputHold.d.ts +49 -0
- package/dist/Layer/inputHold.d.ts.map +1 -0
- package/dist/Layer/inputHold.js +636 -0
- package/dist/Layer/preserveAnimations.d.ts +1 -5
- package/dist/Layer/preserveAnimations.d.ts.map +1 -1
- package/dist/Layer/preserveAnimations.js +12 -214
- package/dist/Lightbox/Lightbox.d.ts.map +1 -1
- package/dist/Lightbox/Lightbox.js +4 -0
- package/dist/MetadataList/MetadataList.js +1 -1
- package/dist/MobileNav/MobileNav.d.ts +11 -1
- package/dist/MobileNav/MobileNav.d.ts.map +1 -1
- package/dist/MobileNav/MobileNav.js +34 -1
- package/dist/MoreMenu/MoreMenu.d.ts +5 -3
- package/dist/MoreMenu/MoreMenu.d.ts.map +1 -1
- package/dist/RadioList/RadioListItem.d.ts.map +1 -1
- package/dist/RadioList/RadioListItem.js +4 -1
- package/dist/SelectableCard/SelectableCard.d.ts +1 -1
- package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
- package/dist/SelectableCard/SelectableCard.js +5 -1
- package/dist/Spinner/Spinner.d.ts.map +1 -1
- package/dist/Spinner/Spinner.js +12 -2
- package/dist/Table/plugins/sortable/useTableSortable.js +1 -1
- package/dist/Token/Token.d.ts.map +1 -1
- package/dist/Token/Token.js +9 -0
- package/dist/Token/TokenLink.d.ts +1 -1
- package/dist/Token/TokenLink.d.ts.map +1 -1
- package/dist/Token/TokenLink.js +4 -1
- package/dist/Tooltip/useTooltip.d.ts.map +1 -1
- package/dist/Tooltip/useTooltip.js +162 -59
- package/dist/TreeList/TreeListItem.d.ts +2 -1
- package/dist/TreeList/TreeListItem.d.ts.map +1 -1
- package/dist/TreeList/TreeListItem.js +27 -3
- package/dist/astryx.css +30 -7
- package/dist/gestures/GestureHost.d.ts +2 -2
- package/dist/gestures/GestureHost.d.ts.map +1 -1
- package/dist/gestures/GestureHost.js +21 -6
- package/dist/gestures/nativeScroll.d.ts +3 -6
- package/dist/gestures/nativeScroll.d.ts.map +1 -1
- package/dist/gestures/nativeScroll.js +7 -52
- package/dist/gestures/wheelSegmenter.d.ts +68 -1
- package/dist/gestures/wheelSegmenter.d.ts.map +1 -1
- package/dist/gestures/wheelSegmenter.js +199 -10
- package/dist/hooks/menuPressGesture.d.ts +133 -21
- package/dist/hooks/menuPressGesture.d.ts.map +1 -1
- package/dist/hooks/menuPressGesture.js +155 -30
- package/dist/hooks/menuPressValues.d.ts +16 -0
- package/dist/hooks/menuPressValues.d.ts.map +1 -0
- package/dist/hooks/menuPressValues.js +18 -0
- package/dist/hooks/useClickableContainer.d.ts +27 -5
- package/dist/hooks/useClickableContainer.d.ts.map +1 -1
- package/dist/hooks/useClickableContainer.js +41 -5
- package/dist/hooks/useFocusTrap.d.ts +10 -0
- package/dist/hooks/useFocusTrap.d.ts.map +1 -1
- package/dist/hooks/useFocusTrap.js +225 -132
- package/dist/hooks/useMenuPress.d.ts +34 -1
- package/dist/hooks/useMenuPress.d.ts.map +1 -1
- package/dist/hooks/useMenuPress.js +93 -5
- package/dist/hooks/usePressFeedback.d.ts +6 -6
- package/dist/hooks/usePressFeedback.js +6 -6
- package/dist/motion/carryAnimations.d.ts +58 -0
- package/dist/motion/carryAnimations.d.ts.map +1 -0
- package/dist/motion/carryAnimations.js +305 -0
- package/dist/motion/transientCopy.d.ts +4 -2
- package/dist/motion/transientCopy.d.ts.map +1 -1
- package/dist/motion/transientCopy.js +34 -5
- package/dist/motion/uikit/gestures.d.ts +41 -0
- package/dist/motion/uikit/gestures.d.ts.map +1 -1
- package/dist/motion/uikit/gestures.js +25 -0
- package/dist/motion/uikit/index.d.ts +1 -1
- package/dist/motion/uikit/index.d.ts.map +1 -1
- package/dist/motion/uikit/index.js +1 -1
- package/dist/privateAttributes/menuPressLit.stylex.d.ts +52 -0
- package/dist/privateAttributes/menuPressLit.stylex.d.ts.map +1 -0
- package/dist/privateAttributes/menuPressLit.stylex.js +99 -0
- package/dist/privateAttributes/press.stylex.d.ts +139 -0
- package/dist/privateAttributes/press.stylex.d.ts.map +1 -0
- package/dist/privateAttributes/press.stylex.js +98 -0
- package/dist/theme/tokens.stylex.d.ts +2 -2
- package/dist/theme/tokens.stylex.js +1 -1
- package/dist/utils/flatTree.d.ts +6 -3
- package/dist/utils/flatTree.d.ts.map +1 -1
- package/dist/utils/flatTree.js +13 -3
- package/dist/utils/hitArea.d.ts.map +1 -1
- package/dist/utils/hitArea.js +82 -5
- package/dist/utils/inputStream.d.ts +14 -1
- package/dist/utils/inputStream.d.ts.map +1 -1
- package/dist/utils/inputStream.js +40 -9
- package/dist/utils/interactionOverlay.stylex.d.ts +2 -1
- package/dist/utils/interactionOverlay.stylex.d.ts.map +1 -1
- package/dist/utils/interactionOverlay.stylex.js +7 -2
- package/dist/utils/pressFeedback.d.ts +7 -0
- package/dist/utils/pressFeedback.d.ts.map +1 -1
- package/dist/utils/pressFeedback.js +32 -7
- package/dist/utils/pressGesture.d.ts +6 -0
- package/dist/utils/pressGesture.d.ts.map +1 -1
- package/dist/utils/pressGesture.js +17 -0
- package/dist/utils/rowPressLayer.stylex.d.ts +14 -0
- package/dist/utils/rowPressLayer.stylex.d.ts.map +1 -0
- package/dist/utils/rowPressLayer.stylex.js +25 -0
- package/dist/utils/scrollView.d.ts +25 -0
- package/dist/utils/scrollView.d.ts.map +1 -0
- package/dist/utils/scrollView.js +108 -0
- package/dist/utils/selectionLock.d.ts.map +1 -1
- package/dist/utils/selectionLock.js +1 -10
- package/dist/utils/triggerFocus.d.ts +5 -0
- package/dist/utils/triggerFocus.d.ts.map +1 -1
- package/dist/utils/triggerFocus.js +9 -2
- package/package.json +5 -5
- package/src/BottomSheet/BottomSheet.tsx +5 -0
- package/src/ClickableCard/ClickableCard.tsx +8 -1
- package/src/DateInput/PickerWheel.tsx +7 -2
- package/src/DateRangeInput/DateRangeInput.tsx +1 -1
- package/src/Dialog/Dialog.doc.mjs +1 -1
- package/src/Dialog/Dialog.tsx +12 -1
- package/src/Drawer/Drawer.doc.mjs +1 -1
- package/src/Drawer/useDrawerDialogPresence.ts +9 -2
- package/src/DropdownMenu/DropdownMenu.doc.mjs +1 -2
- package/src/DropdownMenu/DropdownMenu.tsx +29 -5
- package/src/DropdownMenu/DropdownMenuCheckboxItem.tsx +5 -1
- package/src/DropdownMenu/DropdownMenuItem.tsx +8 -4
- package/src/DropdownMenu/DropdownMenuRadioItem.tsx +5 -1
- package/src/DropdownMenu/DropdownMenuSubMenu.tsx +5 -1
- package/src/FileInput/FileInput.tsx +16 -2
- package/src/InfoTip/InfoTip.doc.mjs +26 -2
- package/src/InfoTip/InfoTip.tsx +1 -0
- package/src/Item/Item.tsx +51 -9
- package/src/Layer/holdEntranceInput.ts +84 -0
- package/src/Layer/inputHold.ts +734 -0
- package/src/Layer/preserveAnimations.ts +12 -275
- package/src/Lightbox/Lightbox.tsx +4 -0
- package/src/MetadataList/MetadataList.tsx +1 -1
- package/src/MobileNav/MobileNav.doc.mjs +3 -3
- package/src/MobileNav/MobileNav.tsx +34 -1
- package/src/MoreMenu/MoreMenu.doc.mjs +2 -4
- package/src/MoreMenu/MoreMenu.tsx +5 -3
- package/src/RadioList/RadioListItem.tsx +4 -5
- package/src/SelectableCard/SelectableCard.tsx +8 -1
- package/src/Spinner/Spinner.tsx +13 -3
- package/src/Table/plugins/sortable/useTableSortable.tsx +1 -1
- package/src/Token/Token.tsx +18 -1
- package/src/Token/TokenLink.tsx +7 -1
- package/src/Tooltip/useTooltip.tsx +175 -79
- package/src/TreeList/TreeListItem.tsx +36 -2
- package/src/gestures/GestureHost.ts +21 -5
- package/src/gestures/README.md +12 -4
- package/src/gestures/nativeScroll.ts +12 -68
- package/src/gestures/wheelSegmenter.ts +243 -10
- package/src/hooks/menuPressGesture.ts +244 -38
- package/src/hooks/menuPressValues.ts +18 -0
- package/src/hooks/useClickableContainer.doc.mjs +8 -2
- package/src/hooks/useClickableContainer.ts +72 -6
- package/src/hooks/useFocusTrap.ts +268 -151
- package/src/hooks/useMenuPress.ts +118 -11
- package/src/hooks/usePressFeedback.doc.mjs +3 -3
- package/src/hooks/usePressFeedback.ts +6 -6
- package/src/motion/MEASUREMENTS.md +11 -0
- package/src/motion/carryAnimations.ts +389 -0
- package/src/motion/transientCopy.ts +45 -5
- package/src/motion/uikit/gestures.ts +22 -0
- package/src/motion/uikit/index.ts +1 -0
- package/src/privateAttributes/menuPressLit.stylex.ts +104 -0
- package/src/privateAttributes/press.stylex.ts +244 -0
- package/src/theme/tokens.stylex.ts +1 -1
- package/src/utils/flatTree.ts +15 -3
- package/src/utils/hitArea.ts +107 -5
- package/src/utils/inputStream.ts +47 -10
- package/src/utils/interactionOverlay.stylex.ts +7 -2
- package/src/utils/pressFeedback.ts +31 -6
- package/src/utils/pressGesture.ts +24 -1
- package/src/utils/rowPressLayer.stylex.ts +27 -0
- package/src/utils/scrollView.ts +135 -0
- package/src/utils/selectionLock.ts +5 -10
- package/src/utils/triggerFocus.ts +17 -4
|
@@ -15,9 +15,12 @@
|
|
|
15
15
|
* technology, carries no ids or test ids, joins no form or radio group (a
|
|
16
16
|
* copied checked radio would uncheck the live one), and its frames and media
|
|
17
17
|
* load nothing. Laying it out changes no ancestor's position, and a scaled
|
|
18
|
-
* host draws it at the old size.
|
|
19
|
-
*
|
|
20
|
-
*
|
|
18
|
+
* host draws it at the old size. A clone restarts each CSS animation and runs
|
|
19
|
+
* no transition but a `@starting-style` one; the copy carries on its
|
|
20
|
+
* element's from where they were.
|
|
21
|
+
* Laid in a host outside the element's own ancestors, it keeps what it
|
|
22
|
+
* inherited from them: its inherited properties and custom properties that
|
|
23
|
+
* differ from the host's are written on it.
|
|
21
24
|
* Limits: a rule keyed on a removed `id`, or matched through an ancestor
|
|
22
25
|
* between the host and the element (`.collapsed .label`), does not style the
|
|
23
26
|
* copy as it styled the element; and content holding a canvas whose pixels read back
|
|
@@ -28,6 +31,8 @@
|
|
|
28
31
|
* SYNC: When modified, update /packages/core/src/motion/animatedLayout.ts
|
|
29
32
|
*/
|
|
30
33
|
|
|
34
|
+
import { carryAnimations, saveAnimations } from "./carryAnimations.js";
|
|
35
|
+
|
|
31
36
|
/** Above this many elements, old content is not copied: the new one enters. */
|
|
32
37
|
const MAX_COPIED_ELEMENTS = 1500;
|
|
33
38
|
|
|
@@ -115,11 +120,19 @@ function readInherited(element) {
|
|
|
115
120
|
/** Scroll offsets a copy restores once laid out (a clone carries none). */
|
|
116
121
|
const scrollOffsets = new WeakMap();
|
|
117
122
|
|
|
123
|
+
/**
|
|
124
|
+
* The CSS animations and transitions a copy's element ran, and the copy of
|
|
125
|
+
* each element in the copied subtree. The copy carries them on once laid out
|
|
126
|
+
* (`placeOver`).
|
|
127
|
+
*/
|
|
128
|
+
const carriedMotion = new WeakMap();
|
|
129
|
+
|
|
118
130
|
/**
|
|
119
131
|
* A copy that takes no part: no ids or test ids, no form or radio group (a
|
|
120
132
|
* copied checked radio would uncheck the live one), no label for a live
|
|
121
133
|
* control, and copied frames and media load nothing. Scrolled descendants
|
|
122
|
-
* keep their offsets
|
|
134
|
+
* keep their offsets. The CSS animations and transitions running in it carry
|
|
135
|
+
* on from where they were, once the copy is laid out (`placeOver`).
|
|
123
136
|
*/
|
|
124
137
|
export function inertCopy(element) {
|
|
125
138
|
const copy = element.cloneNode(true);
|
|
@@ -133,6 +146,10 @@ export function inertCopy(element) {
|
|
|
133
146
|
});
|
|
134
147
|
scrollOffsets.set(copy, offsets);
|
|
135
148
|
inheritedValues.set(copy, readInherited(element));
|
|
149
|
+
carriedMotion.set(copy, {
|
|
150
|
+
saved: saveAnimations(element),
|
|
151
|
+
copyOf: new Map(sourceNodes.map((node, index) => [node, copyNodes[index]]))
|
|
152
|
+
});
|
|
136
153
|
for (const node of copyNodes) {
|
|
137
154
|
for (const name of ['id', 'data-testid', 'name', 'form', 'for', 'autofocus']) {
|
|
138
155
|
node.removeAttribute(name);
|
|
@@ -170,7 +187,8 @@ export function paintedBackground(element) {
|
|
|
170
187
|
/**
|
|
171
188
|
* Lay `element` over `rect` (viewport coordinates), absolutely, as the last
|
|
172
189
|
* child of `host`, wherever its containing block is: no ancestor's position
|
|
173
|
-
* changes.
|
|
190
|
+
* changes. A copy's scrolled descendants then restore their offsets, and the
|
|
191
|
+
* CSS animations and transitions its element ran carry on in it.
|
|
174
192
|
*/
|
|
175
193
|
export function placeOver(element, host, rect) {
|
|
176
194
|
Object.assign(element.style, {
|
|
@@ -221,6 +239,11 @@ export function placeOver(element, host, rect) {
|
|
|
221
239
|
node.scrollLeft = left;
|
|
222
240
|
}
|
|
223
241
|
}
|
|
242
|
+
const carried = carriedMotion.get(element);
|
|
243
|
+
if (carried != null) {
|
|
244
|
+
carriedMotion.delete(element);
|
|
245
|
+
carryAnimations(carried.saved, element, node => carried.copyOf.get(node) ?? null);
|
|
246
|
+
}
|
|
224
247
|
}
|
|
225
248
|
|
|
226
249
|
/**
|
|
@@ -264,6 +287,12 @@ export function visiblePartCopy(element) {
|
|
|
264
287
|
if (values != null) {
|
|
265
288
|
inheritedValues.set(holder, values);
|
|
266
289
|
}
|
|
290
|
+
// The content's CSS motion carries on when the holder is laid out.
|
|
291
|
+
const carried = carriedMotion.get(content);
|
|
292
|
+
if (carried != null) {
|
|
293
|
+
carriedMotion.set(holder, carried);
|
|
294
|
+
carriedMotion.delete(content);
|
|
295
|
+
}
|
|
267
296
|
const box = element.getBoundingClientRect();
|
|
268
297
|
return {
|
|
269
298
|
copy: holder,
|
|
@@ -253,6 +253,29 @@ export declare const UIKIT_PRESS: {
|
|
|
253
253
|
readonly unit: "ms";
|
|
254
254
|
};
|
|
255
255
|
};
|
|
256
|
+
/**
|
|
257
|
+
* UIMenu presented by a button whose menu is its primary action: how far the
|
|
258
|
+
* finger that opened it travels before it picks. DropdownMenu's press model
|
|
259
|
+
* reads a copy in `hooks/menuPressValues.ts`.
|
|
260
|
+
*/
|
|
261
|
+
export declare const UIKIT_MENU_PRESS: {
|
|
262
|
+
/**
|
|
263
|
+
* After the menu opens under a still-held finger, the finger travels this
|
|
264
|
+
* far before it starts picking. The distance is a straight line from the
|
|
265
|
+
* first sample the menu receives after it opened. Until then nothing is
|
|
266
|
+
* lit, and lifting acts on nothing.
|
|
267
|
+
* @source measured: UIKit lab (injected host app), iOS 26.2 simulator,
|
|
268
|
+
* iPhone 17 Pro, gesture-state hook, steps 150 ms apart, Oct 23 2026
|
|
269
|
+
* (M-MN2): with the menu open under a held finger and a 1 pt first step,
|
|
270
|
+
* moves of (0, 9) and (7, 7) picked nothing; (0, 10), (0, 11), (10, 0),
|
|
271
|
+
* (9, 9) and (10, 10) picked; a 9 pt step followed by 3 pt more picked
|
|
272
|
+
* nothing
|
|
273
|
+
*/
|
|
274
|
+
readonly handoff: {
|
|
275
|
+
readonly value: 10;
|
|
276
|
+
readonly unit: "px";
|
|
277
|
+
};
|
|
278
|
+
};
|
|
256
279
|
export declare const UIKIT_VELOCITY: {
|
|
257
280
|
/**
|
|
258
281
|
* UIPanGestureRecognizer.velocity(in:) is this times the newest event's
|
|
@@ -567,6 +590,24 @@ export declare const UIKIT_GESTURES: {
|
|
|
567
590
|
readonly unit: "ms";
|
|
568
591
|
};
|
|
569
592
|
};
|
|
593
|
+
readonly menuPress: {
|
|
594
|
+
/**
|
|
595
|
+
* After the menu opens under a still-held finger, the finger travels this
|
|
596
|
+
* far before it starts picking. The distance is a straight line from the
|
|
597
|
+
* first sample the menu receives after it opened. Until then nothing is
|
|
598
|
+
* lit, and lifting acts on nothing.
|
|
599
|
+
* @source measured: UIKit lab (injected host app), iOS 26.2 simulator,
|
|
600
|
+
* iPhone 17 Pro, gesture-state hook, steps 150 ms apart, Oct 23 2026
|
|
601
|
+
* (M-MN2): with the menu open under a held finger and a 1 pt first step,
|
|
602
|
+
* moves of (0, 9) and (7, 7) picked nothing; (0, 10), (0, 11), (10, 0),
|
|
603
|
+
* (9, 9) and (10, 10) picked; a 9 pt step followed by 3 pt more picked
|
|
604
|
+
* nothing
|
|
605
|
+
*/
|
|
606
|
+
readonly handoff: {
|
|
607
|
+
readonly value: 10;
|
|
608
|
+
readonly unit: "px";
|
|
609
|
+
};
|
|
610
|
+
};
|
|
570
611
|
readonly velocity: {
|
|
571
612
|
/**
|
|
572
613
|
* UIPanGestureRecognizer.velocity(in:) is this times the newest event's
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gestures.d.ts","sourceRoot":"","sources":["../../../src/motion/uikit/gestures.ts"],"names":[],"mappings":"AAgDA,MAAM,MAAM,mBAAmB,GAC7B,IAAI,GAAG,IAAI,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,OAAO,CAAC;AAEnD;;;GAGG;AACH,MAAM,WAAW,eAAe,CAAC,CAAC,GAAG,MAAM;IACzC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IAClB,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC;CACpC;AAED,eAAO,MAAM,SAAS;IACpB;;;;;;;OAOG;;;;;IAEH;;;;;OAKG;;;;;IAEH;;;;;;OAMG;;;;;IAEH;;;;;OAKG;;;;;CAE+C,CAAC;AAErD,eAAO,MAAM,gBAAgB;IAC3B;;;;;;OAMG;;;;;IAEH;;;;;;OAMG;;;;;CAE+C,CAAC;AAErD,eAAO,MAAM,SAAS;IACpB;;;;;;;;;;OAUG;;;;;CAE+C,CAAC;AAErD,eAAO,MAAM,WAAW;IACtB;;;;;OAKG;;;;;IAEH;;;;;OAKG;;;;;IAEH;;;;;OAKG;;;;;IAEH;;;;;;OAMG;;;;;CAE+C,CAAC;AAErD,eAAO,MAAM,WAAW;IACtB;;;;;;;OAOG;;;;;CAE+C,CAAC;AAErD,eAAO,MAAM,cAAc;IACzB;;;;;;OAMG;;;;;CAG+C,CAAC;AAErD,eAAO,MAAM,qBAAqB;IAChC;;;;;;OAMG;;;;;IAEH;;;;OAIG;;;;;CAE+C,CAAC;AAErD,eAAO,MAAM,aAAa;IACxB;;;;;;;OAOG;;;;;CAE+C,CAAC;AAErD,eAAO,MAAM,WAAW;IACtB;;;;;OAKG;;;;;IAEH;;;;;OAKG;;;;;IAEH;;;;;;OAMG;;;;;IAEH;;;;;OAKG;;;;;IAEH;;;;;;OAMG;;;;;CAE+C,CAAC;AAErD,eAAO,MAAM,cAAc;IACzB;;;;;;;;;;;;OAYG;;;;;IAEH;;;;;;;;OAQG;;;;;IAEH;;;;;;;OAOG;;;;;CAE+C,CAAC;AAErD;;;;;GAKG;AACH,eAAO,MAAM,WAAW;IACtB;;;;OAIG;;;;;CAE+C,CAAC;AAErD;;;;;GAKG;AACH,eAAO,MAAM,cAAc;;
|
|
1
|
+
{"version":3,"file":"gestures.d.ts","sourceRoot":"","sources":["../../../src/motion/uikit/gestures.ts"],"names":[],"mappings":"AAgDA,MAAM,MAAM,mBAAmB,GAC7B,IAAI,GAAG,IAAI,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,OAAO,CAAC;AAEnD;;;GAGG;AACH,MAAM,WAAW,eAAe,CAAC,CAAC,GAAG,MAAM;IACzC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IAClB,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC;CACpC;AAED,eAAO,MAAM,SAAS;IACpB;;;;;;;OAOG;;;;;IAEH;;;;;OAKG;;;;;IAEH;;;;;;OAMG;;;;;IAEH;;;;;OAKG;;;;;CAE+C,CAAC;AAErD,eAAO,MAAM,gBAAgB;IAC3B;;;;;;OAMG;;;;;IAEH;;;;;;OAMG;;;;;CAE+C,CAAC;AAErD,eAAO,MAAM,SAAS;IACpB;;;;;;;;;;OAUG;;;;;CAE+C,CAAC;AAErD,eAAO,MAAM,WAAW;IACtB;;;;;OAKG;;;;;IAEH;;;;;OAKG;;;;;IAEH;;;;;OAKG;;;;;IAEH;;;;;;OAMG;;;;;CAE+C,CAAC;AAErD,eAAO,MAAM,WAAW;IACtB;;;;;;;OAOG;;;;;CAE+C,CAAC;AAErD,eAAO,MAAM,cAAc;IACzB;;;;;;OAMG;;;;;CAG+C,CAAC;AAErD,eAAO,MAAM,qBAAqB;IAChC;;;;;;OAMG;;;;;IAEH;;;;OAIG;;;;;CAE+C,CAAC;AAErD,eAAO,MAAM,aAAa;IACxB;;;;;;;OAOG;;;;;CAE+C,CAAC;AAErD,eAAO,MAAM,WAAW;IACtB;;;;;OAKG;;;;;IAEH;;;;;OAKG;;;;;IAEH;;;;;;OAMG;;;;;IAEH;;;;;OAKG;;;;;IAEH;;;;;;OAMG;;;;;CAE+C,CAAC;AAErD;;;;GAIG;AACH,eAAO,MAAM,gBAAgB;IAC3B;;;;;;;;;;;OAWG;;;;;CAE+C,CAAC;AAErD,eAAO,MAAM,cAAc;IACzB;;;;;;;;;;;;OAYG;;;;;IAEH;;;;;;;;OAQG;;;;;IAEH;;;;;;;OAOG;;;;;CAE+C,CAAC;AAErD;;;;;GAKG;AACH,eAAO,MAAM,WAAW;IACtB;;;;OAIG;;;;;CAE+C,CAAC;AAErD;;;;;GAKG;AACH,eAAO,MAAM,cAAc;;QA9QzB;;;;;;;WAOG;;;;;QAEH;;;;;WAKG;;;;;QAEH;;;;;;WAMG;;;;;QAEH;;;;;WAKG;;;;;;;QAKH;;;;;;WAMG;;;;;QAEH;;;;;;WAMG;;;;;;;QAKH;;;;;;;;;;WAUG;;;;;;;QAKH;;;;;WAKG;;;;;QAEH;;;;;WAKG;;;;;QAEH;;;;;WAKG;;;;;QAEH;;;;;;WAMG;;;;;;;QAKH;;;;;;;WAOG;;;;;;;QAKH;;;;;;WAMG;;;;;;;QAMH;;;;;;WAMG;;;;;QAEH;;;;WAIG;;;;;;;QAKH;;;;;;;WAOG;;;;;;;QAKH;;;;;WAKG;;;;;QAEH;;;;;WAKG;;;;;QAEH;;;;;;WAMG;;;;;QAEH;;;;;WAKG;;;;;QAEH;;;;;;WAMG;;;;;;;QAUH;;;;;;;;;;;WAWG;;;;;;;QAKH;;;;;;;;;;;;WAYG;;;;;QAEH;;;;;;;;WAQG;;;;;QAEH;;;;;;;WAOG;;;;;;CAqCK,CAAC;AAEX;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,sKAUxB,CAAC;AAEX,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,qBAAqB,CAAC,CAAC,MAAM,CAAC,CAAC;AAExE;;;;;;;;GAQG;AACH,eAAO,MAAM,yBAAyB,EAAE,MAAM,CAC5C,kBAAkB,EAClB,eAAe,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAWvC,CAAC"}
|
|
@@ -295,6 +295,30 @@ export const UIKIT_PRESS = {
|
|
|
295
295
|
unit: 'ms'
|
|
296
296
|
}
|
|
297
297
|
};
|
|
298
|
+
|
|
299
|
+
/**
|
|
300
|
+
* UIMenu presented by a button whose menu is its primary action: how far the
|
|
301
|
+
* finger that opened it travels before it picks. DropdownMenu's press model
|
|
302
|
+
* reads a copy in `hooks/menuPressValues.ts`.
|
|
303
|
+
*/
|
|
304
|
+
export const UIKIT_MENU_PRESS = {
|
|
305
|
+
/**
|
|
306
|
+
* After the menu opens under a still-held finger, the finger travels this
|
|
307
|
+
* far before it starts picking. The distance is a straight line from the
|
|
308
|
+
* first sample the menu receives after it opened. Until then nothing is
|
|
309
|
+
* lit, and lifting acts on nothing.
|
|
310
|
+
* @source measured: UIKit lab (injected host app), iOS 26.2 simulator,
|
|
311
|
+
* iPhone 17 Pro, gesture-state hook, steps 150 ms apart, Oct 23 2026
|
|
312
|
+
* (M-MN2): with the menu open under a held finger and a 1 pt first step,
|
|
313
|
+
* moves of (0, 9) and (7, 7) picked nothing; (0, 10), (0, 11), (10, 0),
|
|
314
|
+
* (9, 9) and (10, 10) picked; a 9 pt step followed by 3 pt more picked
|
|
315
|
+
* nothing
|
|
316
|
+
*/
|
|
317
|
+
handoff: {
|
|
318
|
+
value: 10,
|
|
319
|
+
unit: 'px'
|
|
320
|
+
}
|
|
321
|
+
};
|
|
298
322
|
export const UIKIT_VELOCITY = {
|
|
299
323
|
/**
|
|
300
324
|
* UIPanGestureRecognizer.velocity(in:) is this times the newest event's
|
|
@@ -374,6 +398,7 @@ export const UIKIT_GESTURES = {
|
|
|
374
398
|
screenEdgePan: UIKIT_SCREEN_EDGE_PAN,
|
|
375
399
|
control: UIKIT_CONTROL,
|
|
376
400
|
press: UIKIT_PRESS,
|
|
401
|
+
menuPress: UIKIT_MENU_PRESS,
|
|
377
402
|
velocity: UIKIT_VELOCITY
|
|
378
403
|
};
|
|
379
404
|
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
* SYNC: When a domain file is added, re-export it here and list it in
|
|
18
18
|
* /packages/core/src/motion/README.md.
|
|
19
19
|
*/
|
|
20
|
-
export { HAPTIC_FEEDBACK_KINDS, HAPTIC_VIBRATION_PATTERNS, UIKIT_CLICK, UIKIT_CONTROL, UIKIT_GESTURES, UIKIT_LONG_PRESS, UIKIT_PAN, UIKIT_PINCH, UIKIT_PRESS, UIKIT_ROTATION, UIKIT_SCREEN_EDGE_PAN, UIKIT_SWIPE, UIKIT_TAP, UIKIT_VELOCITY, type GestureConstant, type GestureConstantUnit, type HapticFeedbackKind, } from './gestures.js';
|
|
20
|
+
export { HAPTIC_FEEDBACK_KINDS, HAPTIC_VIBRATION_PATTERNS, UIKIT_CLICK, UIKIT_CONTROL, UIKIT_GESTURES, UIKIT_LONG_PRESS, UIKIT_MENU_PRESS, UIKIT_PAN, UIKIT_PINCH, UIKIT_PRESS, UIKIT_ROTATION, UIKIT_SCREEN_EDGE_PAN, UIKIT_SWIPE, UIKIT_TAP, UIKIT_VELOCITY, type GestureConstant, type GestureConstantUnit, type HapticFeedbackKind, } from './gestures.js';
|
|
21
21
|
export { datePicker } from './datePicker.js';
|
|
22
22
|
export { navigation, registerNavigationTable } from './navigation.js';
|
|
23
23
|
export { picker } from './picker.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/motion/uikit/index.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EACL,qBAAqB,EACrB,yBAAyB,EACzB,WAAW,EACX,aAAa,EACb,cAAc,EACd,gBAAgB,EAChB,SAAS,EACT,WAAW,EACX,WAAW,EACX,cAAc,EACd,qBAAqB,EACrB,WAAW,EACX,SAAS,EACT,cAAc,EACd,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,GACxB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAC,UAAU,EAAC,MAAM,cAAc,CAAC;AACxC,OAAO,EAAC,UAAU,EAAE,uBAAuB,EAAC,MAAM,cAAc,CAAC;AACjE,OAAO,EAAC,MAAM,EAAC,MAAM,UAAU,CAAC;AAChC,OAAO,EAAC,WAAW,EAAE,wBAAwB,EAAC,MAAM,eAAe,CAAC;AACpE,OAAO,EAAC,mBAAmB,EAAE,MAAM,EAAC,MAAM,UAAU,CAAC;AACrD,OAAO,EAAC,gBAAgB,EAAC,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAC,MAAM,EAAC,MAAM,UAAU,CAAC;AAChC,OAAO,EACL,2BAA2B,EAC3B,2BAA2B,EAC3B,oBAAoB,EACpB,oBAAoB,EACpB,aAAa,EACb,2BAA2B,EAC3B,wBAAwB,EACxB,yBAAyB,EACzB,oBAAoB,EACpB,eAAe,EACf,sBAAsB,EACtB,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,0BAA0B,EAC1B,8BAA8B,EAC9B,wCAAwC,EACxC,qBAAqB,EACrB,sBAAsB,EACtB,mBAAmB,EACnB,aAAa,EACb,mBAAmB,EACnB,oBAAoB,EACpB,0BAA0B,EAC1B,oBAAoB,EACpB,yBAAyB,EACzB,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,EACpB,wBAAwB,EACxB,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,EACpB,OAAO,GACR,MAAM,WAAW,CAAC;AACnB,OAAO,EAAC,aAAa,EAAC,MAAM,UAAU,CAAC;AACvC,OAAO,EAAC,mBAAmB,EAAE,MAAM,EAAC,MAAM,UAAU,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/motion/uikit/index.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EACL,qBAAqB,EACrB,yBAAyB,EACzB,WAAW,EACX,aAAa,EACb,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,SAAS,EACT,WAAW,EACX,WAAW,EACX,cAAc,EACd,qBAAqB,EACrB,WAAW,EACX,SAAS,EACT,cAAc,EACd,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,GACxB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAC,UAAU,EAAC,MAAM,cAAc,CAAC;AACxC,OAAO,EAAC,UAAU,EAAE,uBAAuB,EAAC,MAAM,cAAc,CAAC;AACjE,OAAO,EAAC,MAAM,EAAC,MAAM,UAAU,CAAC;AAChC,OAAO,EAAC,WAAW,EAAE,wBAAwB,EAAC,MAAM,eAAe,CAAC;AACpE,OAAO,EAAC,mBAAmB,EAAE,MAAM,EAAC,MAAM,UAAU,CAAC;AACrD,OAAO,EAAC,gBAAgB,EAAC,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAC,MAAM,EAAC,MAAM,UAAU,CAAC;AAChC,OAAO,EACL,2BAA2B,EAC3B,2BAA2B,EAC3B,oBAAoB,EACpB,oBAAoB,EACpB,aAAa,EACb,2BAA2B,EAC3B,wBAAwB,EACxB,yBAAyB,EACzB,oBAAoB,EACpB,eAAe,EACf,sBAAsB,EACtB,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,0BAA0B,EAC1B,8BAA8B,EAC9B,wCAAwC,EACxC,qBAAqB,EACrB,sBAAsB,EACtB,mBAAmB,EACnB,aAAa,EACb,mBAAmB,EACnB,oBAAoB,EACpB,0BAA0B,EAC1B,oBAAoB,EACpB,yBAAyB,EACzB,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,EACpB,wBAAwB,EACxB,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,EACpB,OAAO,GACR,MAAM,WAAW,CAAC;AACnB,OAAO,EAAC,aAAa,EAAC,MAAM,UAAU,CAAC;AACvC,OAAO,EAAC,mBAAmB,EAAE,MAAM,EAAC,MAAM,UAAU,CAAC"}
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
* /packages/core/src/motion/README.md.
|
|
21
21
|
*/
|
|
22
22
|
|
|
23
|
-
export { HAPTIC_FEEDBACK_KINDS, HAPTIC_VIBRATION_PATTERNS, UIKIT_CLICK, UIKIT_CONTROL, UIKIT_GESTURES, UIKIT_LONG_PRESS, UIKIT_PAN, UIKIT_PINCH, UIKIT_PRESS, UIKIT_ROTATION, UIKIT_SCREEN_EDGE_PAN, UIKIT_SWIPE, UIKIT_TAP, UIKIT_VELOCITY } from "./gestures.js";
|
|
23
|
+
export { HAPTIC_FEEDBACK_KINDS, HAPTIC_VIBRATION_PATTERNS, UIKIT_CLICK, UIKIT_CONTROL, UIKIT_GESTURES, UIKIT_LONG_PRESS, UIKIT_MENU_PRESS, UIKIT_PAN, UIKIT_PINCH, UIKIT_PRESS, UIKIT_ROTATION, UIKIT_SCREEN_EDGE_PAN, UIKIT_SWIPE, UIKIT_TAP, UIKIT_VELOCITY } from "./gestures.js";
|
|
24
24
|
export { datePicker } from "./datePicker.js";
|
|
25
25
|
export { navigation, registerNavigationTable } from "./navigation.js";
|
|
26
26
|
export { picker } from "./picker.js";
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file privateAttributes/menuPressLit.stylex.ts
|
|
3
|
+
* @input The row that a held finger or pen lights in a menu
|
|
4
|
+
* @output Exports markMenuPressLit and clearMenuPressLit, which mark that row,
|
|
5
|
+
* and isMenuPressLit, which reads the mark. It also exports
|
|
6
|
+
* menuPressLitRowStyle, which paints the marked row. The hold pair,
|
|
7
|
+
* holdMenuPressPaint and releaseMenuPressPaint, keeps the other rows off
|
|
8
|
+
* their pressed paint, and isMenuPressPaintHeld reads that hold.
|
|
9
|
+
* @position Owner module of the private menu-press-lit attribute: the only
|
|
10
|
+
* file that writes its name. The menu press model (hooks/useMenuPress.ts)
|
|
11
|
+
* marks the row; DropdownMenu's rows compose the styles. No package entry
|
|
12
|
+
* exports it.
|
|
13
|
+
*
|
|
14
|
+
* SYNC: Each row that composes menuPressLitRowStyle reads
|
|
15
|
+
* `--_menu-row-focus-paint` in its `:focus` background, and a row with an
|
|
16
|
+
* `:active` background reads `--_menu-row-active-paint` there:
|
|
17
|
+
* - /packages/core/src/DropdownMenu/DropdownMenuItem.tsx
|
|
18
|
+
* - /packages/core/src/DropdownMenu/DropdownMenuCheckboxItem.tsx
|
|
19
|
+
* - /packages/core/src/DropdownMenu/DropdownMenuRadioItem.tsx
|
|
20
|
+
* - /packages/core/src/DropdownMenu/DropdownMenuSubMenu.tsx
|
|
21
|
+
*/
|
|
22
|
+
import type { StyleXStyles } from '@stylexjs/stylex';
|
|
23
|
+
/** Marks `row` as the row that a held finger or pen lights. */
|
|
24
|
+
export declare function markMenuPressLit(row: Element): void;
|
|
25
|
+
/** Removes the mark from `row`. */
|
|
26
|
+
export declare function clearMenuPressLit(row: Element): void;
|
|
27
|
+
/** Whether a held finger or pen lights `row`. */
|
|
28
|
+
export declare function isMenuPressLit(row: Element): boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Keeps `menu`'s rows off their `:active` paint while a held finger or pen
|
|
31
|
+
* presses in it. The row the press began on stays `:active` as the press
|
|
32
|
+
* moves on. The lit row keeps the pressed overlay through its own mark.
|
|
33
|
+
*/
|
|
34
|
+
export declare function holdMenuPressPaint(menu: HTMLElement): void;
|
|
35
|
+
/** Gives `menu`'s rows their `:active` paint back. */
|
|
36
|
+
export declare function releaseMenuPressPaint(menu: HTMLElement): void;
|
|
37
|
+
/** Whether a held finger or pen keeps `menu`'s rows off their `:active` paint. */
|
|
38
|
+
export declare function isMenuPressPaintHeld(menu: HTMLElement): boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Compose on a menu row whose `:focus` background is
|
|
41
|
+
* `var(--_menu-row-focus-paint, <hover overlay>)`, and whose `:active`
|
|
42
|
+
* background, if any, is `var(--_menu-row-active-paint, <pressed overlay>)`.
|
|
43
|
+
* The row paints the hover overlay on focus, and the pressed overlay while a
|
|
44
|
+
* held finger or pen lights it.
|
|
45
|
+
* Under a finger, the hover overlay is too faint to follow. The variable has
|
|
46
|
+
* no default: a layered stylesheet emits a default unlayered, and it would
|
|
47
|
+
* beat the attribute arm. The value resolves on the row, so a theme set on any
|
|
48
|
+
* ancestor applies. The style sets only a custom property, which shares no
|
|
49
|
+
* key with StyleX's CSS property type, so TypeScript needs the wider type.
|
|
50
|
+
*/
|
|
51
|
+
export declare const menuPressLitRowStyle: StyleXStyles;
|
|
52
|
+
//# sourceMappingURL=menuPressLit.stylex.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"menuPressLit.stylex.d.ts","sourceRoot":"","sources":["../../src/privateAttributes/menuPressLit.stylex.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;;;;;;GAoBG;AAGH,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,kBAAkB,CAAC;AAMnD,+DAA+D;AAC/D,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAEnD;AAED,mCAAmC;AACnC,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAEpD;AAED,iDAAiD;AACjD,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAEpD;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAE1D;AAED,sDAAsD;AACtD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAE7D;AAED,kFAAkF;AAClF,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAE/D;AA6BD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,oBAAoB,EAAiB,YAAY,CAAC"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
/**
|
|
3
|
+
* @file privateAttributes/menuPressLit.stylex.ts
|
|
4
|
+
* @input The row that a held finger or pen lights in a menu
|
|
5
|
+
* @output Exports markMenuPressLit and clearMenuPressLit, which mark that row,
|
|
6
|
+
* and isMenuPressLit, which reads the mark. It also exports
|
|
7
|
+
* menuPressLitRowStyle, which paints the marked row. The hold pair,
|
|
8
|
+
* holdMenuPressPaint and releaseMenuPressPaint, keeps the other rows off
|
|
9
|
+
* their pressed paint, and isMenuPressPaintHeld reads that hold.
|
|
10
|
+
* @position Owner module of the private menu-press-lit attribute: the only
|
|
11
|
+
* file that writes its name. The menu press model (hooks/useMenuPress.ts)
|
|
12
|
+
* marks the row; DropdownMenu's rows compose the styles. No package entry
|
|
13
|
+
* exports it.
|
|
14
|
+
*
|
|
15
|
+
* SYNC: Each row that composes menuPressLitRowStyle reads
|
|
16
|
+
* `--_menu-row-focus-paint` in its `:focus` background, and a row with an
|
|
17
|
+
* `:active` background reads `--_menu-row-active-paint` there:
|
|
18
|
+
* - /packages/core/src/DropdownMenu/DropdownMenuItem.tsx
|
|
19
|
+
* - /packages/core/src/DropdownMenu/DropdownMenuCheckboxItem.tsx
|
|
20
|
+
* - /packages/core/src/DropdownMenu/DropdownMenuRadioItem.tsx
|
|
21
|
+
* - /packages/core/src/DropdownMenu/DropdownMenuSubMenu.tsx
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
import * as stylex from '@stylexjs/stylex';
|
|
25
|
+
import "../theme/tokens.stylex.js";
|
|
26
|
+
import { colorVars } from "../theme/tokens.stylex.js";
|
|
27
|
+
const MENU_PRESS_LIT = 'data-astryx-menu-press-lit';
|
|
28
|
+
const ACTIVE_PAINT = '--_menu-row-active-paint';
|
|
29
|
+
|
|
30
|
+
/** Marks `row` as the row that a held finger or pen lights. */
|
|
31
|
+
export function markMenuPressLit(row) {
|
|
32
|
+
row.setAttribute(MENU_PRESS_LIT, '');
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/** Removes the mark from `row`. */
|
|
36
|
+
export function clearMenuPressLit(row) {
|
|
37
|
+
row.removeAttribute(MENU_PRESS_LIT);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** Whether a held finger or pen lights `row`. */
|
|
41
|
+
export function isMenuPressLit(row) {
|
|
42
|
+
return row.hasAttribute(MENU_PRESS_LIT);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Keeps `menu`'s rows off their `:active` paint while a held finger or pen
|
|
47
|
+
* presses in it. The row the press began on stays `:active` as the press
|
|
48
|
+
* moves on. The lit row keeps the pressed overlay through its own mark.
|
|
49
|
+
*/
|
|
50
|
+
export function holdMenuPressPaint(menu) {
|
|
51
|
+
menu.style.setProperty(ACTIVE_PAINT, 'transparent');
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/** Gives `menu`'s rows their `:active` paint back. */
|
|
55
|
+
export function releaseMenuPressPaint(menu) {
|
|
56
|
+
menu.style.removeProperty(ACTIVE_PAINT);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/** Whether a held finger or pen keeps `menu`'s rows off their `:active` paint. */
|
|
60
|
+
export function isMenuPressPaintHeld(menu) {
|
|
61
|
+
return menu.style.getPropertyValue(ACTIVE_PAINT) !== '';
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* A value for each attribute state. The index signature gives StyleX the value
|
|
66
|
+
* type, which it cannot read from a literal attribute key.
|
|
67
|
+
*/
|
|
68
|
+
|
|
69
|
+
const litRowPaint = {
|
|
70
|
+
'--_menu-row-focus-paint': {
|
|
71
|
+
default: null,
|
|
72
|
+
'[data-astryx-menu-press-lit]': colorVars['--color-overlay-pressed']
|
|
73
|
+
},
|
|
74
|
+
'--_menu-row-active-paint': {
|
|
75
|
+
default: null,
|
|
76
|
+
'[data-astryx-menu-press-lit]': colorVars['--color-overlay-pressed']
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
const styles = {
|
|
80
|
+
row: {
|
|
81
|
+
"--_menu-row-focus-paint": "x1ar3rj9",
|
|
82
|
+
"--_menu-row-active-paint": "xcukuoe",
|
|
83
|
+
$$css: true
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Compose on a menu row whose `:focus` background is
|
|
89
|
+
* `var(--_menu-row-focus-paint, <hover overlay>)`, and whose `:active`
|
|
90
|
+
* background, if any, is `var(--_menu-row-active-paint, <pressed overlay>)`.
|
|
91
|
+
* The row paints the hover overlay on focus, and the pressed overlay while a
|
|
92
|
+
* held finger or pen lights it.
|
|
93
|
+
* Under a finger, the hover overlay is too faint to follow. The variable has
|
|
94
|
+
* no default: a layered stylesheet emits a default unlayered, and it would
|
|
95
|
+
* beat the attribute arm. The value resolves on the row, so a theme set on any
|
|
96
|
+
* ancestor applies. The style sets only a custom property, which shares no
|
|
97
|
+
* key with StyleX's CSS property type, so TypeScript needs the wider type.
|
|
98
|
+
*/
|
|
99
|
+
export const menuPressLitRowStyle = styles.row;
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file privateAttributes/press.stylex.ts
|
|
3
|
+
* @input StyleX, the semantic overlay color tokens, the touch press strength
|
|
4
|
+
* (`pressVars`, utils/interactionOverlay.stylex.ts) and the row layer's
|
|
5
|
+
* clocks (utils/rowPressLayer.stylex.ts)
|
|
6
|
+
* @output `rowPressLayerStyles`: the compositor press layer for list rows
|
|
7
|
+
* (`cell`) and its own-image arms for a row on the `backgroundImage`
|
|
8
|
+
* variant (`cellOnImage`)
|
|
9
|
+
* @position Owner module of the private press attribute for the row layer:
|
|
10
|
+
* the press controller (utils/pressFeedback.ts) writes the attribute, and
|
|
11
|
+
* this file reads it. No package entry exports it. Item and TreeList
|
|
12
|
+
* compose these styles after their overlay variant;
|
|
13
|
+
* utils/interactionOverlay.cell.test.ts tests them.
|
|
14
|
+
*/
|
|
15
|
+
import * as stylex from '@stylexjs/stylex';
|
|
16
|
+
export declare const rowPressLayerStyles: Readonly<{
|
|
17
|
+
readonly cell: Readonly<{
|
|
18
|
+
readonly backgroundImage: stylex.StyleXClassNameFor<"backgroundImage", unknown>;
|
|
19
|
+
readonly animationName: stylex.StyleXClassNameFor<"animationName", unknown>;
|
|
20
|
+
readonly isolation: stylex.StyleXClassNameFor<"isolation", "isolate" | null>;
|
|
21
|
+
readonly '::before': stylex.StyleXClassNameFor<"::before", {
|
|
22
|
+
readonly content: {
|
|
23
|
+
readonly default: null;
|
|
24
|
+
readonly "@media (pointer: coarse)": {
|
|
25
|
+
readonly default: null;
|
|
26
|
+
readonly ":where(:not(:disabled,[aria-disabled=\"true\"]))": {
|
|
27
|
+
readonly default: null;
|
|
28
|
+
readonly ":is([data-astryx-press=\"on\"],[data-astryx-press=\"fading\"])": "\"\"";
|
|
29
|
+
};
|
|
30
|
+
};
|
|
31
|
+
};
|
|
32
|
+
readonly position: {
|
|
33
|
+
readonly default: null;
|
|
34
|
+
readonly "@media (pointer: coarse)": {
|
|
35
|
+
readonly default: null;
|
|
36
|
+
readonly ":is([data-astryx-press=\"on\"],[data-astryx-press=\"fading\"])": "absolute";
|
|
37
|
+
};
|
|
38
|
+
};
|
|
39
|
+
readonly inset: {
|
|
40
|
+
readonly default: null;
|
|
41
|
+
readonly "@media (pointer: coarse)": {
|
|
42
|
+
readonly default: null;
|
|
43
|
+
readonly ":is([data-astryx-press=\"on\"],[data-astryx-press=\"fading\"])": 0;
|
|
44
|
+
};
|
|
45
|
+
};
|
|
46
|
+
readonly zIndex: {
|
|
47
|
+
readonly default: null;
|
|
48
|
+
readonly "@media (pointer: coarse)": {
|
|
49
|
+
readonly default: null;
|
|
50
|
+
readonly ":is([data-astryx-press=\"on\"],[data-astryx-press=\"fading\"])": -1;
|
|
51
|
+
};
|
|
52
|
+
};
|
|
53
|
+
readonly borderRadius: {
|
|
54
|
+
readonly default: null;
|
|
55
|
+
readonly "@media (pointer: coarse)": {
|
|
56
|
+
readonly default: null;
|
|
57
|
+
readonly ":is([data-astryx-press=\"on\"],[data-astryx-press=\"fading\"])": "inherit";
|
|
58
|
+
};
|
|
59
|
+
};
|
|
60
|
+
readonly pointerEvents: {
|
|
61
|
+
readonly default: null;
|
|
62
|
+
readonly "@media (pointer: coarse)": {
|
|
63
|
+
readonly default: null;
|
|
64
|
+
readonly ":is([data-astryx-press=\"on\"],[data-astryx-press=\"fading\"])": "none";
|
|
65
|
+
};
|
|
66
|
+
};
|
|
67
|
+
readonly backgroundColor: {
|
|
68
|
+
readonly default: null;
|
|
69
|
+
readonly "@media (pointer: coarse)": {
|
|
70
|
+
readonly default: null;
|
|
71
|
+
readonly ":is([data-astryx-press=\"on\"],[data-astryx-press=\"fading\"])": stylex.StyleXVar<"light-dark(#05365919, #FFFFFF19)">;
|
|
72
|
+
};
|
|
73
|
+
};
|
|
74
|
+
readonly opacity: {
|
|
75
|
+
readonly default: null;
|
|
76
|
+
readonly "@media (pointer: coarse)": {
|
|
77
|
+
readonly default: null;
|
|
78
|
+
readonly "[data-astryx-press=\"on\"]": 1;
|
|
79
|
+
readonly "[data-astryx-press=\"fading\"]": 0;
|
|
80
|
+
};
|
|
81
|
+
};
|
|
82
|
+
readonly animationName: {
|
|
83
|
+
readonly default: null;
|
|
84
|
+
readonly "@media (pointer: coarse)": {
|
|
85
|
+
readonly default: null;
|
|
86
|
+
readonly ":where(:not(:disabled,[aria-disabled=\"true\"]))": {
|
|
87
|
+
readonly default: null;
|
|
88
|
+
readonly "[data-astryx-press=\"fading\"]": string;
|
|
89
|
+
};
|
|
90
|
+
};
|
|
91
|
+
};
|
|
92
|
+
readonly animationDuration: {
|
|
93
|
+
readonly default: null;
|
|
94
|
+
readonly "@media (pointer: coarse)": {
|
|
95
|
+
readonly default: null;
|
|
96
|
+
readonly "[data-astryx-press=\"fading\"]": {
|
|
97
|
+
readonly default: string;
|
|
98
|
+
readonly "@media (prefers-reduced-motion: reduce)": string;
|
|
99
|
+
};
|
|
100
|
+
};
|
|
101
|
+
};
|
|
102
|
+
readonly animationTimingFunction: {
|
|
103
|
+
readonly default: null;
|
|
104
|
+
readonly "@media (pointer: coarse)": {
|
|
105
|
+
readonly default: null;
|
|
106
|
+
readonly "[data-astryx-press=\"fading\"]": string;
|
|
107
|
+
};
|
|
108
|
+
};
|
|
109
|
+
readonly animationFillMode: {
|
|
110
|
+
readonly default: null;
|
|
111
|
+
readonly "@media (pointer: coarse)": {
|
|
112
|
+
readonly default: null;
|
|
113
|
+
readonly "[data-astryx-press=\"fading\"]": "both";
|
|
114
|
+
};
|
|
115
|
+
};
|
|
116
|
+
}>;
|
|
117
|
+
}>;
|
|
118
|
+
readonly cellWithoutLayer: Readonly<{
|
|
119
|
+
readonly backgroundImage: stylex.StyleXClassNameFor<"backgroundImage", "none">;
|
|
120
|
+
readonly animationName: stylex.StyleXClassNameFor<"animationName", unknown>;
|
|
121
|
+
readonly isolation: stylex.StyleXClassNameFor<"isolation", "auto" | null>;
|
|
122
|
+
readonly '::before': stylex.StyleXClassNameFor<"::before", {
|
|
123
|
+
readonly content: {
|
|
124
|
+
readonly default: null;
|
|
125
|
+
readonly "@media (pointer: coarse)": {
|
|
126
|
+
readonly default: null;
|
|
127
|
+
readonly ":where(:not(:disabled,[aria-disabled=\"true\"]))": {
|
|
128
|
+
readonly default: null;
|
|
129
|
+
readonly ":is([data-astryx-press=\"on\"],[data-astryx-press=\"fading\"])": "none";
|
|
130
|
+
};
|
|
131
|
+
};
|
|
132
|
+
};
|
|
133
|
+
}>;
|
|
134
|
+
}>;
|
|
135
|
+
readonly cellOnImage: Readonly<{
|
|
136
|
+
readonly backgroundImage: stylex.StyleXClassNameFor<"backgroundImage", string | null>;
|
|
137
|
+
}>;
|
|
138
|
+
}>;
|
|
139
|
+
//# sourceMappingURL=press.stylex.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"press.stylex.d.ts","sourceRoot":"","sources":["../../src/privateAttributes/press.stylex.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,MAAM,MAAM,kBAAkB,CAAC;AAsD3C,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyK9B,CAAC"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/* eslint-disable @astryx/no-hover-on-disabled -- Every hover branch is
|
|
4
|
+
* nested beneath ENABLED below, as in interactionOverlay.stylex.ts. */
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* @file privateAttributes/press.stylex.ts
|
|
8
|
+
* @input StyleX, the semantic overlay color tokens, the touch press strength
|
|
9
|
+
* (`pressVars`, utils/interactionOverlay.stylex.ts) and the row layer's
|
|
10
|
+
* clocks (utils/rowPressLayer.stylex.ts)
|
|
11
|
+
* @output `rowPressLayerStyles`: the compositor press layer for list rows
|
|
12
|
+
* (`cell`) and its own-image arms for a row on the `backgroundImage`
|
|
13
|
+
* variant (`cellOnImage`)
|
|
14
|
+
* @position Owner module of the private press attribute for the row layer:
|
|
15
|
+
* the press controller (utils/pressFeedback.ts) writes the attribute, and
|
|
16
|
+
* this file reads it. No package entry exports it. Item and TreeList
|
|
17
|
+
* compose these styles after their overlay variant;
|
|
18
|
+
* utils/interactionOverlay.cell.test.ts tests them.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
import * as stylex from '@stylexjs/stylex';
|
|
22
|
+
import "../theme/tokens.stylex.js";
|
|
23
|
+
import { colorVars } from "../theme/tokens.stylex.js";
|
|
24
|
+
import "../utils/interactionOverlay.stylex.js";
|
|
25
|
+
import { pressVars } from "../utils/interactionOverlay.stylex.js";
|
|
26
|
+
import "../utils/rowPressLayer.stylex.js";
|
|
27
|
+
import { cellPressConsts } from "../utils/rowPressLayer.stylex.js";
|
|
28
|
+
|
|
29
|
+
// The overlay's arm selectors (interactionOverlay.stylex.ts), restated here:
|
|
30
|
+
// StyleX resolves a style's keys within its own file.
|
|
31
|
+
const ENABLED = ':where(:not(:disabled,[aria-disabled="true"]))';
|
|
32
|
+
const HOVER_HOVER = '@media (hover: hover)';
|
|
33
|
+
const COARSE = '@media (pointer: coarse)';
|
|
34
|
+
const PRESSED_ON = '[data-astryx-press="on"]';
|
|
35
|
+
const PRESSED_FADING = '[data-astryx-press="fading"]';
|
|
36
|
+
/**
|
|
37
|
+
* A press in any of its states: the row layer exists only then, so at rest a
|
|
38
|
+
* row's own `::before` and its stacking are untouched.
|
|
39
|
+
*/
|
|
40
|
+
const PRESSED_ANY = ':is([data-astryx-press="on"],[data-astryx-press="fading"])';
|
|
41
|
+
const PRESS_ALPHA = pressVars['--astryx-press-alpha'];
|
|
42
|
+
const hoverImage = `linear-gradient(${colorVars['--color-overlay-hover']}, ${colorVars['--color-overlay-hover']})`;
|
|
43
|
+
const pressedImage = `linear-gradient(${colorVars['--color-overlay-pressed']}, ${colorVars['--color-overlay-pressed']})`;
|
|
44
|
+
/** The overlay's paint, read back off the element (its gradient layer). */
|
|
45
|
+
const pressedOverlayImage = 'var(--_press-paint-image)';
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* The overlay's strength release (interactionOverlay.stylex.ts), restated so
|
|
49
|
+
* a fine pointer keeps it: the same keyframes, so the same animation.
|
|
50
|
+
*/
|
|
51
|
+
const pressRelease = "x10jkm1t-B";
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* The row layer's clock as CSS. It is the strength release's clock, scaled
|
|
55
|
+
* by the theme's `--_astryx-motion-tempo` up to 1.5, so the layer and the
|
|
56
|
+
* strength land together.
|
|
57
|
+
*/
|
|
58
|
+
const CELL_RELEASE = `calc(${cellPressConsts.cellReleaseMs}ms * min(var(--_astryx-motion-tempo, 1), 1.5))`;
|
|
59
|
+
/** The same clock under Reduce Motion: a tempo may shorten it, never lengthen it. */
|
|
60
|
+
const CELL_RELEASE_REDUCED = `min(${cellPressConsts.cellReleaseMs}ms, calc(${cellPressConsts.cellReleaseMs}ms * var(--_astryx-motion-tempo, 1)))`;
|
|
61
|
+
const REDUCED_MOTION = '@media (prefers-reduced-motion: reduce)';
|
|
62
|
+
|
|
63
|
+
/** Opacity 1 → 0: the row layer leaves; its fading arm runs it. */
|
|
64
|
+
const cellRelease = "x1jn504y-B";
|
|
65
|
+
|
|
66
|
+
/** The release's curve: the table's gentle ease-out. */
|
|
67
|
+
const RELEASE_EASE = cellPressConsts.cellReleaseEase;
|
|
68
|
+
export const rowPressLayerStyles = {
|
|
69
|
+
cell: {
|
|
70
|
+
kKwaWg: "x7ngsy6 x10ogxw0 xubczrd x18xnkjv",
|
|
71
|
+
kKVMdj: "x14e4jsf x6su2wr",
|
|
72
|
+
kHBbk8: "xif6eam",
|
|
73
|
+
kgeoSG: "x1ocadqd",
|
|
74
|
+
kEoFBp: "x1ukh9kf",
|
|
75
|
+
kFcpXp: "xrkptjy",
|
|
76
|
+
kxmVGU: "xjscm90",
|
|
77
|
+
kPB484: "x1kec4ew",
|
|
78
|
+
km8f2m: "x13r5q6d",
|
|
79
|
+
kLkRvE: "x1dn949c",
|
|
80
|
+
k5QlbN: "xw7rim2 xr9xsjc",
|
|
81
|
+
k7EzDT: "x1bxn267",
|
|
82
|
+
kQZAMR: "x16lp0i7 x1bf026e",
|
|
83
|
+
kZiNAr: "x1gyhjqm",
|
|
84
|
+
k8Tatv: "x1dn5vsf",
|
|
85
|
+
$$css: true
|
|
86
|
+
},
|
|
87
|
+
cellWithoutLayer: {
|
|
88
|
+
kKwaWg: "x18o3ruo",
|
|
89
|
+
kKVMdj: "x14e4jsf",
|
|
90
|
+
kHBbk8: "xrqzsdu",
|
|
91
|
+
kgeoSG: "x1995whq",
|
|
92
|
+
$$css: true
|
|
93
|
+
},
|
|
94
|
+
cellOnImage: {
|
|
95
|
+
kKwaWg: "x7uyq82 x3f84ok x7ngsy6 x10ogxw0 xubczrd x18xnkjv xmvprkv xetgvay",
|
|
96
|
+
$$css: true
|
|
97
|
+
}
|
|
98
|
+
};
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
*/
|
|
16
16
|
import * as stylex from '@stylexjs/stylex';
|
|
17
17
|
export declare const colorDefaults: {
|
|
18
|
-
readonly '--color-accent': "light-dark(#0064E0, #
|
|
18
|
+
readonly '--color-accent': "light-dark(#0064E0, #0171E3)";
|
|
19
19
|
readonly '--color-accent-muted': "light-dark(#0082FB33, #0082FB3F)";
|
|
20
20
|
readonly '--color-on-accent': "light-dark(#FFFFFF, #FFFFFF)";
|
|
21
21
|
readonly '--color-neutral': "light-dark(rgba(5, 54, 89, 0.1), rgba(223, 226, 229, 0.2))";
|
|
@@ -115,7 +115,7 @@ export declare const colorDefaults: {
|
|
|
115
115
|
readonly '--color-text-yellow': "light-dark(#753F07, #FBCE03)";
|
|
116
116
|
};
|
|
117
117
|
export declare const colorVars: stylex.VarGroup<Readonly<{
|
|
118
|
-
readonly '--color-accent': "light-dark(#0064E0, #
|
|
118
|
+
readonly '--color-accent': "light-dark(#0064E0, #0171E3)";
|
|
119
119
|
readonly '--color-accent-muted': "light-dark(#0082FB33, #0082FB3F)";
|
|
120
120
|
readonly '--color-on-accent': "light-dark(#FFFFFF, #FFFFFF)";
|
|
121
121
|
readonly '--color-neutral': "light-dark(rgba(5, 54, 89, 0.1), rgba(223, 226, 229, 0.2))";
|
|
@@ -24,7 +24,7 @@ import * as stylex from '@stylexjs/stylex';
|
|
|
24
24
|
|
|
25
25
|
export const colorDefaults = {
|
|
26
26
|
// Core semantic
|
|
27
|
-
'--color-accent': 'light-dark(#0064E0, #
|
|
27
|
+
'--color-accent': 'light-dark(#0064E0, #0171E3)',
|
|
28
28
|
'--color-accent-muted': 'light-dark(#0082FB33, #0082FB3F)',
|
|
29
29
|
'--color-on-accent': 'light-dark(#FFFFFF, #FFFFFF)',
|
|
30
30
|
'--color-neutral': 'light-dark(rgba(5, 54, 89, 0.1), rgba(223, 226, 229, 0.2))',
|