@seed-design/lynx-react 0.6.2 → 0.7.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/lib/components/Accordion/Accordion.d.ts.map +1 -1
- package/lib/components/Accordion/Accordion.jsx +24 -14
- package/lib/components/ActionButton/ActionButton.d.ts +1 -1
- package/lib/components/ActionButton/ActionButton.d.ts.map +1 -1
- package/lib/components/ActionButton/ActionButton.jsx +12 -4
- package/lib/components/AppBar/AppBar.d.ts.map +1 -1
- package/lib/components/AppBar/AppBar.jsx +9 -8
- package/lib/components/Badge/Badge.d.ts.map +1 -1
- package/lib/components/Badge/Badge.jsx +2 -1
- package/lib/components/BottomSheet/BottomSheet.d.ts.map +1 -1
- package/lib/components/BottomSheet/BottomSheet.jsx +9 -9
- package/lib/components/Box/Box.d.ts.map +1 -1
- package/lib/components/Box/Box.jsx +2 -1
- package/lib/components/Callout/Callout.d.ts +2 -2
- package/lib/components/Callout/Callout.d.ts.map +1 -1
- package/lib/components/Callout/Callout.jsx +20 -10
- package/lib/components/Checkbox/Checkbox.d.ts +4 -2
- package/lib/components/Checkbox/Checkbox.d.ts.map +1 -1
- package/lib/components/Checkbox/Checkbox.jsx +33 -17
- package/lib/components/Chip/Chip.d.ts +1 -1
- package/lib/components/Chip/Chip.d.ts.map +1 -1
- package/lib/components/Chip/Chip.jsx +36 -16
- package/lib/components/Count/Count.d.ts +7 -0
- package/lib/components/Count/Count.d.ts.map +1 -0
- package/lib/components/Count/Count.jsx +19 -0
- package/lib/components/Count/index.d.ts +2 -0
- package/lib/components/Count/index.d.ts.map +1 -0
- package/lib/components/Divider/Divider.d.ts.map +1 -1
- package/lib/components/Divider/Divider.jsx +2 -1
- package/lib/components/Field/Field.d.ts.map +1 -1
- package/lib/components/Field/Field.jsx +11 -15
- package/lib/components/Icon/Icon.d.ts.map +1 -1
- package/lib/components/Icon/Icon.jsx +4 -3
- package/lib/components/InputButton/InputButton.d.ts +40 -0
- package/lib/components/InputButton/InputButton.d.ts.map +1 -0
- package/lib/components/InputButton/InputButton.jsx +118 -0
- package/lib/components/InputButton/InputButton.namespace.d.ts +2 -0
- package/lib/components/InputButton/InputButton.namespace.d.ts.map +1 -0
- package/lib/components/InputButton/InputButton.namespace.js +16 -0
- package/lib/components/InputButton/index.d.ts +3 -0
- package/lib/components/InputButton/index.d.ts.map +1 -0
- package/lib/components/KeyboardAvoidingScrollView/KeyboardAvoidingScrollView.d.ts.map +1 -1
- package/lib/components/KeyboardAvoidingScrollView/KeyboardAvoidingScrollView.jsx +12 -8
- package/lib/components/List/List.d.ts +51 -0
- package/lib/components/List/List.d.ts.map +1 -0
- package/lib/components/List/List.jsx +176 -0
- package/lib/components/List/List.namespace.d.ts +2 -0
- package/lib/components/List/List.namespace.d.ts.map +1 -0
- package/lib/components/List/List.namespace.js +18 -0
- package/lib/components/List/index.d.ts +3 -0
- package/lib/components/List/index.d.ts.map +1 -0
- package/lib/components/MannerTemp/MannerTemp.d.ts.map +1 -1
- package/lib/components/MannerTemp/MannerTemp.jsx +3 -2
- package/lib/components/MannerTempBadge/MannerTempBadge.d.ts.map +1 -1
- package/lib/components/MannerTempBadge/MannerTempBadge.jsx +2 -1
- package/lib/components/Menu/Menu.d.ts +69 -0
- package/lib/components/Menu/Menu.d.ts.map +1 -0
- package/lib/components/Menu/Menu.jsx +520 -0
- package/lib/components/Menu/Menu.namespace.d.ts +2 -0
- package/lib/components/Menu/Menu.namespace.d.ts.map +1 -0
- package/lib/components/Menu/Menu.namespace.js +21 -0
- package/lib/components/Menu/index.d.ts +3 -0
- package/lib/components/Menu/index.d.ts.map +1 -0
- package/lib/components/NotificationBadge/NotificationBadge.d.ts.map +1 -1
- package/lib/components/NotificationBadge/NotificationBadge.jsx +3 -2
- package/lib/components/PageBanner/PageBanner.d.ts +5 -5
- package/lib/components/PageBanner/PageBanner.d.ts.map +1 -1
- package/lib/components/PageBanner/PageBanner.jsx +25 -14
- package/lib/components/ProgressCircle/ProgressCircle.d.ts +2 -2
- package/lib/components/ProgressCircle/ProgressCircle.d.ts.map +1 -1
- package/lib/components/ProgressCircle/ProgressCircle.jsx +4 -3
- package/lib/components/RadioGroup/RadioGroup.d.ts +5 -3
- package/lib/components/RadioGroup/RadioGroup.d.ts.map +1 -1
- package/lib/components/RadioGroup/RadioGroup.jsx +22 -9
- package/lib/components/ReactionButton/ReactionButton.d.ts +20 -0
- package/lib/components/ReactionButton/ReactionButton.d.ts.map +1 -0
- package/lib/components/ReactionButton/ReactionButton.jsx +88 -0
- package/lib/components/ReactionButton/index.d.ts +2 -0
- package/lib/components/ReactionButton/index.d.ts.map +1 -0
- package/lib/components/ScaleFeedback/ScaleFeedback.d.ts +11 -0
- package/lib/components/ScaleFeedback/ScaleFeedback.d.ts.map +1 -0
- package/lib/components/ScaleFeedback/ScaleFeedback.jsx +16 -0
- package/lib/components/ScaleFeedback/index.d.ts +2 -0
- package/lib/components/ScaleFeedback/index.d.ts.map +1 -0
- package/lib/components/SegmentedControl/SegmentedControl.d.ts +1 -0
- package/lib/components/SegmentedControl/SegmentedControl.d.ts.map +1 -1
- package/lib/components/SegmentedControl/SegmentedControl.jsx +23 -10
- package/lib/components/SelectBox/SelectBox.d.ts.map +1 -1
- package/lib/components/SelectBox/SelectBox.jsx +23 -13
- package/lib/components/Stack/Stack.d.ts.map +1 -1
- package/lib/components/Stack/Stack.jsx +2 -1
- package/lib/components/SwipeableMenuSheet/SwipeableMenuSheet.d.ts +85 -0
- package/lib/components/SwipeableMenuSheet/SwipeableMenuSheet.d.ts.map +1 -0
- package/lib/components/SwipeableMenuSheet/SwipeableMenuSheet.jsx +256 -0
- package/lib/components/SwipeableMenuSheet/SwipeableMenuSheet.namespace.d.ts +2 -0
- package/lib/components/SwipeableMenuSheet/SwipeableMenuSheet.namespace.d.ts.map +1 -0
- package/lib/components/SwipeableMenuSheet/SwipeableMenuSheet.namespace.js +24 -0
- package/lib/components/SwipeableMenuSheet/index.d.ts +3 -0
- package/lib/components/SwipeableMenuSheet/index.d.ts.map +1 -0
- package/lib/components/Switch/Switch.d.ts +27 -3
- package/lib/components/Switch/Switch.d.ts.map +1 -1
- package/lib/components/Switch/Switch.jsx +22 -9
- package/lib/components/Tabs/Tabs.d.ts +4 -2
- package/lib/components/Tabs/Tabs.d.ts.map +1 -1
- package/lib/components/Tabs/Tabs.jsx +37 -22
- package/lib/components/TagGroup/TagGroup.d.ts.map +1 -1
- package/lib/components/TagGroup/TagGroup.jsx +4 -3
- package/lib/components/Text/Text.d.ts.map +1 -1
- package/lib/components/Text/Text.jsx +2 -1
- package/lib/components/TextField/TextField.d.ts.map +1 -1
- package/lib/components/TextField/TextField.jsx +35 -23
- package/lib/components/index.d.ts +7 -0
- package/lib/components/index.d.ts.map +1 -1
- package/lib/components/private/Positioning.d.ts +69 -0
- package/lib/components/private/Positioning.d.ts.map +1 -0
- package/lib/components/private/Positioning.js +109 -0
- package/lib/components/private/TrackPositioning.d.ts +22 -0
- package/lib/components/private/TrackPositioning.d.ts.map +1 -0
- package/lib/contexts/ScaleFeedbackContentContext.d.ts +4 -0
- package/lib/contexts/ScaleFeedbackContentContext.d.ts.map +1 -0
- package/lib/contexts/ScaleFeedbackContentContext.js +6 -0
- package/lib/contexts/index.d.ts +2 -0
- package/lib/contexts/index.d.ts.map +1 -0
- package/lib/hooks/index.d.ts +1 -0
- package/lib/hooks/index.d.ts.map +1 -1
- package/lib/hooks/useIconColor.d.ts.map +1 -1
- package/lib/hooks/useIconColor.js +8 -3
- package/lib/hooks/usePressTap.d.ts +4 -3
- package/lib/hooks/usePressTap.d.ts.map +1 -1
- package/lib/hooks/useScaleFeedback.d.ts +48 -0
- package/lib/hooks/useScaleFeedback.d.ts.map +1 -0
- package/lib/hooks/useScaleFeedback.js +108 -0
- package/lib/index.d.ts +1 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +17 -3
- package/lib/node_modules/.bun/@floating-ui_core@1.8.0/node_modules/@floating-ui/core/dist/floating-ui.core.js +493 -0
- package/lib/node_modules/.bun/@floating-ui_utils@0.2.12/node_modules/@floating-ui/utils/dist/floating-ui.utils.js +114 -0
- package/lib/utils/calculate-scale-feedback.d.ts +5 -0
- package/lib/utils/calculate-scale-feedback.d.ts.map +1 -0
- package/lib/utils/calculate-scale-feedback.js +13 -0
- package/lib/utils/compose-event-handlers.d.ts +5 -0
- package/lib/utils/compose-event-handlers.d.ts.map +1 -0
- package/lib/utils/compose-event-handlers.js +16 -0
- package/lib/utils/create-slot-recipe-context.d.ts.map +1 -1
- package/lib/utils/create-slot-recipe-context.jsx +6 -16
- package/lib/utils/index.d.ts +1 -0
- package/lib/utils/index.d.ts.map +1 -1
- package/lib/utils/merge-props.d.ts +15 -0
- package/lib/utils/merge-props.d.ts.map +1 -0
- package/lib/utils/merge-props.js +36 -0
- package/lib/utils/merge-refs.d.ts +8 -0
- package/lib/utils/merge-refs.d.ts.map +1 -0
- package/lib/utils/merge-refs.js +38 -0
- package/package.json +6 -5
- package/src/components/Accordion/Accordion.tsx +36 -27
- package/src/components/ActionButton/ActionButton.tsx +27 -12
- package/src/components/AppBar/AppBar.tsx +17 -18
- package/src/components/Badge/Badge.tsx +2 -2
- package/src/components/BottomSheet/BottomSheet.tsx +9 -17
- package/src/components/Box/Box.tsx +2 -2
- package/src/components/Callout/Callout.tsx +39 -22
- package/src/components/Checkbox/Checkbox.test.tsx +44 -0
- package/src/components/Checkbox/Checkbox.tsx +52 -21
- package/src/components/Chip/Chip.test.tsx +50 -1
- package/src/components/Chip/Chip.tsx +75 -31
- package/src/components/Count/Count.tsx +35 -0
- package/src/components/Count/index.ts +1 -0
- package/src/components/Divider/Divider.tsx +2 -2
- package/src/components/Field/Field.tsx +15 -28
- package/src/components/Icon/Icon.test.tsx +4 -6
- package/src/components/Icon/Icon.tsx +14 -7
- package/src/components/InputButton/InputButton.namespace.ts +20 -0
- package/src/components/InputButton/InputButton.test.tsx +82 -0
- package/src/components/InputButton/InputButton.tsx +295 -0
- package/src/components/InputButton/index.ts +2 -0
- package/src/components/KeyboardAvoidingScrollView/KeyboardAvoidingScrollView.tsx +16 -21
- package/src/components/List/List.namespace.ts +24 -0
- package/src/components/List/List.test.tsx +162 -0
- package/src/components/List/List.tsx +476 -0
- package/src/components/List/index.ts +3 -0
- package/src/components/MannerTemp/MannerTemp.tsx +3 -4
- package/src/components/MannerTempBadge/MannerTempBadge.tsx +2 -2
- package/src/components/Menu/Menu.namespace.ts +26 -0
- package/src/components/Menu/Menu.tsx +883 -0
- package/src/components/Menu/index.ts +31 -0
- package/src/components/NotificationBadge/NotificationBadge.tsx +4 -9
- package/src/components/PageBanner/PageBanner.test.tsx +3 -0
- package/src/components/PageBanner/PageBanner.tsx +54 -45
- package/src/components/ProgressCircle/ProgressCircle.test.tsx +48 -0
- package/src/components/ProgressCircle/ProgressCircle.tsx +22 -3
- package/src/components/RadioGroup/RadioGroup.test.tsx +87 -0
- package/src/components/RadioGroup/RadioGroup.tsx +50 -14
- package/src/components/ReactionButton/ReactionButton.test.tsx +122 -0
- package/src/components/ReactionButton/ReactionButton.tsx +139 -0
- package/src/components/ReactionButton/index.ts +1 -0
- package/src/components/ScaleFeedback/ScaleFeedback.test.tsx +41 -0
- package/src/components/ScaleFeedback/ScaleFeedback.tsx +32 -0
- package/src/components/ScaleFeedback/index.ts +1 -0
- package/src/components/SegmentedControl/SegmentedControl.test.tsx +15 -3
- package/src/components/SegmentedControl/SegmentedControl.tsx +35 -14
- package/src/components/SelectBox/SelectBox.test.tsx +39 -1
- package/src/components/SelectBox/SelectBox.tsx +27 -16
- package/src/components/Stack/Stack.tsx +2 -2
- package/src/components/SwipeableMenuSheet/SwipeableMenuSheet.namespace.ts +37 -0
- package/src/components/SwipeableMenuSheet/SwipeableMenuSheet.test.tsx +258 -0
- package/src/components/SwipeableMenuSheet/SwipeableMenuSheet.tsx +655 -0
- package/src/components/SwipeableMenuSheet/index.ts +43 -0
- package/src/components/Switch/Switch.test.tsx +57 -0
- package/src/components/Switch/Switch.tsx +60 -16
- package/src/components/Tabs/Tabs.test.tsx +19 -0
- package/src/components/Tabs/Tabs.tsx +72 -40
- package/src/components/TagGroup/TagGroup.tsx +4 -6
- package/src/components/Text/Text.tsx +2 -2
- package/src/components/TextField/TextField.tsx +60 -54
- package/src/components/index.ts +7 -0
- package/src/components/private/Positioning.test.ts +235 -0
- package/src/components/private/Positioning.ts +223 -0
- package/src/components/private/TrackPositioning.test.ts +58 -0
- package/src/components/private/TrackPositioning.ts +37 -0
- package/src/contexts/ScaleFeedbackContentContext.ts +4 -0
- package/src/contexts/index.ts +1 -0
- package/src/hooks/index.ts +1 -0
- package/src/hooks/useIconColor.test.ts +4 -4
- package/src/hooks/useIconColor.ts +13 -6
- package/src/hooks/usePressTap.ts +4 -3
- package/src/hooks/useScaleFeedback.integration.test.tsx +85 -0
- package/src/hooks/useScaleFeedback.test.ts +50 -0
- package/src/hooks/useScaleFeedback.ts +199 -0
- package/src/index.ts +1 -0
- package/src/utils/calculate-scale-feedback.ts +12 -0
- package/src/utils/compose-event-handlers.ts +16 -0
- package/src/utils/create-slot-recipe-context.tsx +6 -7
- package/src/utils/index.ts +1 -0
- package/src/utils/merge-props.test.tsx +152 -0
- package/src/utils/merge-props.ts +62 -0
- package/src/utils/merge-refs.ts +44 -0
|
@@ -0,0 +1,655 @@
|
|
|
1
|
+
import { menuSheet } from "@seed-design/lynx-css/recipes/menu-sheet";
|
|
2
|
+
import type { MenuSheetVariantProps } from "@seed-design/lynx-css/recipes/menu-sheet";
|
|
3
|
+
import { menuSheetItem } from "@seed-design/lynx-css/recipes/menu-sheet-item";
|
|
4
|
+
import type { MenuSheetItemVariantProps } from "@seed-design/lynx-css/recipes/menu-sheet-item";
|
|
5
|
+
import * as React from "@lynx-js/react";
|
|
6
|
+
import { forwardRef, isValidElement } from "@lynx-js/react";
|
|
7
|
+
import type { ForwardRefExoticComponent, PropsWithoutRef, RefAttributes } from "@lynx-js/react";
|
|
8
|
+
import clsx from "clsx";
|
|
9
|
+
|
|
10
|
+
import { usePressTap } from "../../hooks/usePressTap";
|
|
11
|
+
import { useSafeArea } from "../../hooks/useSafeArea";
|
|
12
|
+
import type {
|
|
13
|
+
LynxAccessibilityProps,
|
|
14
|
+
LynxPressableProps,
|
|
15
|
+
LynxStyledElementProps,
|
|
16
|
+
LynxTextRef,
|
|
17
|
+
LynxViewRef,
|
|
18
|
+
} from "../../types";
|
|
19
|
+
import { createSlotRecipeContext } from "../../utils/create-slot-recipe-context";
|
|
20
|
+
import { toArray } from "../../utils/children";
|
|
21
|
+
import {
|
|
22
|
+
BottomSheetBackdrop,
|
|
23
|
+
BottomSheetContent,
|
|
24
|
+
BottomSheetHandle,
|
|
25
|
+
BottomSheetPositioner,
|
|
26
|
+
BottomSheetRoot,
|
|
27
|
+
type BottomSheetBackdropProps,
|
|
28
|
+
type BottomSheetContentProps,
|
|
29
|
+
type BottomSheetHandleProps,
|
|
30
|
+
type BottomSheetPositionerProps,
|
|
31
|
+
type BottomSheetRootProps,
|
|
32
|
+
type BottomSheetRootRef,
|
|
33
|
+
} from "../BottomSheet/BottomSheet";
|
|
34
|
+
import { IconSlotProvider } from "../Icon/Icon";
|
|
35
|
+
|
|
36
|
+
type LynxForwardRefComponent<T, P> = ForwardRefExoticComponent<
|
|
37
|
+
PropsWithoutRef<P> & RefAttributes<T>
|
|
38
|
+
>;
|
|
39
|
+
|
|
40
|
+
interface SwipeableMenuSheetClassNames {
|
|
41
|
+
positioner: string;
|
|
42
|
+
backdrop: string;
|
|
43
|
+
content: string;
|
|
44
|
+
contentInner: string;
|
|
45
|
+
header: string;
|
|
46
|
+
title: string;
|
|
47
|
+
description: string;
|
|
48
|
+
list: string;
|
|
49
|
+
group: string;
|
|
50
|
+
footer: string;
|
|
51
|
+
closeButton: string;
|
|
52
|
+
closeButtonLabel: string;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
interface SwipeableMenuSheetItemClassNames {
|
|
56
|
+
root: string;
|
|
57
|
+
content: string;
|
|
58
|
+
label: string;
|
|
59
|
+
description: string;
|
|
60
|
+
prefixIcon: string;
|
|
61
|
+
divider: string;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const { ClassNamesProvider, useClassNames } = createSlotRecipeContext(menuSheet);
|
|
65
|
+
// Keep this concrete: Lynx drops the entire calc when this token remains a var() reference.
|
|
66
|
+
const CONTENT_PADDING_BOTTOM = "16px";
|
|
67
|
+
|
|
68
|
+
export type SwipeableMenuSheetCloseReason = "trigger" | "closeButton" | "interactOutside" | "drag";
|
|
69
|
+
|
|
70
|
+
export interface SwipeableMenuSheetOpenChangeDetails {
|
|
71
|
+
reason: SwipeableMenuSheetCloseReason;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
interface SwipeableMenuSheetContextValue {
|
|
75
|
+
rootRef: React.RefObject<BottomSheetRootRef | null>;
|
|
76
|
+
skipAnimation: boolean;
|
|
77
|
+
setPendingReason: (reason: SwipeableMenuSheetCloseReason) => void;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const SwipeableMenuSheetContext = React.createContext<SwipeableMenuSheetContextValue | null>(null);
|
|
81
|
+
const ContentLabelAlignContext = React.createContext<SwipeableMenuSheetLabelAlign | undefined>(
|
|
82
|
+
undefined,
|
|
83
|
+
);
|
|
84
|
+
const GroupLabelAlignContext = React.createContext<SwipeableMenuSheetLabelAlign | undefined>(
|
|
85
|
+
undefined,
|
|
86
|
+
);
|
|
87
|
+
const SwipeableMenuSheetItemPositionContext = React.createContext({ isLast: true });
|
|
88
|
+
|
|
89
|
+
function useSwipeableMenuSheetContext(): SwipeableMenuSheetContextValue {
|
|
90
|
+
const context = React.useContext(SwipeableMenuSheetContext);
|
|
91
|
+
if (!context) {
|
|
92
|
+
throw new Error(
|
|
93
|
+
"SwipeableMenuSheet compound components must be used within SwipeableMenuSheetRoot.",
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
return context;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function closeSheet(
|
|
100
|
+
rootRef: React.RefObject<BottomSheetRootRef | null>,
|
|
101
|
+
skipAnimation: boolean,
|
|
102
|
+
): void {
|
|
103
|
+
if (skipAnimation) {
|
|
104
|
+
rootRef.current?.close({ animate: false });
|
|
105
|
+
} else {
|
|
106
|
+
rootRef.current?.close();
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export type SwipeableMenuSheetRootRef = BottomSheetRootRef;
|
|
111
|
+
|
|
112
|
+
export interface SwipeableMenuSheetRootProps
|
|
113
|
+
extends Omit<
|
|
114
|
+
BottomSheetRootProps,
|
|
115
|
+
| "open"
|
|
116
|
+
| "defaultOpen"
|
|
117
|
+
| "onOpenChange"
|
|
118
|
+
| "side"
|
|
119
|
+
| "snapPoints"
|
|
120
|
+
| "headerAlign"
|
|
121
|
+
| "skipAnimation"
|
|
122
|
+
>,
|
|
123
|
+
Omit<MenuSheetVariantProps, "closeButtonPressed"> {
|
|
124
|
+
open?: boolean;
|
|
125
|
+
defaultOpen?: boolean;
|
|
126
|
+
onOpenChange?: (open: boolean, details: SwipeableMenuSheetOpenChangeDetails) => void;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* A bottom-only, fit-height menu sheet backed by the Lynx BottomSheet engine.
|
|
131
|
+
*/
|
|
132
|
+
export const SwipeableMenuSheetRoot: LynxForwardRefComponent<
|
|
133
|
+
BottomSheetRootRef,
|
|
134
|
+
SwipeableMenuSheetRootProps
|
|
135
|
+
> = forwardRef<BottomSheetRootRef, SwipeableMenuSheetRootProps>((props, forwardedRef) => {
|
|
136
|
+
const [variantProps, restProps] = menuSheet.splitVariantProps(props);
|
|
137
|
+
const { open, defaultOpen, onOpenChange, children, ...nativeProps } = restProps;
|
|
138
|
+
const skipAnimation = variantProps.skipAnimation === true;
|
|
139
|
+
const internalRef = React.useRef<BottomSheetRootRef | null>(null);
|
|
140
|
+
const pendingReasonRef = React.useRef<SwipeableMenuSheetCloseReason | null>(null);
|
|
141
|
+
|
|
142
|
+
const mergedRef = React.useCallback(
|
|
143
|
+
(value: BottomSheetRootRef | null) => {
|
|
144
|
+
internalRef.current = value;
|
|
145
|
+
if (typeof forwardedRef === "function") {
|
|
146
|
+
forwardedRef(value);
|
|
147
|
+
} else if (forwardedRef) {
|
|
148
|
+
forwardedRef.current = value;
|
|
149
|
+
}
|
|
150
|
+
},
|
|
151
|
+
[forwardedRef],
|
|
152
|
+
);
|
|
153
|
+
const setPendingReason = React.useCallback((reason: SwipeableMenuSheetCloseReason) => {
|
|
154
|
+
pendingReasonRef.current = reason;
|
|
155
|
+
}, []);
|
|
156
|
+
const handleShowChange = React.useCallback(
|
|
157
|
+
(nextOpen: boolean) => {
|
|
158
|
+
const reason = pendingReasonRef.current ?? "drag";
|
|
159
|
+
pendingReasonRef.current = null;
|
|
160
|
+
onOpenChange?.(nextOpen, { reason });
|
|
161
|
+
},
|
|
162
|
+
[onOpenChange],
|
|
163
|
+
);
|
|
164
|
+
const classNames = React.useMemo(() => menuSheet({ skipAnimation }), [skipAnimation]);
|
|
165
|
+
const context = React.useMemo<SwipeableMenuSheetContextValue>(
|
|
166
|
+
() => ({ rootRef: internalRef, skipAnimation, setPendingReason }),
|
|
167
|
+
[setPendingReason, skipAnimation],
|
|
168
|
+
);
|
|
169
|
+
|
|
170
|
+
return (
|
|
171
|
+
<SwipeableMenuSheetContext.Provider value={context}>
|
|
172
|
+
<ClassNamesProvider value={classNames}>
|
|
173
|
+
<BottomSheetRoot
|
|
174
|
+
{...nativeProps}
|
|
175
|
+
ref={mergedRef}
|
|
176
|
+
open={open}
|
|
177
|
+
defaultOpen={defaultOpen}
|
|
178
|
+
side="bottom"
|
|
179
|
+
snapPoints={["fit"]}
|
|
180
|
+
skipAnimation={skipAnimation}
|
|
181
|
+
onOpenChange={handleShowChange}
|
|
182
|
+
>
|
|
183
|
+
{children}
|
|
184
|
+
</BottomSheetRoot>
|
|
185
|
+
</ClassNamesProvider>
|
|
186
|
+
</SwipeableMenuSheetContext.Provider>
|
|
187
|
+
);
|
|
188
|
+
});
|
|
189
|
+
SwipeableMenuSheetRoot.displayName = "SwipeableMenuSheetRoot";
|
|
190
|
+
|
|
191
|
+
export interface SwipeableMenuSheetTriggerProps
|
|
192
|
+
extends LynxStyledElementProps,
|
|
193
|
+
LynxAccessibilityProps,
|
|
194
|
+
Pick<LynxPressableProps, "bindtap"> {}
|
|
195
|
+
|
|
196
|
+
export const SwipeableMenuSheetTrigger: LynxForwardRefComponent<
|
|
197
|
+
unknown,
|
|
198
|
+
SwipeableMenuSheetTriggerProps
|
|
199
|
+
> = forwardRef<unknown, SwipeableMenuSheetTriggerProps>((props, ref) => {
|
|
200
|
+
const {
|
|
201
|
+
children,
|
|
202
|
+
className,
|
|
203
|
+
style,
|
|
204
|
+
bindtap: userBindtap,
|
|
205
|
+
"accessibility-element": accessibilityElement = true,
|
|
206
|
+
"accessibility-label": accessibilityLabel,
|
|
207
|
+
"accessibility-role-description": accessibilityRoleDescription = "button",
|
|
208
|
+
"accessibility-traits": accessibilityTraits,
|
|
209
|
+
"accessibility-value": accessibilityValue,
|
|
210
|
+
"accessibility-elements-hidden": accessibilityElementsHidden,
|
|
211
|
+
"accessibility-heading": accessibilityHeading,
|
|
212
|
+
"accessibility-actions": accessibilityActions,
|
|
213
|
+
"accessibility-exclusive-focus": accessibilityExclusiveFocus,
|
|
214
|
+
"ios-platform-accessibility-id": iosPlatformAccessibilityId,
|
|
215
|
+
} = props;
|
|
216
|
+
const { rootRef, setPendingReason, skipAnimation } = useSwipeableMenuSheetContext();
|
|
217
|
+
|
|
218
|
+
const handleTap: NonNullable<LynxPressableProps["bindtap"]> = (event, instance) => {
|
|
219
|
+
setPendingReason("trigger");
|
|
220
|
+
if (skipAnimation) {
|
|
221
|
+
rootRef.current?.open({ animate: false });
|
|
222
|
+
} else {
|
|
223
|
+
rootRef.current?.open();
|
|
224
|
+
}
|
|
225
|
+
userBindtap?.(event, instance);
|
|
226
|
+
};
|
|
227
|
+
|
|
228
|
+
return (
|
|
229
|
+
<view
|
|
230
|
+
{...(ref ? ({ ref: ref as LynxViewRef } as Record<string, unknown>) : {})}
|
|
231
|
+
bindtap={handleTap}
|
|
232
|
+
className={className}
|
|
233
|
+
style={style as never}
|
|
234
|
+
accessibility-element={accessibilityElement}
|
|
235
|
+
accessibility-label={accessibilityLabel}
|
|
236
|
+
accessibility-role-description={accessibilityRoleDescription}
|
|
237
|
+
accessibility-traits={accessibilityTraits}
|
|
238
|
+
accessibility-value={accessibilityValue}
|
|
239
|
+
accessibility-elements-hidden={accessibilityElementsHidden}
|
|
240
|
+
accessibility-heading={accessibilityHeading}
|
|
241
|
+
accessibility-actions={accessibilityActions}
|
|
242
|
+
accessibility-exclusive-focus={accessibilityExclusiveFocus}
|
|
243
|
+
ios-platform-accessibility-id={iosPlatformAccessibilityId}
|
|
244
|
+
>
|
|
245
|
+
{children}
|
|
246
|
+
</view>
|
|
247
|
+
);
|
|
248
|
+
});
|
|
249
|
+
SwipeableMenuSheetTrigger.displayName = "SwipeableMenuSheetTrigger";
|
|
250
|
+
|
|
251
|
+
export interface SwipeableMenuSheetPositionerProps extends BottomSheetPositionerProps {}
|
|
252
|
+
|
|
253
|
+
export const SwipeableMenuSheetPositioner: LynxForwardRefComponent<
|
|
254
|
+
unknown,
|
|
255
|
+
SwipeableMenuSheetPositionerProps
|
|
256
|
+
> = forwardRef<unknown, SwipeableMenuSheetPositionerProps>((props, ref) => {
|
|
257
|
+
const classNames = useClassNames();
|
|
258
|
+
|
|
259
|
+
return (
|
|
260
|
+
<BottomSheetPositioner
|
|
261
|
+
{...(ref ? { ref } : {})}
|
|
262
|
+
{...props}
|
|
263
|
+
className={clsx(classNames.positioner, props.className)}
|
|
264
|
+
/>
|
|
265
|
+
);
|
|
266
|
+
});
|
|
267
|
+
SwipeableMenuSheetPositioner.displayName = "SwipeableMenuSheetPositioner";
|
|
268
|
+
|
|
269
|
+
export interface SwipeableMenuSheetBackdropProps extends BottomSheetBackdropProps {}
|
|
270
|
+
|
|
271
|
+
export function SwipeableMenuSheetBackdrop(props: SwipeableMenuSheetBackdropProps) {
|
|
272
|
+
const { children, className, clickToClose = true, onClick: userOnClick, ...nativeProps } = props;
|
|
273
|
+
const classNames = useClassNames();
|
|
274
|
+
const { rootRef, setPendingReason, skipAnimation } = useSwipeableMenuSheetContext();
|
|
275
|
+
const handleClick = React.useCallback(() => {
|
|
276
|
+
if (clickToClose) {
|
|
277
|
+
setPendingReason("interactOutside");
|
|
278
|
+
closeSheet(rootRef, skipAnimation);
|
|
279
|
+
}
|
|
280
|
+
userOnClick?.();
|
|
281
|
+
}, [clickToClose, rootRef, setPendingReason, skipAnimation, userOnClick]);
|
|
282
|
+
|
|
283
|
+
return (
|
|
284
|
+
<BottomSheetBackdrop
|
|
285
|
+
{...nativeProps}
|
|
286
|
+
className={clsx(classNames.backdrop, className)}
|
|
287
|
+
clickToClose={false}
|
|
288
|
+
onClick={handleClick}
|
|
289
|
+
>
|
|
290
|
+
{children}
|
|
291
|
+
</BottomSheetBackdrop>
|
|
292
|
+
);
|
|
293
|
+
}
|
|
294
|
+
SwipeableMenuSheetBackdrop.displayName = "SwipeableMenuSheetBackdrop";
|
|
295
|
+
|
|
296
|
+
export interface SwipeableMenuSheetContentProps
|
|
297
|
+
extends BottomSheetContentProps,
|
|
298
|
+
LynxAccessibilityProps {
|
|
299
|
+
labelAlign?: SwipeableMenuSheetLabelAlign;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
export const SwipeableMenuSheetContent: LynxForwardRefComponent<
|
|
303
|
+
unknown,
|
|
304
|
+
SwipeableMenuSheetContentProps
|
|
305
|
+
> = forwardRef<unknown, SwipeableMenuSheetContentProps>((props, ref) => {
|
|
306
|
+
const { children, className, innerClassName, innerStyle, labelAlign, ...contentProps } = props;
|
|
307
|
+
const classNames = useClassNames();
|
|
308
|
+
const { safeAreaInsetBottom } = useSafeArea();
|
|
309
|
+
|
|
310
|
+
return (
|
|
311
|
+
<ContentLabelAlignContext.Provider value={labelAlign}>
|
|
312
|
+
<BottomSheetContent
|
|
313
|
+
{...(ref ? { ref } : {})}
|
|
314
|
+
{...contentProps}
|
|
315
|
+
className={clsx(classNames.content, className)}
|
|
316
|
+
innerClassName={clsx(classNames.contentInner, innerClassName)}
|
|
317
|
+
innerStyle={
|
|
318
|
+
{
|
|
319
|
+
paddingBottom: `calc(${CONTENT_PADDING_BOTTOM} + ${safeAreaInsetBottom})`,
|
|
320
|
+
...innerStyle,
|
|
321
|
+
} as BottomSheetContentProps["innerStyle"]
|
|
322
|
+
}
|
|
323
|
+
>
|
|
324
|
+
{children}
|
|
325
|
+
</BottomSheetContent>
|
|
326
|
+
</ContentLabelAlignContext.Provider>
|
|
327
|
+
);
|
|
328
|
+
});
|
|
329
|
+
SwipeableMenuSheetContent.displayName = "SwipeableMenuSheetContent";
|
|
330
|
+
|
|
331
|
+
export interface SwipeableMenuSheetHandleProps extends BottomSheetHandleProps {}
|
|
332
|
+
|
|
333
|
+
export function SwipeableMenuSheetHandle(props: SwipeableMenuSheetHandleProps) {
|
|
334
|
+
return <BottomSheetHandle {...props} />;
|
|
335
|
+
}
|
|
336
|
+
SwipeableMenuSheetHandle.displayName = "SwipeableMenuSheetHandle";
|
|
337
|
+
|
|
338
|
+
export interface SwipeableMenuSheetSlotProps extends LynxStyledElementProps {}
|
|
339
|
+
|
|
340
|
+
function createViewSlot(
|
|
341
|
+
slotName: keyof SwipeableMenuSheetClassNames,
|
|
342
|
+
): LynxForwardRefComponent<unknown, SwipeableMenuSheetSlotProps> {
|
|
343
|
+
return forwardRef<unknown, SwipeableMenuSheetSlotProps>((props, ref) => {
|
|
344
|
+
const { children, className, style } = props;
|
|
345
|
+
const classNames = useClassNames();
|
|
346
|
+
|
|
347
|
+
return (
|
|
348
|
+
<view
|
|
349
|
+
{...(ref ? ({ ref: ref as LynxViewRef } as Record<string, unknown>) : {})}
|
|
350
|
+
className={clsx(classNames[slotName], className)}
|
|
351
|
+
style={style as never}
|
|
352
|
+
>
|
|
353
|
+
{children}
|
|
354
|
+
</view>
|
|
355
|
+
);
|
|
356
|
+
});
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
function createTextSlot(
|
|
360
|
+
slotName: keyof SwipeableMenuSheetClassNames,
|
|
361
|
+
): LynxForwardRefComponent<unknown, SwipeableMenuSheetSlotProps> {
|
|
362
|
+
return forwardRef<unknown, SwipeableMenuSheetSlotProps>((props, ref) => {
|
|
363
|
+
const { children, className, style } = props;
|
|
364
|
+
const classNames = useClassNames();
|
|
365
|
+
|
|
366
|
+
return (
|
|
367
|
+
<text
|
|
368
|
+
{...(ref ? ({ ref: ref as LynxTextRef } as Record<string, unknown>) : {})}
|
|
369
|
+
className={clsx(classNames[slotName], className)}
|
|
370
|
+
style={style as never}
|
|
371
|
+
>
|
|
372
|
+
{children}
|
|
373
|
+
</text>
|
|
374
|
+
);
|
|
375
|
+
});
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
export interface SwipeableMenuSheetHeaderProps extends SwipeableMenuSheetSlotProps {}
|
|
379
|
+
export const SwipeableMenuSheetHeader = createViewSlot("header");
|
|
380
|
+
SwipeableMenuSheetHeader.displayName = "SwipeableMenuSheetHeader";
|
|
381
|
+
|
|
382
|
+
export interface SwipeableMenuSheetTitleProps extends SwipeableMenuSheetSlotProps {}
|
|
383
|
+
export const SwipeableMenuSheetTitle = createTextSlot("title");
|
|
384
|
+
SwipeableMenuSheetTitle.displayName = "SwipeableMenuSheetTitle";
|
|
385
|
+
|
|
386
|
+
export interface SwipeableMenuSheetDescriptionProps extends SwipeableMenuSheetSlotProps {}
|
|
387
|
+
export const SwipeableMenuSheetDescription = createTextSlot("description");
|
|
388
|
+
SwipeableMenuSheetDescription.displayName = "SwipeableMenuSheetDescription";
|
|
389
|
+
|
|
390
|
+
export interface SwipeableMenuSheetListProps extends SwipeableMenuSheetSlotProps {}
|
|
391
|
+
export const SwipeableMenuSheetList = createViewSlot("list");
|
|
392
|
+
SwipeableMenuSheetList.displayName = "SwipeableMenuSheetList";
|
|
393
|
+
|
|
394
|
+
export type SwipeableMenuSheetLabelAlign = "left" | "center";
|
|
395
|
+
|
|
396
|
+
export interface SwipeableMenuSheetGroupProps extends SwipeableMenuSheetSlotProps {
|
|
397
|
+
labelAlign?: SwipeableMenuSheetLabelAlign;
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
export const SwipeableMenuSheetGroup: LynxForwardRefComponent<
|
|
401
|
+
unknown,
|
|
402
|
+
SwipeableMenuSheetGroupProps
|
|
403
|
+
> = forwardRef<unknown, SwipeableMenuSheetGroupProps>((props, ref) => {
|
|
404
|
+
const { children, className, style, labelAlign } = props;
|
|
405
|
+
const classNames = useClassNames();
|
|
406
|
+
const contentLabelAlign = React.useContext(ContentLabelAlignContext);
|
|
407
|
+
const resolvedLabelAlign = labelAlign ?? contentLabelAlign;
|
|
408
|
+
const items = toArray(children);
|
|
409
|
+
|
|
410
|
+
return (
|
|
411
|
+
<GroupLabelAlignContext.Provider value={resolvedLabelAlign}>
|
|
412
|
+
<view
|
|
413
|
+
{...(ref ? ({ ref: ref as LynxViewRef } as Record<string, unknown>) : {})}
|
|
414
|
+
className={clsx(classNames.group, className)}
|
|
415
|
+
style={style as never}
|
|
416
|
+
>
|
|
417
|
+
{items.map((item, index) => (
|
|
418
|
+
<SwipeableMenuSheetItemPositionContext.Provider
|
|
419
|
+
key={isValidElement(item) ? (item.key ?? index) : index}
|
|
420
|
+
value={{ isLast: index === items.length - 1 }}
|
|
421
|
+
>
|
|
422
|
+
{item}
|
|
423
|
+
</SwipeableMenuSheetItemPositionContext.Provider>
|
|
424
|
+
))}
|
|
425
|
+
</view>
|
|
426
|
+
</GroupLabelAlignContext.Provider>
|
|
427
|
+
);
|
|
428
|
+
});
|
|
429
|
+
SwipeableMenuSheetGroup.displayName = "SwipeableMenuSheetGroup";
|
|
430
|
+
|
|
431
|
+
export interface SwipeableMenuSheetFooterProps extends SwipeableMenuSheetSlotProps {}
|
|
432
|
+
export const SwipeableMenuSheetFooter = createViewSlot("footer");
|
|
433
|
+
SwipeableMenuSheetFooter.displayName = "SwipeableMenuSheetFooter";
|
|
434
|
+
|
|
435
|
+
export interface SwipeableMenuSheetCloseButtonProps
|
|
436
|
+
extends LynxStyledElementProps,
|
|
437
|
+
LynxAccessibilityProps,
|
|
438
|
+
LynxPressableProps {}
|
|
439
|
+
|
|
440
|
+
export const SwipeableMenuSheetCloseButton: LynxForwardRefComponent<
|
|
441
|
+
unknown,
|
|
442
|
+
SwipeableMenuSheetCloseButtonProps
|
|
443
|
+
> = forwardRef<unknown, SwipeableMenuSheetCloseButtonProps>((props, ref) => {
|
|
444
|
+
const {
|
|
445
|
+
children,
|
|
446
|
+
className,
|
|
447
|
+
style,
|
|
448
|
+
bindtap: userBindtap,
|
|
449
|
+
"main-thread:bindtap": userMainThreadBindtap,
|
|
450
|
+
"accessibility-element": accessibilityElement = true,
|
|
451
|
+
"accessibility-label": accessibilityLabel = "Close",
|
|
452
|
+
"accessibility-role-description": accessibilityRoleDescription = "button",
|
|
453
|
+
"accessibility-traits": accessibilityTraits,
|
|
454
|
+
"accessibility-value": accessibilityValue,
|
|
455
|
+
"accessibility-elements-hidden": accessibilityElementsHidden,
|
|
456
|
+
"accessibility-heading": accessibilityHeading,
|
|
457
|
+
"accessibility-actions": accessibilityActions,
|
|
458
|
+
"accessibility-exclusive-focus": accessibilityExclusiveFocus,
|
|
459
|
+
"ios-platform-accessibility-id": iosPlatformAccessibilityId,
|
|
460
|
+
} = props;
|
|
461
|
+
const { rootRef, setPendingReason, skipAnimation } = useSwipeableMenuSheetContext();
|
|
462
|
+
const handleTap = React.useCallback<NonNullable<LynxPressableProps["bindtap"]>>(
|
|
463
|
+
(event, instance) => {
|
|
464
|
+
setPendingReason("closeButton");
|
|
465
|
+
closeSheet(rootRef, skipAnimation);
|
|
466
|
+
userBindtap?.(event, instance);
|
|
467
|
+
},
|
|
468
|
+
[rootRef, setPendingReason, skipAnimation, userBindtap],
|
|
469
|
+
);
|
|
470
|
+
const { pressed, ...pressHandlers } = usePressTap({
|
|
471
|
+
onTap: handleTap,
|
|
472
|
+
mainThreadOnTap: userMainThreadBindtap,
|
|
473
|
+
});
|
|
474
|
+
const classNames = menuSheet({ skipAnimation, closeButtonPressed: pressed });
|
|
475
|
+
|
|
476
|
+
return (
|
|
477
|
+
<view
|
|
478
|
+
{...(ref ? ({ ref: ref as LynxViewRef } as Record<string, unknown>) : {})}
|
|
479
|
+
{...pressHandlers}
|
|
480
|
+
className={clsx(classNames.closeButton, className)}
|
|
481
|
+
style={style as never}
|
|
482
|
+
accessibility-element={accessibilityElement}
|
|
483
|
+
accessibility-label={accessibilityLabel}
|
|
484
|
+
accessibility-role-description={accessibilityRoleDescription}
|
|
485
|
+
accessibility-traits={accessibilityTraits}
|
|
486
|
+
accessibility-value={accessibilityValue}
|
|
487
|
+
accessibility-elements-hidden={accessibilityElementsHidden}
|
|
488
|
+
accessibility-heading={accessibilityHeading}
|
|
489
|
+
accessibility-actions={accessibilityActions}
|
|
490
|
+
accessibility-exclusive-focus={accessibilityExclusiveFocus}
|
|
491
|
+
ios-platform-accessibility-id={iosPlatformAccessibilityId}
|
|
492
|
+
>
|
|
493
|
+
<text className={classNames.closeButtonLabel}>{children}</text>
|
|
494
|
+
</view>
|
|
495
|
+
);
|
|
496
|
+
});
|
|
497
|
+
SwipeableMenuSheetCloseButton.displayName = "SwipeableMenuSheetCloseButton";
|
|
498
|
+
|
|
499
|
+
export type SwipeableMenuSheetItemTone = NonNullable<MenuSheetItemVariantProps["tone"]>;
|
|
500
|
+
|
|
501
|
+
export interface SwipeableMenuSheetItemProps
|
|
502
|
+
extends LynxStyledElementProps,
|
|
503
|
+
LynxAccessibilityProps,
|
|
504
|
+
LynxPressableProps {
|
|
505
|
+
tone?: SwipeableMenuSheetItemTone;
|
|
506
|
+
labelAlign?: SwipeableMenuSheetLabelAlign;
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
interface SwipeableMenuSheetItemContextValue {
|
|
510
|
+
classNames: SwipeableMenuSheetItemClassNames;
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
const SwipeableMenuSheetItemContext =
|
|
514
|
+
React.createContext<SwipeableMenuSheetItemContextValue | null>(null);
|
|
515
|
+
|
|
516
|
+
function useSwipeableMenuSheetItemContext(): SwipeableMenuSheetItemContextValue {
|
|
517
|
+
const context = React.useContext(SwipeableMenuSheetItemContext);
|
|
518
|
+
if (!context) {
|
|
519
|
+
throw new Error("SwipeableMenuSheet item slots must be used within SwipeableMenuSheetItem.");
|
|
520
|
+
}
|
|
521
|
+
return context;
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
export const SwipeableMenuSheetItem: LynxForwardRefComponent<unknown, SwipeableMenuSheetItemProps> =
|
|
525
|
+
forwardRef<unknown, SwipeableMenuSheetItemProps>((props, ref) => {
|
|
526
|
+
const {
|
|
527
|
+
children,
|
|
528
|
+
className,
|
|
529
|
+
style,
|
|
530
|
+
tone = "neutral",
|
|
531
|
+
labelAlign,
|
|
532
|
+
bindtap: userBindtap,
|
|
533
|
+
"main-thread:bindtap": userMainThreadBindtap,
|
|
534
|
+
"accessibility-element": accessibilityElement = true,
|
|
535
|
+
"accessibility-role-description": accessibilityRoleDescription = "button",
|
|
536
|
+
"accessibility-label": accessibilityLabel,
|
|
537
|
+
"accessibility-traits": accessibilityTraits,
|
|
538
|
+
"accessibility-value": accessibilityValue,
|
|
539
|
+
"accessibility-elements-hidden": accessibilityElementsHidden,
|
|
540
|
+
"accessibility-heading": accessibilityHeading,
|
|
541
|
+
"accessibility-actions": accessibilityActions,
|
|
542
|
+
"accessibility-exclusive-focus": accessibilityExclusiveFocus,
|
|
543
|
+
"ios-platform-accessibility-id": iosPlatformAccessibilityId,
|
|
544
|
+
} = props;
|
|
545
|
+
const groupLabelAlign = React.useContext(GroupLabelAlignContext);
|
|
546
|
+
const contentLabelAlign = React.useContext(ContentLabelAlignContext);
|
|
547
|
+
const { isLast } = React.useContext(SwipeableMenuSheetItemPositionContext);
|
|
548
|
+
const resolvedLabelAlign = labelAlign ?? groupLabelAlign ?? contentLabelAlign ?? "left";
|
|
549
|
+
const { pressed, ...pressHandlers } = usePressTap({
|
|
550
|
+
onTap: userBindtap,
|
|
551
|
+
mainThreadOnTap: userMainThreadBindtap,
|
|
552
|
+
});
|
|
553
|
+
const classNames = menuSheetItem({ tone, labelAlign: resolvedLabelAlign, pressed });
|
|
554
|
+
const itemContext = React.useMemo<SwipeableMenuSheetItemContextValue>(
|
|
555
|
+
() => ({ classNames }),
|
|
556
|
+
[classNames],
|
|
557
|
+
);
|
|
558
|
+
|
|
559
|
+
return (
|
|
560
|
+
<SwipeableMenuSheetItemContext.Provider value={itemContext}>
|
|
561
|
+
<IconSlotProvider
|
|
562
|
+
value={{
|
|
563
|
+
classNames: { prefixIcon: classNames.prefixIcon },
|
|
564
|
+
deps: [tone, resolvedLabelAlign, pressed],
|
|
565
|
+
}}
|
|
566
|
+
>
|
|
567
|
+
<view
|
|
568
|
+
{...(ref ? ({ ref: ref as LynxViewRef } as Record<string, unknown>) : {})}
|
|
569
|
+
{...pressHandlers}
|
|
570
|
+
className={clsx(classNames.root, className)}
|
|
571
|
+
style={style as never}
|
|
572
|
+
accessibility-element={accessibilityElement}
|
|
573
|
+
accessibility-label={accessibilityLabel}
|
|
574
|
+
accessibility-role-description={accessibilityRoleDescription}
|
|
575
|
+
accessibility-traits={accessibilityTraits}
|
|
576
|
+
accessibility-value={accessibilityValue}
|
|
577
|
+
accessibility-elements-hidden={accessibilityElementsHidden}
|
|
578
|
+
accessibility-heading={accessibilityHeading}
|
|
579
|
+
accessibility-actions={accessibilityActions}
|
|
580
|
+
accessibility-exclusive-focus={accessibilityExclusiveFocus}
|
|
581
|
+
ios-platform-accessibility-id={iosPlatformAccessibilityId}
|
|
582
|
+
>
|
|
583
|
+
{children}
|
|
584
|
+
</view>
|
|
585
|
+
{!isLast ? (
|
|
586
|
+
<view className={classNames.divider} accessibility-elements-hidden={true} />
|
|
587
|
+
) : null}
|
|
588
|
+
</IconSlotProvider>
|
|
589
|
+
</SwipeableMenuSheetItemContext.Provider>
|
|
590
|
+
);
|
|
591
|
+
});
|
|
592
|
+
SwipeableMenuSheetItem.displayName = "SwipeableMenuSheetItem";
|
|
593
|
+
|
|
594
|
+
export interface SwipeableMenuSheetItemContentProps extends LynxStyledElementProps {}
|
|
595
|
+
|
|
596
|
+
export const SwipeableMenuSheetItemContent: LynxForwardRefComponent<
|
|
597
|
+
unknown,
|
|
598
|
+
SwipeableMenuSheetItemContentProps
|
|
599
|
+
> = forwardRef<unknown, SwipeableMenuSheetItemContentProps>((props, ref) => {
|
|
600
|
+
const { children, className, style } = props;
|
|
601
|
+
const { classNames } = useSwipeableMenuSheetItemContext();
|
|
602
|
+
|
|
603
|
+
return (
|
|
604
|
+
<view
|
|
605
|
+
{...(ref ? ({ ref: ref as LynxViewRef } as Record<string, unknown>) : {})}
|
|
606
|
+
className={clsx(classNames.content, className)}
|
|
607
|
+
style={style as never}
|
|
608
|
+
>
|
|
609
|
+
{children}
|
|
610
|
+
</view>
|
|
611
|
+
);
|
|
612
|
+
});
|
|
613
|
+
SwipeableMenuSheetItemContent.displayName = "SwipeableMenuSheetItemContent";
|
|
614
|
+
|
|
615
|
+
export interface SwipeableMenuSheetItemLabelProps extends LynxStyledElementProps {}
|
|
616
|
+
|
|
617
|
+
export const SwipeableMenuSheetItemLabel: LynxForwardRefComponent<
|
|
618
|
+
unknown,
|
|
619
|
+
SwipeableMenuSheetItemLabelProps
|
|
620
|
+
> = forwardRef<unknown, SwipeableMenuSheetItemLabelProps>((props, ref) => {
|
|
621
|
+
const { children, className, style } = props;
|
|
622
|
+
const { classNames } = useSwipeableMenuSheetItemContext();
|
|
623
|
+
|
|
624
|
+
return (
|
|
625
|
+
<text
|
|
626
|
+
{...(ref ? ({ ref: ref as LynxTextRef } as Record<string, unknown>) : {})}
|
|
627
|
+
className={clsx(classNames.label, className)}
|
|
628
|
+
style={style as never}
|
|
629
|
+
>
|
|
630
|
+
{children}
|
|
631
|
+
</text>
|
|
632
|
+
);
|
|
633
|
+
});
|
|
634
|
+
SwipeableMenuSheetItemLabel.displayName = "SwipeableMenuSheetItemLabel";
|
|
635
|
+
|
|
636
|
+
export interface SwipeableMenuSheetItemDescriptionProps extends LynxStyledElementProps {}
|
|
637
|
+
|
|
638
|
+
export const SwipeableMenuSheetItemDescription: LynxForwardRefComponent<
|
|
639
|
+
unknown,
|
|
640
|
+
SwipeableMenuSheetItemDescriptionProps
|
|
641
|
+
> = forwardRef<unknown, SwipeableMenuSheetItemDescriptionProps>((props, ref) => {
|
|
642
|
+
const { children, className, style } = props;
|
|
643
|
+
const { classNames } = useSwipeableMenuSheetItemContext();
|
|
644
|
+
|
|
645
|
+
return (
|
|
646
|
+
<text
|
|
647
|
+
{...(ref ? ({ ref: ref as LynxTextRef } as Record<string, unknown>) : {})}
|
|
648
|
+
className={clsx(classNames.description, className)}
|
|
649
|
+
style={style as never}
|
|
650
|
+
>
|
|
651
|
+
{children}
|
|
652
|
+
</text>
|
|
653
|
+
);
|
|
654
|
+
});
|
|
655
|
+
SwipeableMenuSheetItemDescription.displayName = "SwipeableMenuSheetItemDescription";
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export {
|
|
2
|
+
SwipeableMenuSheetBackdrop,
|
|
3
|
+
type SwipeableMenuSheetBackdropProps,
|
|
4
|
+
SwipeableMenuSheetCloseButton,
|
|
5
|
+
type SwipeableMenuSheetCloseButtonProps,
|
|
6
|
+
SwipeableMenuSheetContent,
|
|
7
|
+
type SwipeableMenuSheetContentProps,
|
|
8
|
+
SwipeableMenuSheetDescription,
|
|
9
|
+
type SwipeableMenuSheetDescriptionProps,
|
|
10
|
+
SwipeableMenuSheetFooter,
|
|
11
|
+
type SwipeableMenuSheetFooterProps,
|
|
12
|
+
SwipeableMenuSheetGroup,
|
|
13
|
+
type SwipeableMenuSheetGroupProps,
|
|
14
|
+
SwipeableMenuSheetHandle,
|
|
15
|
+
type SwipeableMenuSheetHandleProps,
|
|
16
|
+
SwipeableMenuSheetHeader,
|
|
17
|
+
type SwipeableMenuSheetHeaderProps,
|
|
18
|
+
SwipeableMenuSheetItem,
|
|
19
|
+
SwipeableMenuSheetItemContent,
|
|
20
|
+
type SwipeableMenuSheetItemContentProps,
|
|
21
|
+
SwipeableMenuSheetItemDescription,
|
|
22
|
+
type SwipeableMenuSheetItemDescriptionProps,
|
|
23
|
+
SwipeableMenuSheetItemLabel,
|
|
24
|
+
type SwipeableMenuSheetItemLabelProps,
|
|
25
|
+
type SwipeableMenuSheetItemProps,
|
|
26
|
+
type SwipeableMenuSheetItemTone,
|
|
27
|
+
SwipeableMenuSheetList,
|
|
28
|
+
type SwipeableMenuSheetListProps,
|
|
29
|
+
type SwipeableMenuSheetLabelAlign,
|
|
30
|
+
type SwipeableMenuSheetCloseReason,
|
|
31
|
+
type SwipeableMenuSheetOpenChangeDetails,
|
|
32
|
+
SwipeableMenuSheetPositioner,
|
|
33
|
+
type SwipeableMenuSheetPositionerProps,
|
|
34
|
+
SwipeableMenuSheetRoot,
|
|
35
|
+
type SwipeableMenuSheetRootProps,
|
|
36
|
+
type SwipeableMenuSheetRootRef,
|
|
37
|
+
SwipeableMenuSheetTitle,
|
|
38
|
+
type SwipeableMenuSheetTitleProps,
|
|
39
|
+
SwipeableMenuSheetTrigger,
|
|
40
|
+
type SwipeableMenuSheetTriggerProps,
|
|
41
|
+
} from "./SwipeableMenuSheet";
|
|
42
|
+
|
|
43
|
+
export * as SwipeableMenuSheet from "./SwipeableMenuSheet.namespace";
|