@astryxdesign/core 0.7.7-canary.f9ac85f → 0.7.7

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 (198) hide show
  1. package/CHANGELOG.md +104 -0
  2. package/dist/AppShell/useCloseMobileDrawerOnActivate.d.ts +13 -0
  3. package/dist/AppShell/useCloseMobileDrawerOnActivate.d.ts.map +1 -0
  4. package/dist/AppShell/useCloseMobileDrawerOnActivate.js +45 -0
  5. package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
  6. package/dist/BottomSheet/BottomSheet.js +79 -9
  7. package/dist/BottomSheet/BottomSheetPanel.d.ts.map +1 -1
  8. package/dist/BottomSheet/BottomSheetPanel.js +1 -1
  9. package/dist/BottomSheet/bottomSheetStack.d.ts.map +1 -1
  10. package/dist/BottomSheet/bottomSheetStack.js +5 -4
  11. package/dist/Breadcrumbs/BreadcrumbItem.d.ts +2 -1
  12. package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
  13. package/dist/Breadcrumbs/BreadcrumbItem.js +7 -3
  14. package/dist/Button/Button.d.ts.map +1 -1
  15. package/dist/Button/Button.js +30 -2
  16. package/dist/CheckboxList/CheckboxList.d.ts.map +1 -1
  17. package/dist/CheckboxList/CheckboxList.js +7 -1
  18. package/dist/CheckboxList/CheckboxListContext.d.ts +6 -0
  19. package/dist/CheckboxList/CheckboxListContext.d.ts.map +1 -1
  20. package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
  21. package/dist/CheckboxList/CheckboxListItem.js +10 -2
  22. package/dist/DateInput/DateInput.d.ts.map +1 -1
  23. package/dist/DateInput/DateInput.js +5 -2
  24. package/dist/DateInput/MonthScroller.d.ts.map +1 -1
  25. package/dist/DateInput/MonthScroller.js +13 -27
  26. package/dist/DateInput/Wheel.d.ts.map +1 -1
  27. package/dist/DateInput/Wheel.js +22 -41
  28. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  29. package/dist/DateTimeInput/DateTimeInput.js +5 -2
  30. package/dist/Dialog/Dialog.d.ts.map +1 -1
  31. package/dist/Dialog/Dialog.js +4 -3
  32. package/dist/Drawer/Drawer.js +0 -1
  33. package/dist/Drawer/useDrawerDialogPresence.d.ts.map +1 -1
  34. package/dist/Drawer/useDrawerDialogPresence.js +5 -1
  35. package/dist/Field/PanelSearchInput.d.ts +9 -1
  36. package/dist/Field/PanelSearchInput.d.ts.map +1 -1
  37. package/dist/Field/PanelSearchInput.js +3 -1
  38. package/dist/InfoTip/InfoTip.d.ts +2 -2
  39. package/dist/InfoTip/InfoTip.js +4 -4
  40. package/dist/Layer/layerAnimations.stylex.d.ts +7 -8
  41. package/dist/Layer/layerAnimations.stylex.d.ts.map +1 -1
  42. package/dist/Layer/layerAnimations.stylex.js +25 -20
  43. package/dist/Layer/usePressPin.d.ts +3 -5
  44. package/dist/Layer/usePressPin.d.ts.map +1 -1
  45. package/dist/Layer/usePressPin.js +4 -6
  46. package/dist/MobileNav/MobileNav.js +0 -1
  47. package/dist/MultiSelector/hooks.d.ts.map +1 -1
  48. package/dist/MultiSelector/hooks.js +2 -4
  49. package/dist/Outline/Outline.d.ts +2 -4
  50. package/dist/Outline/Outline.d.ts.map +1 -1
  51. package/dist/Outline/Outline.js +4 -52
  52. package/dist/Outline/useOutlineFromMarkdown.d.ts.map +1 -1
  53. package/dist/Outline/useOutlineFromMarkdown.js +1 -0
  54. package/dist/Outline/useScrollSpy.js +3 -3
  55. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  56. package/dist/PowerSearch/PowerSearch.js +134 -179
  57. package/dist/RadioList/RadioList.d.ts.map +1 -1
  58. package/dist/RadioList/RadioList.js +5 -0
  59. package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
  60. package/dist/Resizable/ResizeHandle.js +118 -260
  61. package/dist/Resizable/resizeGesture.d.ts +91 -0
  62. package/dist/Resizable/resizeGesture.d.ts.map +1 -0
  63. package/dist/Resizable/resizeGesture.js +251 -0
  64. package/dist/SideNav/SideNavItem.d.ts.map +1 -1
  65. package/dist/SideNav/SideNavItem.js +3 -9
  66. package/dist/Token/Token.d.ts +2 -2
  67. package/dist/Token/Token.d.ts.map +1 -1
  68. package/dist/Token/Token.js +12 -4
  69. package/dist/Token/TokenNamingContext.d.ts +14 -0
  70. package/dist/Token/TokenNamingContext.d.ts.map +1 -0
  71. package/dist/Token/TokenNamingContext.js +23 -0
  72. package/dist/Tokenizer/Tokenizer.d.ts +46 -59
  73. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  74. package/dist/Tokenizer/Tokenizer.js +35 -58
  75. package/dist/Tokenizer/TokenizerBottomSheet.d.ts +25 -28
  76. package/dist/Tokenizer/TokenizerBottomSheet.d.ts.map +1 -1
  77. package/dist/Tokenizer/TokenizerBottomSheet.js +157 -54
  78. package/dist/Tokenizer/TokenizerItemRemovableContext.d.ts.map +1 -1
  79. package/dist/Tokenizer/TokenizerItemRemovableContext.js +5 -3
  80. package/dist/Tooltip/Tooltip.d.ts +25 -30
  81. package/dist/Tooltip/Tooltip.d.ts.map +1 -1
  82. package/dist/Tooltip/Tooltip.js +24 -5
  83. package/dist/Tooltip/index.d.ts +1 -1
  84. package/dist/Tooltip/index.d.ts.map +1 -1
  85. package/dist/Tooltip/useTooltip.d.ts +28 -29
  86. package/dist/Tooltip/useTooltip.d.ts.map +1 -1
  87. package/dist/Tooltip/useTooltip.js +20 -8
  88. package/dist/TopNav/TopNavItem.d.ts.map +1 -1
  89. package/dist/TopNav/TopNavItem.js +4 -7
  90. package/dist/TopNav/TopNavMegaMenuItem.d.ts.map +1 -1
  91. package/dist/TopNav/TopNavMegaMenuItem.js +4 -7
  92. package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
  93. package/dist/TopNav/TopNavMenu.js +4 -7
  94. package/dist/astryx.css +5 -5
  95. package/dist/gestures/GestureHost.d.ts +27 -1
  96. package/dist/gestures/GestureHost.d.ts.map +1 -1
  97. package/dist/gestures/GestureHost.js +90 -8
  98. package/dist/hooks/useHighlightedOptionScroll.d.ts +11 -1
  99. package/dist/hooks/useHighlightedOptionScroll.d.ts.map +1 -1
  100. package/dist/hooks/useHighlightedOptionScroll.js +103 -5
  101. package/dist/hooks/useMenuPress.d.ts.map +1 -1
  102. package/dist/hooks/useMenuPress.js +4 -2
  103. package/dist/i18n/generated-english/PowerSearch/PowerSearch.generated.d.ts.map +1 -1
  104. package/dist/i18n/generated-english/PowerSearch/PowerSearch.generated.js +1 -0
  105. package/dist/i18n/generated-english/Tokenizer/TokenizerBottomSheet.generated.d.ts.map +1 -1
  106. package/dist/i18n/generated-english/Tokenizer/TokenizerBottomSheet.generated.js +7 -1
  107. package/dist/i18n/generated-locales/en.generated.d.ts.map +1 -1
  108. package/dist/i18n/generated-locales/en.generated.js +1 -0
  109. package/dist/i18n/generated-locales/pseudo.generated.d.ts.map +1 -1
  110. package/dist/i18n/generated-locales/pseudo.generated.js +1 -0
  111. package/dist/internal/SheetConfirmation.d.ts +11 -0
  112. package/dist/internal/SheetConfirmation.d.ts.map +1 -0
  113. package/dist/internal/SheetConfirmation.js +92 -0
  114. package/dist/internal/sheetDraft.d.ts +35 -0
  115. package/dist/internal/sheetDraft.d.ts.map +1 -0
  116. package/dist/internal/sheetDraft.js +65 -0
  117. package/dist/internal/touch-sheet.d.ts +21 -0
  118. package/dist/internal/touch-sheet.d.ts.map +1 -0
  119. package/dist/internal/touch-sheet.js +19 -0
  120. package/dist/internal/useDismissSearchOnTouchDrag.d.ts +24 -0
  121. package/dist/internal/useDismissSearchOnTouchDrag.d.ts.map +1 -0
  122. package/dist/internal/useDismissSearchOnTouchDrag.js +56 -0
  123. package/dist/motion/reducedMotion.d.ts +24 -0
  124. package/dist/motion/reducedMotion.d.ts.map +1 -1
  125. package/dist/motion/reducedMotion.js +78 -1
  126. package/dist/utils/clickGuard.d.ts +8 -1
  127. package/dist/utils/clickGuard.d.ts.map +1 -1
  128. package/dist/utils/clickGuard.js +24 -1
  129. package/locales/en.json +4 -0
  130. package/locales/pseudo.json +3 -0
  131. package/package.json +9 -9
  132. package/src/AppShell/useCloseMobileDrawerOnActivate.ts +52 -0
  133. package/src/BottomSheet/BottomSheet.tsx +95 -10
  134. package/src/BottomSheet/BottomSheetPanel.tsx +7 -2
  135. package/src/BottomSheet/bottomSheetStack.ts +8 -4
  136. package/src/Breadcrumbs/BreadcrumbItem.tsx +13 -3
  137. package/src/Button/Button.tsx +37 -1
  138. package/src/CheckboxList/CheckboxList.doc.mjs +4 -2
  139. package/src/CheckboxList/CheckboxList.tsx +6 -0
  140. package/src/CheckboxList/CheckboxListContext.tsx +6 -0
  141. package/src/CheckboxList/CheckboxListItem.tsx +11 -2
  142. package/src/DateInput/DateInput.tsx +8 -2
  143. package/src/DateInput/MonthScroller.tsx +18 -22
  144. package/src/DateInput/Wheel.tsx +30 -32
  145. package/src/DateTimeInput/DateTimeInput.tsx +8 -2
  146. package/src/Dialog/Dialog.tsx +19 -4
  147. package/src/Drawer/Drawer.tsx +1 -1
  148. package/src/Drawer/useDrawerDialogPresence.ts +5 -1
  149. package/src/Field/PanelSearchInput.tsx +11 -0
  150. package/src/InfoTip/InfoTip.doc.mjs +3 -3
  151. package/src/InfoTip/InfoTip.tsx +5 -5
  152. package/src/Layer/layerAnimations.stylex.ts +24 -16
  153. package/src/Layer/usePressPin.ts +5 -11
  154. package/src/MobileNav/MobileNav.tsx +1 -1
  155. package/src/MultiSelector/hooks.ts +2 -4
  156. package/src/Outline/Outline.doc.mjs +177 -51
  157. package/src/Outline/Outline.tsx +5 -57
  158. package/src/Outline/useOutlineFromMarkdown.doc.mjs +157 -0
  159. package/src/Outline/useOutlineFromMarkdown.ts +1 -0
  160. package/src/Outline/useScrollSpy.ts +3 -3
  161. package/src/PowerSearch/PowerSearch.doc.mjs +3 -3
  162. package/src/PowerSearch/PowerSearch.tsx +196 -183
  163. package/src/RadioList/RadioList.doc.mjs +4 -2
  164. package/src/RadioList/RadioList.tsx +4 -0
  165. package/src/Resizable/ResizeHandle.tsx +133 -328
  166. package/src/Resizable/resizeGesture.ts +368 -0
  167. package/src/SideNav/SideNavItem.tsx +3 -7
  168. package/src/Token/Token.tsx +13 -4
  169. package/src/Token/TokenNamingContext.ts +28 -0
  170. package/src/Tokenizer/Tokenizer.doc.mjs +16 -0
  171. package/src/Tokenizer/Tokenizer.tsx +81 -86
  172. package/src/Tokenizer/TokenizerBottomSheet.tsx +219 -93
  173. package/src/Tokenizer/TokenizerItemRemovableContext.ts +5 -3
  174. package/src/Tooltip/Tooltip.doc.mjs +123 -54
  175. package/src/Tooltip/Tooltip.tsx +36 -39
  176. package/src/Tooltip/index.ts +0 -1
  177. package/src/Tooltip/useTooltip.doc.mjs +147 -33
  178. package/src/Tooltip/useTooltip.tsx +39 -32
  179. package/src/TopNav/TopNavItem.tsx +6 -5
  180. package/src/TopNav/TopNavMegaMenuItem.tsx +6 -5
  181. package/src/TopNav/TopNavMenu.tsx +6 -5
  182. package/src/gestures/GestureHost.ts +105 -10
  183. package/src/hooks/useHighlightedOptionScroll.ts +113 -9
  184. package/src/hooks/useMenuPress.ts +8 -2
  185. package/src/i18n/generated-english/PowerSearch/PowerSearch.generated.ts +1 -0
  186. package/src/i18n/generated-english/Tokenizer/TokenizerBottomSheet.generated.ts +7 -1
  187. package/src/i18n/generated-locales/en.generated.ts +1 -0
  188. package/src/i18n/generated-locales/pseudo.generated.ts +1 -0
  189. package/src/internal/SheetConfirmation.tsx +101 -0
  190. package/src/internal/sheetDraft.ts +80 -0
  191. package/src/internal/touch-sheet.ts +21 -0
  192. package/src/internal/useDismissSearchOnTouchDrag.ts +69 -0
  193. package/src/motion/reducedMotion.ts +79 -1
  194. package/src/utils/clickGuard.ts +37 -1
  195. package/dist/internal/tokenizer-presentation.d.ts +0 -21
  196. package/dist/internal/tokenizer-presentation.d.ts.map +0 -1
  197. package/dist/internal/tokenizer-presentation.js +0 -21
  198. package/src/internal/tokenizer-presentation.ts +0 -25
