tamagui 1.5.19 → 1.5.20
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/dist/cjs/views/Group.js +162 -80
- package/dist/cjs/views/Group.js.map +2 -2
- package/dist/esm/views/Group.js +164 -82
- package/dist/esm/views/Group.js.map +2 -2
- package/dist/esm/views/Group.mjs +164 -82
- package/dist/esm/views/Group.mjs.map +2 -2
- package/dist/jsx/views/Group.js +155 -78
- package/dist/jsx/views/Group.js.map +2 -2
- package/dist/jsx/views/Group.mjs +155 -78
- package/dist/jsx/views/Group.mjs.map +2 -2
- package/package.json +49 -48
- package/src/views/Group.tsx +212 -94
- package/types/views/Group.d.ts +127 -14
- package/types/views/Group.d.ts.map +1 -1
package/dist/cjs/views/Group.js
CHANGED
|
@@ -28,6 +28,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
28
28
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
29
|
var Group_exports = {};
|
|
30
30
|
__export(Group_exports, {
|
|
31
|
+
Group: () => Group,
|
|
31
32
|
GroupFrame: () => GroupFrame,
|
|
32
33
|
XGroup: () => XGroup,
|
|
33
34
|
YGroup: () => YGroup
|
|
@@ -35,14 +36,25 @@ __export(Group_exports, {
|
|
|
35
36
|
module.exports = __toCommonJS(Group_exports);
|
|
36
37
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
37
38
|
var import_core = require("@tamagui/core");
|
|
39
|
+
var import_create_context = require("@tamagui/create-context");
|
|
38
40
|
var import_stacks = require("@tamagui/stacks");
|
|
41
|
+
var import_use_controllable_state = require("@tamagui/use-controllable-state");
|
|
39
42
|
var import_react = __toESM(require("react"));
|
|
40
43
|
var import_react_native = require("react-native");
|
|
44
|
+
var import_reforest = require("reforest");
|
|
45
|
+
const GROUP_NAME = "Group";
|
|
46
|
+
const [createGroupContext, createGroupScope] = (0, import_create_context.createContextScope)(GROUP_NAME);
|
|
47
|
+
const [GroupProvider, useGroupContext] = createGroupContext(GROUP_NAME);
|
|
41
48
|
const GroupFrame = (0, import_core.styled)(import_stacks.ThemeableStack, {
|
|
42
49
|
name: "GroupFrame",
|
|
43
|
-
backgroundColor: "$background",
|
|
44
|
-
y: 0,
|
|
45
50
|
variants: {
|
|
51
|
+
unstyled: {
|
|
52
|
+
false: {
|
|
53
|
+
y: 0,
|
|
54
|
+
backgroundColor: "$background",
|
|
55
|
+
size: "$true"
|
|
56
|
+
}
|
|
57
|
+
},
|
|
46
58
|
size: (val, { tokens }) => {
|
|
47
59
|
const borderRadius = tokens.radius[val] ?? val ?? tokens.radius["$true"];
|
|
48
60
|
return {
|
|
@@ -51,97 +63,153 @@ const GroupFrame = (0, import_core.styled)(import_stacks.ThemeableStack, {
|
|
|
51
63
|
}
|
|
52
64
|
},
|
|
53
65
|
defaultVariants: {
|
|
54
|
-
|
|
66
|
+
unstyled: false
|
|
55
67
|
}
|
|
56
68
|
});
|
|
57
69
|
function createGroup(verticalDefault) {
|
|
58
|
-
return (0,
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
const
|
|
81
|
-
const
|
|
82
|
-
const
|
|
83
|
-
const
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
...hasRadius && {
|
|
89
|
-
...isFirst && !vertical && {
|
|
90
|
-
borderTopLeftRadius: radius,
|
|
91
|
-
borderBottomLeftRadius: radius
|
|
92
|
-
},
|
|
93
|
-
...isFirst && vertical && {
|
|
94
|
-
borderTopLeftRadius: radius,
|
|
95
|
-
borderTopRightRadius: radius
|
|
96
|
-
},
|
|
97
|
-
...isLast && !vertical && {
|
|
98
|
-
borderTopRightRadius: radius,
|
|
99
|
-
borderBottomRightRadius: radius
|
|
100
|
-
},
|
|
101
|
-
...isLast && vertical && {
|
|
102
|
-
borderBottomLeftRadius: radius,
|
|
103
|
-
borderBottomRightRadius: radius
|
|
104
|
-
}
|
|
70
|
+
return (0, import_core.withStaticProperties)(
|
|
71
|
+
(0, import_react.forwardRef)((props, ref) => {
|
|
72
|
+
const activeProps = (0, import_core.useMediaPropsActive)(props);
|
|
73
|
+
const {
|
|
74
|
+
__scopeGroup,
|
|
75
|
+
children: childrenProp,
|
|
76
|
+
space,
|
|
77
|
+
size = "$true",
|
|
78
|
+
spaceDirection,
|
|
79
|
+
separator,
|
|
80
|
+
scrollable,
|
|
81
|
+
axis = verticalDefault ? "vertical" : "horizontal",
|
|
82
|
+
disabled: disabledProp,
|
|
83
|
+
disablePassBorderRadius: disablePassBorderRadiusProp,
|
|
84
|
+
borderRadius,
|
|
85
|
+
forceUseItem,
|
|
86
|
+
...restProps
|
|
87
|
+
} = (0, import_core.getExpandedShorthands)(activeProps);
|
|
88
|
+
const vertical = axis === "vertical";
|
|
89
|
+
const [itemChildrenCount, setItemChildrenCount] = (0, import_use_controllable_state.useControllableState)({
|
|
90
|
+
defaultProp: forceUseItem ? 1 : 0
|
|
91
|
+
});
|
|
92
|
+
const isUsingItems = itemChildrenCount > 0;
|
|
93
|
+
const radius = borderRadius ?? (size ? (0, import_core.getVariableValue)((0, import_core.getTokens)().radius[size]) - 1 : void 0);
|
|
94
|
+
const hasRadius = radius !== void 0;
|
|
95
|
+
const disablePassBorderRadius = disablePassBorderRadiusProp ?? !hasRadius;
|
|
96
|
+
const childrenArray = import_react.Children.toArray(childrenProp);
|
|
97
|
+
const children = isUsingItems ? childrenProp : childrenArray.map((child, i) => {
|
|
98
|
+
if (!(0, import_react.isValidElement)(child)) {
|
|
99
|
+
return child;
|
|
105
100
|
}
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
101
|
+
const disabled = child.props.disabled ?? disabledProp;
|
|
102
|
+
const isFirst = i === 0;
|
|
103
|
+
const isLast = i === childrenArray.length - 1;
|
|
104
|
+
const radiusStyles = disablePassBorderRadius ? null : getBorderRadius({ isFirst, isLast, radius, vertical });
|
|
105
|
+
const props2 = {
|
|
106
|
+
disabled,
|
|
107
|
+
...(0, import_core.isTamaguiElement)(child) ? radiusStyles : { style: radiusStyles }
|
|
108
|
+
};
|
|
109
|
+
return cloneElementWithPropOrder(child, props2);
|
|
110
|
+
});
|
|
111
|
+
const indexedChildren = (0, import_reforest.useIndexedChildren)(
|
|
112
|
+
(0, import_core.spacedChildren)({
|
|
113
|
+
direction: spaceDirection,
|
|
114
|
+
separator,
|
|
115
|
+
space,
|
|
116
|
+
children
|
|
117
|
+
})
|
|
118
|
+
);
|
|
119
|
+
const onItemMount = import_react.default.useCallback(
|
|
120
|
+
() => setItemChildrenCount((prev) => prev + 1),
|
|
121
|
+
[]
|
|
122
|
+
);
|
|
123
|
+
const onItemUnmount = import_react.default.useCallback(
|
|
124
|
+
() => setItemChildrenCount((prev) => prev - 1),
|
|
125
|
+
[]
|
|
126
|
+
);
|
|
127
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
128
|
+
GroupProvider,
|
|
129
|
+
{
|
|
130
|
+
disablePassBorderRadius,
|
|
131
|
+
vertical: axis === "vertical",
|
|
132
|
+
radius,
|
|
133
|
+
disabled: disabledProp,
|
|
134
|
+
onItemMount,
|
|
135
|
+
onItemUnmount,
|
|
136
|
+
scope: __scopeGroup,
|
|
137
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
138
|
+
GroupFrame,
|
|
139
|
+
{
|
|
140
|
+
ref,
|
|
141
|
+
size,
|
|
142
|
+
flexDirection: axis === "horizontal" ? "row" : "column",
|
|
143
|
+
borderRadius,
|
|
144
|
+
...restProps,
|
|
145
|
+
children: wrapScroll(activeProps, indexedChildren)
|
|
146
|
+
}
|
|
147
|
+
)
|
|
148
|
+
}
|
|
149
|
+
);
|
|
150
|
+
}),
|
|
151
|
+
{
|
|
152
|
+
Item: GroupItem
|
|
153
|
+
}
|
|
154
|
+
);
|
|
155
|
+
}
|
|
156
|
+
const GroupItem = (props) => {
|
|
157
|
+
var _a;
|
|
158
|
+
const { __scopeGroup, children } = props;
|
|
159
|
+
const treeIndex = (0, import_reforest.useIndex)();
|
|
160
|
+
const context = useGroupContext("GroupItem", __scopeGroup);
|
|
161
|
+
import_react.default.useEffect(() => {
|
|
162
|
+
context.onItemMount();
|
|
163
|
+
return () => {
|
|
164
|
+
context.onItemUnmount();
|
|
165
|
+
};
|
|
166
|
+
}, []);
|
|
167
|
+
if (!(0, import_react.isValidElement)(children)) {
|
|
168
|
+
return children;
|
|
169
|
+
}
|
|
170
|
+
const disabled = children.props.disabled ?? context.disabled;
|
|
171
|
+
if (!treeIndex) {
|
|
172
|
+
throw Error("<Group.Item/> should only be used within a <Group/>");
|
|
173
|
+
}
|
|
174
|
+
const isFirst = treeIndex.index === 0;
|
|
175
|
+
const isLast = treeIndex.index === treeIndex.maxIndex;
|
|
176
|
+
let propsToPass = {
|
|
177
|
+
disabled
|
|
178
|
+
};
|
|
179
|
+
if (!context.disablePassBorderRadius) {
|
|
180
|
+
const radiusStyles = getBorderRadius({
|
|
181
|
+
radius: context.radius,
|
|
182
|
+
isFirst,
|
|
183
|
+
isLast,
|
|
184
|
+
vertical: context.vertical
|
|
112
185
|
});
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
space,
|
|
127
|
-
children
|
|
128
|
-
})
|
|
129
|
-
)
|
|
130
|
-
}
|
|
131
|
-
);
|
|
186
|
+
if ((0, import_core.isTamaguiElement)(children)) {
|
|
187
|
+
propsToPass = { ...propsToPass, ...radiusStyles };
|
|
188
|
+
} else {
|
|
189
|
+
propsToPass.style = radiusStyles;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
return (0, import_react.cloneElement)(children, {
|
|
193
|
+
...propsToPass,
|
|
194
|
+
// @ts-ignore
|
|
195
|
+
style: {
|
|
196
|
+
...(_a = children.props) == null ? void 0 : _a["style"],
|
|
197
|
+
...propsToPass.style
|
|
198
|
+
}
|
|
132
199
|
});
|
|
133
|
-
}
|
|
134
|
-
const
|
|
200
|
+
};
|
|
201
|
+
const Group = createGroup(true);
|
|
202
|
+
const YGroup = Group;
|
|
135
203
|
const XGroup = createGroup(false);
|
|
136
|
-
const wrapScroll = ({ scrollable,
|
|
204
|
+
const wrapScroll = ({ scrollable, axis, showScrollIndicator = false }, children) => {
|
|
137
205
|
if (scrollable)
|
|
138
206
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
139
207
|
import_react_native.ScrollView,
|
|
140
208
|
{
|
|
141
|
-
...vertical && {
|
|
209
|
+
...axis === "vertical" && {
|
|
142
210
|
showsVerticalScrollIndicator: showScrollIndicator
|
|
143
211
|
},
|
|
144
|
-
|
|
212
|
+
...axis === "horizontal" && {
|
|
145
213
|
horizontal: true,
|
|
146
214
|
showsHorizontalScrollIndicator: showScrollIndicator
|
|
147
215
|
},
|
|
@@ -150,12 +218,26 @@ const wrapScroll = ({ scrollable, vertical, showScrollIndicator = false }, child
|
|
|
150
218
|
);
|
|
151
219
|
return children;
|
|
152
220
|
};
|
|
221
|
+
const getBorderRadius = ({
|
|
222
|
+
isFirst,
|
|
223
|
+
isLast,
|
|
224
|
+
radius,
|
|
225
|
+
vertical
|
|
226
|
+
}) => {
|
|
227
|
+
return {
|
|
228
|
+
borderTopLeftRadius: isFirst ? radius : 0,
|
|
229
|
+
borderTopRightRadius: vertical && isFirst || !vertical && isLast ? radius : 0,
|
|
230
|
+
borderBottomLeftRadius: vertical && isLast || !vertical && isFirst ? radius : 0,
|
|
231
|
+
borderBottomRightRadius: isLast ? radius : 0
|
|
232
|
+
};
|
|
233
|
+
};
|
|
153
234
|
const cloneElementWithPropOrder = (child, props) => {
|
|
154
235
|
const next = (0, import_core.mergeProps)(child.props, props, false, (0, import_core.getConfig)().shorthands)[0];
|
|
155
236
|
return import_react.default.cloneElement({ ...child, props: null }, next);
|
|
156
237
|
};
|
|
157
238
|
// Annotate the CommonJS export names for ESM import in node:
|
|
158
239
|
0 && (module.exports = {
|
|
240
|
+
Group,
|
|
159
241
|
GroupFrame,
|
|
160
242
|
XGroup,
|
|
161
243
|
YGroup
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/views/Group.tsx"],
|
|
4
|
-
"sourcesContent": ["import {\n GetProps,\n TamaguiElement,\n getConfig,\n getExpandedShorthands,\n getTokens,\n getVariableValue,\n isTamaguiElement,\n mergeProps,\n spacedChildren,\n styled,\n useMediaPropsActive,\n} from '@tamagui/core'\nimport { ThemeableStack } from '@tamagui/stacks'\nimport React, { Children, forwardRef, isValidElement } from 'react'\nimport { ScrollView } from 'react-native'\n\nexport const GroupFrame = styled(ThemeableStack, {\n name: 'GroupFrame',\n backgroundColor: '$background',\n
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;
|
|
4
|
+
"sourcesContent": ["import {\n GetProps,\n TamaguiElement,\n UnionableString,\n Variable,\n getConfig,\n getExpandedShorthands,\n getTokens,\n getVariableValue,\n isTamaguiElement,\n mergeProps,\n spacedChildren,\n styled,\n useMediaPropsActive,\n withStaticProperties,\n} from '@tamagui/core'\nimport { Scope, createContextScope } from '@tamagui/create-context'\nimport { ThemeableStack } from '@tamagui/stacks'\nimport { useControllableState } from '@tamagui/use-controllable-state'\nimport React, { Children, cloneElement, forwardRef, isValidElement } from 'react'\nimport { ScrollView } from 'react-native'\nimport { useIndex, useIndexedChildren } from 'reforest'\n\ninterface GroupContextValue {\n vertical: boolean\n disablePassBorderRadius: boolean\n onItemMount: () => void\n onItemUnmount: () => void\n radius?: number | UnionableString | Variable<any>\n disabled?: boolean\n}\n\nconst GROUP_NAME = 'Group'\n\ntype ScopedProps<P> = P & { __scopeGroup?: Scope }\nconst [createGroupContext, createGroupScope] = createContextScope(GROUP_NAME)\nconst [GroupProvider, useGroupContext] = createGroupContext<GroupContextValue>(GROUP_NAME)\n\nexport const GroupFrame = styled(ThemeableStack, {\n name: 'GroupFrame',\n\n variants: {\n unstyled: {\n false: {\n y: 0,\n backgroundColor: '$background',\n size: '$true',\n },\n },\n\n size: (val, { tokens }) => {\n const borderRadius = tokens.radius[val] ?? val ?? tokens.radius['$true']\n return {\n borderRadius,\n }\n },\n } as const,\n\n defaultVariants: {\n unstyled: false,\n },\n})\n\nexport type GroupProps = GetProps<typeof GroupFrame> & {\n axis?: 'horizontal' | 'vertical'\n\n scrollable?: boolean\n /**\n * @default false\n */\n showScrollIndicator?: boolean\n disabled?: boolean\n disablePassBorderRadius?: boolean\n /**\n * forces the group to use the Group.Item API\n */\n forceUseItem?: boolean\n}\n\nfunction createGroup(verticalDefault: boolean) {\n return withStaticProperties(\n forwardRef<TamaguiElement, ScopedProps<GroupProps>>((props, ref) => {\n const activeProps = useMediaPropsActive(props)\n\n const {\n __scopeGroup,\n children: childrenProp,\n space,\n size = '$true',\n spaceDirection,\n separator,\n scrollable,\n axis = verticalDefault ? 'vertical' : 'horizontal',\n disabled: disabledProp,\n disablePassBorderRadius: disablePassBorderRadiusProp,\n borderRadius,\n forceUseItem,\n ...restProps\n } = getExpandedShorthands(activeProps)\n\n const vertical = axis === 'vertical'\n const [itemChildrenCount, setItemChildrenCount] = useControllableState({\n defaultProp: forceUseItem ? 1 : 0,\n })\n const isUsingItems = itemChildrenCount > 0\n\n // 1 off given border to adjust for border radius? This should be user controllable\n const radius =\n borderRadius ??\n (size ? getVariableValue(getTokens().radius[size]) - 1 : undefined)\n\n const hasRadius = radius !== undefined\n const disablePassBorderRadius = disablePassBorderRadiusProp ?? !hasRadius\n\n const childrenArray = Children.toArray(childrenProp)\n const children = isUsingItems\n ? childrenProp\n : childrenArray.map((child, i) => {\n if (!isValidElement(child)) {\n return child\n }\n const disabled = child.props.disabled ?? disabledProp\n\n const isFirst = i === 0\n const isLast = i === childrenArray.length - 1\n\n const radiusStyles = disablePassBorderRadius\n ? null\n : getBorderRadius({ isFirst, isLast, radius, vertical })\n const props = {\n disabled,\n ...(isTamaguiElement(child) ? radiusStyles : { style: radiusStyles }),\n }\n\n return cloneElementWithPropOrder(child, props)\n })\n\n const indexedChildren = useIndexedChildren(\n spacedChildren({\n direction: spaceDirection,\n separator,\n space,\n children,\n })\n )\n\n const onItemMount = React.useCallback(\n () => setItemChildrenCount((prev) => prev + 1),\n []\n )\n const onItemUnmount = React.useCallback(\n () => setItemChildrenCount((prev) => prev - 1),\n []\n )\n\n return (\n <GroupProvider\n disablePassBorderRadius={disablePassBorderRadius}\n vertical={axis === 'vertical'}\n radius={radius}\n disabled={disabledProp}\n onItemMount={onItemMount}\n onItemUnmount={onItemUnmount}\n scope={__scopeGroup}\n >\n <GroupFrame\n ref={ref}\n size={size}\n flexDirection={axis === 'horizontal' ? 'row' : 'column'}\n borderRadius={borderRadius}\n {...restProps}\n >\n {wrapScroll(activeProps, indexedChildren)}\n </GroupFrame>\n </GroupProvider>\n )\n }),\n {\n Item: GroupItem,\n }\n )\n}\n\nconst GroupItem = (props: ScopedProps<{ children: React.ReactNode }>) => {\n const { __scopeGroup, children } = props\n const treeIndex = useIndex()\n const context = useGroupContext('GroupItem', __scopeGroup)\n\n React.useEffect(() => {\n context.onItemMount()\n return () => {\n context.onItemUnmount()\n }\n }, [])\n\n if (!isValidElement(children)) {\n return children as any\n }\n\n const disabled = children.props.disabled ?? context.disabled\n\n if (!treeIndex) {\n throw Error('<Group.Item/> should only be used within a <Group/>')\n }\n\n const isFirst = treeIndex.index === 0\n const isLast = treeIndex.index === treeIndex.maxIndex\n\n let propsToPass: Record<string, any> = {\n disabled,\n }\n\n if (!context.disablePassBorderRadius) {\n const radiusStyles = getBorderRadius({\n radius: context.radius,\n isFirst,\n isLast,\n vertical: context.vertical,\n })\n if (isTamaguiElement(children)) {\n propsToPass = { ...propsToPass, ...radiusStyles }\n } else {\n propsToPass.style = radiusStyles\n }\n }\n\n return cloneElement(children, {\n ...propsToPass,\n // @ts-ignore\n style: {\n ...children.props?.['style'],\n ...propsToPass.style,\n },\n })\n}\n\nexport const Group = createGroup(true)\nexport const YGroup = Group\nexport const XGroup = createGroup(false)\n\nconst wrapScroll = (\n { scrollable, axis, showScrollIndicator = false }: GroupProps,\n children: any\n) => {\n if (scrollable)\n return (\n <ScrollView\n {...(axis === 'vertical' && {\n showsVerticalScrollIndicator: showScrollIndicator,\n })}\n {...(axis === 'horizontal' && {\n horizontal: true,\n showsHorizontalScrollIndicator: showScrollIndicator,\n })}\n >\n {children}\n </ScrollView>\n )\n return children\n}\n\nconst getBorderRadius = ({\n isFirst,\n isLast,\n radius,\n vertical,\n}: {\n radius: any\n vertical: boolean\n isFirst: boolean\n isLast: boolean\n}) => {\n // TODO: RTL support would be nice here\n return {\n borderTopLeftRadius: isFirst ? radius : 0,\n borderTopRightRadius: (vertical && isFirst) || (!vertical && isLast) ? radius : 0,\n borderBottomLeftRadius: (vertical && isLast) || (!vertical && isFirst) ? radius : 0,\n borderBottomRightRadius: isLast ? radius : 0,\n }\n}\n\nconst cloneElementWithPropOrder = (child: any, props: Object) => {\n const next = mergeProps(child.props, props, false, getConfig().shorthands)[0]\n return React.cloneElement({ ...child, props: null }, next)\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["props", "React"]
|
|
7
7
|
}
|
package/dist/esm/views/Group.js
CHANGED
|
@@ -8,16 +8,28 @@ import {
|
|
|
8
8
|
mergeProps,
|
|
9
9
|
spacedChildren,
|
|
10
10
|
styled,
|
|
11
|
-
useMediaPropsActive
|
|
11
|
+
useMediaPropsActive,
|
|
12
|
+
withStaticProperties
|
|
12
13
|
} from "@tamagui/core";
|
|
14
|
+
import { createContextScope } from "@tamagui/create-context";
|
|
13
15
|
import { ThemeableStack } from "@tamagui/stacks";
|
|
14
|
-
import
|
|
16
|
+
import { useControllableState } from "@tamagui/use-controllable-state";
|
|
17
|
+
import React, { Children, cloneElement, forwardRef, isValidElement } from "react";
|
|
15
18
|
import { ScrollView } from "react-native";
|
|
19
|
+
import { useIndex, useIndexedChildren } from "reforest";
|
|
20
|
+
const GROUP_NAME = "Group";
|
|
21
|
+
const [createGroupContext, createGroupScope] = createContextScope(GROUP_NAME);
|
|
22
|
+
const [GroupProvider, useGroupContext] = createGroupContext(GROUP_NAME);
|
|
16
23
|
const GroupFrame = styled(ThemeableStack, {
|
|
17
24
|
name: "GroupFrame",
|
|
18
|
-
backgroundColor: "$background",
|
|
19
|
-
y: 0,
|
|
20
25
|
variants: {
|
|
26
|
+
unstyled: {
|
|
27
|
+
false: {
|
|
28
|
+
y: 0,
|
|
29
|
+
backgroundColor: "$background",
|
|
30
|
+
size: "$true"
|
|
31
|
+
}
|
|
32
|
+
},
|
|
21
33
|
size: (val, { tokens }) => {
|
|
22
34
|
const borderRadius = tokens.radius[val] ?? val ?? tokens.radius["$true"];
|
|
23
35
|
return {
|
|
@@ -26,97 +38,153 @@ const GroupFrame = styled(ThemeableStack, {
|
|
|
26
38
|
}
|
|
27
39
|
},
|
|
28
40
|
defaultVariants: {
|
|
29
|
-
|
|
41
|
+
unstyled: false
|
|
30
42
|
}
|
|
31
43
|
});
|
|
32
44
|
function createGroup(verticalDefault) {
|
|
33
|
-
return
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
const
|
|
56
|
-
const
|
|
57
|
-
const
|
|
58
|
-
const
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
...hasRadius && {
|
|
64
|
-
...isFirst && !vertical && {
|
|
65
|
-
borderTopLeftRadius: radius,
|
|
66
|
-
borderBottomLeftRadius: radius
|
|
67
|
-
},
|
|
68
|
-
...isFirst && vertical && {
|
|
69
|
-
borderTopLeftRadius: radius,
|
|
70
|
-
borderTopRightRadius: radius
|
|
71
|
-
},
|
|
72
|
-
...isLast && !vertical && {
|
|
73
|
-
borderTopRightRadius: radius,
|
|
74
|
-
borderBottomRightRadius: radius
|
|
75
|
-
},
|
|
76
|
-
...isLast && vertical && {
|
|
77
|
-
borderBottomLeftRadius: radius,
|
|
78
|
-
borderBottomRightRadius: radius
|
|
79
|
-
}
|
|
45
|
+
return withStaticProperties(
|
|
46
|
+
forwardRef((props, ref) => {
|
|
47
|
+
const activeProps = useMediaPropsActive(props);
|
|
48
|
+
const {
|
|
49
|
+
__scopeGroup,
|
|
50
|
+
children: childrenProp,
|
|
51
|
+
space,
|
|
52
|
+
size = "$true",
|
|
53
|
+
spaceDirection,
|
|
54
|
+
separator,
|
|
55
|
+
scrollable,
|
|
56
|
+
axis = verticalDefault ? "vertical" : "horizontal",
|
|
57
|
+
disabled: disabledProp,
|
|
58
|
+
disablePassBorderRadius: disablePassBorderRadiusProp,
|
|
59
|
+
borderRadius,
|
|
60
|
+
forceUseItem,
|
|
61
|
+
...restProps
|
|
62
|
+
} = getExpandedShorthands(activeProps);
|
|
63
|
+
const vertical = axis === "vertical";
|
|
64
|
+
const [itemChildrenCount, setItemChildrenCount] = useControllableState({
|
|
65
|
+
defaultProp: forceUseItem ? 1 : 0
|
|
66
|
+
});
|
|
67
|
+
const isUsingItems = itemChildrenCount > 0;
|
|
68
|
+
const radius = borderRadius ?? (size ? getVariableValue(getTokens().radius[size]) - 1 : void 0);
|
|
69
|
+
const hasRadius = radius !== void 0;
|
|
70
|
+
const disablePassBorderRadius = disablePassBorderRadiusProp ?? !hasRadius;
|
|
71
|
+
const childrenArray = Children.toArray(childrenProp);
|
|
72
|
+
const children = isUsingItems ? childrenProp : childrenArray.map((child, i) => {
|
|
73
|
+
if (!isValidElement(child)) {
|
|
74
|
+
return child;
|
|
80
75
|
}
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
76
|
+
const disabled = child.props.disabled ?? disabledProp;
|
|
77
|
+
const isFirst = i === 0;
|
|
78
|
+
const isLast = i === childrenArray.length - 1;
|
|
79
|
+
const radiusStyles = disablePassBorderRadius ? null : getBorderRadius({ isFirst, isLast, radius, vertical });
|
|
80
|
+
const props2 = {
|
|
81
|
+
disabled,
|
|
82
|
+
...isTamaguiElement(child) ? radiusStyles : { style: radiusStyles }
|
|
83
|
+
};
|
|
84
|
+
return cloneElementWithPropOrder(child, props2);
|
|
85
|
+
});
|
|
86
|
+
const indexedChildren = useIndexedChildren(
|
|
87
|
+
spacedChildren({
|
|
88
|
+
direction: spaceDirection,
|
|
89
|
+
separator,
|
|
90
|
+
space,
|
|
91
|
+
children
|
|
92
|
+
})
|
|
93
|
+
);
|
|
94
|
+
const onItemMount = React.useCallback(
|
|
95
|
+
() => setItemChildrenCount((prev) => prev + 1),
|
|
96
|
+
[]
|
|
97
|
+
);
|
|
98
|
+
const onItemUnmount = React.useCallback(
|
|
99
|
+
() => setItemChildrenCount((prev) => prev - 1),
|
|
100
|
+
[]
|
|
101
|
+
);
|
|
102
|
+
return /* @__PURE__ */ jsx(
|
|
103
|
+
GroupProvider,
|
|
104
|
+
{
|
|
105
|
+
disablePassBorderRadius,
|
|
106
|
+
vertical: axis === "vertical",
|
|
107
|
+
radius,
|
|
108
|
+
disabled: disabledProp,
|
|
109
|
+
onItemMount,
|
|
110
|
+
onItemUnmount,
|
|
111
|
+
scope: __scopeGroup,
|
|
112
|
+
children: /* @__PURE__ */ jsx(
|
|
113
|
+
GroupFrame,
|
|
114
|
+
{
|
|
115
|
+
ref,
|
|
116
|
+
size,
|
|
117
|
+
flexDirection: axis === "horizontal" ? "row" : "column",
|
|
118
|
+
borderRadius,
|
|
119
|
+
...restProps,
|
|
120
|
+
children: wrapScroll(activeProps, indexedChildren)
|
|
121
|
+
}
|
|
122
|
+
)
|
|
123
|
+
}
|
|
124
|
+
);
|
|
125
|
+
}),
|
|
126
|
+
{
|
|
127
|
+
Item: GroupItem
|
|
128
|
+
}
|
|
129
|
+
);
|
|
130
|
+
}
|
|
131
|
+
const GroupItem = (props) => {
|
|
132
|
+
var _a;
|
|
133
|
+
const { __scopeGroup, children } = props;
|
|
134
|
+
const treeIndex = useIndex();
|
|
135
|
+
const context = useGroupContext("GroupItem", __scopeGroup);
|
|
136
|
+
React.useEffect(() => {
|
|
137
|
+
context.onItemMount();
|
|
138
|
+
return () => {
|
|
139
|
+
context.onItemUnmount();
|
|
140
|
+
};
|
|
141
|
+
}, []);
|
|
142
|
+
if (!isValidElement(children)) {
|
|
143
|
+
return children;
|
|
144
|
+
}
|
|
145
|
+
const disabled = children.props.disabled ?? context.disabled;
|
|
146
|
+
if (!treeIndex) {
|
|
147
|
+
throw Error("<Group.Item/> should only be used within a <Group/>");
|
|
148
|
+
}
|
|
149
|
+
const isFirst = treeIndex.index === 0;
|
|
150
|
+
const isLast = treeIndex.index === treeIndex.maxIndex;
|
|
151
|
+
let propsToPass = {
|
|
152
|
+
disabled
|
|
153
|
+
};
|
|
154
|
+
if (!context.disablePassBorderRadius) {
|
|
155
|
+
const radiusStyles = getBorderRadius({
|
|
156
|
+
radius: context.radius,
|
|
157
|
+
isFirst,
|
|
158
|
+
isLast,
|
|
159
|
+
vertical: context.vertical
|
|
87
160
|
});
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
space,
|
|
102
|
-
children
|
|
103
|
-
})
|
|
104
|
-
)
|
|
105
|
-
}
|
|
106
|
-
);
|
|
161
|
+
if (isTamaguiElement(children)) {
|
|
162
|
+
propsToPass = { ...propsToPass, ...radiusStyles };
|
|
163
|
+
} else {
|
|
164
|
+
propsToPass.style = radiusStyles;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return cloneElement(children, {
|
|
168
|
+
...propsToPass,
|
|
169
|
+
// @ts-ignore
|
|
170
|
+
style: {
|
|
171
|
+
...(_a = children.props) == null ? void 0 : _a["style"],
|
|
172
|
+
...propsToPass.style
|
|
173
|
+
}
|
|
107
174
|
});
|
|
108
|
-
}
|
|
109
|
-
const
|
|
175
|
+
};
|
|
176
|
+
const Group = createGroup(true);
|
|
177
|
+
const YGroup = Group;
|
|
110
178
|
const XGroup = createGroup(false);
|
|
111
|
-
const wrapScroll = ({ scrollable,
|
|
179
|
+
const wrapScroll = ({ scrollable, axis, showScrollIndicator = false }, children) => {
|
|
112
180
|
if (scrollable)
|
|
113
181
|
return /* @__PURE__ */ jsx(
|
|
114
182
|
ScrollView,
|
|
115
183
|
{
|
|
116
|
-
...vertical && {
|
|
184
|
+
...axis === "vertical" && {
|
|
117
185
|
showsVerticalScrollIndicator: showScrollIndicator
|
|
118
186
|
},
|
|
119
|
-
|
|
187
|
+
...axis === "horizontal" && {
|
|
120
188
|
horizontal: true,
|
|
121
189
|
showsHorizontalScrollIndicator: showScrollIndicator
|
|
122
190
|
},
|
|
@@ -125,11 +193,25 @@ const wrapScroll = ({ scrollable, vertical, showScrollIndicator = false }, child
|
|
|
125
193
|
);
|
|
126
194
|
return children;
|
|
127
195
|
};
|
|
196
|
+
const getBorderRadius = ({
|
|
197
|
+
isFirst,
|
|
198
|
+
isLast,
|
|
199
|
+
radius,
|
|
200
|
+
vertical
|
|
201
|
+
}) => {
|
|
202
|
+
return {
|
|
203
|
+
borderTopLeftRadius: isFirst ? radius : 0,
|
|
204
|
+
borderTopRightRadius: vertical && isFirst || !vertical && isLast ? radius : 0,
|
|
205
|
+
borderBottomLeftRadius: vertical && isLast || !vertical && isFirst ? radius : 0,
|
|
206
|
+
borderBottomRightRadius: isLast ? radius : 0
|
|
207
|
+
};
|
|
208
|
+
};
|
|
128
209
|
const cloneElementWithPropOrder = (child, props) => {
|
|
129
210
|
const next = mergeProps(child.props, props, false, getConfig().shorthands)[0];
|
|
130
211
|
return React.cloneElement({ ...child, props: null }, next);
|
|
131
212
|
};
|
|
132
213
|
export {
|
|
214
|
+
Group,
|
|
133
215
|
GroupFrame,
|
|
134
216
|
XGroup,
|
|
135
217
|
YGroup
|