@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.
Files changed (213) hide show
  1. package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
  2. package/dist/BottomSheet/BottomSheet.js +5 -0
  3. package/dist/Calendar/styles.d.ts +1 -1
  4. package/dist/ClickableCard/ClickableCard.d.ts +1 -1
  5. package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
  6. package/dist/ClickableCard/ClickableCard.js +5 -1
  7. package/dist/DateInput/PickerWheel.d.ts.map +1 -1
  8. package/dist/DateInput/PickerWheel.js +7 -1
  9. package/dist/DateRangeInput/DateRangeInput.js +1 -1
  10. package/dist/Dialog/Dialog.d.ts +2 -1
  11. package/dist/Dialog/Dialog.d.ts.map +1 -1
  12. package/dist/Dialog/Dialog.js +12 -1
  13. package/dist/Drawer/useDrawerDialogPresence.d.ts +2 -1
  14. package/dist/Drawer/useDrawerDialogPresence.d.ts.map +1 -1
  15. package/dist/Drawer/useDrawerDialogPresence.js +11 -2
  16. package/dist/DropdownMenu/DropdownMenu.d.ts +9 -1
  17. package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
  18. package/dist/DropdownMenu/DropdownMenu.js +9 -4
  19. package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts.map +1 -1
  20. package/dist/DropdownMenu/DropdownMenuCheckboxItem.js +3 -2
  21. package/dist/DropdownMenu/DropdownMenuItem.d.ts.map +1 -1
  22. package/dist/DropdownMenu/DropdownMenuItem.js +3 -2
  23. package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts.map +1 -1
  24. package/dist/DropdownMenu/DropdownMenuRadioItem.js +3 -2
  25. package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -1
  26. package/dist/DropdownMenu/DropdownMenuSubMenu.js +3 -2
  27. package/dist/Field/inputDisabledFocus.d.ts +4 -4
  28. package/dist/Field/inputStyles.stylex.d.ts +1 -1
  29. package/dist/FileInput/FileInput.d.ts.map +1 -1
  30. package/dist/FileInput/FileInput.js +16 -2
  31. package/dist/Icon/Icon.d.ts +1 -1
  32. package/dist/InfoTip/InfoTip.d.ts +1 -0
  33. package/dist/InfoTip/InfoTip.d.ts.map +1 -1
  34. package/dist/InfoTip/InfoTip.js +1 -0
  35. package/dist/Item/Item.d.ts +2 -1
  36. package/dist/Item/Item.d.ts.map +1 -1
  37. package/dist/Item/Item.js +29 -6
  38. package/dist/Layer/holdEntranceInput.d.ts +24 -0
  39. package/dist/Layer/holdEntranceInput.d.ts.map +1 -0
  40. package/dist/Layer/holdEntranceInput.js +65 -0
  41. package/dist/Layer/inputHold.d.ts +49 -0
  42. package/dist/Layer/inputHold.d.ts.map +1 -0
  43. package/dist/Layer/inputHold.js +636 -0
  44. package/dist/Layer/preserveAnimations.d.ts +1 -5
  45. package/dist/Layer/preserveAnimations.d.ts.map +1 -1
  46. package/dist/Layer/preserveAnimations.js +12 -214
  47. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  48. package/dist/Lightbox/Lightbox.js +4 -0
  49. package/dist/MetadataList/MetadataList.js +1 -1
  50. package/dist/MobileNav/MobileNav.d.ts +11 -1
  51. package/dist/MobileNav/MobileNav.d.ts.map +1 -1
  52. package/dist/MobileNav/MobileNav.js +34 -1
  53. package/dist/MoreMenu/MoreMenu.d.ts +5 -3
  54. package/dist/MoreMenu/MoreMenu.d.ts.map +1 -1
  55. package/dist/RadioList/RadioListItem.d.ts.map +1 -1
  56. package/dist/RadioList/RadioListItem.js +4 -1
  57. package/dist/SelectableCard/SelectableCard.d.ts +1 -1
  58. package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
  59. package/dist/SelectableCard/SelectableCard.js +5 -1
  60. package/dist/Spinner/Spinner.d.ts.map +1 -1
  61. package/dist/Spinner/Spinner.js +12 -2
  62. package/dist/Table/plugins/sortable/useTableSortable.js +1 -1
  63. package/dist/Token/Token.d.ts.map +1 -1
  64. package/dist/Token/Token.js +9 -0
  65. package/dist/Token/TokenLink.d.ts +1 -1
  66. package/dist/Token/TokenLink.d.ts.map +1 -1
  67. package/dist/Token/TokenLink.js +4 -1
  68. package/dist/Tooltip/useTooltip.d.ts.map +1 -1
  69. package/dist/Tooltip/useTooltip.js +162 -59
  70. package/dist/TreeList/TreeListItem.d.ts +2 -1
  71. package/dist/TreeList/TreeListItem.d.ts.map +1 -1
  72. package/dist/TreeList/TreeListItem.js +27 -3
  73. package/dist/astryx.css +30 -7
  74. package/dist/gestures/GestureHost.d.ts +2 -2
  75. package/dist/gestures/GestureHost.d.ts.map +1 -1
  76. package/dist/gestures/GestureHost.js +21 -6
  77. package/dist/gestures/nativeScroll.d.ts +3 -6
  78. package/dist/gestures/nativeScroll.d.ts.map +1 -1
  79. package/dist/gestures/nativeScroll.js +7 -52
  80. package/dist/gestures/wheelSegmenter.d.ts +68 -1
  81. package/dist/gestures/wheelSegmenter.d.ts.map +1 -1
  82. package/dist/gestures/wheelSegmenter.js +199 -10
  83. package/dist/hooks/menuPressGesture.d.ts +133 -21
  84. package/dist/hooks/menuPressGesture.d.ts.map +1 -1
  85. package/dist/hooks/menuPressGesture.js +155 -30
  86. package/dist/hooks/menuPressValues.d.ts +16 -0
  87. package/dist/hooks/menuPressValues.d.ts.map +1 -0
  88. package/dist/hooks/menuPressValues.js +18 -0
  89. package/dist/hooks/useClickableContainer.d.ts +27 -5
  90. package/dist/hooks/useClickableContainer.d.ts.map +1 -1
  91. package/dist/hooks/useClickableContainer.js +41 -5
  92. package/dist/hooks/useFocusTrap.d.ts +10 -0
  93. package/dist/hooks/useFocusTrap.d.ts.map +1 -1
  94. package/dist/hooks/useFocusTrap.js +225 -132
  95. package/dist/hooks/useMenuPress.d.ts +34 -1
  96. package/dist/hooks/useMenuPress.d.ts.map +1 -1
  97. package/dist/hooks/useMenuPress.js +93 -5
  98. package/dist/hooks/usePressFeedback.d.ts +6 -6
  99. package/dist/hooks/usePressFeedback.js +6 -6
  100. package/dist/motion/carryAnimations.d.ts +58 -0
  101. package/dist/motion/carryAnimations.d.ts.map +1 -0
  102. package/dist/motion/carryAnimations.js +305 -0
  103. package/dist/motion/transientCopy.d.ts +4 -2
  104. package/dist/motion/transientCopy.d.ts.map +1 -1
  105. package/dist/motion/transientCopy.js +34 -5
  106. package/dist/motion/uikit/gestures.d.ts +41 -0
  107. package/dist/motion/uikit/gestures.d.ts.map +1 -1
  108. package/dist/motion/uikit/gestures.js +25 -0
  109. package/dist/motion/uikit/index.d.ts +1 -1
  110. package/dist/motion/uikit/index.d.ts.map +1 -1
  111. package/dist/motion/uikit/index.js +1 -1
  112. package/dist/privateAttributes/menuPressLit.stylex.d.ts +52 -0
  113. package/dist/privateAttributes/menuPressLit.stylex.d.ts.map +1 -0
  114. package/dist/privateAttributes/menuPressLit.stylex.js +99 -0
  115. package/dist/privateAttributes/press.stylex.d.ts +139 -0
  116. package/dist/privateAttributes/press.stylex.d.ts.map +1 -0
  117. package/dist/privateAttributes/press.stylex.js +98 -0
  118. package/dist/theme/tokens.stylex.d.ts +2 -2
  119. package/dist/theme/tokens.stylex.js +1 -1
  120. package/dist/utils/flatTree.d.ts +6 -3
  121. package/dist/utils/flatTree.d.ts.map +1 -1
  122. package/dist/utils/flatTree.js +13 -3
  123. package/dist/utils/hitArea.d.ts.map +1 -1
  124. package/dist/utils/hitArea.js +82 -5
  125. package/dist/utils/inputStream.d.ts +14 -1
  126. package/dist/utils/inputStream.d.ts.map +1 -1
  127. package/dist/utils/inputStream.js +40 -9
  128. package/dist/utils/interactionOverlay.stylex.d.ts +2 -1
  129. package/dist/utils/interactionOverlay.stylex.d.ts.map +1 -1
  130. package/dist/utils/interactionOverlay.stylex.js +7 -2
  131. package/dist/utils/pressFeedback.d.ts +7 -0
  132. package/dist/utils/pressFeedback.d.ts.map +1 -1
  133. package/dist/utils/pressFeedback.js +32 -7
  134. package/dist/utils/pressGesture.d.ts +6 -0
  135. package/dist/utils/pressGesture.d.ts.map +1 -1
  136. package/dist/utils/pressGesture.js +17 -0
  137. package/dist/utils/rowPressLayer.stylex.d.ts +14 -0
  138. package/dist/utils/rowPressLayer.stylex.d.ts.map +1 -0
  139. package/dist/utils/rowPressLayer.stylex.js +25 -0
  140. package/dist/utils/scrollView.d.ts +25 -0
  141. package/dist/utils/scrollView.d.ts.map +1 -0
  142. package/dist/utils/scrollView.js +108 -0
  143. package/dist/utils/selectionLock.d.ts.map +1 -1
  144. package/dist/utils/selectionLock.js +1 -10
  145. package/dist/utils/triggerFocus.d.ts +5 -0
  146. package/dist/utils/triggerFocus.d.ts.map +1 -1
  147. package/dist/utils/triggerFocus.js +9 -2
  148. package/package.json +5 -5
  149. package/src/BottomSheet/BottomSheet.tsx +5 -0
  150. package/src/ClickableCard/ClickableCard.tsx +8 -1
  151. package/src/DateInput/PickerWheel.tsx +7 -2
  152. package/src/DateRangeInput/DateRangeInput.tsx +1 -1
  153. package/src/Dialog/Dialog.doc.mjs +1 -1
  154. package/src/Dialog/Dialog.tsx +12 -1
  155. package/src/Drawer/Drawer.doc.mjs +1 -1
  156. package/src/Drawer/useDrawerDialogPresence.ts +9 -2
  157. package/src/DropdownMenu/DropdownMenu.doc.mjs +1 -2
  158. package/src/DropdownMenu/DropdownMenu.tsx +29 -5
  159. package/src/DropdownMenu/DropdownMenuCheckboxItem.tsx +5 -1
  160. package/src/DropdownMenu/DropdownMenuItem.tsx +8 -4
  161. package/src/DropdownMenu/DropdownMenuRadioItem.tsx +5 -1
  162. package/src/DropdownMenu/DropdownMenuSubMenu.tsx +5 -1
  163. package/src/FileInput/FileInput.tsx +16 -2
  164. package/src/InfoTip/InfoTip.doc.mjs +26 -2
  165. package/src/InfoTip/InfoTip.tsx +1 -0
  166. package/src/Item/Item.tsx +51 -9
  167. package/src/Layer/holdEntranceInput.ts +84 -0
  168. package/src/Layer/inputHold.ts +734 -0
  169. package/src/Layer/preserveAnimations.ts +12 -275
  170. package/src/Lightbox/Lightbox.tsx +4 -0
  171. package/src/MetadataList/MetadataList.tsx +1 -1
  172. package/src/MobileNav/MobileNav.doc.mjs +3 -3
  173. package/src/MobileNav/MobileNav.tsx +34 -1
  174. package/src/MoreMenu/MoreMenu.doc.mjs +2 -4
  175. package/src/MoreMenu/MoreMenu.tsx +5 -3
  176. package/src/RadioList/RadioListItem.tsx +4 -5
  177. package/src/SelectableCard/SelectableCard.tsx +8 -1
  178. package/src/Spinner/Spinner.tsx +13 -3
  179. package/src/Table/plugins/sortable/useTableSortable.tsx +1 -1
  180. package/src/Token/Token.tsx +18 -1
  181. package/src/Token/TokenLink.tsx +7 -1
  182. package/src/Tooltip/useTooltip.tsx +175 -79
  183. package/src/TreeList/TreeListItem.tsx +36 -2
  184. package/src/gestures/GestureHost.ts +21 -5
  185. package/src/gestures/README.md +12 -4
  186. package/src/gestures/nativeScroll.ts +12 -68
  187. package/src/gestures/wheelSegmenter.ts +243 -10
  188. package/src/hooks/menuPressGesture.ts +244 -38
  189. package/src/hooks/menuPressValues.ts +18 -0
  190. package/src/hooks/useClickableContainer.doc.mjs +8 -2
  191. package/src/hooks/useClickableContainer.ts +72 -6
  192. package/src/hooks/useFocusTrap.ts +268 -151
  193. package/src/hooks/useMenuPress.ts +118 -11
  194. package/src/hooks/usePressFeedback.doc.mjs +3 -3
  195. package/src/hooks/usePressFeedback.ts +6 -6
  196. package/src/motion/MEASUREMENTS.md +11 -0
  197. package/src/motion/carryAnimations.ts +389 -0
  198. package/src/motion/transientCopy.ts +45 -5
  199. package/src/motion/uikit/gestures.ts +22 -0
  200. package/src/motion/uikit/index.ts +1 -0
  201. package/src/privateAttributes/menuPressLit.stylex.ts +104 -0
  202. package/src/privateAttributes/press.stylex.ts +244 -0
  203. package/src/theme/tokens.stylex.ts +1 -1
  204. package/src/utils/flatTree.ts +15 -3
  205. package/src/utils/hitArea.ts +107 -5
  206. package/src/utils/inputStream.ts +47 -10
  207. package/src/utils/interactionOverlay.stylex.ts +7 -2
  208. package/src/utils/pressFeedback.ts +31 -6
  209. package/src/utils/pressGesture.ts +24 -1
  210. package/src/utils/rowPressLayer.stylex.ts +27 -0
  211. package/src/utils/scrollView.ts +135 -0
  212. package/src/utils/selectionLock.ts +5 -10
  213. 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. Laid in a host outside the element's own
19
- * ancestors, it keeps what it inherited from them: its inherited properties
20
- * and custom properties that differ from the host's are written on it.
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 once the copy is laid out (`placeOver`).
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;;QAzPzB;;;;;;;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;;;;;;;QAKH;;;;;;;;;;;;WAYG;;;;;QAEH;;;;;;;;WAQG;;;;;QAEH;;;;;;;WAOG;;;;;;CAoCK,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"}
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, #2694FE)";
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, #2694FE)";
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, #2694FE)',
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))',