@@ -1,7 +1,8 @@
1
1
  /**
2
2
  * @file useTooltip.tsx
3
3
  * @input Uses useLayer, usePressPin, React hooks
4
- * @output Exports useTooltip hook with stable trigger refs for hover/focus/tap tooltips
4
+ * @output Exports useTooltip hook with stable trigger refs for hover/focus/tap tooltips,
5
+ * and the module-only useTooltipWithTriggerBehavior that InfoTip's press-to-pin uses
5
6
  * @position Layer hook; builds on useLayer for tooltip behavior
6
7
  *
7
8
  * SYNC: When modified, update:
@@ -10,6 +11,7 @@
10
11
  import { type ReactNode, type RefCallback } from 'react';
11
12
  import { type ContextRenderProps, type LayerAlignment, type LayerPlacement } from '../Layer/useLayer.js';
12
13
  import type { LayerTouchTrigger } from '../Layer/useTouchTrigger.js';
14
+ import { type LayerTriggerBehavior } from '../Layer/usePressPin.js';
13
15
  /**
14
16
  * Focus trigger behavior for tooltips
15
17
  */
@@ -18,13 +20,6 @@ export type TooltipFocusTrigger = 'auto' | 'always' | 'never';
18
20
  * Touch trigger behavior for tooltips
