@astryxdesign/core 0.7.9-canary.048476f → 0.7.9-canary.0a64fdb

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 (72) hide show
  1. package/dist/AppShell/observeMainOverflow.d.ts.map +1 -1
  2. package/dist/AppShell/observeMainOverflow.js +9 -6
  3. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  4. package/dist/CheckboxInput/CheckboxInput.js +54 -11
  5. package/dist/InputGroup/InputGroup.d.ts +4 -3
  6. package/dist/InputGroup/InputGroup.d.ts.map +1 -1
  7. package/dist/InputGroup/InputGroup.js +2 -2
  8. package/dist/InputGroup/groupStyles.d.ts +1 -1
  9. package/dist/InputGroup/groupStyles.d.ts.map +1 -1
  10. package/dist/InputGroup/groupStyles.js +1 -1
  11. package/dist/Layout/LayoutContent.d.ts +3 -1
  12. package/dist/Layout/LayoutContent.d.ts.map +1 -1
  13. package/dist/Layout/LayoutContent.js +12 -4
  14. package/dist/Layout/LayoutPanel.d.ts +4 -1
  15. package/dist/Layout/LayoutPanel.d.ts.map +1 -1
  16. package/dist/Layout/LayoutPanel.js +13 -4
  17. package/dist/MobileNav/MobileNav.d.ts.map +1 -1
  18. package/dist/MobileNav/MobileNav.js +5 -0
  19. package/dist/RadioList/RadioListItem.d.ts.map +1 -1
  20. package/dist/RadioList/RadioListItem.js +18 -3
  21. package/dist/Stack/StackItem.d.ts +8 -4
  22. package/dist/Stack/StackItem.d.ts.map +1 -1
  23. package/dist/Stack/StackItem.js +17 -4
  24. package/dist/astryx.css +5 -1
  25. package/dist/gestures/PanGestureRecognizer.d.ts +11 -1
  26. package/dist/gestures/PanGestureRecognizer.d.ts.map +1 -1
  27. package/dist/gestures/PanGestureRecognizer.js +15 -1
  28. package/dist/gestures/ScreenEdgePanGestureRecognizer.d.ts +6 -1
  29. package/dist/gestures/ScreenEdgePanGestureRecognizer.d.ts.map +1 -1
  30. package/dist/hooks/StackItemScrollRegion.d.ts +31 -0
  31. package/dist/hooks/StackItemScrollRegion.d.ts.map +1 -0
  32. package/dist/hooks/StackItemScrollRegion.js +40 -0
  33. package/dist/hooks/useScrollRegionProps.d.ts +35 -0
  34. package/dist/hooks/useScrollRegionProps.d.ts.map +1 -0
  35. package/dist/hooks/useScrollRegionProps.js +51 -0
  36. package/dist/i18n/generated-english/hooks/useScrollRegionProps.generated.d.ts +8 -0
  37. package/dist/i18n/generated-english/hooks/useScrollRegionProps.generated.d.ts.map +1 -0
  38. package/dist/i18n/generated-english/hooks/useScrollRegionProps.generated.js +12 -0
  39. package/dist/i18n/generated-locales/en.generated.d.ts.map +1 -1
  40. package/dist/i18n/generated-locales/en.generated.js +1 -0
  41. package/dist/i18n/generated-locales/pseudo.generated.d.ts.map +1 -1
  42. package/dist/i18n/generated-locales/pseudo.generated.js +1 -0
  43. package/dist/utils/touchHitArea.stylex.d.ts +35 -0
  44. package/dist/utils/touchHitArea.stylex.d.ts.map +1 -0
  45. package/dist/utils/touchHitArea.stylex.js +32 -0
  46. package/locales/en.json +4 -0
  47. package/locales/pseudo.json +3 -0
  48. package/package.json +4 -4
  49. package/src/AppShell/observeMainOverflow.ts +9 -6
  50. package/src/CheckboxInput/CheckboxInput.doc.mjs +3 -2
  51. package/src/CheckboxInput/CheckboxInput.tsx +71 -9
  52. package/src/InputGroup/InputGroup.doc.mjs +4 -3
  53. package/src/InputGroup/InputGroup.tsx +4 -3
  54. package/src/InputGroup/groupStyles.ts +3 -1
  55. package/src/Layout/LayoutContent.doc.mjs +6 -3
  56. package/src/Layout/LayoutContent.tsx +10 -4
  57. package/src/Layout/LayoutPanel.doc.mjs +6 -3
  58. package/src/Layout/LayoutPanel.tsx +11 -4
  59. package/src/MobileNav/MobileNav.tsx +5 -0
  60. package/src/RadioList/RadioListItem.doc.mjs +3 -2
  61. package/src/RadioList/RadioListItem.tsx +21 -2
  62. package/src/Stack/Stack.doc.mjs +1 -1
  63. package/src/Stack/StackItem.tsx +27 -13
  64. package/src/gestures/PanGestureRecognizer.ts +19 -2
  65. package/src/gestures/README.md +2 -1
  66. package/src/gestures/ScreenEdgePanGestureRecognizer.ts +6 -1
  67. package/src/hooks/StackItemScrollRegion.tsx +57 -0
  68. package/src/hooks/useScrollRegionProps.ts +76 -0
  69. package/src/i18n/generated-english/hooks/useScrollRegionProps.generated.ts +13 -0
  70. package/src/i18n/generated-locales/en.generated.ts +1 -0
  71. package/src/i18n/generated-locales/pseudo.generated.ts +1 -0
  72. package/src/utils/touchHitArea.stylex.ts +41 -0
@@ -1 +1 @@
1
- {"version":3,"file":"observeMainOverflow.d.ts","sourceRoot":"","sources":["../../src/AppShell/observeMainOverflow.ts"],"names":[],"mappings":"AAyCA;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,WAAW,EACjB,QAAQ,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,GACrC,MAAM,IAAI,CA2FZ"}
1
+ {"version":3,"file":"observeMainOverflow.d.ts","sourceRoot":"","sources":["../../src/AppShell/observeMainOverflow.ts"],"names":[],"mappings":"AA4CA;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,WAAW,EACjB,QAAQ,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,GACrC,MAAM,IAAI,CA2FZ"}
@@ -4,20 +4,23 @@
4
4
 
5
5
  /**
6
6
  * @file observeMainOverflow.ts
7
- * @input AppShell's main region under `height="fill"`: its own scroll
8
- * container, holding its content as direct children with no wrapper
7
+ * @input A scroll container that holds its content as direct children with
8
+ * no wrapper: AppShell's main region under `height="fill"`, or a scrolling
9
+ * LayoutContent, LayoutPanel or StackItem
9
10
  * @output observeMainOverflow(main, onChange): reports whether main's content
10
11
  * overflows it on either axis, once at the start and on every change, and
11
12
  * returns the function that stops observing
12
- * @position Internal to AppShell and never exported. AppShell makes main a
13
+ * @position Internal and never exported. AppShell makes main a
13
14
  * keyboard stop only while it overflows (`spec:AST-025` FR12,
14
- * `component:AppShell` FR4 and PR1). Main has no inner content box, so its
15
- * content grows inside it without resizing it: its direct children's sizes
16
- * are watched instead.
15
+ * `component:AppShell` FR4 and PR1). useScrollRegionProps names a
16
+ * scrolling region only while it overflows. Main has no inner content
17
+ * box, so its content grows inside it without resizing it: its direct
18
+ * children's sizes are watched instead.
17
19
  *
18
20
  * SYNC: When modified, update:
19
21
  * - /packages/core/src/AppShell/AppShell.tsx
20
22
  * - /packages/core/src/AppShell/observeMainOverflow.test.ts
23
+ * - /packages/core/src/hooks/useScrollRegionProps.ts
21
24
  */
22
25
  import { getLogicalAxisMapping, measureLogicalScrollAxis } from "../hooks/scrollGeometry.js";
23
26
  import { observeMutations } from "../utils/sharedMutationObserver.js";
