@hjmds/react-native 1.8.0 → 1.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -0
- package/dist/agreement.d.ts.map +1 -1
- package/dist/agreement.js +13 -3
- package/dist/agreement.js.map +1 -1
- package/dist/carousel-motion.d.ts +16 -0
- package/dist/carousel-motion.d.ts.map +1 -0
- package/dist/carousel-motion.js +57 -0
- package/dist/carousel-motion.js.map +1 -0
- package/dist/celebration.d.ts +8 -0
- package/dist/celebration.d.ts.map +1 -0
- package/dist/celebration.js +64 -0
- package/dist/celebration.js.map +1 -0
- package/dist/content-transition.d.ts +12 -0
- package/dist/content-transition.d.ts.map +1 -0
- package/dist/content-transition.js +34 -0
- package/dist/content-transition.js.map +1 -0
- package/dist/date-picker.d.ts +8 -1
- package/dist/date-picker.d.ts.map +1 -1
- package/dist/date-picker.js +2 -2
- package/dist/date-picker.js.map +1 -1
- package/dist/evidence.d.ts +1 -1
- package/dist/evidence.js +1 -1
- package/dist/forms.d.ts.map +1 -1
- package/dist/forms.js +40 -4
- package/dist/forms.js.map +1 -1
- package/dist/image-viewer.d.ts.map +1 -1
- package/dist/image-viewer.js +4 -2
- package/dist/image-viewer.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/inputs.d.ts.map +1 -1
- package/dist/inputs.js +11 -3
- package/dist/inputs.js.map +1 -1
- package/dist/internal/state.d.ts +19 -0
- package/dist/internal/state.d.ts.map +1 -1
- package/dist/internal/state.js +15 -0
- package/dist/internal/state.js.map +1 -1
- package/dist/number-field.d.ts.map +1 -1
- package/dist/number-field.js +6 -1
- package/dist/number-field.js.map +1 -1
- package/dist/overlays.d.ts +1 -1
- package/dist/overlays.d.ts.map +1 -1
- package/dist/overlays.js +11 -2
- package/dist/overlays.js.map +1 -1
- package/dist/provider.d.ts +19 -1
- package/dist/provider.d.ts.map +1 -1
- package/dist/provider.js +10 -2
- package/dist/provider.js.map +1 -1
- package/dist/screen-transition.d.ts +14 -0
- package/dist/screen-transition.d.ts.map +1 -0
- package/dist/screen-transition.js +42 -0
- package/dist/screen-transition.js.map +1 -0
- package/dist/sheet-gesture.d.ts +11 -3
- package/dist/sheet-gesture.d.ts.map +1 -1
- package/dist/sheet-gesture.js +59 -11
- package/dist/sheet-gesture.js.map +1 -1
- package/dist/slider.d.ts.map +1 -1
- package/dist/slider.js +58 -11
- package/dist/slider.js.map +1 -1
- package/dist/sortable.d.ts +15 -0
- package/dist/sortable.d.ts.map +1 -0
- package/dist/sortable.js +64 -0
- package/dist/sortable.js.map +1 -0
- package/dist/swipe-actions.d.ts +17 -0
- package/dist/swipe-actions.d.ts.map +1 -0
- package/dist/swipe-actions.js +58 -0
- package/dist/swipe-actions.js.map +1 -0
- package/dist/tags-input.d.ts.map +1 -1
- package/dist/tags-input.js +5 -1
- package/dist/tags-input.js.map +1 -1
- package/dist/toast-liquid.d.ts.map +1 -1
- package/dist/toast-liquid.js +17 -2
- package/dist/toast-liquid.js.map +1 -1
- package/dist/transfer-list.d.ts.map +1 -1
- package/dist/transfer-list.js +3 -2
- package/dist/transfer-list.js.map +1 -1
- package/dist/upload-item.d.ts.map +1 -1
- package/dist/upload-item.js +5 -3
- package/dist/upload-item.js.map +1 -1
- package/docs/liquid-toast.md +11 -6
- package/docs/patches/react-native-screen-transitions.patch +87 -0
- package/package.json +70 -4
package/dist/provider.d.ts
CHANGED
|
@@ -43,10 +43,28 @@ type HjmNativeProviderValueProps = Readonly<{
|
|
|
43
43
|
minimumVisualTarget?: never;
|
|
44
44
|
brandPalette?: never;
|
|
45
45
|
}>;
|
|
46
|
+
/** Window insets in points, usually `useSafeAreaInsets()` from react-native-safe-area-context. */
|
|
47
|
+
export type HjmNativeSafeAreaInsets = Readonly<{
|
|
48
|
+
top?: number;
|
|
49
|
+
right?: number;
|
|
50
|
+
bottom?: number;
|
|
51
|
+
left?: number;
|
|
52
|
+
}>;
|
|
46
53
|
export type HjmNativeProviderProps = Readonly<{
|
|
47
54
|
children: ReactNode;
|
|
55
|
+
/**
|
|
56
|
+
* Window safe-area insets that full-screen overlays (Sheet, DatePicker, Select,
|
|
57
|
+
* Combobox) apply when the call site passes none. Added after the 2026-09-30
|
|
58
|
+
* audit found sheet content under the iOS home indicator and the Android
|
|
59
|
+
* navigation bar because every call site had to remember the prop. The core
|
|
60
|
+
* entry cannot import the optional safe-area peer, so the host measures once
|
|
61
|
+
* here; nested providers inherit the nearest supplied value.
|
|
62
|
+
*/
|
|
63
|
+
safeAreaInsets?: HjmNativeSafeAreaInsets;
|
|
48
64
|
}> & (HjmNativeProviderEnvironmentProps | HjmNativeProviderValueProps);
|
|
49
|
-
export declare function HjmNativeProvider({ children, theme, direction, textScale, reducedMotion, minimumVisualTarget, brandPalette: suppliedBrandPalette, value: suppliedValue, }: HjmNativeProviderProps): import("react").JSX.Element;
|
|
65
|
+
export declare function HjmNativeProvider({ children, theme, direction, textScale, reducedMotion, minimumVisualTarget, brandPalette: suppliedBrandPalette, value: suppliedValue, safeAreaInsets: suppliedInsets, }: HjmNativeProviderProps): import("react").JSX.Element;
|
|
50
66
|
export declare function useHjmNativeTheme(): HjmNativeTheme;
|
|
67
|
+
/** Insets supplied to the nearest HjmNativeProvider; `{}` when the host supplied none. */
|
|
68
|
+
export declare function useHjmNativeSafeAreaInsets(): HjmNativeSafeAreaInsets;
|
|
51
69
|
export {};
|
|
52
70
|
//# sourceMappingURL=provider.d.ts.map
|
package/dist/provider.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,qBAAqB,EAE1B,KAAK,yBAAyB,EAC9B,KAAK,qBAAqB,EAC1B,KAAK,qCAAqC,EAC3C,MAAM,2DAA2D,CAAC;AACnE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAC;AAClF,OAAO,EAOL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AASf,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE9D,MAAM,MAAM,cAAc,GAAG,yBAAyB,GACpD,QAAQ,CAAC;IACP,MAAM,EAAE,yBAAyB,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC;IACtD;;;;OAIG;IACH,WAAW,EAAE,iBAAiB,CAAC;IAC/B,MAAM,EAAE,QAAQ,CAAC;QACf,OAAO,EAAE,OAAO,OAAO,CAAC;QACxB,MAAM,EAAE,OAAO,MAAM,CAAC;QACtB,UAAU,EAAE,OAAO,UAAU,CAAC;KAC/B,CAAC,CAAC;CACJ,CAAC,CAAC;AAEL,0FAA0F;AAC1F,MAAM,MAAM,qBAAqB,GAAG,WAAW,CAAC,qCAAqC,CAAC,cAAc,CAAC,CAAC,CAAC;AAEvG,KAAK,iCAAiC,GAAG,QAAQ,CAAC;IAChD,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,SAAS,CAAC,EAAE,qBAAqB,CAAC;IAClC,SAAS,CAAC,EAAE,qBAAqB,CAAC;IAClC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B;;;;OAIG;IACH,YAAY,CAAC,EAAE,qBAAqB,CAAC;CACtC,CAAC,CAAC;AAEH,KAAK,2BAA2B,GAAG,QAAQ,CAAC;IAC1C,wFAAwF;IACxF,KAAK,EAAE,yBAAyB,CAAC;IACjC,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,SAAS,CAAC,EAAE,KAAK,CAAC;IAClB,SAAS,CAAC,EAAE,KAAK,CAAC;IAClB,aAAa,CAAC,EAAE,KAAK,CAAC;IACtB,mBAAmB,CAAC,EAAE,KAAK,CAAC;IAC5B,YAAY,CAAC,EAAE,KAAK,CAAC;CACtB,CAAC,CAAC;AAEH,MAAM,MAAM,sBAAsB,GAAG,QAAQ,CAAC;IAC5C,QAAQ,EAAE,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,qBAAqB,EAE1B,KAAK,yBAAyB,EAC9B,KAAK,qBAAqB,EAC1B,KAAK,qCAAqC,EAC3C,MAAM,2DAA2D,CAAC;AACnE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAC;AAClF,OAAO,EAOL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AASf,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE9D,MAAM,MAAM,cAAc,GAAG,yBAAyB,GACpD,QAAQ,CAAC;IACP,MAAM,EAAE,yBAAyB,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC;IACtD;;;;OAIG;IACH,WAAW,EAAE,iBAAiB,CAAC;IAC/B,MAAM,EAAE,QAAQ,CAAC;QACf,OAAO,EAAE,OAAO,OAAO,CAAC;QACxB,MAAM,EAAE,OAAO,MAAM,CAAC;QACtB,UAAU,EAAE,OAAO,UAAU,CAAC;KAC/B,CAAC,CAAC;CACJ,CAAC,CAAC;AAEL,0FAA0F;AAC1F,MAAM,MAAM,qBAAqB,GAAG,WAAW,CAAC,qCAAqC,CAAC,cAAc,CAAC,CAAC,CAAC;AAEvG,KAAK,iCAAiC,GAAG,QAAQ,CAAC;IAChD,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,SAAS,CAAC,EAAE,qBAAqB,CAAC;IAClC,SAAS,CAAC,EAAE,qBAAqB,CAAC;IAClC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B;;;;OAIG;IACH,YAAY,CAAC,EAAE,qBAAqB,CAAC;CACtC,CAAC,CAAC;AAEH,KAAK,2BAA2B,GAAG,QAAQ,CAAC;IAC1C,wFAAwF;IACxF,KAAK,EAAE,yBAAyB,CAAC;IACjC,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,SAAS,CAAC,EAAE,KAAK,CAAC;IAClB,SAAS,CAAC,EAAE,KAAK,CAAC;IAClB,aAAa,CAAC,EAAE,KAAK,CAAC;IACtB,mBAAmB,CAAC,EAAE,KAAK,CAAC;IAC5B,YAAY,CAAC,EAAE,KAAK,CAAC;CACtB,CAAC,CAAC;AAEH,kGAAkG;AAClG,MAAM,MAAM,uBAAuB,GAAG,QAAQ,CAAC;IAC7C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC,CAAC;AAEH,MAAM,MAAM,sBAAsB,GAAG,QAAQ,CAAC;IAC5C,QAAQ,EAAE,SAAS,CAAC;IACpB;;;;;;;OAOG;IACH,cAAc,CAAC,EAAE,uBAAuB,CAAC;CAC1C,CAAC,GAAG,CAAC,iCAAiC,GAAG,2BAA2B,CAAC,CAAC;AAwDvE,wBAAgB,iBAAiB,CAAC,EAChC,QAAQ,EACR,KAAK,EACL,SAAS,EACT,SAAS,EACT,aAAa,EACb,mBAAmB,EACnB,YAAY,EAAE,oBAAoB,EAClC,KAAK,EAAE,aAAa,EACpB,cAAc,EAAE,cAAc,GAC/B,EAAE,sBAAsB,+BA+DxB;AAED,wBAAgB,iBAAiB,IAAI,cAAc,CAMlD;AAED,0FAA0F;AAC1F,wBAAgB,0BAA0B,IAAI,uBAAuB,CAEpE"}
|
package/dist/provider.js
CHANGED
|
@@ -9,6 +9,8 @@ const HjmNativeThemeContext = createContext(null);
|
|
|
9
9
|
* brand; the resolved palette cannot be split back into defaults and overrides.
|
|
10
10
|
*/
|
|
11
11
|
const HjmNativeBrandPaletteContext = createContext(undefined);
|
|
12
|
+
const noInsets = {};
|
|
13
|
+
const HjmNativeSafeAreaContext = createContext(noInsets);
|
|
12
14
|
const subscribeHydration = () => () => undefined;
|
|
13
15
|
const clientSnapshot = () => true;
|
|
14
16
|
const serverSnapshot = () => false;
|
|
@@ -44,8 +46,10 @@ function toEnvironmentInput(props) {
|
|
|
44
46
|
: { minimumVisualTarget: props.minimumVisualTarget }),
|
|
45
47
|
};
|
|
46
48
|
}
|
|
47
|
-
export function HjmNativeProvider({ children, theme, direction, textScale, reducedMotion, minimumVisualTarget, brandPalette: suppliedBrandPalette, value: suppliedValue, }) {
|
|
49
|
+
export function HjmNativeProvider({ children, theme, direction, textScale, reducedMotion, minimumVisualTarget, brandPalette: suppliedBrandPalette, value: suppliedValue, safeAreaInsets: suppliedInsets, }) {
|
|
48
50
|
const parent = useContext(HjmNativeThemeContext);
|
|
51
|
+
const inheritedInsets = useContext(HjmNativeSafeAreaContext);
|
|
52
|
+
const safeAreaInsets = suppliedInsets ?? inheritedInsets;
|
|
49
53
|
const inheritedBrandPalette = useContext(HjmNativeBrandPaletteContext);
|
|
50
54
|
const brandPalette = suppliedValue === undefined ? suppliedBrandPalette ?? inheritedBrandPalette : undefined;
|
|
51
55
|
const colorScheme = useColorScheme();
|
|
@@ -87,7 +91,7 @@ export function HjmNativeProvider({ children, theme, direction, textScale, reduc
|
|
|
87
91
|
tokens: { spacing, radius, typography },
|
|
88
92
|
};
|
|
89
93
|
}, [brandPalette, environment, parent, suppliedValue, systemReducedMotion, systemTextScale, systemTheme]);
|
|
90
|
-
return (_jsx(HjmNativeThemeContext.Provider, { value: contextValue, children: _jsx(HjmNativeBrandPaletteContext.Provider, { value: brandPalette, children: children }) }));
|
|
94
|
+
return (_jsx(HjmNativeThemeContext.Provider, { value: contextValue, children: _jsx(HjmNativeBrandPaletteContext.Provider, { value: brandPalette, children: _jsx(HjmNativeSafeAreaContext.Provider, { value: safeAreaInsets, children: children }) }) }));
|
|
91
95
|
}
|
|
92
96
|
export function useHjmNativeTheme() {
|
|
93
97
|
const value = useContext(HjmNativeThemeContext);
|
|
@@ -96,4 +100,8 @@ export function useHjmNativeTheme() {
|
|
|
96
100
|
}
|
|
97
101
|
return value;
|
|
98
102
|
}
|
|
103
|
+
/** Insets supplied to the nearest HjmNativeProvider; `{}` when the host supplied none. */
|
|
104
|
+
export function useHjmNativeSafeAreaInsets() {
|
|
105
|
+
return useContext(HjmNativeSafeAreaContext);
|
|
106
|
+
}
|
|
99
107
|
//# sourceMappingURL=provider.js.map
|
package/dist/provider.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":";AAAA,OAAO,EACL,gCAAgC,EAChC,iCAAiC,GAMlC,MAAM,2DAA2D,CAAC;AAEnE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAC;AAClF,OAAO,EACL,aAAa,EACb,UAAU,EACV,SAAS,EACT,OAAO,EACP,QAAQ,EACR,oBAAoB,GAErB,MAAM,OAAO,CAAC;AACf,OAAO,EACL,iBAAiB,EACjB,WAAW,EACX,QAAQ,EACR,cAAc,EACd,mBAAmB,GACpB,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
import { type ViewProps } from "react-native";
|
|
3
|
+
import { type ScreenTransitionConfig } from "react-native-screen-transitions";
|
|
4
|
+
/** The host owns its navigation container, route types and back behavior. */
|
|
5
|
+
export { createBlankStackNavigator as createHjmTransitionStack } from "react-native-screen-transitions/react-navigation";
|
|
6
|
+
/** Wrap each route: retained shared-element screens must not leak into accessibility. */
|
|
7
|
+
export declare function SharedTransitionScreen({ children, style, ...props }: ViewProps): import("react").JSX.Element;
|
|
8
|
+
export type SharedTransitionElementProps = Pick<ViewProps, "style" | "accessibilityLabel"> & {
|
|
9
|
+
id: string;
|
|
10
|
+
children: ReactNode;
|
|
11
|
+
};
|
|
12
|
+
export declare function SharedTransitionElement({ id, children, ...props }: SharedTransitionElementProps): import("react").JSX.Element;
|
|
13
|
+
export declare function useSharedTransitionOptions(id: string): ScreenTransitionConfig;
|
|
14
|
+
//# sourceMappingURL=screen-transition.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"screen-transition.d.ts","sourceRoot":"","sources":["../src/screen-transition.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,EAAQ,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAEpD,OAAmB,EAAE,KAAK,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAI1F,6EAA6E;AAC7E,OAAO,EAAE,yBAAyB,IAAI,wBAAwB,EAAE,MAAM,kDAAkD,CAAC;AAEzH,yFAAyF;AACzF,wBAAgB,sBAAsB,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE,EAAE,SAAS,+BAQ9E;AAED,MAAM,MAAM,4BAA4B,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO,GAAG,oBAAoB,CAAC,GAAG;IAC3F,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,SAAS,CAAC;CACjC,CAAC;AACF,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,4BAA4B,+BAM/F;AACD,wBAAgB,0BAA0B,CAAC,EAAE,EAAE,MAAM,GAAG,sBAAsB,CAc7E"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { View } from "react-native";
|
|
3
|
+
import { useIsFocused } from "@react-navigation/native";
|
|
4
|
+
import Transition, {} from "react-native-screen-transitions";
|
|
5
|
+
import { motion as timing } from "@hjmds/design-contracts/foundations";
|
|
6
|
+
import { useHjmNativeTheme } from "./provider.js";
|
|
7
|
+
/** The host owns its navigation container, route types and back behavior. */
|
|
8
|
+
export { createBlankStackNavigator as createHjmTransitionStack } from "react-native-screen-transitions/react-navigation";
|
|
9
|
+
/** Wrap each route: retained shared-element screens must not leak into accessibility. */
|
|
10
|
+
export function SharedTransitionScreen({ children, style, ...props }) {
|
|
11
|
+
const focused = useIsFocused();
|
|
12
|
+
const { colors } = useHjmNativeTheme();
|
|
13
|
+
// Keep the source mounted for reverse geometry, but hide it from assistive tech.
|
|
14
|
+
// An opaque themed surface also prevents the transition backdrop tinting content.
|
|
15
|
+
return _jsx(View, { ...props, style: [{ flex: 1, backgroundColor: colors.bg }, style], accessibilityElementsHidden: !focused, importantForAccessibility: focused ? "auto" : "no-hide-descendants", pointerEvents: focused ? "auto" : "none", children: children });
|
|
16
|
+
}
|
|
17
|
+
export function SharedTransitionElement({ id, children, ...props }) {
|
|
18
|
+
const { environment } = useHjmNativeTheme();
|
|
19
|
+
if (!id.trim())
|
|
20
|
+
throw new TypeError("SharedTransitionElement requires a stable shared ID");
|
|
21
|
+
// Inline measurement avoids a new native teleport dependency in existing clients.
|
|
22
|
+
// Live-view handoff and clipping escape are intentionally not exposed.
|
|
23
|
+
return _jsx(Transition.Boundary, { id: id, enabled: !environment.reducedMotion, handoff: false, escapeClipping: false, ...props, children: children });
|
|
24
|
+
}
|
|
25
|
+
export function useSharedTransitionOptions(id) {
|
|
26
|
+
const { environment } = useHjmNativeTheme();
|
|
27
|
+
if (!id.trim())
|
|
28
|
+
throw new TypeError("Shared transition requires a stable shared ID");
|
|
29
|
+
const reduced = environment.reducedMotion;
|
|
30
|
+
return {
|
|
31
|
+
gestureEnabled: !reduced,
|
|
32
|
+
gestureDirection: "vertical",
|
|
33
|
+
transitionSpec: { open: { duration: reduced ? 0 : timing.slow }, close: { duration: reduced ? 0 : timing.normal } },
|
|
34
|
+
screenStyleInterpolator: ({ bounds }) => {
|
|
35
|
+
"worklet";
|
|
36
|
+
if (reduced)
|
|
37
|
+
return { content: { style: { opacity: 1 } } };
|
|
38
|
+
return bounds({ id }).navigation.zoom({ target: "bound" });
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=screen-transition.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"screen-transition.js","sourceRoot":"","sources":["../src/screen-transition.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,IAAI,EAAkB,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,UAAU,EAAE,EAA+B,MAAM,iCAAiC,CAAC;AAC1F,OAAO,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,qCAAqC,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElD,6EAA6E;AAC7E,OAAO,EAAE,yBAAyB,IAAI,wBAAwB,EAAE,MAAM,kDAAkD,CAAC;AAEzH,yFAAyF;AACzF,MAAM,UAAU,sBAAsB,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,KAAK,EAAa;IAC7E,MAAM,OAAO,GAAG,YAAY,EAAE,CAAC;IAC/B,MAAM,EAAE,MAAM,EAAE,GAAG,iBAAiB,EAAE,CAAC;IACvC,iFAAiF;IACjF,kFAAkF;IAClF,OAAO,KAAC,IAAI,OAAK,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,eAAe,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,EAC7E,2BAA2B,EAAE,CAAC,OAAO,EAAE,yBAAyB,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,qBAAqB,EAC1G,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,YAAG,QAAQ,GAAQ,CAAC;AAChE,CAAC;AAKD,MAAM,UAAU,uBAAuB,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAgC;IAC9F,MAAM,EAAE,WAAW,EAAE,GAAG,iBAAiB,EAAE,CAAC;IAC5C,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,MAAM,IAAI,SAAS,CAAC,qDAAqD,CAAC,CAAC;IAC3F,kFAAkF;IAClF,uEAAuE;IACvE,OAAO,KAAC,UAAU,CAAC,QAAQ,IAAC,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,WAAW,CAAC,aAAa,EAAE,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,KAAM,KAAK,YAAG,QAAQ,GAAuB,CAAC;AAC9J,CAAC;AACD,MAAM,UAAU,0BAA0B,CAAC,EAAU;IACnD,MAAM,EAAE,WAAW,EAAE,GAAG,iBAAiB,EAAE,CAAC;IAC5C,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,MAAM,IAAI,SAAS,CAAC,+CAA+C,CAAC,CAAC;IACrF,MAAM,OAAO,GAAG,WAAW,CAAC,aAAa,CAAC;IAC1C,OAAO;QACL,cAAc,EAAE,CAAC,OAAO;QACxB,gBAAgB,EAAE,UAAU;QAC5B,cAAc,EAAE,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE;QACnH,uBAAuB,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;YACtC,SAAS,CAAC;YACV,IAAI,OAAO;gBAAE,OAAO,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;YAC3D,OAAO,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;QAC7D,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/dist/sheet-gesture.d.ts
CHANGED
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
import { type ReactNode } from "react";
|
|
2
|
-
import {
|
|
3
|
-
|
|
2
|
+
import { type HjmNativeSafeAreaInsets } from "./provider.js";
|
|
3
|
+
/**
|
|
4
|
+
* The keyboard-aware input with the HJM field frame. The raw library input had no
|
|
5
|
+
* border or padding, so it read as plain text (2026-09-30 audit).
|
|
6
|
+
*/
|
|
7
|
+
export declare const GestureSheetInput: import("react").ForwardRefExoticComponent<Omit<import("@gorhom/bottom-sheet/lib/typescript/components/bottomSheetTextInput/types.js").BottomSheetTextInputProps & import("react").RefAttributes<import("react-native-gesture-handler").TextInput | undefined>, "ref"> & import("react").RefAttributes<import("react-native-gesture-handler").TextInput | undefined>>;
|
|
8
|
+
/** Closes the newest open GestureSheet. Returns false when none is open (let the host close). */
|
|
9
|
+
export declare function dismissTopGestureSheet(): boolean;
|
|
4
10
|
export declare function GestureSheetProvider({ children }: {
|
|
5
11
|
children: ReactNode;
|
|
6
12
|
}): import("react").JSX.Element;
|
|
@@ -13,7 +19,9 @@ export type GestureSheetProps = {
|
|
|
13
19
|
snapPoints?: readonly (number | `${number}%`)[];
|
|
14
20
|
initialIndex?: number;
|
|
15
21
|
busy?: boolean;
|
|
22
|
+
/** Defaults to the HjmNativeProvider insets; keeps the full snap below the status bar. */
|
|
23
|
+
safeAreaInsets?: HjmNativeSafeAreaInsets;
|
|
16
24
|
};
|
|
17
25
|
/** Explicit gesture variant: it does not silently change the canonical Sheet. */
|
|
18
|
-
export declare function GestureSheet({ open, onOpenChange, title, closeLabel, children, snapPoints, initialIndex, busy }: GestureSheetProps): import("react").JSX.Element;
|
|
26
|
+
export declare function GestureSheet({ open, onOpenChange, title, closeLabel, children, snapPoints, initialIndex, busy, safeAreaInsets }: GestureSheetProps): import("react").JSX.Element;
|
|
19
27
|
//# sourceMappingURL=sheet-gesture.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sheet-gesture.d.ts","sourceRoot":"","sources":["../src/sheet-gesture.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"sheet-gesture.d.ts","sourceRoot":"","sources":["../src/sheet-gesture.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAoF,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAMzH,OAAO,EAAiD,KAAK,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAG5G;;;GAGG;AACH,eAAO,MAAM,iBAAiB,sWAO7B,CAAC;AAUF,iGAAiG;AACjG,wBAAgB,sBAAsB,IAAI,OAAO,CAKhD;AACD,wBAAgB,oBAAoB,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,+BAGzE;AACD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,SAAS,CAAC;IACpB,UAAU,CAAC,EAAE,SAAS,CAAC,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC;IAChD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,0FAA0F;IAC1F,cAAc,CAAC,EAAE,uBAAuB,CAAC;CAC1C,CAAC;AAEF,iFAAiF;AACjF,wBAAgB,YAAY,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAC5E,UAA2B,EAAE,YAAgB,EAAE,IAAY,EAAE,cAAc,EAAE,EAAE,iBAAiB,+BAqEjG"}
|
package/dist/sheet-gesture.js
CHANGED
|
@@ -1,19 +1,46 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { useCallback, useEffect, useRef } from "react";
|
|
2
|
+
import { forwardRef, useCallback, useEffect, useRef } from "react";
|
|
3
3
|
import { BackHandler, View } from "react-native";
|
|
4
|
-
import { BottomSheetModal, BottomSheetModalProvider, BottomSheetScrollView, BottomSheetBackdrop, BottomSheetTextInput } from "@gorhom/bottom-sheet";
|
|
4
|
+
import { BottomSheetModal, BottomSheetModalProvider, BottomSheetScrollView, BottomSheetBackdrop, BottomSheetHandle, BottomSheetTextInput } from "@gorhom/bottom-sheet";
|
|
5
5
|
import { ReduceMotion } from "react-native-reanimated";
|
|
6
6
|
import { Button } from "./actions.js";
|
|
7
7
|
import { Text } from "./primitives.js";
|
|
8
|
-
import { useHjmNativeTheme } from "./provider.js";
|
|
9
|
-
|
|
8
|
+
import { useHjmNativeSafeAreaInsets, useHjmNativeTheme } from "./provider.js";
|
|
9
|
+
/**
|
|
10
|
+
* The keyboard-aware input with the HJM field frame. The raw library input had no
|
|
11
|
+
* border or padding, so it read as plain text (2026-09-30 audit).
|
|
12
|
+
*/
|
|
13
|
+
export const GestureSheetInput = forwardRef(function GestureSheetInput({ style, ...props }, ref) {
|
|
14
|
+
const { colors, tokens } = useHjmNativeTheme();
|
|
15
|
+
return _jsx(BottomSheetTextInput, { ref: ref, placeholderTextColor: colors.textWeak, ...props, style: [{ borderColor: colors.borderControl, borderRadius: tokens.radius.md, borderWidth: 1, color: colors.text,
|
|
16
|
+
fontSize: tokens.typography.body.fontSize, minHeight: 48, paddingHorizontal: tokens.spacing.md }, style] });
|
|
17
|
+
});
|
|
18
|
+
/**
|
|
19
|
+
* Open sheets, newest last. Android back inside an RN Modal goes to the Modal's
|
|
20
|
+
* onRequestClose and never reaches BackHandler, so the host closed instead of the
|
|
21
|
+
* sheet (2026-09-30 audit). A host that renders GestureSheet inside a Modal calls
|
|
22
|
+
* `dismissTopGestureSheet()` from onRequestClose first; BackHandler still covers
|
|
23
|
+
* sheets outside a Modal. Rejected: patching the Modal, which the host owns.
|
|
24
|
+
*/
|
|
25
|
+
const openSheets = [];
|
|
26
|
+
/** Closes the newest open GestureSheet. Returns false when none is open (let the host close). */
|
|
27
|
+
export function dismissTopGestureSheet() {
|
|
28
|
+
const close = openSheets[openSheets.length - 1];
|
|
29
|
+
if (!close)
|
|
30
|
+
return false;
|
|
31
|
+
close();
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
10
34
|
export function GestureSheetProvider({ children }) {
|
|
11
35
|
// Fixed points keep public index semantics stable; dynamic sizing inserts another point.
|
|
12
36
|
return _jsx(BottomSheetModalProvider, { children: children });
|
|
13
37
|
}
|
|
14
38
|
/** Explicit gesture variant: it does not silently change the canonical Sheet. */
|
|
15
|
-
export function GestureSheet({ open, onOpenChange, title, closeLabel, children, snapPoints = ["50%", "90%"], initialIndex = 0, busy = false }) {
|
|
39
|
+
export function GestureSheet({ open, onOpenChange, title, closeLabel, children, snapPoints = ["50%", "90%"], initialIndex = 0, busy = false, safeAreaInsets }) {
|
|
16
40
|
const theme = useHjmNativeTheme();
|
|
41
|
+
const providerInsets = useHjmNativeSafeAreaInsets();
|
|
42
|
+
const topInset = safeAreaInsets?.top ?? providerInsets.top ?? 0;
|
|
43
|
+
const bottomInset = safeAreaInsets?.bottom ?? providerInsets.bottom ?? 0;
|
|
17
44
|
const modal = useRef(null);
|
|
18
45
|
const presented = useRef(false);
|
|
19
46
|
const openRef = useRef(open);
|
|
@@ -37,13 +64,34 @@ export function GestureSheet({ open, onOpenChange, title, closeLabel, children,
|
|
|
37
64
|
useEffect(() => {
|
|
38
65
|
if (!open)
|
|
39
66
|
return;
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
67
|
+
// Busy keeps the sheet but still consumes back, as before.
|
|
68
|
+
const close = () => { if (!busy)
|
|
69
|
+
onOpenChange(false); };
|
|
70
|
+
openSheets.push(close);
|
|
71
|
+
const subscription = BackHandler.addEventListener("hardwareBackPress", () => { close(); return true; });
|
|
72
|
+
return () => {
|
|
73
|
+
subscription.remove();
|
|
74
|
+
const at = openSheets.lastIndexOf(close);
|
|
75
|
+
if (at >= 0)
|
|
76
|
+
openSheets.splice(at, 1);
|
|
77
|
+
};
|
|
43
78
|
}, [open, busy, onOpenChange]);
|
|
44
|
-
|
|
79
|
+
// The library's backdrop and handle announce English defaults ("Bottom sheet
|
|
80
|
+
// backdrop", "Bottom sheet handle"; 2026-09-30 audit). The backdrop becomes a
|
|
81
|
+
// localized dismiss button like the canonical Sheet's, and only while it can
|
|
82
|
+
// dismiss; the handle leaves the tree because the close button is the
|
|
83
|
+
// accessible route between snap points' end states.
|
|
84
|
+
const backdrop = useCallback((props) => _jsx(BottomSheetBackdrop, { ...props, accessible: !busy, accessibilityLabel: closeLabel, accessibilityHint: "", accessibilityRole: "button", appearsOnIndex: 0, disappearsOnIndex: -1, pressBehavior: busy ? "none" : "close" }), [busy, closeLabel]);
|
|
85
|
+
const handle = useCallback((props) => _jsx(BottomSheetHandle, { ...props, accessible: false, indicatorStyle: { backgroundColor: theme.colors.text } }), [theme.colors.text]);
|
|
86
|
+
// The library background is itself an accessible "Bottom Sheet" adjustable element
|
|
87
|
+
// (hardcoded, no prop), so it is replaced with a plain surface.
|
|
88
|
+
const background = useCallback(({ style, pointerEvents }) => _jsx(View, { accessible: false, pointerEvents: pointerEvents, style: [{ borderTopLeftRadius: theme.tokens.radius.lg, borderTopRightRadius: theme.tokens.radius.lg }, style] }), [theme.tokens.radius.lg]);
|
|
45
89
|
// Fixed points keep public index semantics stable; dynamic sizing inserts another point.
|
|
46
|
-
|
|
47
|
-
|
|
90
|
+
// accessible={false}: the container defaulted to one "Bottom Sheet" element that
|
|
91
|
+
// swallowed the title, input and close button; the localized title replaces the
|
|
92
|
+
// English default name wherever the container is still listed. topInset keeps the 90% snap below
|
|
93
|
+
// the status bar, where the title used to sit (2026-09-30 audit).
|
|
94
|
+
return _jsx(BottomSheetModal, { ref: modal, index: initialIndex, snapPoints: [...snapPoints], accessible: false, accessibilityLabel: title, accessibilityRole: "none", topInset: topInset, handleComponent: handle, backgroundComponent: background, enableDynamicSizing: false, enablePanDownToClose: !busy, backdropComponent: backdrop, overrideReduceMotion: theme.environment.reducedMotion ? ReduceMotion.Always : ReduceMotion.System, backgroundStyle: { backgroundColor: theme.colors.bg }, onDismiss: () => { presented.current = false; if (openRef.current)
|
|
95
|
+
onOpenChange(false); }, children: _jsx(BottomSheetScrollView, { keyboardShouldPersistTaps: "handled", children: _jsxs(View, { accessibilityViewIsModal: true, style: { gap: theme.tokens.spacing.sm, padding: theme.tokens.spacing.lg, paddingBottom: theme.tokens.spacing.lg + bottomInset }, children: [_jsx(Text, { accessibilityRole: "header", children: title }), children, _jsx(Button, { disabled: busy, onPress: () => onOpenChange(false), children: closeLabel })] }) }) });
|
|
48
96
|
}
|
|
49
97
|
//# sourceMappingURL=sheet-gesture.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sheet-gesture.js","sourceRoot":"","sources":["../src/sheet-gesture.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"sheet-gesture.js","sourceRoot":"","sources":["../src/sheet-gesture.tsx"],"names":[],"mappings":"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"}
|
package/dist/slider.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slider.d.ts","sourceRoot":"","sources":["../src/slider.tsx"],"names":[],"mappings":"AAcA,OAAO,EAGL,IAAI,
|
|
1
|
+
{"version":3,"file":"slider.d.ts","sourceRoot":"","sources":["../src/slider.tsx"],"names":[],"mappings":"AAcA,OAAO,EAGL,IAAI,EACJ,KAAK,iBAAiB,EACtB,KAAK,SAAS,EACd,KAAK,SAAS,EACd,KAAK,SAAS,EACf,MAAM,cAAc,CAAC;AAMtB,KAAK,qBAAqB,GAAG,IAAI,CAC/B,SAAS,EACP,sBAAsB,GACtB,oBAAoB,GACpB,mBAAmB,GACnB,oBAAoB,GACpB,oBAAoB,GACpB,YAAY,GACZ,UAAU,GACV,uBAAuB,GACvB,UAAU,GACV,OAAO,CACV,CAAC;AAKF,MAAM,MAAM,WAAW,GAAG,qBAAqB,GAC7C,QAAQ,CAAC;IACP,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,4EAA4E;IAC5E,cAAc,EAAE,MAAM,CAAC;IACvB,4EAA4E;IAC5E,cAAc,EAAE,MAAM,CAAC;IACvB,6DAA6D;IAC7D,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACzC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC9C,cAAc,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IACtC,YAAY,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;CACrC,CAAC,CAAC;AAEL,2EAA2E;AAC3E,eAAO,MAAM,MAAM;WArBR,MAAM;SACR,MAAM;SACN,MAAM;WACJ,MAAM;YACL,MAAM;mBACC,MAAM;oBACL,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI;uBACpB,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI;eAC/B,OAAO;IAClB,4EAA4E;oBAC5D,MAAM;IACtB,4EAA4E;oBAC5D,MAAM;IACtB,6DAA6D;mBAC9C,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM;eAC7B,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI;qBAC5B,SAAS,CAAC,SAAS,CAAC;mBACtB,SAAS,CAAC,SAAS,CAAC;yCA6TrC,CAAC"}
|
package/dist/slider.js
CHANGED
|
@@ -5,6 +5,8 @@ import { PanResponder, Text as NativeText, View, } from "react-native";
|
|
|
5
5
|
import { useControllableState } from "./internal/state.js";
|
|
6
6
|
import { logicalTextAlign, resolveNativeTextScaleProps } from "./internal/styles.js";
|
|
7
7
|
import { useHjmNativeTheme } from "./provider.js";
|
|
8
|
+
/** Points of travel before a drag counts as horizontal or vertical intent. */
|
|
9
|
+
const sliderIntentSlop = 6;
|
|
8
10
|
/** Dependency-free horizontal Slider using the Native responder system. */
|
|
9
11
|
export const Slider = forwardRef(function Slider({ label, min, max, step, value, defaultValue, onValueChange, onValueChangeEnd, decrementLabel, incrementLabel, getValueText, disabled = false, onFocus, onBlur, onLayout, containerStyle, controlStyle, ...viewProps }, forwardedRef) {
|
|
10
12
|
const { colors, environment, textScaling, tokens } = useHjmNativeTheme();
|
|
@@ -51,13 +53,13 @@ export const Slider = forwardRef(function Slider({ label, min, max, step, value,
|
|
|
51
53
|
setDragging(false);
|
|
52
54
|
onValueChangeEnd?.(lastInteractionValueRef.current);
|
|
53
55
|
};
|
|
54
|
-
const updateFromLocation = (
|
|
56
|
+
const updateFromLocation = (locationX) => {
|
|
55
57
|
if (disabled)
|
|
56
58
|
return;
|
|
57
59
|
const extent = layoutWidth - recipe.thumbDiameter;
|
|
58
60
|
if (extent <= 0)
|
|
59
61
|
return;
|
|
60
|
-
const offset =
|
|
62
|
+
const offset = locationX - recipe.thumbDiameter / 2;
|
|
61
63
|
publish(resolveSliderValueFromOffset(descriptor, offset, extent, environment.direction));
|
|
62
64
|
};
|
|
63
65
|
const performAction = (intent) => {
|
|
@@ -69,25 +71,70 @@ export const Slider = forwardRef(function Slider({ label, min, max, step, value,
|
|
|
69
71
|
publish(next);
|
|
70
72
|
onValueChangeEnd?.(next);
|
|
71
73
|
};
|
|
74
|
+
const begin = () => {
|
|
75
|
+
activeGestureRef.current = true;
|
|
76
|
+
lastInteractionValueRef.current = currentValueRef.current;
|
|
77
|
+
setDragging(true);
|
|
78
|
+
};
|
|
79
|
+
const beginRef = useRef(begin);
|
|
80
|
+
beginRef.current = begin;
|
|
72
81
|
const updateFromLocationRef = useRef(updateFromLocation);
|
|
73
82
|
const finishRef = useRef(finish);
|
|
74
83
|
updateFromLocationRef.current = updateFromLocation;
|
|
75
84
|
finishRef.current = finish;
|
|
85
|
+
// The responder is taken on touch start so a tap can still seek, but nothing is
|
|
86
|
+
// written until the gesture shows horizontal intent (dx dominates past the slop)
|
|
87
|
+
// or ends as a tap. Writing on grant moved the value 50% -> 88% when a vertical
|
|
88
|
+
// page scroll merely started on the track (2026-09-30 audit, Android). A vertical
|
|
89
|
+
// start leaves the gesture pending, so the ScrollView's termination request ends
|
|
90
|
+
// it with no value change and no onValueChangeEnd. Rejected: claiming only on
|
|
91
|
+
// move, which loses tap-to-seek on the track.
|
|
92
|
+
const gestureIntentRef = useRef("pending");
|
|
93
|
+
const grantLocationRef = useRef(0);
|
|
76
94
|
const panResponder = useMemo(() => PanResponder.create({
|
|
77
95
|
onStartShouldSetPanResponder: () => !disabledRef.current,
|
|
78
|
-
onMoveShouldSetPanResponder: () => !disabledRef.current
|
|
96
|
+
onMoveShouldSetPanResponder: (_event, gesture) => !disabledRef.current
|
|
97
|
+
&& Math.abs(gesture.dx) > sliderIntentSlop
|
|
98
|
+
&& Math.abs(gesture.dx) > Math.abs(gesture.dy),
|
|
79
99
|
onPanResponderGrant: (event) => {
|
|
100
|
+
gestureIntentRef.current = "pending";
|
|
101
|
+
grantLocationRef.current = event.nativeEvent.locationX;
|
|
102
|
+
},
|
|
103
|
+
onPanResponderMove: (event, gesture) => {
|
|
80
104
|
if (disabledRef.current)
|
|
81
105
|
return;
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
106
|
+
if (gestureIntentRef.current === "pending") {
|
|
107
|
+
const dx = Math.abs(gesture?.dx ?? 0);
|
|
108
|
+
const dy = Math.abs(gesture?.dy ?? 0);
|
|
109
|
+
if (dy > sliderIntentSlop && dy >= dx) {
|
|
110
|
+
gestureIntentRef.current = "vertical";
|
|
111
|
+
}
|
|
112
|
+
else if (dx > sliderIntentSlop && dx > dy) {
|
|
113
|
+
gestureIntentRef.current = "horizontal";
|
|
114
|
+
beginRef.current();
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
if (gestureIntentRef.current === "horizontal")
|
|
118
|
+
updateFromLocationRef.current(event.nativeEvent.locationX);
|
|
119
|
+
},
|
|
120
|
+
onPanResponderRelease: (_event, gesture) => {
|
|
121
|
+
if (gestureIntentRef.current === "pending"
|
|
122
|
+
&& Math.abs(gesture?.dx ?? 0) <= sliderIntentSlop
|
|
123
|
+
&& Math.abs(gesture?.dy ?? 0) <= sliderIntentSlop
|
|
124
|
+
&& !disabledRef.current) {
|
|
125
|
+
// A tap: seek once to where the finger went down.
|
|
126
|
+
beginRef.current();
|
|
127
|
+
updateFromLocationRef.current(grantLocationRef.current);
|
|
128
|
+
}
|
|
129
|
+
gestureIntentRef.current = "pending";
|
|
130
|
+
finishRef.current();
|
|
131
|
+
},
|
|
132
|
+
onPanResponderTerminate: () => {
|
|
133
|
+
gestureIntentRef.current = "pending";
|
|
134
|
+
finishRef.current();
|
|
86
135
|
},
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
onPanResponderTerminate: () => finishRef.current(),
|
|
90
|
-
onPanResponderTerminationRequest: () => true,
|
|
136
|
+
// Yield to a parent scroll until the drag is known to be horizontal.
|
|
137
|
+
onPanResponderTerminationRequest: () => gestureIntentRef.current !== "horizontal",
|
|
91
138
|
onShouldBlockNativeResponder: () => true,
|
|
92
139
|
}), []);
|
|
93
140
|
useEffect(() => {
|
package/dist/slider.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slider.js","sourceRoot":"","sources":["../src/slider.tsx"],"names":[],"mappings":";AAAA,OAAO,EACL,mBAAmB,EACnB,uBAAuB,EACvB,yBAAyB,EACzB,4BAA4B,EAC5B,YAAY,GACb,MAAM,2CAA2C,CAAC;AACnD,OAAO,EACL,UAAU,EACV,SAAS,EACT,OAAO,EACP,MAAM,EACN,QAAQ,GACT,MAAM,OAAO,CAAC;AACf,OAAO,EACL,YAAY,EACZ,IAAI,IAAI,UAAU,EAClB,IAAI,
|
|
1
|
+
{"version":3,"file":"slider.js","sourceRoot":"","sources":["../src/slider.tsx"],"names":[],"mappings":";AAAA,OAAO,EACL,mBAAmB,EACnB,uBAAuB,EACvB,yBAAyB,EACzB,4BAA4B,EAC5B,YAAY,GACb,MAAM,2CAA2C,CAAC;AACnD,OAAO,EACL,UAAU,EACV,SAAS,EACT,OAAO,EACP,MAAM,EACN,QAAQ,GACT,MAAM,OAAO,CAAC;AACf,OAAO,EACL,YAAY,EACZ,IAAI,IAAI,UAAU,EAClB,IAAI,GAKL,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AACrF,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAgBlD,8EAA8E;AAC9E,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAwB3B,2EAA2E;AAC3E,MAAM,CAAC,MAAM,MAAM,GAAG,UAAU,CAAoB,SAAS,MAAM,CACjE,EACE,KAAK,EACL,GAAG,EACH,GAAG,EACH,IAAI,EACJ,KAAK,EACL,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,YAAY,EACZ,QAAQ,GAAG,KAAK,EAChB,OAAO,EACP,MAAM,EACN,QAAQ,EACR,cAAc,EACd,YAAY,EACZ,GAAG,SAAS,EACb,EACD,YAAY;IAEZ,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,iBAAiB,EAAE,CAAC;IACzE,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,oBAAoB,CAAS;QACnE,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;QACzC,YAAY,EAAE,YAAY,IAAI,GAAG;QACjC,GAAG,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC;KACpE,CAAC,CAAC;IACH,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC,YAAY,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,uBAAuB,CAAC;QACzC,KAAK;QACL,KAAK,EAAE,YAAY;QACnB,GAAG;QACH,GAAG;QACH,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;QACvC,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC;KAClD,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC;IACzC,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAClD,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,gBAAgB,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACvC,MAAM,uBAAuB,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;IACrD,MAAM,eAAe,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;IAC7C,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IACrC,eAAe,CAAC,OAAO,GAAG,YAAY,CAAC;IACvC,WAAW,CAAC,OAAO,GAAG,QAAQ,CAAC;IAE/B,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,gBAAgB,CAAC,OAAO;YAAE,uBAAuB,CAAC,OAAO,GAAG,YAAY,CAAC;IAChF,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAEnB,MAAM,OAAO,GAAG,CAAC,IAAY,EAAE,EAAE;QAC/B,MAAM,QAAQ,GAAG,gBAAgB,CAAC,OAAO;YACvC,CAAC,CAAC,uBAAuB,CAAC,OAAO;YACjC,CAAC,CAAC,YAAY,CAAC;QACjB,uBAAuB,CAAC,OAAO,GAAG,IAAI,CAAC;QACvC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC;YAAE,eAAe,CAAC,IAAI,CAAC,CAAC;IACxD,CAAC,CAAC;IACF,MAAM,MAAM,GAAG,GAAG,EAAE;QAClB,IAAI,CAAC,gBAAgB,CAAC,OAAO;YAAE,OAAO;QACtC,gBAAgB,CAAC,OAAO,GAAG,KAAK,CAAC;QACjC,WAAW,CAAC,KAAK,CAAC,CAAC;QACnB,gBAAgB,EAAE,CAAC,uBAAuB,CAAC,OAAO,CAAC,CAAC;IACtD,CAAC,CAAC;IACF,MAAM,kBAAkB,GAAG,CAAC,SAAiB,EAAE,EAAE;QAC/C,IAAI,QAAQ;YAAE,OAAO;QACrB,MAAM,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC,aAAa,CAAC;QAClD,IAAI,MAAM,IAAI,CAAC;YAAE,OAAO;QACxB,MAAM,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC,aAAa,GAAG,CAAC,CAAC;QACpD,OAAO,CAAC,4BAA4B,CAClC,UAAU,EACV,MAAM,EACN,MAAM,EACN,WAAW,CAAC,SAAS,CACtB,CAAC,CAAC;IACL,CAAC,CAAC;IACF,MAAM,aAAa,GAAG,CAAC,MAAiC,EAAE,EAAE;QAC1D,IAAI,QAAQ;YAAE,OAAO;QACrB,MAAM,IAAI,GAAG,mBAAmB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACrD,IAAI,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,CAAC;YAAE,OAAO;QAC1C,OAAO,CAAC,IAAI,CAAC,CAAC;QACd,gBAAgB,EAAE,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC,CAAC;IAEF,MAAM,KAAK,GAAG,GAAG,EAAE;QACjB,gBAAgB,CAAC,OAAO,GAAG,IAAI,CAAC;QAChC,uBAAuB,CAAC,OAAO,GAAG,eAAe,CAAC,OAAO,CAAC;QAC1D,WAAW,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC,CAAC;IACF,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC/B,QAAQ,CAAC,OAAO,GAAG,KAAK,CAAC;IACzB,MAAM,qBAAqB,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC;IACzD,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IACjC,qBAAqB,CAAC,OAAO,GAAG,kBAAkB,CAAC;IACnD,SAAS,CAAC,OAAO,GAAG,MAAM,CAAC;IAE3B,gFAAgF;IAChF,iFAAiF;IACjF,gFAAgF;IAChF,kFAAkF;IAClF,iFAAiF;IACjF,8EAA8E;IAC9E,8CAA8C;IAC9C,MAAM,gBAAgB,GAAG,MAAM,CAAwC,SAAS,CAAC,CAAC;IAClF,MAAM,gBAAgB,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,YAAY,GAAG,OAAO,CAC1B,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC;QACxB,4BAA4B,EAAE,GAAG,EAAE,CAAC,CAAC,WAAW,CAAC,OAAO;QACxD,2BAA2B,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,OAAO;eACjE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,gBAAgB;eACvC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QAChD,mBAAmB,EAAE,CAAC,KAAK,EAAE,EAAE;YAC7B,gBAAgB,CAAC,OAAO,GAAG,SAAS,CAAC;YACrC,gBAAgB,CAAC,OAAO,GAAG,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC;QACzD,CAAC;QACD,kBAAkB,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;YACrC,IAAI,WAAW,CAAC,OAAO;gBAAE,OAAO;YAChC,IAAI,gBAAgB,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC3C,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;gBACtC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;gBACtC,IAAI,EAAE,GAAG,gBAAgB,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;oBACtC,gBAAgB,CAAC,OAAO,GAAG,UAAU,CAAC;gBACxC,CAAC;qBAAM,IAAI,EAAE,GAAG,gBAAgB,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC;oBAC5C,gBAAgB,CAAC,OAAO,GAAG,YAAY,CAAC;oBACxC,QAAQ,CAAC,OAAO,EAAE,CAAC;gBACrB,CAAC;YACH,CAAC;YACD,IAAI,gBAAgB,CAAC,OAAO,KAAK,YAAY;gBAAE,qBAAqB,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QAC5G,CAAC;QACD,qBAAqB,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE;YACzC,IACE,gBAAgB,CAAC,OAAO,KAAK,SAAS;mBACnC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,CAAC,IAAI,gBAAgB;mBAC9C,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,CAAC,IAAI,gBAAgB;mBAC9C,CAAC,WAAW,CAAC,OAAO,EACvB,CAAC;gBACD,kDAAkD;gBAClD,QAAQ,CAAC,OAAO,EAAE,CAAC;gBACnB,qBAAqB,CAAC,OAAO,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;YAC1D,CAAC;YACD,gBAAgB,CAAC,OAAO,GAAG,SAAS,CAAC;YACrC,SAAS,CAAC,OAAO,EAAE,CAAC;QACtB,CAAC;QACD,uBAAuB,EAAE,GAAG,EAAE;YAC5B,gBAAgB,CAAC,OAAO,GAAG,SAAS,CAAC;YACrC,SAAS,CAAC,OAAO,EAAE,CAAC;QACtB,CAAC;QACD,qEAAqE;QACrE,gCAAgC,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,OAAO,KAAK,YAAY;QACjF,4BAA4B,EAAE,GAAG,EAAE,CAAC,IAAI;KACzC,CAAC,EACF,EAAE,CACH,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,QAAQ;YAAE,SAAS,CAAC,OAAO,EAAE,CAAC;IACpC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEf,MAAM,QAAQ,GAAG,yBAAyB,CAAC,UAAU,CAAC,CAAC;IACvD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC;IAC/D,MAAM,cAAc,GAAG,WAAW,CAAC,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;IACjF,MAAM,SAAS,GAAG,MAAM,GAAG,cAAc,CAAC;IAC1C,MAAM,YAAY,GAAG,SAAS,IAAI,MAAM,CAAC,YAAY,CAAC,CAAC;IACvD,MAAM,WAAW,GAAG,QAAQ;QAC1B,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC;YACE,oBAAoB,EAAE;gBACpB,EAAE,IAAI,EAAE,WAAoB,EAAE,KAAK,EAAE,cAAc,EAAE;gBACrD,EAAE,IAAI,EAAE,WAAoB,EAAE,KAAK,EAAE,cAAc,EAAE;aACtD;YACD,qBAAqB,EAAE,CAAC,KAA8C,EAAE,EAAE;gBACxE,IAAI,KAAK,CAAC,WAAW,CAAC,UAAU,KAAK,WAAW;oBAAE,aAAa,CAAC,WAAW,CAAC,CAAC;gBAC7E,IAAI,KAAK,CAAC,WAAW,CAAC,UAAU,KAAK,WAAW;oBAAE,aAAa,CAAC,WAAW,CAAC,CAAC;YAC/E,CAAC;SACF,CAAC;IACN,MAAM,mBAAmB,GAAG,2BAA2B,CAAC,WAAW,EAAE;QACnE,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC;QACtC,EAAE,KAAK,EAAE,MAAM,CAAC,QAAQ,EAAE,SAAS,EAAE,gBAAgB,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE;KAC/E,CAAC,CAAC;IACH,MAAM,mBAAmB,GAAG,2BAA2B,CAAC,WAAW,EAAE;QACnE,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,iBAAiB,CAAC;QAC3C;YACE,KAAK,EAAE,MAAM,CAAC,SAAS;YACvB,WAAW,EAAE,CAAC,cAAc,CAAC;YAC7B,SAAS,EAAE,gBAAgB,CAAC,WAAW,CAAC,SAAS,CAAC;SACnD;KACF,CAAC,CAAC;IAEH,OAAO,CACL,MAAC,IAAI,IACH,KAAK,EAAE;YACL;gBACE,GAAG,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE;gBACtB,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;aAC5D;YACD,cAAc;SACf,aAED,MAAC,IAAI,IACH,UAAU,EAAE,KAAK,EACjB,2BAA2B,QAC3B,yBAAyB,EAAC,qBAAqB,EAC/C,KAAK,EAAE;oBACL,UAAU,EAAE,UAAU;oBACtB,SAAS,EAAE,WAAW,CAAC,SAAS;oBAChC,aAAa,EAAE,KAAK;oBACpB,cAAc,EAAE,eAAe;iBAChC,aAED,KAAC,UAAU,OAAK,mBAAmB,YAChC,KAAK,GACK,EACb,KAAC,UAAU,OAAK,mBAAmB,YAChC,YAAY,GACF,IACR,EACP,MAAC,IAAI,OACC,SAAS,KACT,YAAY,CAAC,WAAW,KACxB,WAAW,EACf,GAAG,EAAE,YAAY,EACjB,UAAU,QACV,kBAAkB,EAAE,KAAK,EACzB,iBAAiB,EAAC,YAAY,EAC9B,kBAAkB,EAAE,EAAE,QAAQ,EAAE,EAChC,kBAAkB,EAAE;oBAClB,GAAG;oBACH,GAAG;oBACH,GAAG,EAAE,YAAY;oBACjB,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;iBACxD,EACD,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;oBAChB,UAAU,CAAC,KAAK,CAAC,CAAC;oBAClB,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC;gBAClB,CAAC,EACD,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;oBACjB,UAAU,CAAC,IAAI,CAAC,CAAC;oBACjB,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;gBACnB,CAAC,EACD,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;oBAClB,cAAc,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oBAC/C,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC;gBACpB,CAAC,EACD,KAAK,EAAE;oBACL;wBACE,cAAc,EAAE,QAAQ;wBACxB,SAAS,EAAE,MAAM,CAAC,SAAS;wBAC3B,QAAQ,EAAE,MAAM,CAAC,SAAS;qBAC3B;oBACD,YAAY;iBACb,aAED,KAAC,IAAI,IACH,aAAa,EAAC,MAAM,EACpB,KAAK,EAAE;4BACL,eAAe,EAAE,MAAM,CAAC,UAAU;4BAClC,WAAW,EAAE,MAAM,CAAC,SAAS;4BAC7B,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI;4BAChC,WAAW,EAAE,CAAC;4BACd,MAAM,EAAE,MAAM,CAAC,WAAW;4BAC1B,IAAI,EAAE,MAAM,CAAC,aAAa,GAAG,CAAC;4BAC9B,QAAQ,EAAE,UAAU;4BACpB,KAAK,EAAE,MAAM,CAAC,aAAa,GAAG,CAAC;yBAChC,GACD,EACF,KAAC,IAAI,IACH,aAAa,EAAC,MAAM,EACpB,KAAK,EAAE;4BACL,eAAe,EAAE,MAAM,CAAC,YAAY;4BACpC,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI;4BAChC,MAAM,EAAE,MAAM,CAAC,WAAW;4BAC1B,GAAG,CAAC,WAAW,CAAC,SAAS,KAAK,KAAK;gCACjC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,aAAa,GAAG,CAAC,EAAE;gCACrC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,aAAa,GAAG,CAAC,EAAE,CAAC;4BACvC,QAAQ,EAAE,UAAU;4BACpB,KAAK,EAAE,MAAM,GAAG,QAAQ;yBACzB,GACD,EACD,OAAO,CAAC,CAAC,CAAC,CACT,KAAC,IAAI,IACH,aAAa,EAAC,MAAM,EACpB,KAAK,EAAE;4BACL,WAAW,EAAE,MAAM,CAAC,YAAY;4BAChC,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC;4BAChD,WAAW,EAAE,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK;4BAC5C,MAAM,EAAE,MAAM,CAAC,aAAa,GAAG,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;4BACnE,IAAI,EAAE,SAAS,GAAG,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM;4BAClD,QAAQ,EAAE,UAAU;4BACpB,KAAK,EAAE,MAAM,CAAC,aAAa,GAAG,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;4BAClE,MAAM,EAAE,CAAC;yBACV,GACD,CACH,CAAC,CAAC,CAAC,IAAI,EACR,KAAC,IAAI,IACH,aAAa,EAAC,MAAM,EACpB,KAAK,EAAE;4BACL,eAAe,EAAE,MAAM,CAAC,EAAE;4BAC1B,WAAW,EAAE,MAAM,CAAC,YAAY;4BAChC,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI;4BAChC,WAAW,EAAE,CAAC;4BACd,MAAM,EAAE,MAAM,CAAC,aAAa;4BAC5B,IAAI,EAAE,SAAS;4BACf,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;4BAC1D,QAAQ,EAAE,UAAU;4BACpB,KAAK,EAAE,MAAM,CAAC,aAAa;4BAC3B,MAAM,EAAE,CAAC;yBACV,GACD,IACG,IACF,CACR,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type ReactNode } from "react";
|
|
2
|
+
import { type SortableItem, type SortableLabels, type ReorderIntent } from "@hjmds/design-contracts/components/interaction-adapters";
|
|
3
|
+
export type SortableCollectionProps = {
|
|
4
|
+
items: readonly SortableItem[];
|
|
5
|
+
label: string;
|
|
6
|
+
labels: SortableLabels;
|
|
7
|
+
renderItem(item: SortableItem): ReactNode;
|
|
8
|
+
onCommit(intent: ReorderIntent): void;
|
|
9
|
+
onCancel?(): void;
|
|
10
|
+
disabled?: boolean;
|
|
11
|
+
/** Pass route focus when screens remain mounted across tabs; resets GH2 drag state. */
|
|
12
|
+
active?: boolean;
|
|
13
|
+
};
|
|
14
|
+
export declare function SortableCollection(props: SortableCollectionProps): import("react").JSX.Element;
|
|
15
|
+
//# sourceMappingURL=sortable.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sortable.d.ts","sourceRoot":"","sources":["../src/sortable.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA+B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAGpE,OAAO,EAAgC,KAAK,YAAY,EAAE,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,yDAAyD,CAAC;AAKnK,MAAM,MAAM,uBAAuB,GAAG;IACpC,KAAK,EAAE,SAAS,YAAY,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,cAAc,CAAC;IACtE,UAAU,CAAC,IAAI,EAAE,YAAY,GAAG,SAAS,CAAC;IAC1C,QAAQ,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAAC;IAAC,QAAQ,CAAC,IAAI,IAAI,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC7E,uFAAuF;IACvF,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AACF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,uBAAuB,+BA8DhE"}
|
package/dist/sortable.js
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useRef, useState } from "react";
|
|
3
|
+
import { AccessibilityInfo, AppState, View } from "react-native";
|
|
4
|
+
import Sortable from "react-native-sortables";
|
|
5
|
+
import { reorderIntent, validateItems } from "@hjmds/design-contracts/components/interaction-adapters";
|
|
6
|
+
import { Button } from "./actions.js";
|
|
7
|
+
import { Text } from "./primitives.js";
|
|
8
|
+
import { useHjmNativeTheme } from "./provider.js";
|
|
9
|
+
export function SortableCollection(props) {
|
|
10
|
+
validateItems(props.items);
|
|
11
|
+
if (!props.label.trim())
|
|
12
|
+
throw new TypeError("SortableCollection needs a label");
|
|
13
|
+
const { tokens, environment } = useHjmNativeTheme();
|
|
14
|
+
const snapshot = useRef("");
|
|
15
|
+
const dragging = useRef(false);
|
|
16
|
+
const latest = useRef(props);
|
|
17
|
+
latest.current = props;
|
|
18
|
+
const [session, setSession] = useState(0);
|
|
19
|
+
const signature = JSON.stringify(props.items);
|
|
20
|
+
useEffect(() => {
|
|
21
|
+
if (dragging.current) {
|
|
22
|
+
dragging.current = false;
|
|
23
|
+
latest.current.onCancel?.();
|
|
24
|
+
}
|
|
25
|
+
}, [signature, props.active]);
|
|
26
|
+
useEffect(() => {
|
|
27
|
+
const sub = AppState.addEventListener("change", state => {
|
|
28
|
+
if (state !== "active") {
|
|
29
|
+
if (dragging.current) {
|
|
30
|
+
dragging.current = false;
|
|
31
|
+
latest.current.onCancel?.();
|
|
32
|
+
}
|
|
33
|
+
setSession(value => value + 1);
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
return () => { sub.remove(); if (dragging.current)
|
|
37
|
+
latest.current.onCancel?.(); };
|
|
38
|
+
}, []);
|
|
39
|
+
function commit(id, to, source) {
|
|
40
|
+
if (props.disabled || props.active === false)
|
|
41
|
+
return;
|
|
42
|
+
const intent = reorderIntent(props.items, id, to, source);
|
|
43
|
+
if (intent) {
|
|
44
|
+
props.onCommit(intent);
|
|
45
|
+
AccessibilityInfo.announceForAccessibility(props.labels.position(props.items[intent.fromIndex], to + 1, props.items.length));
|
|
46
|
+
}
|
|
47
|
+
// The engine keeps temporary order even when the controlled host rejects a move.
|
|
48
|
+
setSession(value => value + 1);
|
|
49
|
+
}
|
|
50
|
+
return _jsx(View, { accessibilityLabel: props.label, children: _jsx(Sortable.Grid, { columns: 1, data: [...props.items], keyExtractor: item => item.id, itemEntering: null, itemExiting: null, customHandle: true, sortEnabled: !props.disabled && props.active !== false && !environment.reducedMotion, hapticsEnabled: false, activationAnimationDuration: environment.reducedMotion ? 0 : 120, dropAnimationDuration: environment.reducedMotion ? 0 : 200, onDragStart: () => { snapshot.current = signature; dragging.current = true; }, onDragEnd: ({ key, toIndex }) => {
|
|
51
|
+
if (!dragging.current || snapshot.current !== signature)
|
|
52
|
+
return;
|
|
53
|
+
dragging.current = false;
|
|
54
|
+
commit(key, toIndex, "drag");
|
|
55
|
+
}, renderItem: ({ item, index }) => _jsxs(View, { style: { padding: tokens.spacing.xs, gap: tokens.spacing.xs }, children: [_jsx(Sortable.Handle, { mode: props.disabled || item.disabled ? "non-draggable" : "draggable", children: _jsxs(View, { accessible: true, accessibilityRole: "adjustable", accessibilityLabel: props.labels.handle(item), accessibilityValue: { text: props.labels.position(item, index + 1, props.items.length) }, accessibilityActions: [{ name: "decrement", label: props.labels.previous(item) }, { name: "increment", label: props.labels.next(item) }], onAccessibilityAction: ({ nativeEvent }) => {
|
|
56
|
+
if (nativeEvent.actionName === "increment" || nativeEvent.actionName === "decrement") {
|
|
57
|
+
commit(item.id, index + (nativeEvent.actionName === "increment" ? 1 : -1), "accessibility-action");
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
// Yoga `direction` mirrors the rows under HJM RTL even when the OS is LTR;
|
|
61
|
+
// without it the grip and the move buttons stayed left-to-right (2026-09-30 audit).
|
|
62
|
+
style: { alignItems: "center", direction: environment.direction, flexDirection: "row", gap: tokens.spacing.xs, minHeight: 44 }, children: [_jsx(Text, { children: "\u283F" }), _jsx(Text, { children: item.label })] }) }), props.renderItem(item), _jsxs(View, { style: { direction: environment.direction, flexDirection: "row", flexWrap: "wrap", gap: tokens.spacing.xs }, children: [_jsx(Button, { tone: "ghost", disabled: props.disabled || item.disabled || index === 0, onPress: () => commit(item.id, index - 1, "accessibility-action"), children: props.labels.previous(item) }), _jsx(Button, { tone: "ghost", disabled: props.disabled || item.disabled || index === props.items.length - 1, onPress: () => commit(item.id, index + 1, "accessibility-action"), children: props.labels.next(item) })] })] }) }, `${signature}:${session}:${props.active !== false}`) });
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=sortable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sortable.js","sourceRoot":"","sources":["../src/sortable.tsx"],"names":[],"mappings":"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"}
|