19
21
  */
20
22
  export type TooltipTouchTrigger = LayerTouchTrigger;
21
- /**
22
- * How the trigger opens the tooltip. `adaptive`, the default, previews it on
23
- * hover and focus, and a tap opens it unless the trigger acts. `hover`
24
- * previews it on hover and focus, and no touch or pen tap opens it. `toggle`
25
- * pins it on a click, tap, Enter, or Space on a button trigger.
26
- */
27
- export type TooltipTriggerBehavior = 'adaptive' | 'hover' | 'toggle';
28
23
  export interface TooltipOptions {
29
24
  /**
30
25
  * Position placement relative to anchor
@@ -64,30 +59,9 @@ export interface TooltipOptions {
64
59
  * - `tap`: tap always opens the tooltip, even on a trigger that acts
65
60
  * - `none`: touch never opens the tooltip
66
61
  *
67
- * It decides only under `triggerBehavior="adaptive"`, the default.
68
- *
69
62
  * @default 'auto'
70
63
  */
71
64
  touchTrigger?: TooltipTouchTrigger;
72
- /**
73
- * How the trigger opens the tooltip:
74
- * - `adaptive` (the default): hover and focus preview it. A tap opens it
75
- * unless the trigger performs an action of its own. While `touchTrigger`
76
- * remains, it decides those taps.
77
- * - `hover`: hover and focus preview it; no touch or pen tap opens it.
78
- * - `toggle`: on a button trigger, a click, a tap, Enter, or Space pins the
79
- * tooltip open, and the same press closes it. Hover and keyboard focus
80
- * still preview it. A pinned tooltip stays until Escape, a second press,
81
- * a press outside, or focus leaving. Astryx clickable rows and cards
82
- * ignore the pinning press, except an Item row on a trigger that is not
83
- * a native button. The `Tooltip` component also stops it at a child
84
- * trigger. A hook caller stops a plain `onClick` ancestor itself. The
85
- * trigger reports `aria-expanded` and `aria-controls`, and the tooltip's
86
- * text is announced once when it pins. `touchTrigger` is ignored.
87
- *
88
- * @default 'adaptive'
89
- */
90
- triggerBehavior?: TooltipTriggerBehavior;
91
65
  /**
92
66
  * Whether the tooltip is enabled.
93
67
  * When false, hover/focus triggers are disabled.
@@ -185,4 +159,29 @@ export interface TooltipReturn {
185
159
  * ```
186
160
  */
187
161
  export declare function useTooltip(options?: TooltipOptions): TooltipReturn;
162
+ /**
163
+ * Module-only options for `useTooltipWithTriggerBehavior`. Not exported from
164
+ * the package.
165
+ */
166
+ export interface TooltipWithTriggerBehaviorOptions extends TooltipOptions {
167
+ /**
168
+ * How the trigger opens the tooltip:
169
+ * - `adaptive` (the default): hover and focus preview it. `touchTrigger`
170
+ * decides taps.
171
+ * - `toggle`: on a button trigger, a click, a tap, Enter, or Space pins the
172
+ * tooltip open, and the same press closes it. Hover and keyboard focus
173
+ * still preview it. A pinned tooltip stays until Escape, a second press,
174
+ * a press outside, or focus leaving. The trigger reports `aria-expanded`
175
+ * and `aria-controls`, and the tooltip's text is announced once when it
176
+ * pins. `touchTrigger` is ignored. InfoTip uses it.
177
+ *
178
+ * @default 'adaptive'
179
+ */
180
+ triggerBehavior?: LayerTriggerBehavior;
181
+ }
182
+ /**
183
+ * `useTooltip` with a trigger behavior. Module-only: InfoTip's press-to-pin
184
+ * goes through it, and the package does not export it.
185
+ */
186
+ export declare function useTooltipWithTriggerBehavior(options?: TooltipWithTriggerBehaviorOptions): TooltipReturn;
188
187
  //# sourceMappingURL=useTooltip.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useTooltip.d.ts","sourceRoot":"","sources":["../../src/Tooltip/useTooltip.tsx"],"names":[],"mappings":"AAIA;;;;;;;;GAQG;AAEH,OAAO,EAIL,KAAK,SAAS,EACd,KAAK,WAAW,EACjB,MAAM,OAAO,CAAC;AAEf,OAAO,EAEL,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACnB,KAAK,cAAc,EACpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,0BAA0B,CAAC;AA+ChE;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE9D;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG,iBAAiB,CAAC;AAEpD;;;;;GAKG;AACH,MAAM,MAAM,sBAAsB,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,CAAC;AAErE,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,SAAS,CAAC,EAAE,cAAc,CAAC;IAE3B;;;OAGG;IACH,SAAS,CAAC,EAAE,cAAc,CAAC;IAE3B;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;;;;;;OAQG;IACH,YAAY,CAAC,EAAE,mBAAmB,CAAC;IAEnC;;;;;;;;;;;OAWG;IACH,YAAY,CAAC,EAAE,mBAAmB,CAAC;IAEnC;;;;;;;;;;;;;;;;;OAiBG;IACH,eAAe,CAAC,EAAE,sBAAsB,CAAC;IAEzC;;;;;OAKG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;;;;;;;;;OAUG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IAEpB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B;;;OAGG;IACH,GAAG,EAAE,WAAW,CAAC,WAAW,CAAC,CAAC;IAE9B;;;OAGG;IACH,WAAW,EAAE,WAAW,CAAC,WAAW,CAAC,CAAC;IAEtC;;;;OAIG;IACH,cAAc,EAAE,WAAW,CAAC,WAAW,CAAC,CAAC;IAEzC;;;OAGG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,WAAW,EAAE,MAAM,CAAC;IAEpB;;;;;;;OAOG;IACH,aAAa,EAAE,CACb,QAAQ,EAAE,SAAS,EACnB,KAAK,CAAC,EAAE,IAAI,CAAC,kBAAkB,EAAE,aAAa,CAAC,KAC5C,SAAS,CAAC;CAChB;AAyBD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,wBAAgB,UAAU,CAAC,OAAO,GAAE,cAAmB,GAAG,aAAa,CAqdtE"}
1
+ {"version":3,"file":"useTooltip.d.ts","sourceRoot":"","sources":["../../src/Tooltip/useTooltip.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;GASG;AAEH,OAAO,EAIL,KAAK,SAAS,EACd,KAAK,WAAW,EACjB,MAAM,OAAO,CAAC;AAEf,OAAO,EAEL,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACnB,KAAK,cAAc,EACpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,0BAA0B,CAAC;AAKhE,OAAO,EAAc,KAAK,oBAAoB,EAAC,MAAM,sBAAsB,CAAC;AA0C5E;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE9D;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG,iBAAiB,CAAC;AAEpD,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,SAAS,CAAC,EAAE,cAAc,CAAC;IAE3B;;;OAGG;IACH,SAAS,CAAC,EAAE,cAAc,CAAC;IAE3B;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;;;;;;OAQG;IACH,YAAY,CAAC,EAAE,mBAAmB,CAAC;IAEnC;;;;;;;;;OASG;IACH,YAAY,CAAC,EAAE,mBAAmB,CAAC;IAEnC;;;;;OAKG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;;;;;;;;;OAUG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IAEpB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B;;;OAGG;IACH,GAAG,EAAE,WAAW,CAAC,WAAW,CAAC,CAAC;IAE9B;;;OAGG;IACH,WAAW,EAAE,WAAW,CAAC,WAAW,CAAC,CAAC;IAEtC;;;;OAIG;IACH,cAAc,EAAE,WAAW,CAAC,WAAW,CAAC,CAAC;IAEzC;;;OAGG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,WAAW,EAAE,MAAM,CAAC;IAEpB;;;;;;;OAOG;IACH,aAAa,EAAE,CACb,QAAQ,EAAE,SAAS,EACnB,KAAK,CAAC,EAAE,IAAI,CAAC,kBAAkB,EAAE,aAAa,CAAC,KAC5C,SAAS,CAAC;CAChB;AAyBD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,wBAAgB,UAAU,CAAC,OAAO,GAAE,cAAmB,GAAG,aAAa,CAOtE;AAED;;;GAGG;AACH,MAAM,WAAW,iCAAkC,SAAQ,cAAc;IACvE;;;;;;;;;;;;OAYG;IACH,eAAe,CAAC,EAAE,oBAAoB,CAAC;CACxC;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,CAC3C,OAAO,GAAE,iCAAsC,GAC9C,aAAa,CAqdf"}
@@ -5,7 +5,8 @@
5
5
  /**
6
6
  * @file useTooltip.tsx
7
7
  * @input Uses useLayer, usePressPin, React hooks
8
- * @output Exports useTooltip hook with stable trigger refs for hover/focus/tap tooltips
8
+ * @output Exports useTooltip hook with stable trigger refs for hover/focus/tap tooltips,
9
+ * and the module-only useTooltipWithTriggerBehavior that InfoTip's press-to-pin uses
9
10
  * @position Layer hook; builds on useLayer for tooltip behavior
10
11
  *
11
12
  * SYNC: When modified, update:
@@ -51,13 +52,6 @@ const styles = {
51
52
  * Touch trigger behavior for tooltips
52
53
  */
53
54
 
54
- /**
55
- * How the trigger opens the tooltip. `adaptive`, the default, previews it on
56
- * hover and focus, and a tap opens it unless the trigger acts. `hover`
57
- * previews it on hover and focus, and no touch or pen tap opens it. `toggle`
58
- * pins it on a click, tap, Enter, or Space on a button trigger.
59
- */
60
-
61
55
  /**
62
56
  * Check if an element is naturally focusable
63
57
  */
@@ -106,6 +100,24 @@ function isFocusable(element) {
106
100
  */
107
101
 
108
102
  export function useTooltip(options = {}) {
103
+ // The option is fixed to `adaptive`, so an options object that carries it at
104
+ // runtime cannot reach the press-to-pin path.
105
+ return useTooltipWithTriggerBehavior({
106
+ ...options,
107
+ triggerBehavior: 'adaptive'
108
+ });
109
+ }
110
+
111
+ /**
112
+ * Module-only options for `useTooltipWithTriggerBehavior`. Not exported from
113
+ * the package.
114
+ */
115
+
116
+ /**
117
+ * `useTooltip` with a trigger behavior. Module-only: InfoTip's press-to-pin
118
+ * goes through it, and the package does not export it.
119
+ */
120
+ export function useTooltipWithTriggerBehavior(options = {}) {
109
121
  const {
110
122
  placement = 'above',
111
123
  alignment = 'center',
@@ -1 +1 @@
1
- {"version":3,"file":"TopNavItem.d.ts","sourceRoot":"","sources":["../../src/TopNav/TopNavItem.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,OAAO,CAAC;AACrC,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAY5C,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,eAAe,CAAC;AAErD,OAAO,EAAgB,KAAK,WAAW,EAAC,MAAM,iCAAiC,CAAC;AA2DhF,MAAM,WAAW,eAAgB,SAAQ,SAAS,CAAC,iBAAiB,CAAC;IACnE,wCAAwC;IACxC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IACnC,4BAA4B;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,yCAAyC;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yBAAyB;IACzB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,qDAAqD;IACrD,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC5B,oCAAoC;IACpC,cAAc,CAAC,EAAE,KAAK,CAAC,2BAA2B,CAAC;IACnD;;;;OAIG;IACH,EAAE,CAAC,EAAE,iBAAiB,CAAC;IACvB;;;;OAIG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;OAEG;IACH,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB;;OAEG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB;;;;OAIG;IACH,IAAI,CAAC,EAAE,WAAW,CAAC;CACpB;AAWD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,UAAU,CAAC,EACzB,EAAE,EACF,IAAI,EACJ,MAAM,EACN,OAAO,EACP,KAAK,EACL,UAAkB,EAClB,UAAkB,EAClB,UAAkB,EAClB,IAAI,EACJ,QAAQ,EACR,IAAW,EACX,MAAM,EACN,SAAS,EACT,KAAK,EACL,GAAG,EACH,GAAG,KAAK,EACT,EAAE,eAAe,+BAkGjB;yBAnHe,UAAU"}
1
+ {"version":3,"file":"TopNavItem.d.ts","sourceRoot":"","sources":["../../src/TopNav/TopNavItem.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,OAAO,CAAC;AACrC,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAY5C,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,eAAe,CAAC;AAErD,OAAO,EAAgB,KAAK,WAAW,EAAC,MAAM,iCAAiC,CAAC;AA2DhF,MAAM,WAAW,eAAgB,SAAQ,SAAS,CAAC,iBAAiB,CAAC;IACnE,wCAAwC;IACxC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IACnC,4BAA4B;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,yCAAyC;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yBAAyB;IACzB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,qDAAqD;IACrD,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC5B,oCAAoC;IACpC,cAAc,CAAC,EAAE,KAAK,CAAC,2BAA2B,CAAC;IACnD;;;;OAIG;IACH,EAAE,CAAC,EAAE,iBAAiB,CAAC;IACvB;;;;OAIG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;OAEG;IACH,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB;;OAEG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB;;;;OAIG;IACH,IAAI,CAAC,EAAE,WAAW,CAAC;CACpB;AAWD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,UAAU,CAAC,EACzB,EAAE,EACF,IAAI,EACJ,MAAM,EACN,OAAO,EACP,KAAK,EACL,UAAkB,EAClB,UAAkB,EAClB,UAAkB,EAClB,IAAI,EACJ,QAAQ,EACR,IAAW,EACX,MAAM,EACN,SAAS,EACT,KAAK,EACL,GAAG,EACH,GAAG,KAAK,EACT,EAAE,eAAe,+BAmGjB;yBApHe,UAAU"}
@@ -22,7 +22,7 @@ import { useLinkComponent } from "../Link/useLinkComponent.js";
22
22
  import { useTopNavRenderMode } from "./TopNavRenderContext.js";
23
23
  import { navItemStyles } from "../NavItem/navItemStyles.stylex.js";
24
24
  import { mergeProps } from "../utils/index.js";
25
- import { useAppShellMobile } from "../AppShell/AppShellMobileContext.js";
25
+ import { useCloseMobileDrawerOnActivate } from "../AppShell/useCloseMobileDrawerOnActivate.js";
26
26
  import { themeProps } from "../utils/themeProps.js";
27
27
  import { focusOutlineProps } from "../utils/focusOutline.stylex.js";
28
28
  import { interactionOverlayStyles } from "../utils/interactionOverlay.stylex.js";
@@ -112,9 +112,7 @@ export function TopNavItem({
112
112
  const pressable = usePressFeedback();
113
113
  const LinkComponent = useLinkComponent(as);
114
114
  const renderMode = useTopNavRenderMode();
115
- const {
116
- closeMobileNav
117
- } = useAppShellMobile();
115
+ const closeDrawerAfter = useCloseMobileDrawerOnActivate(renderMode === 'drawer');
118
116
 
119
117
  // A disabled item renders as a plain <a> with no href: an href-less anchor
120
118
  // is not focusable and exposes no link affordance, so programmatic focus +
@@ -129,14 +127,13 @@ export function TopNavItem({
129
127
  // Drawer mode — render as a SideNavItem-style vertical list element
130
128
  // =========================================================================
131
129
  if (renderMode === 'drawer') {
130
+ const activate = closeDrawerAfter(onClick);
132
131
  const handleDrawerClick = e => {
133
132
  if (isDisabled) {
134
133
  preventDefaultClick(e);
135
134
  return;
136
135
  }
137
- // Forward the original onClick if present
138
- onClick?.(e);
139
- closeMobileNav();
136
+ activate?.(e);
140
137
  };
141
138
  return /*#__PURE__*/_jsxs(Root, {
142
139
  ref: ref,
@@ -1 +1 @@
1
- {"version":3,"file":"TopNavMegaMenuItem.d.ts","sourceRoot":"","sources":["../../src/TopNav/TopNavMegaMenuItem.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,EAAC,KAAK,SAAS,EAAC,MAAM,OAAO,CAAC;AAa5C,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,eAAe,CAAC;AAGrD,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAsG5C,MAAM,WAAW,uBAAwB,SAAQ,IAAI,CACnD,SAAS,CAAC,WAAW,CAAC,EACtB,SAAS,CACV;IACC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC7B,uCAAuC;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,2DAA2D;IAC3D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mDAAmD;IACnD,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,uCAAuC;IACvC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qCAAqC;IACrC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB;;;OAGG;IACH,EAAE,CAAC,EAAE,iBAAiB,CAAC;CACxB;AAMD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,GAAG,EACH,KAAK,EACL,WAAW,EACX,IAAI,EACJ,IAAI,EACJ,OAAO,EACP,EAAE,EACF,QAAQ,EACR,MAAM,EACN,SAAS,EACT,KAAK,EACL,GAAG,SAAS,EACb,EAAE,uBAAuB,qBAsFzB;yBAnGe,kBAAkB"}
1
+ {"version":3,"file":"TopNavMegaMenuItem.d.ts","sourceRoot":"","sources":["../../src/TopNav/TopNavMegaMenuItem.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,EAAC,KAAK,SAAS,EAAC,MAAM,OAAO,CAAC;AAa5C,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,eAAe,CAAC;AAGrD,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAsG5C,MAAM,WAAW,uBAAwB,SAAQ,IAAI,CACnD,SAAS,CAAC,WAAW,CAAC,EACtB,SAAS,CACV;IACC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC7B,uCAAuC;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,2DAA2D;IAC3D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mDAAmD;IACnD,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,uCAAuC;IACvC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qCAAqC;IACrC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB;;;OAGG;IACH,EAAE,CAAC,EAAE,iBAAiB,CAAC;CACxB;AAMD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,GAAG,EACH,KAAK,EACL,WAAW,EACX,IAAI,EACJ,IAAI,EACJ,OAAO,EACP,EAAE,EACF,QAAQ,EACR,MAAM,EACN,SAAS,EACT,KAAK,EACL,GAAG,SAAS,EACb,EAAE,uBAAuB,qBAuFzB;yBApGe,kBAAkB"}
@@ -22,7 +22,7 @@ import { navItemStyles } from "../NavItem/navItemStyles.stylex.js";
22
22
  import { useLinkComponent } from "../Link/useLinkComponent.js";
23
23
  import { useTopNavRenderMode } from "./TopNavRenderContext.js";
24
24
  import { mergeProps } from "../utils/index.js";
25
- import { useAppShellMobile } from "../AppShell/AppShellMobileContext.js";
25
+ import { useCloseMobileDrawerOnActivate } from "../AppShell/useCloseMobileDrawerOnActivate.js";
26
26
  import { themeProps } from "../utils/themeProps.js";
27
27
  import { focusOutlineProps } from "../utils/focusOutline.stylex.js";
28
28
  import { interactionOverlayStyles } from "../utils/interactionOverlay.stylex.js";
@@ -112,9 +112,7 @@ export function TopNavMegaMenuItem({
112
112
  const pressable = usePressFeedback();
113
113
  const renderMode = useTopNavRenderMode();
114
114
  const LinkComponent = useLinkComponent(as);
115
- const {
116
- closeMobileNav
117
- } = useAppShellMobile();
115
+ const closeDrawerAfter = useCloseMobileDrawerOnActivate(renderMode === 'drawer');
118
116
 
119
117
  // =========================================================================
120
118
  // Drawer mode — matches SideNavItem / TopNavMenu drawer appearance
@@ -124,10 +122,9 @@ export function TopNavMegaMenuItem({
124
122
  const elementProps = Element === 'button' ? {
125
123
  type: 'button'
126
124
  } : {};
127
- const handleDrawerClick = () => {
125
+ const handleDrawerClick = closeDrawerAfter(() => {
128
126
  onClick?.();
129
- closeMobileNav();
130
- };
127
+ });
131
128
  return /*#__PURE__*/_jsxs(Element, {
132
129
  ...restProps,
133
130
  ref: ref,
@@ -1 +1 @@
1
- {"version":3,"file":"TopNavMenu.d.ts","sourceRoot":"","sources":["../../src/TopNav/TopNavMenu.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,EAKZ,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAaf,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAqN5C;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,IAAI,CAAC,EAAE,SAAS,CAAC;IAEjB;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAMD,MAAM,WAAW,eAAgB,SAAQ,SAAS,CAAC,iBAAiB,CAAC;IACnE,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IACnC;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAE5B;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,wBAAgB,UAAU,CAAC,EACzB,GAAG,EACH,KAAK,EACL,KAAK,EACL,KAAW,EACX,SAAe,EACf,MAAM,EACN,SAAS,EACT,KAAK,EACL,OAAO,EAAE,WAAW,EACpB,YAAY,EAAE,gBAAgB,EAC9B,YAAY,EAAE,gBAAgB,EAC9B,GAAG,IAAI,EACR,EAAE,eAAe,4BAsSjB;yBAnTe,UAAU"}
1
+ {"version":3,"file":"TopNavMenu.d.ts","sourceRoot":"","sources":["../../src/TopNav/TopNavMenu.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,EAKZ,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAaf,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAqN5C;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,IAAI,CAAC,EAAE,SAAS,CAAC;IAEjB;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAMD,MAAM,WAAW,eAAgB,SAAQ,SAAS,CAAC,iBAAiB,CAAC;IACnE,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IACnC;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAE5B;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,wBAAgB,UAAU,CAAC,EACzB,GAAG,EACH,KAAK,EACL,KAAK,EACL,KAAW,EACX,SAAe,EACf,MAAM,EACN,SAAS,EACT,KAAK,EACL,OAAO,EAAE,WAAW,EACpB,YAAY,EAAE,gBAAgB,EAC9B,YAAY,EAAE,gBAAgB,EAC9B,GAAG,IAAI,EACR,EAAE,eAAe,4BAuSjB;yBApTe,UAAU"}
@@ -31,7 +31,7 @@ import { useMergedRefs } from "../hooks/useMergedRefs.js";
31
31
  import { navItemStyles } from "../NavItem/navItemStyles.stylex.js";
32
32
  import { useTopNavSlot } from "./TopNavContext.js";
33
33
  import { useTopNavRenderMode } from "./TopNavRenderContext.js";
34
- import { useAppShellMobile } from "../AppShell/AppShellMobileContext.js";
34
+ import { useCloseMobileDrawerOnActivate } from "../AppShell/useCloseMobileDrawerOnActivate.js";
35
35
  import { useLinkComponent } from "../Link/useLinkComponent.js";
36
36
  import { isSafeUrl } from "../utils/safeUrl.js";
37
37
  import { themeProps } from "../utils/themeProps.js";
@@ -212,9 +212,7 @@ export function TopNavMenu({
212
212
  }) {
213
213
  const pressable = usePressFeedback();
214
214
  const renderMode = useTopNavRenderMode();
215
- const {
216
- closeMobileNav
217
- } = useAppShellMobile();
215
+ const closeDrawerAfter = useCloseMobileDrawerOnActivate(renderMode === 'drawer');
218
216
  const LinkComponent = useLinkComponent();
219
217
  const [drawerExpanded, setDrawerExpanded] = useState(false);
220
218
  const menuId = useId();
@@ -351,10 +349,9 @@ export function TopNavMenu({
351
349
  children: items.map(item => /*#__PURE__*/_jsxs(LinkComponent, {
352
350
  href: item.href,
353
351
  ...pressable,
354
- onClick: _e => {
352
+ onClick: closeDrawerAfter(_e => {
355
353
  item.onClick?.();
356
- closeMobileNav();
357
- },
354
+ }),
358
355
  ...focusOutlineProps.focusVisible(navItemStyles.item, interactionOverlayStyles.backgroundColor, drawerStyles.item),
359
356
  children: [isRenderable(item.icon) && /*#__PURE__*/_jsx("span", {
360
357
  ...{
package/dist/astryx.css CHANGED
@@ -63,6 +63,7 @@
63
63
  @keyframes x13kz0yu-B{0%, 100%{opacity:1;}50%{opacity:.5;}}
64
64
  @keyframes x132z07p-B{0%{opacity:.25;}9.99%{opacity:.25;}10%{opacity:.325;}19.99%{opacity:.325;}20%{opacity:.4;}29.99%{opacity:.4;}30%{opacity:.475;}39.99%{opacity:.475;}40%{opacity:.55;}49.99%{opacity:.55;}50%{opacity:.625;}59.99%{opacity:.625;}60%{opacity:.7;}69.99%{opacity:.7;}70%{opacity:.775;}79.99%{opacity:.775;}80%{opacity:.85;}89.99%{opacity:.85;}90%{opacity:.925;}100%{opacity:.925;}}
65
65
  @keyframes x1jn504y-B{from{opacity:1;}to{opacity:0;}}
66
+ @keyframes x12p7u8f-B{from{opacity:0;animation-timing-function:cubic-bezier(0.42, 0, 0.58, 1);}to{opacity:1;}}
66
67
  @keyframes x18re5ia-B{from{opacity:0;}to{opacity:1;}}
67
68
  @keyframes xtut5q7-B{0%{opacity:1;}50%{opacity:.5;}100%{opacity:1;}}
68
69
  @keyframes x1k48ry3-B{from{opacity:0;transform:scale(.95);}to{opacity:1;transform:scale(1);}}
@@ -717,7 +718,6 @@
717
718
  .xg7jpbn:not(#\#):not(#\#):not(#\#){-webkit-text-fill-color:transparent}
718
719
  .xpdipgo:not(#\#):not(#\#):not(#\#){-webkit-touch-callout:none}
719
720
  .x1winvzj:not(#\#):not(#\#):not(#\#){-webkit-user-select:none}
720
- .x4465f1:not(#\#):not(#\#):not(#\#){align-content:end}
721
721
  .x8gbvx8:not(#\#):not(#\#):not(#\#){align-content:flex-start}
722
722
  .x1pha0wt:not(#\#):not(#\#):not(#\#){align-items:baseline}
723
723
  .x6s0dn4:not(#\#):not(#\#):not(#\#){align-items:center}
@@ -1686,13 +1686,13 @@
1686
1686
  @media (prefers-reduced-motion: reduce){.x4q6aw4.x4q6aw4:not(#\#):not(#\#):not(#\#){animation-direction:alternate}}
1687
1687
  @media (prefers-reduced-motion: reduce) and (pointer: coarse){.x1jq6yc9.x1jq6yc9:not(#\#):not(#\#):not(#\#){animation-duration:.2s}}
1688
1688
  @media (prefers-reduced-motion: reduce){.xnh0sag.xnh0sag:not(#\#):not(#\#):not(#\#){animation-duration:3s}}
1689
- @media (prefers-reduced-motion: reduce) and (pointer: coarse){.x13pi3j7.x13pi3j7:not(#\#):not(#\#):not(#\#){animation-duration:min(var(--duration-fast-max),.2s)}}
1690
1689
  @media (prefers-reduced-motion: reduce){.x1p2ibn3.x1p2ibn3:not(#\#):not(#\#):not(#\#){animation-duration:var(--_progress-bar-pulse)}}
1691
- @media ((prefers-reduced-motion: reduce) and (not (prefers-reduced-motion: reduce))) or ((prefers-reduced-motion: reduce) and (not (pointer: coarse))){.xa4pr1u.xa4pr1u:not(#\#):not(#\#):not(#\#){animation-name:none}}
1690
+ @media (prefers-reduced-motion: reduce) and (pointer: coarse){.x10got5w.x10got5w:not(#\#):not(#\#):not(#\#){animation-duration:200ms}}
1691
+ @media ((prefers-reduced-motion: reduce) and (not (pointer: coarse)) and (not (prefers-reduced-motion: reduce))) or ((prefers-reduced-motion: reduce) and (not (pointer: coarse)) and (not (pointer: coarse))){.x2g3n7u.x2g3n7u:not(#\#):not(#\#):not(#\#){animation-name:none}}
1692
1692
  @media (prefers-reduced-motion: reduce) and (not (pointer: coarse)){.xtuz6mp.xtuz6mp:not(#\#):not(#\#):not(#\#){animation-name:none}}
1693
1693
  @media (prefers-reduced-motion: reduce){.x1aquc0h.x1aquc0h:not(#\#):not(#\#):not(#\#){animation-name:none}}
1694
+ @media (prefers-reduced-motion: reduce) and (pointer: coarse){.xaqowwx.xaqowwx:not(#\#):not(#\#):not(#\#){animation-name:x12p7u8f-B}}
1694
1695
  @media ((prefers-reduced-motion: reduce) and (pointer: coarse) and (not (prefers-reduced-motion: reduce))) or ((prefers-reduced-motion: reduce) and (pointer: coarse) and (not ((not (pointer: coarse))))){.x6mpr79.x6mpr79:not(#\#):not(#\#):not(#\#){animation-name:x18re5ia-B}}
1695
- @media (prefers-reduced-motion: reduce) and (pointer: coarse){.xajy0lc.xajy0lc:not(#\#):not(#\#):not(#\#){animation-name:x18re5ia-B}}
1696
1696
  @media (prefers-reduced-motion: reduce){.xfqa98z.xfqa98z:not(#\#):not(#\#):not(#\#){animation-name:xml828b-B}}
1697
1697
  @media (prefers-reduced-motion: reduce) and (pointer: coarse){.xr5m3f0.xr5m3f0:not(#\#):not(#\#):not(#\#){animation-timing-function:cubic-bezier(.42,0,.58,1)}}
1698
1698
  @media (prefers-reduced-motion: reduce){.x10xcq22.x10xcq22:not(#\#):not(#\#):not(#\#){animation-timing-function:var(--_progress-bar-pulse-curve)}}
@@ -2019,7 +2019,7 @@
2019
2019
  .xe0p6wg:not(#\#):not(#\#):not(#\#):not(#\#){min-height:28px}
2020
2020
  .x21xpn4:not(#\#):not(#\#):not(#\#):not(#\#){min-height:32px}
2021
2021
  .x1gg8mnh:not(#\#):not(#\#):not(#\#):not(#\#){min-height:44px}
2022
- .x121v3j4:not(#\#):not(#\#):not(#\#):not(#\#){min-height:min-content}
2022
+ .x1lh6h5t:not(#\#):not(#\#):not(#\#):not(#\#){min-height:fit-content}
2023
2023
  .x1xf4nls:not(#\#):not(#\#):not(#\#):not(#\#){min-height:var(--size-element-lg)}
2024
2024
  .x1uogy3y:not(#\#):not(#\#):not(#\#):not(#\#){min-height:var(--size-element-md)}
2025
2025
  .x1gdqauq:not(#\#):not(#\#):not(#\#):not(#\#){min-height:var(--size-element-sm)}
@@ -96,6 +96,12 @@ export declare class GestureHost {
96
96
  * lift click (`spec:AST-094` FR28: nothing acts).
97
97
  */
98
98
  private readonly cancelledFingers;
99
+ /**
100
+ * The pens and pointer-read fingers that the app's lost focus cancelled,
101
+ * by pointer id. Each is kept until its lift, which must not click either,
102
+ * or until a new press.
103
+ */
104
+ private readonly cancelledPointers;
99
105
  /** Touch.identifier → the element the finger landed on. */
100
106
  private readonly touchTargets;
101
107
  /**
@@ -117,6 +123,8 @@ export declare class GestureHost {
117
123
  private readonly processed;
118
124
  /** pointerId → arena id, for live mouse and pen contacts. */
119
125
  private readonly pointerIds;
126
+ /** Each contact's kind: a blur refuses a pen's or a pointer-read finger's lift, never a mouse's. */
127
+ private readonly pointerKinds;
120
128
  /**
121
129
  * The boxes the host watches for screen-edge pans (syncLayoutWatch): each
122
130
  * element with an enabled one, and the root for one whose band moves with
@@ -397,7 +405,18 @@ export declare class GestureHost {
397
405
  private readonly onArmedPress;
398
406
  /** A kept press's blocking `touchmove` follows the armed press (syncTouchMoveListener). */
399
407
  private syncKeptPresses;
400
- /** After a contact ends: an armed press that is over stops listening. */
408
+ /**
409
+ * A new press is a new gesture, as the click guard reads one, so the lifts
410
+ * the blur cancelled owe nothing after it. A second finger keeps the other
411
+ * fingers' refusals, since those fingers may still be down.
412
+ */
413
+ private dropCancelledLifts;
414
+ /**
415
+ * After a contact ends: an armed press that is over stops listening. A
416
+ * contact the lost focus cancelled still owes its lift, so the press is
417
+ * not over until that lift comes. A lift the page never hears ends it at
418
+ * the next press, or at a cancel.
419
+ */
401
420
  private releaseArmedPress;
402
421
  /** With nothing attached, stop listening and stop following the pointer. */
403
422
  private uninstallIfIdle;
@@ -688,6 +707,8 @@ export declare class GestureHost {
688
707
  * FR10), and no claim is released here.
689
708
  */
690
709
  private failUnclaimedLoneFingerPans;
710
+ /** Whether a finger's drag is claimed: then two fingers make no pinch. */
711
+ private isFingerClaimed;
691
712
  private readonly onVisibilityChange;
692
713
  private readonly onBlur;
693
714
  /** Whether the browser sends Touch Events at all (`ontouchstart`). */
@@ -698,6 +719,11 @@ export declare class GestureHost {
698
719
  * after load), as the move path does.
699
720
  */
700
721
  private readsFingersFromPointerEvents;
722
+ /**
723
+ * The lift of a contact the lost focus cancelled: its click is refused,
724
+ * and a finger's touchend after it is cancelled.
725
+ */
726
+ private refuseCancelledLift;
701
727
  /** The app lost focus: UIKit cancels every touch in flight. */
702
728
  private cancelEverything;
703
729
  }
@@ -1 +1 @@
1
- {"version":3,"file":"GestureHost.d.ts","sourceRoot":"","sources":["../../src/gestures/GestureHost.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"GestureHost.d.ts","sourceRoot":"","sources":["../../src/gestures/GestureHost.ts"],"names":[],"mappings":"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"}
@@ -457,6 +457,12 @@ export class GestureHost {
457
457
  * lift click (`spec:AST-094` FR28: nothing acts).
458
458
  */
459
459
  cancelledFingers = new Set();
460
+ /**
461
+ * The pens and pointer-read fingers that the app's lost focus cancelled,
462
+ * by pointer id. Each is kept until its lift, which must not click either,
463
+ * or until a new press.
464
+ */
465
+ cancelledPointers = new Map();
460
466
  /** Touch.identifier → the element the finger landed on. */
461
467
  touchTargets = new Map();
462
468
  /**
@@ -478,6 +484,8 @@ export class GestureHost {
478
484
  processed = new WeakSet();
479
485
  /** pointerId → arena id, for live mouse and pen contacts. */
480
486
  pointerIds = new Map();
487
+ /** Each contact's kind: a blur refuses a pen's or a pointer-read finger's lift, never a mouse's. */
488
+ pointerKinds = new Map();
481
489
  /**
482
490
  * The boxes the host watches for screen-edge pans (syncLayoutWatch): each
483
491
  * element with an enabled one, and the root for one whose band moves with
@@ -1420,13 +1428,32 @@ export class GestureHost {
1420
1428
  }
1421
1429
  }
1422
1430
 
1423
- /** After a contact ends: an armed press that is over stops listening. */
1431
+ /**
1432
+ * A new press is a new gesture, as the click guard reads one, so the lifts
1433
+ * the blur cancelled owe nothing after it. A second finger keeps the other
1434
+ * fingers' refusals, since those fingers may still be down.
1435
+ */
1436
+ dropCancelledLifts(event) {
1437
+ const isSecond = event.pointerType === 'touch' && event.isPrimary === false;
1438
+ for (const [pointerId, kind] of [...this.cancelledPointers]) {
1439
+ if (pointerId === event.pointerId || !(isSecond && kind === 'touch')) {
1440
+ this.cancelledPointers.delete(pointerId);
1441
+ }
1442
+ }
1443
+ }
1444
+
1445
+ /**
1446
+ * After a contact ends: an armed press that is over stops listening. A
1447
+ * contact the lost focus cancelled still owes its lift, so the press is
1448
+ * not over until that lift comes. A lift the page never hears ends it at
1449
+ * the next press, or at a cancel.
1450
+ */
1424
1451
  releaseArmedPress() {
1425
1452
  if (!this.isArmedPress) {
1426
1453
  return;
1427
1454
  }
1428
1455
  queueMicrotask(() => {
1429
- if (this.isArmedPress && this.arena.touches.length === 0) {
1456
+ if (this.isArmedPress && this.arena.touches.length === 0 && this.cancelledPointers.size === 0) {
1430
1457
  this.isArmedPress = false;
1431
1458
  this.syncKeptPresses();
1432
1459
  this.syncListeners();
@@ -1457,6 +1484,7 @@ export class GestureHost {
1457
1484
  return;
1458
1485
  }
1459
1486
  this.cancelledFingers.clear();
1487
+ this.cancelledPointers.clear();
1460
1488
  this.clearClaimedLifts();
1461
1489
  this.cancelCallerRead?.();
1462
1490
  this.cancelCallerRead = null;
@@ -2415,8 +2443,9 @@ export class GestureHost {
2415
2443
  consumerElement
2416
2444
  });
2417
2445
  }
2418
- // The finger's events keep going to what the engine hit.
2419
- this.watchTarget(touch.identifier, native, recognizers.some(claimsWhileMoving) || consumer?.keepsTouch != null, consumer != null || recognizers.some(recognizer => recognizer.claimsTouches));
2446
+ // The finger's events keep going to what the engine hit. A disabled
2447
+ // participant can never claim, so a scroll never waits on it.
2448
+ this.watchTarget(touch.identifier, native, recognizers.some(recognizer => recognizer.isEnabled && claimsWhileMoving(recognizer)) || consumer?.keepsTouch != null && consumer.isEnabled?.() !== false, consumer != null && consumer.isEnabled?.() !== false || recognizers.some(recognizer => recognizer.isEnabled && recognizer.claimsTouches));
2420
2449
  this.lastFed.set(id, {
2421
2450
  x: touch.clientX,
2422
2451
  y: touch.clientY,
@@ -2460,6 +2489,11 @@ export class GestureHost {
2460
2489
  for (const input of untracked) {
2461
2490
  this.arena.untrackedBegan(input);
2462
2491
  }
2492
+ // Again once the new fingers are delivered: a pinch's second finger may
2493
+ // have landed on another one-finger pan, the next row.
2494
+ if (this.fingerTargets.length > 1 && !this.isFingerClaimed()) {
2495
+ this.failUnclaimedLoneFingerPans();
2496
+ }
2463
2497
  // Stamped after the consumers judged the touch: the brake asks whether
2464
2498
  // an EARLIER finger is still driving a scroll.
2465
2499
  const landed = landedOn(event);
@@ -2985,6 +3019,7 @@ export class GestureHost {
2985
3019
  if (!isPointerKind(event.pointerType)) {
2986
3020
  return;
2987
3021
  }
3022
+ this.dropCancelledLifts(event);
2988
3023
  if (event.pointerType === 'touch' && this.usesTouchEvents) {
2989
3024
  this.pairPointer(event.pointerId, {
2990
3025
  x: event.clientX,
@@ -2993,6 +3028,13 @@ export class GestureHost {
2993
3028
  });
2994
3029
  return;
2995
3030
  }
3031
+ if (event.pointerType === 'touch' && event.isPrimary === false) {
3032
+ // Fingers from pointer events: a second one, wherever either lands,
3033
+ // leaves the two to the page's pinch, as onTouchStart does. A finger
3034
+ // that is not the primary pointer is a second finger, even where the
3035
+ // host never heard the first.
3036
+ this.failUnclaimedLoneFingerPans();
3037
+ }
2996
3038
  // A right click, a pen's barrel button, or a ctrl-click on macOS (its
2997
3039
  // context click) starts no press (FR43).
2998
3040
  if (event.pointerType !== 'touch' && !isPrimaryClick(event)) {
@@ -3010,6 +3052,7 @@ export class GestureHost {
3010
3052
  }
3011
3053
  const id = this.nextId++;
3012
3054
  this.pointerIds.set(event.pointerId, id);
3055
+ this.pointerKinds.set(event.pointerId, event.pointerType);
3013
3056
  if (target !== landed && target != null) {
3014
3057
  this.retargeted.set(id, {
3015
3058
  x: event.clientX,
@@ -3033,6 +3076,11 @@ export class GestureHost {
3033
3076
  recognizers,
3034
3077
  consumer
3035
3078
  }]);
3079
+ if (event.pointerType === 'touch' && event.isPrimary === false && !this.isFingerClaimed()) {
3080
+ // Again once this finger is delivered: it may have landed on another
3081
+ // one-finger pan.
3082
+ this.failUnclaimedLoneFingerPans();
3083
+ }
3036
3084
  if (locksSelectionFor(event.pointerType)) {
3037
3085
  // The presented target: what the pen is on, where the engine's own
3038
3086
  // hit test may still see the motion's start.
@@ -3079,9 +3127,14 @@ export class GestureHost {
3079
3127
  }
3080
3128
  const id = this.pointerIds.get(event.pointerId);
3081
3129
  if (id == null) {
3130
+ // A contact the lost focus cancelled: its lift clicks nothing.
3131
+ if (this.cancelledPointers.delete(event.pointerId)) {
3132
+ this.refuseCancelledLift(event);
3133
+ }
3082
3134
  return;
3083
3135
  }
3084
3136
  this.pointerIds.delete(event.pointerId);
3137
+ this.pointerKinds.delete(event.pointerId);
3085
3138
  this.unlockSelection(id);
3086
3139
  const dispositions = this.arena.ended([{
3087
3140
  id,
@@ -3176,9 +3229,12 @@ export class GestureHost {
3176
3229
  }
3177
3230
  return;
3178
3231
  }
3232
+ // A contact that ends in a cancel owes no refused lift.
3233
+ this.cancelledPointers.delete(event.pointerId);
3179
3234
  const id = this.pointerIds.get(event.pointerId);
3180
3235
  if (id != null) {
3181
3236
  this.pointerIds.delete(event.pointerId);
3237
+ this.pointerKinds.delete(event.pointerId);
3182
3238
  this.unlockSelection(id, true);
3183
3239
  this.retargeted.delete(id);
3184
3240
  this.arena.cancelled([id], eventTime(event));
@@ -3348,18 +3404,22 @@ export class GestureHost {
3348
3404
  }
3349
3405
  }
3350
3406
  }
3407
+ /** Whether a finger's drag is claimed: then two fingers make no pinch. */
3408
+ isFingerClaimed() {
3409
+ return this.arena.touches.some(touch => touch.pointerType === 'touch' && this.arena.isClaimed(touch.id));
3410
+ }
3351
3411
  onVisibilityChange = () => {
3352
3412
  if (this.doc.visibilityState === 'hidden') {
3353
3413
  this.cancelEverything(this.arena.now());
3354
- // As at a blur: the press sends no further pointer event, so an armed
3355
- // press's page listeners go now (FR24).
3414
+ // As at a blur: an armed press's page listeners go once nothing is left
3415
+ // to hear.
3356
3416
  this.releaseArmedPress();
3357
3417
  }
3358
3418
  };
3359
3419
  onBlur = () => {
3360
3420
  this.cancelEverything(this.arena.now());
3361
- // The press a blur ends sends no further pointer event: an armed press's
3362
- // page listeners go now, as at its lift (FR24).
3421
+ // An armed press's page listeners go once nothing is left to hear. A pen
3422
+ // or a pointer-read finger the blur cancelled still owes its lift.
3363
3423
  this.releaseArmedPress();
3364
3424
  };
3365
3425
 
@@ -3379,8 +3439,29 @@ export class GestureHost {
3379
3439
  return this.inputMode === 'pointer-events' || view != null && !('ontouchstart' in view);
3380
3440
  }
3381
3441
 
3442
+ /**
3443
+ * The lift of a contact the lost focus cancelled: its click is refused,
3444
+ * and a finger's touchend after it is cancelled.
3445
+ */
3446
+ refuseCancelledLift(event) {
3447
+ armClickGuard(this.doc, {
3448
+ takesLateMouse: event.pointerType === 'touch'
3449
+ });
3450
+ if (event.pointerType === 'touch') {
3451
+ // Noted as a claimed lift is: capped, and gone after its time.
3452
+ this.noteClaimedLift(event);
3453
+ }
3454
+ }
3455
+
3382
3456
  /** The app lost focus: UIKit cancels every touch in flight. */
3383
3457
  cancelEverything(time) {
3458
+ // The browser may keep a pen or a pointer-read finger down: its lift must
3459
+ // not click. A mouse button held through the blur keeps its click.
3460
+ for (const [pointerId, kind] of this.pointerKinds) {
3461
+ if (kind !== 'mouse') {
3462
+ this.cancelledPointers.set(pointerId, kind);
3463
+ }
3464
+ }
3384
3465
  const ids = [...this.pointerIds.values()];
3385
3466
  for (const id of ids) {
3386
3467
  this.unlockSelection(id, true);
@@ -3394,6 +3475,7 @@ export class GestureHost {
3394
3475
  }
3395
3476
  }
3396
3477
  this.pointerIds.clear();
3478
+ this.pointerKinds.clear();
3397
3479
  this.retargeted.clear();
3398
3480
  this.fingerPointers.clear();
3399
3481
  this.pendingPointers.clear();