@@ -1 +1 @@
1
- {"version":3,"file":"CheckboxInput.d.ts","sourceRoot":"","sources":["../../src/CheckboxInput/CheckboxInput.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"CheckboxInput.d.ts","sourceRoot":"","sources":["../../src/CheckboxInput/CheckboxInput.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAML,KAAK,WAAW,EAChB,KAAK,UAAU,EAGf,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,MAAM,MAAM,kBAAkB,CAAC;AAS3C,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,gBAAgB,CAAC;AAG9C,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,SAAS,CAAC;AACtC,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,gBAAgB,CAAC;AA2JhD,QAAA,MAAM,iBAAiB;;;;;;;;;EASrB,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,MAAM,OAAO,iBAAiB,CAAC;AAE/D,MAAM,WAAW,kBAAmB,SAAQ,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC;IACrE,wDAAwD;IACxD,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAClC;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;OAEG;IACH,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,WAAW,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;IACxE;;OAEG;IACH,YAAY,CAAC,EAAE,CACb,OAAO,EAAE,OAAO,EAChB,CAAC,EAAE,WAAW,CAAC,gBAAgB,CAAC,KAC7B,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;OAEG;IACH,KAAK,EAAE,OAAO,GAAG,eAAe,CAAC;IACjC;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;;;;;;;;;;;;;;;OAmBG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;OAIG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB;;;;;OAKG;IACH,IAAI,CAAC,EAAE,iBAAiB,CAAC;IACzB;;OAEG;IACH,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;IACpD;;OAEG;IACH,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;IACnD;;OAEG;IACH,SAAS,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC;IACjC;;;OAGG;IACH,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAOD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,aAAa,CAAC,EAC5B,EAAE,EAAE,MAAM,EACV,KAAK,EACL,aAAqB,EACrB,WAAW,EACX,QAAQ,EACR,YAAY,EACZ,SAAiB,EACjB,KAAK,EACL,UAAkB,EAClB,QAAQ,EACR,eAAe,EACf,UAAkB,EAClB,UAAkB,EAClB,UAAkB,EAClB,IAAW,EACX,OAAO,EACP,MAAM,EACN,SAAS,EACT,MAAM,EACN,KAAK,EACL,MAAM,EACN,SAAS,EACT,KAAK,EACL,GAAG,EACH,kBAAkB,EAAE,mBAAmB,EACvC,GAAG,IAAI,EACR,EAAE,kBAAkB,+BAkRpB;yBA7Se,aAAa"}
@@ -36,6 +36,8 @@ import { usePressFeedback } from "../hooks/usePressFeedback.js";
36
36
  import { useIndicator } from "../Indicator/useIndicator.js";
37
37
  import { themeProps } from "../utils/themeProps.js";
38
38
  import { useMergedRefs } from "../hooks/useMergedRefs.js";
39
+ import { watchHitArea, writeHitInsets } from "../utils/hitArea.js";
40
+ import { touchHitAreaStyles } from "../utils/touchHitArea.stylex.js";
39
41
  import { registerEnglishFallback, useComponentTranslator } from "../i18n/useComponentTranslator.js";
40
42
  import english from "../i18n/generated-english/CheckboxInput/CheckboxInput.generated.js";
41
43
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
@@ -62,6 +64,10 @@ const styles = {
62
64
  kOIVth: "xxhr3t",
63
65
  $$css: true
64
66
  },
67
+ hitAreaHost: {
68
+ kVAEAm: "xrxqdxo",
69
+ $$css: true
70
+ },
65
71
  indicatorPressImage: {
66
72
  "--_indicator-press-image": "x1dueop1 x189o2zt",
67
73
  $$css: true
@@ -210,6 +216,49 @@ export function CheckboxInput({
210
216
  const {
211
217
  focusProps
212
218
  } = useIndicatorFocusRing(indicatorRef);
219
+
220
+ // Under a coarse pointer a labelled checkbox's row grows toward 44 px
221
+ // through an invisible band, and nothing changes size. A label-hidden
222
+ // checkbox is a marker in another component's row, which keeps its target.
223
+ const hasHitArea = !isLabelHidden && !isDisabled && !isReadOnly;
224
+ const inputRef = useRef(null);
225
+ // The watch lives as long as the row is attached: the ref's cleanup stops
226
+ // it, and a replaced row starts its own.
227
+ const watchRowHitArea = useCallback(row => {
228
+ if (row == null || !hasHitArea) {
229
+ return;
230
+ }
231
+ return watchHitArea(row, insets => writeHitInsets(row, insets));
232
+ }, [hasHitArea]);
233
+ // The disabled-message tooltip listens for hover and focus on the whole
234
+ // row, a larger trigger. It anchors on the checkbox itself (below), so it
235
+ // shows next to the control. Its handlers check isEnabled, so the row
236
+ // always attaches them.
237
+ const rowRef = useMergedRefs(disabledMessageTooltip.interactionRef, watchRowHitArea);
238
+ // Where a press on the row itself began. A browser can move a tap's click
239
+ // onto the row's edge, so the band is judged from the press.
240
+ const pressPointRef = useRef(null);
241
+ const handleRowPointerDown = event => {
242
+ pressPointRef.current = event.target === event.currentTarget ? {
243
+ x: event.clientX,
244
+ y: event.clientY
245
+ } : null;
246
+ };
247
+ // A press that began on the band, outside the row's box, toggles the
248
+ // checkbox, as a tap on the box does. A click from code has no press count
249
+ // (`detail` is 0), so it never toggles from here.
250
+ const handleRowClick = event => {
251
+ const press = pressPointRef.current;
252
+ pressPointRef.current = null;
253
+ if (press == null || event.detail === 0 || event.target !== event.currentTarget) {
254
+ return;
255
+ }
256
+ const box = event.currentTarget.getBoundingClientRect();
257
+ const isOnBand = press.x < box.left || press.x > box.right || press.y < box.top || press.y > box.bottom;
258
+ if (isOnBand) {
259
+ inputRef.current?.click();
260
+ }
261
+ };
213
262
  const isIndeterminate = optimisticValue === 'indeterminate';
214
263
  const isChecked = optimisticValue === true;
215
264
 
@@ -249,17 +298,11 @@ export function CheckboxInput({
249
298
  size
250
299
  }), stylex.props(width != null && dynamicWidthStyles.width(width), xstyle), className, style),
251
300
  children: [/*#__PURE__*/_jsxs("div", {
252
- ref: el => {
253
- // Interaction (hover/focus) listeners for the disabled-message
254
- // tooltip attach to the whole row for a larger trigger target;
255
- // positioning anchors on the checkbox itself (below) so the tooltip
256
- // appears next to the control, not the far edge of the row.
257
- // Handlers are gated internally by isEnabled, so attaching
258
- // unconditionally is safe.
259
- disabledMessageTooltip.interactionRef(el);
260
- },
301
+ ref: rowRef,
302
+ onPointerDown: hasHitArea ? handleRowPointerDown : undefined,
303
+ onClick: hasHitArea ? handleRowClick : undefined,
261
304
  ...(isDisabled ? undefined : pressable),
262
- ...stylex.props(styles.container, isLabelHidden && styles.containerLabelHidden,
305
+ ...stylex.props(styles.container, isLabelHidden && styles.containerLabelHidden, hasHitArea && styles.hitAreaHost, hasHitArea && touchHitAreaStyles.layer,
263
306
  // Hover and focus reach the checkbox visual through this ancestor
264
307
  // marker rather than props, so the whole row drives it.
265
308
  !isDisabled && indicatorScope, !isDisabled && styles.indicatorPressImage,
@@ -272,7 +315,7 @@ export function CheckboxInput({
272
315
  ...focusProps,
273
316
  children: [/*#__PURE__*/_jsx("input", {
274
317
  ...rest,
275
- ref: useMergedRefs(ref, indeterminateRef, disabledMessageTooltip.positionRef),
318
+ ref: useMergedRefs(ref, indeterminateRef, disabledMessageTooltip.positionRef, inputRef),
276
319
  id: id,
277
320
  type: "checkbox"
278
321
  // Withhold the name while disabled: the input stays focusable (not
@@ -59,7 +59,8 @@ export interface InputGroupProps extends Omit<BaseProps<HTMLDivElement>, 'childr
59
59
  */
60
60
  size?: InputGroupSize;
61
61
  /**
62
- * Status indicator applied to the group border.
62
+ * Validation status. Its message shows below the group. The group border
63
+ * does not change; a theme can style the row from `data-status`.
63
64
  */
64
65
  status?: InputStatus;
65
66
  /**
@@ -72,8 +73,8 @@ export interface InputGroupProps extends Omit<BaseProps<HTMLDivElement>, 'childr
72
73
  'data-testid'?: string;
73
74
  }
74
75
  /**
75
- * Groups an input with prefix/suffix addons in a visually connected
76
- * container with shared border and focus ring.
76
+ * Groups an input with prefix and suffix addons in one connected row. A
77
+ * focused member stays above its neighbours, so its focus ring shows in full.
77
78
  *
78
79
  * @example
79
80
  * ```
@@ -1 +1 @@
1
- {"version":3,"file":"InputGroup.d.ts","sourceRoot":"","sources":["../../src/InputGroup/InputGroup.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAsB,KAAK,SAAS,EAAC,MAAM,OAAO,CAAC;AAG1D,OAAO,EAAQ,KAAK,WAAW,EAAC,MAAM,UAAU,CAAC;AAGjD,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAK5C,MAAM,MAAM,cAAc,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AA0BhD,MAAM,WAAW,eAAgB,SAAQ,IAAI,CAC3C,SAAS,CAAC,cAAc,CAAC,EACzB,UAAU,CACX;IACC,mDAAmD;IACnD,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAEhC;;OAEG;IACH,QAAQ,EAAE,SAAS,CAAC;IAEpB;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;;OAGG;IACH,IAAI,CAAC,EAAE,cAAc,CAAC;IAEtB;;OAEG;IACH,MAAM,CAAC,EAAE,WAAW,CAAC;IAErB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,UAAU,CAAC,EACzB,QAAQ,EACR,KAAK,EACL,aAAqB,EACrB,WAAW,EACX,UAAU,EAAE,cAAsB,EAClC,UAAkB,EAClB,UAAkB,EAClB,IAAI,EAAE,QAAQ,EACd,MAAM,EACN,YAAY,EACZ,MAAM,EACN,SAAS,EACT,KAAK,EACL,GAAG,EACH,aAAa,EAAE,MAAM,EACrB,GAAG,IAAI,EACR,EAAE,eAAe,+BA8EjB;yBA/Fe,UAAU"}
1
+ {"version":3,"file":"InputGroup.d.ts","sourceRoot":"","sources":["../../src/InputGroup/InputGroup.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAsB,KAAK,SAAS,EAAC,MAAM,OAAO,CAAC;AAG1D,OAAO,EAAQ,KAAK,WAAW,EAAC,MAAM,UAAU,CAAC;AAGjD,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAK5C,MAAM,MAAM,cAAc,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AA0BhD,MAAM,WAAW,eAAgB,SAAQ,IAAI,CAC3C,SAAS,CAAC,cAAc,CAAC,EACzB,UAAU,CACX;IACC,mDAAmD;IACnD,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAEhC;;OAEG;IACH,QAAQ,EAAE,SAAS,CAAC;IAEpB;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;;OAGG;IACH,IAAI,CAAC,EAAE,cAAc,CAAC;IAEtB;;;OAGG;IACH,MAAM,CAAC,EAAE,WAAW,CAAC;IAErB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,UAAU,CAAC,EACzB,QAAQ,EACR,KAAK,EACL,aAAqB,EACrB,WAAW,EACX,UAAU,EAAE,cAAsB,EAClC,UAAkB,EAClB,UAAkB,EAClB,IAAI,EAAE,QAAQ,EACd,MAAM,EACN,YAAY,EACZ,MAAM,EACN,SAAS,EACT,KAAK,EACL,GAAG,EACH,aAAa,EAAE,MAAM,EACrB,GAAG,IAAI,EACR,EAAE,eAAe,+BA8EjB;yBA/Fe,UAAU"}
@@ -57,8 +57,8 @@ const sizeStyles = {
57
57
  }
58
58
  };
59
59
  /**
60
- * Groups an input with prefix/suffix addons in a visually connected
61
- * container with shared border and focus ring.
60
+ * Groups an input with prefix and suffix addons in one connected row. A
61
+ * focused member stays above its neighbours, so its focus ring shows in full.
62
62
  *
63
63
  * @example
64
64
  * ```
@@ -33,7 +33,7 @@ export declare const groupStyles: Readonly<{
33
33
  readonly borderStartEndRadius: stylex.StyleXClassNameFor<"borderStartEndRadius", 0 | "8px">;
34
34
  readonly borderEndEndRadius: stylex.StyleXClassNameFor<"borderEndEndRadius", 0 | "8px">;
35
35
  readonly ':focus-within': stylex.StyleXClassNameFor<":focus-within", {
36
- readonly zIndex: 1;
36
+ readonly zIndex: 2;
37
37
  }>;
38
38
  }>;
39
39
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"groupStyles.d.ts","sourceRoot":"","sources":["../../src/InputGroup/groupStyles.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AAEH,OAAO,KAAK,MAAM,MAAM,kBAAkB,CAAC;AAG3C;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB;;CAEtB,CAAC;AA0BX,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;EAwDtB,CAAC"}
1
+ {"version":3,"file":"groupStyles.d.ts","sourceRoot":"","sources":["../../src/InputGroup/groupStyles.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AAEH,OAAO,KAAK,MAAM,MAAM,kBAAkB,CAAC;AAG3C;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB;;CAEtB,CAAC;AA0BX,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;EA0DtB,CAAC"}
@@ -62,7 +62,7 @@ export const groupStyles = {
62
62
  kVL7Gh: "xbiv7yw x1xrp5p4",
63
63
  kfmiAY: "x1ga7v0g x1ursdma",
64
64
  kT0f0o: "x16uus16 x1qa286i",
65
- kXnDq0: "x1rm9qnc",
65
+ kXnDq0: "x1pc0aet",
66
66
  $$css: true
67
67
  }
68
68
  };
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * @file LayoutContent.tsx
3
- * @input Uses React StyleX, LayoutSlotsContext
3
+ * @input Uses React StyleX, LayoutSlotsContext, useScrollRegionProps
4
4
  * @output Exports LayoutContent component and LayoutContentProps
5
5
  * @position Scrollable main content area for Layout. Wraps the primary body content
6
6
  * with automatic scroll containment and context-aware padding.
@@ -35,6 +35,8 @@ export interface LayoutContentProps extends BaseProps<HTMLDivElement> {
35
35
  /**
36
36
  * Accessible label for the landmark.
37
37
  * Required when role is set and multiple landmarks of the same type exist.
38
+ * While the content scrolls, it also names the scrolling region, which
39
+ * otherwise takes a translated "Content".
38
40
  */
39
41
  label?: string;
40
42
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"LayoutContent.d.ts","sourceRoot":"","sources":["../../src/Layout/LayoutContent.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAC,QAAQ,EAAE,SAAS,EAAC,MAAM,OAAO,CAAC;AAC/C,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAM5C,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,gBAAgB,CAAC;AAqFhD,MAAM,WAAW,kBAAmB,SAAQ,SAAS,CAAC,cAAc,CAAC;IACnE,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAChC;;OAEG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;IAErB;;;;OAIG;IACH,OAAO,CAAC,EAAE,WAAW,CAAC;IAEtB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;OAGG;IACH,IAAI,CAAC,EAAE,QAAQ,CAAC;CACjB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,aAAa,CAAC,EAC5B,QAAQ,EACR,YAAmB,EACnB,OAAO,EACP,KAAK,EACL,IAAI,EACJ,MAAM,EACN,SAAS,EACT,KAAK,EACL,GAAG,EACH,GAAG,KAAK,EACT,EAAE,kBAAkB,+BAkDpB;yBA7De,aAAa"}
1
+ {"version":3,"file":"LayoutContent.d.ts","sourceRoot":"","sources":["../../src/Layout/LayoutContent.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAC,QAAQ,EAAE,SAAS,EAAC,MAAM,OAAO,CAAC;AAC/C,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAQ5C,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,gBAAgB,CAAC;AAqFhD,MAAM,WAAW,kBAAmB,SAAQ,SAAS,CAAC,cAAc,CAAC;IACnE,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAChC;;OAEG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;IAErB;;;;OAIG;IACH,OAAO,CAAC,EAAE,WAAW,CAAC;IAEtB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB;;;;;OAKG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;OAGG;IACH,IAAI,CAAC,EAAE,QAAQ,CAAC;CACjB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,aAAa,CAAC,EAC5B,QAAQ,EACR,YAAmB,EACnB,OAAO,EACP,KAAK,EACL,IAAI,EACJ,MAAM,EACN,SAAS,EACT,KAAK,EACL,GAAG,EACH,GAAG,KAAK,EACT,EAAE,kBAAkB,+BAoDpB;yBA/De,aAAa"}
@@ -4,7 +4,7 @@
4
4
 
5
5
  /**
6
6
  * @file LayoutContent.tsx
7
- * @input Uses React StyleX, LayoutSlotsContext
7
+ * @input Uses React StyleX, LayoutSlotsContext, useScrollRegionProps
8
8
  * @output Exports LayoutContent component and LayoutContentProps
9
9
  * @position Scrollable main content area for Layout. Wraps the primary body content
10
10
  * with automatic scroll containment and context-aware padding.
@@ -19,6 +19,8 @@ import * as stylex from '@stylexjs/stylex';
19
19
  import "../theme/tokens.stylex.js";
20
20
  import { spacingVars } from "../theme/tokens.stylex.js";
21
21
  import { LayoutSlotsContext } from "./LayoutSlotsContext.js";
22
+ import { useMergedRefs } from "../hooks/useMergedRefs.js";
23
+ import { useScrollRegionProps } from "../hooks/useScrollRegionProps.js";
22
24
  import { mergeProps } from "../utils/mergeProps.js";
23
25
  import { themeProps } from "../utils/themeProps.js";
24
26
  import { paddingStyles, containerPaddingInlineVarStyles, containerPaddingBlockStartVarStyles, containerPaddingBlockEndVarStyles } from "./padding.stylex.js";
@@ -146,10 +148,16 @@ export function LayoutContent({
146
148
  hasEnd
147
149
  } = use(LayoutSlotsContext);
148
150
  const isZeroPadding = padding === 0;
151
+ const region = useScrollRegionProps({
152
+ isScrollable,
153
+ role,
154
+ label
155
+ });
156
+ const mergedRef = useMergedRefs(ref, region.ref);
149
157
  return /*#__PURE__*/_jsx("div", {
150
- ref: ref,
151
- role: role,
152
- "aria-label": label,
158
+ ref: mergedRef,
159
+ role: region.role,
160
+ "aria-label": region['aria-label'],
153
161
  ...mergeProps(themeProps('layout-content'), stylex.props(styles.content,
154
162
  // Outer padding on container edges (unless content is full bleed)
155
163
  !hasStart && !isZeroPadding && padding == null && styles.noStart, !hasEnd && !isZeroPadding && padding == null && styles.noEnd, !hasHeader && !isZeroPadding && padding == null && styles.noHeader, !hasFooter && !isZeroPadding && padding == null && styles.noFooter, isScrollable && styles.scrollable, isZeroPadding && styles.fullBleed, padding != null && paddingStyles[padding], padding != null && containerPaddingInlineVarStyles[padding], padding != null && containerPaddingBlockStartVarStyles[padding], padding != null && containerPaddingBlockEndVarStyles[padding], !hasStart && !hasEnd && !isZeroPadding && styles.constrainedNoPanelsStart, !hasStart && !hasEnd && !isZeroPadding && styles.constrainedNoPanelsEnd, hasStart && !hasEnd && !isZeroPadding && styles.constrainedSingleStartPanel, !hasStart && hasEnd && !isZeroPadding && styles.constrainedSingleEndPanel, xstyle), className, style),
@@ -1,6 +1,7 @@
1
1
  /**
2
2
  * @file LayoutPanel.tsx
3
- * @input Uses React StyleX, LayoutAreaContext, LayoutSlotsContext
3
+ * @input Uses React StyleX, LayoutAreaContext, LayoutSlotsContext,
4
+ * useScrollRegionProps
4
5
  * @output Exports LayoutPanel component and LayoutPanelProps
5
6
  * @position Sidebar panel for Layout start/end slots. Use for navigation panels,
6
7
  * settings sidebars, detail panels, or any fixed-width side content.
@@ -47,6 +48,8 @@ export interface LayoutPanelProps extends BaseProps<HTMLDivElement> {
47
48
  /**
48
49
  * Accessible label for the landmark.
49
50
  * Required when role is set and multiple landmarks of the same type exist.
51
+ * While the panel scrolls, it also names the scrolling region, which
52
+ * otherwise takes a translated "Content".
50
53
  */
51
54
  label?: string;
52
55
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"LayoutPanel.d.ts","sourceRoot":"","sources":["../../src/Layout/LayoutPanel.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAC,QAAQ,EAAE,SAAS,EAAC,MAAM,OAAO,CAAC;AAC/C,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAO5C,OAAO,KAAK,EAAC,SAAS,EAAE,WAAW,EAAC,MAAM,gBAAgB,CAAC;AAC3D,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,2BAA2B,CAAC;AAmF9D,MAAM,WAAW,gBAAiB,SAAQ,SAAS,CAAC,cAAc,CAAC;IACjE,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAChC;;OAEG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;IAErB;;;;;;;;;OASG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;;;OAIG;IACH,OAAO,CAAC,EAAE,WAAW,CAAC;IAEtB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;OAGG;IACH,IAAI,CAAC,EAAE,QAAQ,CAAC;IAEhB;;;;OAIG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC;IAElB;;;;;;;;;;;;;OAaG;IACH,SAAS,CAAC,EAAE,cAAc,CAAC;CAC5B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,WAAW,CAAC,EAC1B,QAAQ,EACR,UAAkB,EAClB,YAAmB,EACnB,KAAK,EACL,OAAO,EACP,IAAI,EACJ,KAAK,EACL,SAAS,EACT,MAAM,EACN,SAAS,EACT,KAAK,EACL,GAAG,EACH,GAAG,KAAK,EACT,EAAE,gBAAgB,+BAkElB;yBAhFe,WAAW"}
1
+ {"version":3,"file":"LayoutPanel.d.ts","sourceRoot":"","sources":["../../src/Layout/LayoutPanel.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAC,QAAQ,EAAE,SAAS,EAAC,MAAM,OAAO,CAAC;AAC/C,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAS5C,OAAO,KAAK,EAAC,SAAS,EAAE,WAAW,EAAC,MAAM,gBAAgB,CAAC;AAC3D,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,2BAA2B,CAAC;AAmF9D,MAAM,WAAW,gBAAiB,SAAQ,SAAS,CAAC,cAAc,CAAC;IACjE,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAChC;;OAEG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;IAErB;;;;;;;;;OASG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;;;OAIG;IACH,OAAO,CAAC,EAAE,WAAW,CAAC;IAEtB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB;;;;;OAKG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;OAGG;IACH,IAAI,CAAC,EAAE,QAAQ,CAAC;IAEhB;;;;OAIG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC;IAElB;;;;;;;;;;;;;OAaG;IACH,SAAS,CAAC,EAAE,cAAc,CAAC;CAC5B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,WAAW,CAAC,EAC1B,QAAQ,EACR,UAAkB,EAClB,YAAmB,EACnB,KAAK,EACL,OAAO,EACP,IAAI,EACJ,KAAK,EACL,SAAS,EACT,MAAM,EACN,SAAS,EACT,KAAK,EACL,GAAG,EACH,GAAG,KAAK,EACT,EAAE,gBAAgB,+BAoElB;yBAlFe,WAAW"}
@@ -4,7 +4,8 @@
4
4
 
5
5
  /**
6
6
  * @file LayoutPanel.tsx
7
- * @input Uses React StyleX, LayoutAreaContext, LayoutSlotsContext
7
+ * @input Uses React StyleX, LayoutAreaContext, LayoutSlotsContext,
8
+ * useScrollRegionProps
8
9
  * @output Exports LayoutPanel component and LayoutPanelProps
9
10
  * @position Sidebar panel for Layout start/end slots. Use for navigation panels,
10
11
  * settings sidebars, detail panels, or any fixed-width side content.
@@ -20,6 +21,8 @@ import "../theme/tokens.stylex.js";
20
21
  import { colorVars, spacingVars } from "../theme/tokens.stylex.js";
21
22
  import { LayoutAreaContext } from "./LayoutAreaContext.js";
22
23
  import { LayoutSlotsContext } from "./LayoutSlotsContext.js";
24
+ import { useMergedRefs } from "../hooks/useMergedRefs.js";
25
+ import { useScrollRegionProps } from "../hooks/useScrollRegionProps.js";
23
26
  import { mergeProps } from "../utils/index.js";
24
27
  import { themeProps } from "../utils/themeProps.js";
25
28
  import { paddingStyles, containerPaddingInlineVarStyles, containerPaddingBlockStartVarStyles, containerPaddingBlockEndVarStyles } from "./padding.stylex.js";
@@ -160,6 +163,12 @@ export function LayoutPanel({
160
163
 
161
164
  // When no divider, collapse spacing for seamless visual flow
162
165
  const shouldCollapseSpacing = !hasDivider && !isZeroPadding && padding == null;
166
+ const region = useScrollRegionProps({
167
+ isScrollable,
168
+ role,
169
+ label
170
+ });
171
+ const mergedRef = useMergedRefs(ref, region.ref);
163
172
 
164
173
  // Select divider style based on position
165
174
  const dividerStyle = isStartPanel ? styles.dividerEnd : isEndPanel ? styles.dividerStart : null;
@@ -167,9 +176,9 @@ export function LayoutPanel({
167
176
  // Select collapse style based on position (collapse the side where divider would be)
168
177
  const collapseStyle = isStartPanel ? styles.collapseEnd : isEndPanel ? styles.collapseStart : null;
169
178
  return /*#__PURE__*/_jsx("div", {
170
- ref: ref,
171
- role: role,
172
- "aria-label": label,
179
+ ref: mergedRef,
180
+ role: region.role,
181
+ "aria-label": region['aria-label'],
173
182
  ...mergeProps(themeProps('layout-panel'), stylex.props(styles.panel, dynamicStyles.sizing(effectiveWidth ?? null),
174
183
  // Outer padding on container edges (unless component is full bleed)
175
184
  isStartPanel && !isZeroPadding && padding == null && styles.startPanel, isEndPanel && !isZeroPadding && padding == null && styles.endPanel, !hasHeader && !isZeroPadding && padding == null && styles.noHeader, !hasFooter && !isZeroPadding && padding == null && styles.noFooter, isScrollable && styles.scrollable, isZeroPadding && styles.fullBleed, padding != null && paddingStyles[padding], padding != null && containerPaddingInlineVarStyles[padding], padding != null && containerPaddingBlockStartVarStyles[padding], padding != null && containerPaddingBlockEndVarStyles[padding], hasDivider && dividerStyle, shouldCollapseSpacing && collapseStyle, xstyle), className, style),
@@ -1 +1 @@
1
- {"version":3,"file":"MobileNav.d.ts","sourceRoot":"","sources":["../../src/MobileNav/MobileNav.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAEH,OAAO,EAOL,KAAK,SAAS,EAEf,MAAM,OAAO,CAAC;AAuBf,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAyM5C;;;;;;;GAOG;AACH,eAAO,MAAM,kBAAkB,MAAM,CAAC;AACtC;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,MAAM,CAAC;AAI/B;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAkBpE;AA+DD,MAAM,WAAW,cAAe,SAAQ,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC;IAC9D,wCAAwC;IACxC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IACnC;;;;OAIG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IAEzC;;OAEG;IACH,QAAQ,EAAE,SAAS,CAAC;IAEpB;;;;OAIG;IACH,MAAM,CAAC,EAAE,SAAS,CAAC;IAEnB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;;;;;;OAQG;IACH,IAAI,CAAC,EAAE,OAAO,GAAG,KAAK,GAAG,MAAM,CAAC;IAEhC;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,SAAS,CAAC,EACxB,MAAM,EAAE,UAAU,EAClB,YAAY,EAAE,gBAAgB,EAC9B,QAAQ,EACR,MAAM,EACN,KAAW,EACX,IAAa,EACb,KAAK,EACL,aAAa,EAAE,MAAM,EACrB,MAAM,EACN,SAAS,EACT,KAAK,EACL,OAAO,EAAE,WAAW,EACpB,GAAG,EACH,GAAG,IAAI,EACR,EAAE,cAAc,+BA4RhB;yBA3Se,SAAS"}
1
+ {"version":3,"file":"MobileNav.d.ts","sourceRoot":"","sources":["../../src/MobileNav/MobileNav.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAEH,OAAO,EAOL,KAAK,SAAS,EAEf,MAAM,OAAO,CAAC;AAuBf,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AA0M5C;;;;;;;GAOG;AACH,eAAO,MAAM,kBAAkB,MAAM,CAAC;AACtC;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,MAAM,CAAC;AAI/B;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAkBpE;AA+DD,MAAM,WAAW,cAAe,SAAQ,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC;IAC9D,wCAAwC;IACxC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IACnC;;;;OAIG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IAEzC;;OAEG;IACH,QAAQ,EAAE,SAAS,CAAC;IAEpB;;;;OAIG;IACH,MAAM,CAAC,EAAE,SAAS,CAAC;IAEnB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;;;;;;OAQG;IACH,IAAI,CAAC,EAAE,OAAO,GAAG,KAAK,GAAG,MAAM,CAAC;IAEhC;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,SAAS,CAAC,EACxB,MAAM,EAAE,UAAU,EAClB,YAAY,EAAE,gBAAgB,EAC9B,QAAQ,EACR,MAAM,EACN,KAAW,EACX,IAAa,EACb,KAAK,EACL,aAAa,EAAE,MAAM,EACrB,MAAM,EACN,SAAS,EACT,KAAK,EACL,OAAO,EAAE,WAAW,EACpB,GAAG,EACH,GAAG,IAAI,EACR,EAAE,cAAc,+BAgShB;yBA/Se,SAAS"}
@@ -63,6 +63,7 @@ import { useLayerDismissal } from "../Layer/useLayerDismissal.js";
63
63
  import { themeProps } from "../utils/themeProps.js";
64
64
  import { useMergedRefs } from "../hooks/useMergedRefs.js";
65
65
  import { useScrollLock } from "../hooks/useScrollLock.js";
66
+ import { useFocusRegionContainment } from "../hooks/useFocusTrap.js";
66
67
  import { registerEnglishFallback, useComponentTranslator } from "../i18n/useComponentTranslator.js";
67
68
  import english from "../i18n/generated-english/MobileNav/MobileNav.generated.js";
68
69
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
@@ -328,6 +329,10 @@ export function MobileNav({
328
329
  }
329
330
  }), [onOpenChangeProp, appShellMobile]);
330
331
  const dialogRef = useRef(null);
332
+ // Native showModal() lets Tab leave for the browser's own UI, so the shared
333
+ // module wraps it. A closing drawer stops containing as soon as it starts to
334
+ // slide out.
335
+ useFocusRegionContainment(dialogRef, isOpen);
331
336
  const drawerRef = useRef(null);
332
337
  const closeTimeoutRef = useRef(null);
333
338
  // The input hold on the drawer's layer while it slides in under a coarse
@@ -1 +1 @@
1
- {"version":3,"file":"RadioListItem.d.ts","sourceRoot":"","sources":["../../src/RadioList/RadioListItem.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,EAAqB,KAAK,SAAS,EAAC,MAAM,OAAO,CAAC;AAGhE,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAY5C,OAAO,EAAO,KAAK,SAAS,EAAC,MAAM,cAAc,CAAC;AAsIlD,MAAM,WAAW,kBAAmB,SAAQ,SAAS,CAAC,cAAc,CAAC;IACnE,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAChC;;;;;OAKG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB;;;;;;;;;;OAUG;IACH,KAAK,EAAE,SAAS,CAAC;IACjB;;;;;;;;;;;;;;OAcG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;;;;OAKG;IACH,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;OAEG;IACH,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB;;OAEG;IACH,UAAU,CAAC,EAAE,SAAS,CAAC;CACxB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,aAAa,CAAC,EAC5B,GAAG,EACH,KAAK,EACL,YAAY,EAAE,SAAS,EACvB,KAAK,EACL,WAAW,EACX,UAAU,EAAE,cAAsB,EAClC,YAAY,EACZ,UAAU,EACV,KAAK,EACL,MAAM,EACN,SAAS,EACT,KAAK,EACL,OAAO,EACP,GAAG,IAAI,EACR,EAAE,kBAAkB,qBAuLpB;yBAtMe,aAAa"}
1
+ {"version":3,"file":"RadioListItem.d.ts","sourceRoot":"","sources":["../../src/RadioList/RadioListItem.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,EAAkC,KAAK,SAAS,EAAC,MAAM,OAAO,CAAC;AAG7E,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAe5C,OAAO,EAAO,KAAK,SAAS,EAAC,MAAM,cAAc,CAAC;AAsIlD,MAAM,WAAW,kBAAmB,SAAQ,SAAS,CAAC,cAAc,CAAC;IACnE,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAChC;;;;;OAKG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB;;;;;;;;;;OAUG;IACH,KAAK,EAAE,SAAS,CAAC;IACjB;;;;;;;;;;;;;;OAcG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;;;;OAKG;IACH,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;OAEG;IACH,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB;;OAEG;IACH,UAAU,CAAC,EAAE,SAAS,CAAC;CACxB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,aAAa,CAAC,EAC5B,GAAG,EACH,KAAK,EACL,YAAY,EAAE,SAAS,EACvB,KAAK,EACL,WAAW,EACX,UAAU,EAAE,cAAsB,EAClC,YAAY,EACZ,UAAU,EACV,KAAK,EACL,MAAM,EACN,SAAS,EACT,KAAK,EACL,OAAO,EACP,GAAG,IAAI,EACR,EAAE,kBAAkB,qBAuMpB;yBAtNe,aAAa"}
@@ -17,7 +17,7 @@
17
17
  * - /apps/storybook/stories/RadioList.stories.tsx
18
18
  * - /packages/cli/assets/templates/blocks/components/RadioList/ (showcase blocks)
19
19
  */
20
- import React, { use, useId, useRef } from 'react';
20
+ import React, { use, useCallback, useId, useRef } from 'react';
21
21
  import * as stylex from '@stylexjs/stylex';
22
22
  import { RadioListContext } from "./RadioList.js";
23
23
  import { RadioListReasonContext } from "./RadioListReasonContext.js";
@@ -31,6 +31,9 @@ import "../Indicator/indicator.markers.stylex.js";
31
31
  import { indicatorScope } from "../Indicator/indicator.markers.stylex.js";
32
32
  import { useIndicatorFocusRing } from "../hooks/useIndicatorFocusRing.js";
33
33
  import { usePressFeedback } from "../hooks/usePressFeedback.js";
34
+ import { useMergedRefs } from "../hooks/useMergedRefs.js";
35
+ import { watchHitArea, writeHitInsets } from "../utils/hitArea.js";
36
+ import { touchHitAreaStyles } from "../utils/touchHitArea.stylex.js";
34
37
  import { useIndicator } from "../Indicator/useIndicator.js";
35
38
  import { Item } from "../Item/Item.js";
36
39
  import { themeProps } from "../utils/themeProps.js";
@@ -186,6 +189,18 @@ export function RadioListItem({
186
189
  // since the visible label is now a plain (non-`<label>`) text node — a real
187
190
  // `<label htmlFor>` would double-fire under delegation.
188
191
  const radioRef = useRef(null);
192
+
193
+ // Under a coarse pointer an option's row grows toward 44 px through an
194
+ // invisible band, and the row keeps its size. A tap on the band lands on
195
+ // the row, which hands it to the radio. The watch lives as long as the row
196
+ // is attached: the ref's cleanup stops it.
197
+ const watchRowHitArea = useCallback(row => {
198
+ if (row == null || isDisabled) {
199
+ return;
200
+ }
201
+ return watchHitArea(row, insets => writeHitInsets(row, insets));
202
+ }, [isDisabled]);
203
+ const mergedRowRef = useMergedRefs(ref, watchRowHitArea);
189
204
  const radioCircle = /*#__PURE__*/_jsxs("div", {
190
205
  ...stylex.props(styles.radioWrapper, wrapperSizeStyles[size], !isDisabled && styles.indicatorPressOverlay),
191
206
  ...focusProps,
@@ -251,7 +266,7 @@ export function RadioListItem({
251
266
  children: [radioCircle, startContent]
252
267
  }) : radioCircle;
253
268
  return /*#__PURE__*/_jsx(Item, {
254
- ref: ref,
269
+ ref: mergedRowRef,
255
270
  ...(isDisabled ? undefined : pressable),
256
271
  startContent: mediaContent
257
272
  // Delegate row-surface clicks (label text, description, and the empty
@@ -283,7 +298,7 @@ export function RadioListItem({
283
298
  // interactive hover/press background. Applied after Item's own base
284
299
  // styles so it wins within the base layer; a `radio-list-item` theme
285
300
  // still overrides it from the higher `astryx-theme` layer.
286
- rowStyles.root, !isDisabled && rowStyles.press, xstyle],
301
+ rowStyles.root, !isDisabled && rowStyles.press, !isDisabled && touchHitAreaStyles.layer, xstyle],
287
302
  ...mergeProps(
288
303
  // One target for every row, carrying its size and runtime state so a
289
304
  // theme can express "selected option at large" or restyle disabled
@@ -1,8 +1,10 @@
1
1
  /**
2
2
  * @file StackItem.tsx
3
- * @input Uses React, ElementType, stackItem utility
3
+ * @input Uses React, ElementType, stackItem utility, StackItemScrollRegion
4
4
  * @output Exports StackItem polymorphic component and StackItemProps
5
- * @position Layout/Stack component; uses stackItem.stylex.ts
5
+ * @position Layout/Stack component; uses stackItem.stylex.ts. A scrollable
6
+ * `div` or `span` item renders through StackItemScrollRegion, which names
7
+ * it while it scrolls.
6
8
  *
7
9
  * SYNC: When modified, update these files to stay in sync:
8
10
  * - /packages/core/src/Stack/Stack.doc.mjs
@@ -34,7 +36,9 @@ export interface StackItemProps extends BaseProps<HTMLElement> {
34
36
  * reset, so `<StackItem size="fill" isScrollable>` is a complete scroll
35
37
  * region — it grows to fill the stack and scrolls its own overflow with
36
38
  * no extra style plumbing. Matches `isScrollable` on `LayoutContent`
37
- * and `LayoutPanel`.
39
+ * and `LayoutPanel`. While its content overflows, a `div` or `span` item
40
+ * is a group named by the caller's `aria-label`, or by a translated
41
+ * "Content". Another element keeps its own role.
38
42
  * @default false
39
43
  */
40
44
  isScrollable?: boolean;
@@ -62,7 +66,7 @@ export interface StackItemProps extends BaseProps<HTMLElement> {
62
66
  * </HStack>
63
67
  * ```
64
68
  */
65
- export declare function StackItem({ crossAlignSelf, size, isScrollable, as: element, xstyle, className, style, children, ref, ...props }: StackItemProps): import("react").ReactElement<any, string | import("react").JSXElementConstructor<any>>;
69
+ export declare function StackItem({ crossAlignSelf, size, isScrollable, as: element, xstyle, className, style, children, ref, ...props }: StackItemProps): import("react").ReactElement<any, string | import("react").JSXElementConstructor<any>> | import("react").FunctionComponentElement<import("../hooks/StackItemScrollRegion.js").StackItemScrollRegionProps>;
66
70
  export declare namespace StackItem {
67
71
  var displayName: string;
68
72
  }
@@ -1 +1 @@
1
- {"version":3,"file":"StackItem.d.ts","sourceRoot":"","sources":["../../src/Stack/StackItem.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AAEH,OAAO,EAAgB,KAAK,WAAW,EAAE,KAAK,SAAS,EAAW,MAAM,OAAO,CAAC;AAChF,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAE5C,OAAO,EAEL,KAAK,uBAAuB,EAC5B,KAAK,aAAa,EACnB,MAAM,oBAAoB,CAAC;AAU5B,MAAM,WAAW,cAAe,SAAQ,SAAS,CAAC,WAAW,CAAC;IAC5D,wCAAwC;IACxC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC7B;;;OAGG;IACH,cAAc,CAAC,EAAE,uBAAuB,CAAC;IAEzC;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,aAAa,CAAC;IAErB;;;;;;;;;OASG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB;;;OAGG;IACH,EAAE,CAAC,EAAE,WAAW,CAAC;IAEjB;;OAEG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,SAAS,CAAC,EACxB,cAAc,EACd,IAAI,EACJ,YAAY,EACZ,EAAE,EAAE,OAAe,EACnB,MAAM,EACN,SAAS,EACT,KAAK,EACL,QAAQ,EACR,GAAG,EACH,GAAG,KAAK,EACT,EAAE,cAAc,0FAqBhB;yBAhCe,SAAS"}
1
+ {"version":3,"file":"StackItem.d.ts","sourceRoot":"","sources":["../../src/Stack/StackItem.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAgB,KAAK,WAAW,EAAE,KAAK,SAAS,EAAW,MAAM,OAAO,CAAC;AAChF,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAE5C,OAAO,EAEL,KAAK,uBAAuB,EAC5B,KAAK,aAAa,EACnB,MAAM,oBAAoB,CAAC;AAW5B,MAAM,WAAW,cAAe,SAAQ,SAAS,CAAC,WAAW,CAAC;IAC5D,wCAAwC;IACxC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC7B;;;OAGG;IACH,cAAc,CAAC,EAAE,uBAAuB,CAAC;IAEzC;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,aAAa,CAAC;IAErB;;;;;;;;;;;OAWG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB;;;OAGG;IACH,EAAE,CAAC,EAAE,WAAW,CAAC;IAEjB;;OAEG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,SAAS,CAAC,EACxB,cAAc,EACd,IAAI,EACJ,YAAY,EACZ,EAAE,EAAE,OAAe,EACnB,MAAM,EACN,SAAS,EACT,KAAK,EACL,QAAQ,EACR,GAAG,EACH,GAAG,KAAK,EACT,EAAE,cAAc,0MA8BhB;yBAzCe,SAAS"}
@@ -2,9 +2,11 @@
2
2
 
3
3
  /**
4
4
  * @file StackItem.tsx
5
- * @input Uses React, ElementType, stackItem utility
5
+ * @input Uses React, ElementType, stackItem utility, StackItemScrollRegion
6
6
  * @output Exports StackItem polymorphic component and StackItemProps
7
- * @position Layout/Stack component; uses stackItem.stylex.ts
7
+ * @position Layout/Stack component; uses stackItem.stylex.ts. A scrollable
8
+ * `div` or `span` item renders through StackItemScrollRegion, which names
9
+ * it while it scrolls.
8
10
  *
9
11
  * SYNC: When modified, update these files to stay in sync:
10
12
  * - /packages/core/src/Stack/Stack.doc.mjs
@@ -16,6 +18,7 @@ import * as stylex from '@stylexjs/stylex';
16
18
  import { stackItem } from "./stackItem.stylex.js";
17
19
  import { mergeProps } from "../utils/mergeProps.js";
18
20
  import { themeProps } from "../utils/themeProps.js";
21
+ import { StackItemScrollRegion } from "../hooks/StackItemScrollRegion.js";
19
22
  const overflowStyles = {
20
23
  scrollable: {
21
24
  kVQacm: "xysyzu8",
@@ -52,12 +55,22 @@ export function StackItem({
52
55
  crossAlignSelf,
53
56
  size
54
57
  }), isScrollable && overflowStyles.scrollable, xstyle);
55
- return /*#__PURE__*/createElement(element, {
56
- ref: ref,
58
+ const elementProps = {
57
59
  ...mergeProps(themeProps('stack-item', {
58
60
  size
59
61
  }), stylexProps, className, style),
60
62
  ...props
63
+ };
64
+ if (isScrollable && (element === 'div' || element === 'span')) {
65
+ return /*#__PURE__*/createElement(StackItemScrollRegion, {
66
+ as: element,
67
+ ref,
68
+ elementProps
69
+ }, children);
70
+ }
71
+ return /*#__PURE__*/createElement(element, {
72
+ ref: ref,
73
+ ...elementProps
61
74
  }, children);
62
75
  }
63
76
  StackItem.displayName = 'StackItem';
package/dist/astryx.css CHANGED
@@ -1633,7 +1633,7 @@
1633
1633
  .xttggg:is([dir="rtl"] *):not(#\#):not(#\#):not(#\#){transform:translateX(100%)}
1634
1634
  .x1nyx83j:is([dir="rtl"] *):not(#\#):not(#\#):not(#\#){transform:translateX(50%)}
1635
1635
  .x9cjr8z:popover-open:not(#\#):not(#\#):not(#\#){transform:translateY(0)}
1636
- .x1rm9qnc:focus-within:not(#\#):not(#\#):not(#\#){z-index:1}
1636
+ .x1pc0aet:focus-within:not(#\#):not(#\#):not(#\#){z-index:2}
1637
1637
  .xf5goe6.xf5goe6:where(.astryx-input-group > [data-astryx-input-group-item]):focus-visible:not(#\#):not(#\#):not(#\#){z-index:2}
1638
1638
  .x151j4nw:has(input[aria-disabled="true"]:focus-visible):not(#\#):not(#\#):not(#\#){box-shadow:inset 0 0 0 2px var(--color-accent-muted)}
1639
1639
  .xwmge8v:has(> [aria-disabled="true"]:focus-visible):not(#\#):not(#\#):not(#\#){box-shadow:inset 0 0 0 2px var(--color-accent-muted)}
@@ -2322,6 +2322,7 @@
2322
2322
  @media (prefers-reduced-motion: reduce) and (not (pointer: coarse)) and (not (pointer: coarse)){.xxsp3er.xxsp3er[data-astryx-press="fading"]:not(#\#):not(#\#):not(#\#):not(#\#):not(#\#){animation-name:none}}
2323
2323
  @media (forced-colors: active){.x1pjcgc3.x1pjcgc3[data-astryx-press="fading"]:not(#\#):not(#\#):not(#\#):not(#\#):not(#\#){background-color:Highlight}}
2324
2324
  @media (forced-colors: active){.x1r4mieh.x1r4mieh[data-astryx-press="on"]:not(#\#):not(#\#):not(#\#):not(#\#):not(#\#){background-color:Highlight}}
2325
+ @media (pointer: coarse){.x16x82qr.x16x82qr:not(#\#):not(#\#):not(#\#):not(#\#):not(#\#)::after{inset:calc(var(--astryx-hit-inset-top,0px) * -1) calc(var(--astryx-hit-inset-right,0px) * -1) calc(var(--astryx-hit-inset-bottom,0px) * -1) calc(var(--astryx-hit-inset-left,0px) * -1)}}
2325
2326
  @starting-style{@media (prefers-reduced-motion: reduce) and (pointer: coarse){.xgo67oj.xgo67oj.xgo67oj:not(#\#):not(#\#):not(#\#):not(#\#):not(#\#){opacity:0}}}
2326
2327
  @starting-style{@media (prefers-reduced-motion: reduce){.xspp5ug.xspp5ug.xspp5ug:not(#\#):not(#\#):not(#\#):not(#\#):not(#\#){transform:translateY(0)}}}
2327
2328
  @media (pointer: coarse){.x10ogxw0.x10ogxw0.x10ogxw0:where(:not(:disabled,[aria-disabled="true"]))[data-astryx-press="on"]:not(#\#):not(#\#):not(#\#):not(#\#):not(#\#){background-image:none}}
@@ -2493,7 +2494,10 @@
2493
2494
  .x1c108yo:is([dir="rtl"] *):not(#\#):not(#\#):not(#\#):not(#\#):not(#\#):not(#\#):not(#\#)::after{transform:translateX(-100%)}
2494
2495
  .x12ayhd5:is([dir="rtl"] *):not(#\#):not(#\#):not(#\#):not(#\#):not(#\#):not(#\#):not(#\#)::after{transform:translateX(100%)}
2495
2496
  @media (forced-colors: none){.x1my3e5g.x1my3e5g:not(#\#):not(#\#):not(#\#):not(#\#):not(#\#):not(#\#):not(#\#)::before{background-color:var(--color-overlay-pressed)}}
2497
+ @media (pointer: coarse){.x1c440c0.x1c440c0:not(#\#):not(#\#):not(#\#):not(#\#):not(#\#):not(#\#):not(#\#)::after{clip-path:polygon(evenodd,0 0,100% 0,100% 100%,0 100%,0 0,var(--astryx-hit-inset-left,0px) var(--astryx-hit-inset-top,0px),calc(100% - var(--astryx-hit-inset-right,0px)) var(--astryx-hit-inset-top,0px),calc(100% - var(--astryx-hit-inset-right,0px)) calc(100% - var(--astryx-hit-inset-bottom,0px)),var(--astryx-hit-inset-left,0px) calc(100% - var(--astryx-hit-inset-bottom,0px)),var(--astryx-hit-inset-left,0px) var(--astryx-hit-inset-top,0px))}}
2498
+ @media (pointer: coarse){.x1fjtqre.x1fjtqre:not(#\#):not(#\#):not(#\#):not(#\#):not(#\#):not(#\#):not(#\#)::after{content:""}}
2496
2499
  @media (pointer: coarse){.x1ep27e9.x1ep27e9:not(#\#):not(#\#):not(#\#):not(#\#):not(#\#):not(#\#):not(#\#)::after{display:block}}
2500
+ @media (pointer: coarse){.x7b72wb.x7b72wb:not(#\#):not(#\#):not(#\#):not(#\#):not(#\#):not(#\#):not(#\#)::after{position:absolute}}
2497
2501
  @media (prefers-reduced-motion: reduce){.xhhm9v0.xhhm9v0:not(#\#):not(#\#):not(#\#):not(#\#):not(#\#):not(#\#):not(#\#)::before{transition-delay:0s}}
2498
2502
  @media (prefers-reduced-motion: reduce){.x1viac0w.x1viac0w:not(#\#):not(#\#):not(#\#):not(#\#):not(#\#):not(#\#):not(#\#)::backdrop{transition-duration:.01s}}
2499
2503
  @media (prefers-reduced-motion: reduce){.x13sdc92.x13sdc92:not(#\#):not(#\#):not(#\#):not(#\#):not(#\#):not(#\#):not(#\#)::before{transition-duration:0s}}
@@ -6,7 +6,12 @@ export interface PanGestureRecognizerOptions extends GestureRecognizerOptions<Pa
6
6
  minimumNumberOfTouches?: number;
7
7
  /** @default Infinity */
8
8
  maximumNumberOfTouches?: number;
9
- hysteresis?: number;
9
+ /**
10
+ * The travel that begins the pan, px. A function gives each press its own
11
+ * threshold: it reads the press's first touch when that touch lands.
12
+ * @default UIKit's 10
13
+ */
14
+ hysteresis?: number | ((touch: GestureTouch) => number);
10
15
  /** Movement that may begin the pan; anything else fails it. @default 'any' */
11
16
  direction?: PanDirection;
12
17
  /**
@@ -51,6 +56,11 @@ export declare class PanGestureRecognizer extends GestureRecognizer {
51
56
  /** The movement the begin threshold took (excluded from `translation()`). */
52
57
  travelAtBegan: Point;
53
58
  private readonly tracker;
59
+ /**
60
+ * Read once per press. A finger that lands later keeps the press's
61
+ * threshold.
62
+ */
63
+ private readonly hysteresisFor;
54
64
  /** The lift's event time once the pan ended: its release (AST-100 FR2). */
55
65
  private releaseTime;
56
66
  /** The centroid where the gesture started, in client px. */
@@ -1 +1 @@
1
- {"version":3,"file":"PanGestureRecognizer.d.ts","sourceRoot":"","sources":["../../src/gestures/PanGestureRecognizer.ts"],"names":[],"mappings":"AAuCA,OAAO,EAEL,iBAAiB,EAEjB,KAAK,wBAAwB,EAC7B,KAAK,mBAAmB,EACzB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAC,mBAAmB,EAAE,YAAY,EAAE,KAAK,EAAC,MAAM,SAAS,CAAC;AAGtE,MAAM,MAAM,YAAY,GACtB,KAAK,GAAG,YAAY,GAAG,UAAU,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,MAAM,CAAC;AAEvE,MAAM,WAAW,2BAA4B,SAAQ,wBAAwB,CAAC,oBAAoB,CAAC;IACjG,iBAAiB;IACjB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,wBAAwB;IACxB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,8EAA8E;IAC9E,SAAS,CAAC,EAAE,YAAY,CAAC;IACzB;;;;;;;;OAQG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;;;OAMG;IACH,kBAAkB,CAAC,EAAE,aAAa,CAAC,YAAY,CAAC,CAAC;IACjD,4EAA4E;IAC5E,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAWD,qBAAa,oBAAqB,SAAQ,iBAAiB;IACzD,IAAa,IAAI,IAAI,iBAAiB,CAAC,MAAM,CAAC,CAE7C;IAED,2FAA2F;IAC3F,SAAS,KAAK,MAAM,IAAI,KAAK,CAE5B;IAED,sBAAsB,EAAE,MAAM,CAAC;IAC/B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,YAAY,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;IACpB,yDAAyD;IACzD,UAAU,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAQ;IACpC,6EAA6E;IAC7E,aAAa,EAAE,KAAK,CAAQ;IAE5B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkB;IAC1C,2EAA2E;IAC3E,OAAO,CAAC,WAAW,CAAiC;IACpD,4DAA4D;IAC5D,OAAO,CAAC,MAAM,CAAe;IAC7B,6EAA6E;IAC7E,OAAO,CAAC,MAAM,CAAe;IAC7B,qEAAqE;IACrE,OAAO,CAAC,GAAG,CAAe;IAC1B,OAAO,CAAC,MAAM,CAAe;gBAEjB,OAAO,GAAE,2BAAgC;IAarD;;;OAGG;IACH,WAAW,IAAI,KAAK;IAOpB;;;;;OAKG;IACH,YAAY,CAAC,SAAS,EAAE,YAAY,GAAG,IAAI;IAI3C,kFAAkF;IAClF,cAAc,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAIlC,wEAAwE;IACxE,gBAAgB,IAAI,KAAK;IAIzB;;;;OAIG;IACH,QAAQ,IAAI,KAAK;IAIjB;;;;OAIG;IACH,cAAc,IAAI,KAAK;IAQvB;;;;;;;OAOG;IACH,IAAa,mBAAmB,IAAI,mBAAmB,CAkBtD;cAEkB,YAAY,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO;cAW1C,YAAY,CAC7B,OAAO,EAAE,aAAa,CAAC,YAAY,CAAC,EACpC,KAAK,EAAE,mBAAmB,GACzB,IAAI;cAmBY,YAAY,CAC7B,QAAQ,EAAE,aAAa,CAAC,YAAY,CAAC,EACrC,KAAK,EAAE,mBAAmB,GACzB,IAAI;cASY,YAAY,CAC7B,OAAO,EAAE,aAAa,CAAC,YAAY,CAAC,EACpC,KAAK,EAAE,mBAAmB,GACzB,IAAI;cAoBY,KAAK,IAAI,IAAI;IAWhC;;;;OAIG;IACH,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM;IAoBjE,OAAO,CAAC,QAAQ;IAsChB;;;;;;;OAOG;IACH,OAAO,CAAC,aAAa;IAUrB;;;;;;;OAOG;cACgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAsBvD,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,KAAK;IAWb,kEAAkE;IAClE,OAAO,CAAC,MAAM;IAad,OAAO,CAAC,MAAM;CASf"}
1
+ {"version":3,"file":"PanGestureRecognizer.d.ts","sourceRoot":"","sources":["../../src/gestures/PanGestureRecognizer.ts"],"names":[],"mappings":"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"}