@tamagui/demos 1.12.0 → 1.12.2
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/TabsAdvancedDemo.js +127 -77
- package/dist/cjs/TabsAdvancedDemo.js.map +2 -2
- package/dist/cjs/TabsDemo.js +61 -79
- package/dist/cjs/TabsDemo.js.map +2 -2
- package/dist/esm/TabsAdvancedDemo.js +127 -77
- package/dist/esm/TabsAdvancedDemo.js.map +2 -2
- package/dist/esm/TabsAdvancedDemo.mjs +127 -77
- package/dist/esm/TabsAdvancedDemo.mjs.map +2 -2
- package/dist/esm/TabsDemo.js +70 -80
- package/dist/esm/TabsDemo.js.map +2 -2
- package/dist/esm/TabsDemo.mjs +70 -80
- package/dist/esm/TabsDemo.mjs.map +2 -2
- package/dist/jsx/TabsAdvancedDemo.js +80 -42
- package/dist/jsx/TabsAdvancedDemo.js.map +2 -2
- package/dist/jsx/TabsAdvancedDemo.mjs +80 -42
- package/dist/jsx/TabsAdvancedDemo.mjs.map +2 -2
- package/dist/jsx/TabsDemo.js +60 -58
- package/dist/jsx/TabsDemo.js.map +2 -2
- package/dist/jsx/TabsDemo.mjs +60 -58
- package/dist/jsx/TabsDemo.mjs.map +2 -2
- package/package.json +17 -17
- package/src/TabsAdvancedDemo.tsx +119 -79
- package/src/TabsDemo.tsx +78 -71
- package/types/TabsAdvancedDemo.d.ts.map +1 -1
- package/types/TabsDemo.d.ts.map +1 -1
|
@@ -11,12 +11,16 @@ import {
|
|
|
11
11
|
styled
|
|
12
12
|
} from "tamagui";
|
|
13
13
|
const demos = ["background", "underline"];
|
|
14
|
+
const demosTitle = {
|
|
15
|
+
background: "Background Indicator",
|
|
16
|
+
underline: "Underline Indicator"
|
|
17
|
+
};
|
|
14
18
|
const TabsAdvancedDemo = () => {
|
|
15
19
|
const [demoIndex, setDemoIndex] = useState(0);
|
|
16
20
|
const demo = demos[demoIndex];
|
|
17
21
|
return <>
|
|
18
22
|
{demo === "underline" ? <TabsAdvancedUnderline /> : <TabsAdvancedBackground />}
|
|
19
|
-
<XStack
|
|
23
|
+
<XStack ai="center" space pos="absolute" b="$3" l="$4" $xxs={{ dsp: "none" }}><Button size="$2" onPress={() => setDemoIndex((x) => (x + 1) % demos.length)}>{demosTitle[demo]}</Button></XStack>
|
|
20
24
|
</>;
|
|
21
25
|
};
|
|
22
26
|
const TabsAdvancedBackground = () => {
|
|
@@ -49,34 +53,43 @@ const TabsAdvancedBackground = () => {
|
|
|
49
53
|
value={currentTab}
|
|
50
54
|
onValueChange={setCurrentTab}
|
|
51
55
|
orientation="horizontal"
|
|
52
|
-
size="$
|
|
56
|
+
size="$4"
|
|
53
57
|
padding="$2"
|
|
54
58
|
height={150}
|
|
55
59
|
flexDirection="column"
|
|
56
60
|
activationMode="manual"
|
|
61
|
+
backgroundColor="$background"
|
|
62
|
+
borderRadius="$4"
|
|
63
|
+
position="relative"
|
|
57
64
|
>
|
|
58
|
-
<
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
disablePassBorderRadius
|
|
62
|
-
>
|
|
63
|
-
{intentAt && <TabsRovingIndicator
|
|
65
|
+
<YStack>
|
|
66
|
+
<AnimatePresence>{intentAt && <TabsRovingIndicator
|
|
67
|
+
borderRadius="$4"
|
|
64
68
|
width={intentAt.width}
|
|
65
69
|
height={intentAt.height}
|
|
66
70
|
x={intentAt.x}
|
|
67
71
|
y={intentAt.y}
|
|
68
|
-
/>}
|
|
69
|
-
{activeAt && <TabsRovingIndicator
|
|
72
|
+
/>}</AnimatePresence>
|
|
73
|
+
<AnimatePresence>{activeAt && <TabsRovingIndicator
|
|
74
|
+
borderRadius="$4"
|
|
70
75
|
theme="active"
|
|
71
76
|
width={activeAt.width}
|
|
72
77
|
height={activeAt.height}
|
|
73
78
|
x={activeAt.x}
|
|
74
79
|
y={activeAt.y}
|
|
75
|
-
/>}
|
|
76
|
-
<Tabs.
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
+
/>}</AnimatePresence>
|
|
81
|
+
<Tabs.List
|
|
82
|
+
disablePassBorderRadius
|
|
83
|
+
loop={false}
|
|
84
|
+
aria-label="Manage your account"
|
|
85
|
+
space="$2"
|
|
86
|
+
backgroundColor="transparent"
|
|
87
|
+
>
|
|
88
|
+
<Tabs.Tab unstyled value="tab1" onInteraction={handleOnInteraction}><SizableText>Profile</SizableText></Tabs.Tab>
|
|
89
|
+
<Tabs.Tab unstyled value="tab2" onInteraction={handleOnInteraction}><SizableText>Connections</SizableText></Tabs.Tab>
|
|
90
|
+
<Tabs.Tab unstyled value="tab3" onInteraction={handleOnInteraction}><SizableText>Notifications</SizableText></Tabs.Tab>
|
|
91
|
+
</Tabs.List>
|
|
92
|
+
</YStack>
|
|
80
93
|
<AnimatePresence
|
|
81
94
|
exitBeforeEnter
|
|
82
95
|
enterVariant={enterVariant}
|
|
@@ -114,40 +127,59 @@ const TabsAdvancedUnderline = () => {
|
|
|
114
127
|
value={currentTab}
|
|
115
128
|
onValueChange={setCurrentTab}
|
|
116
129
|
orientation="horizontal"
|
|
117
|
-
size="$
|
|
118
|
-
padding="$2"
|
|
130
|
+
size="$4"
|
|
119
131
|
height={150}
|
|
120
132
|
flexDirection="column"
|
|
121
133
|
activationMode="manual"
|
|
134
|
+
backgroundColor="$background"
|
|
135
|
+
borderRadius="$4"
|
|
122
136
|
>
|
|
123
|
-
<YStack
|
|
124
|
-
|
|
125
|
-
aria-label="Manage your account"
|
|
126
|
-
disablePassBorderRadius
|
|
127
|
-
borderBottomLeftRadius={0}
|
|
128
|
-
borderBottomRightRadius={0}
|
|
129
|
-
paddingBottom="$1.5"
|
|
130
|
-
>
|
|
131
|
-
{intentAt && <TabsRovingIndicator
|
|
137
|
+
<YStack>
|
|
138
|
+
<AnimatePresence>{intentAt && <TabsRovingIndicator
|
|
132
139
|
width={intentAt.width}
|
|
133
|
-
height="$0.
|
|
140
|
+
height="$0.5"
|
|
134
141
|
x={intentAt.x}
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
{activeAt && <TabsRovingIndicator
|
|
142
|
+
bottom={0}
|
|
143
|
+
/>}</AnimatePresence>
|
|
144
|
+
<AnimatePresence>{activeAt && <TabsRovingIndicator
|
|
139
145
|
theme="active"
|
|
140
146
|
active
|
|
141
147
|
width={activeAt.width}
|
|
142
|
-
height="$0.
|
|
148
|
+
height="$0.5"
|
|
143
149
|
x={activeAt.x}
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
150
|
+
bottom={0}
|
|
151
|
+
/>}</AnimatePresence>
|
|
152
|
+
<Tabs.List
|
|
153
|
+
disablePassBorderRadius
|
|
154
|
+
loop={false}
|
|
155
|
+
aria-label="Manage your account"
|
|
156
|
+
borderBottomLeftRadius={0}
|
|
157
|
+
borderBottomRightRadius={0}
|
|
158
|
+
paddingBottom="$1.5"
|
|
159
|
+
borderColor="$color3"
|
|
160
|
+
borderBottomWidth="$0.5"
|
|
161
|
+
backgroundColor="transparent"
|
|
162
|
+
>
|
|
163
|
+
<Tabs.Tab
|
|
164
|
+
unstyled
|
|
165
|
+
padding="$5"
|
|
166
|
+
value="tab1"
|
|
167
|
+
onInteraction={handleOnInteraction}
|
|
168
|
+
><SizableText>Profile</SizableText></Tabs.Tab>
|
|
169
|
+
<Tabs.Tab
|
|
170
|
+
unstyled
|
|
171
|
+
padding="$5"
|
|
172
|
+
value="tab2"
|
|
173
|
+
onInteraction={handleOnInteraction}
|
|
174
|
+
><SizableText>Connections</SizableText></Tabs.Tab>
|
|
175
|
+
<Tabs.Tab
|
|
176
|
+
unstyled
|
|
177
|
+
padding="$5"
|
|
178
|
+
value="tab3"
|
|
179
|
+
onInteraction={handleOnInteraction}
|
|
180
|
+
><SizableText>Notifications</SizableText></Tabs.Tab>
|
|
181
|
+
</Tabs.List>
|
|
182
|
+
</YStack>
|
|
151
183
|
<AnimatePresence
|
|
152
184
|
exitBeforeEnter
|
|
153
185
|
enterVariant={enterVariant}
|
|
@@ -158,13 +190,19 @@ const TabsAdvancedUnderline = () => {
|
|
|
158
190
|
const TabsRovingIndicator = styled(Stack, {
|
|
159
191
|
position: "absolute",
|
|
160
192
|
backgroundColor: "$color5",
|
|
161
|
-
opacity:
|
|
193
|
+
opacity: 0.7,
|
|
162
194
|
animation: "100ms",
|
|
163
|
-
|
|
195
|
+
enterStyle: {
|
|
196
|
+
opacity: 0
|
|
197
|
+
},
|
|
198
|
+
exitStyle: {
|
|
199
|
+
opacity: 0
|
|
200
|
+
},
|
|
164
201
|
variants: {
|
|
165
202
|
active: {
|
|
166
203
|
true: {
|
|
167
|
-
backgroundColor: "$color8"
|
|
204
|
+
backgroundColor: "$color8",
|
|
205
|
+
opacity: 0.6
|
|
168
206
|
}
|
|
169
207
|
}
|
|
170
208
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/TabsAdvancedDemo.tsx"],
|
|
4
|
-
"sourcesContent": ["import {
|
|
5
|
-
"mappings": "AAAA,
|
|
4
|
+
"sourcesContent": ["import { useState } from 'react'\nimport {\n AnimatePresence,\n Button,\n H5,\n SizableText,\n Stack,\n TabLayout,\n Tabs,\n TabsTabProps,\n XStack,\n YStack,\n styled,\n} from 'tamagui'\n\nconst demos = ['background', 'underline'] as const\nconst demosTitle: Record<(typeof demos)[number], string> = {\n background: 'Background Indicator',\n underline: 'Underline Indicator',\n}\n\nexport const TabsAdvancedDemo = () => {\n const [demoIndex, setDemoIndex] = useState(0)\n const demo = demos[demoIndex]\n return (\n <>\n {demo === 'underline' ? <TabsAdvancedUnderline /> : <TabsAdvancedBackground />}\n\n <XStack ai=\"center\" space pos=\"absolute\" b=\"$3\" l=\"$4\" $xxs={{ dsp: 'none' }}>\n <Button size=\"$2\" onPress={() => setDemoIndex((x) => (x + 1) % demos.length)}>\n {demosTitle[demo]}\n </Button>\n </XStack>\n </>\n )\n}\n\nconst TabsAdvancedBackground = () => {\n const [tabState, setTabState] = useState<{\n currentTab: string\n /**\n * Layout of the Tab user might intend to select (hovering / focusing)\n */\n intentAt: TabLayout | null\n /**\n * Layout of the Tab user selected\n */\n activeAt: TabLayout | null\n /**\n * Used to get the direction of activation for animating the active indicator\n */\n prevActiveAt: TabLayout | null\n }>({\n activeAt: null,\n currentTab: 'tab1',\n intentAt: null,\n prevActiveAt: null,\n })\n\n const setCurrentTab = (currentTab: string) => setTabState({ ...tabState, currentTab })\n const setIntentIndicator = (intentAt) => setTabState({ ...tabState, intentAt })\n const setActiveIndicator = (activeAt) =>\n setTabState({ ...tabState, prevActiveAt: tabState.activeAt, activeAt })\n const { activeAt, intentAt, prevActiveAt, currentTab } = tabState\n\n /**\n * -1: from left\n * 0: n/a\n * 1: from right\n */\n const direction = (() => {\n if (!activeAt || !prevActiveAt || activeAt.x === prevActiveAt.x) {\n return 0\n }\n return activeAt.x > prevActiveAt.x ? -1 : 1\n })()\n\n const enterVariant =\n direction === 1 ? 'isLeft' : direction === -1 ? 'isRight' : 'defaultFade'\n const exitVariant =\n direction === 1 ? 'isRight' : direction === -1 ? 'isLeft' : 'defaultFade'\n\n const handleOnInteraction: TabsTabProps['onInteraction'] = (type, layout) => {\n if (type === 'select') {\n setActiveIndicator(layout)\n } else {\n setIntentIndicator(layout)\n }\n }\n\n return (\n <Tabs\n value={currentTab}\n onValueChange={setCurrentTab}\n orientation=\"horizontal\"\n size=\"$4\"\n padding=\"$2\"\n height={150}\n flexDirection=\"column\"\n activationMode=\"manual\"\n backgroundColor=\"$background\"\n borderRadius=\"$4\"\n position=\"relative\"\n >\n <YStack>\n <AnimatePresence>\n {intentAt && (\n <TabsRovingIndicator\n borderRadius=\"$4\"\n width={intentAt.width}\n height={intentAt.height}\n x={intentAt.x}\n y={intentAt.y}\n />\n )}\n </AnimatePresence>\n <AnimatePresence>\n {activeAt && (\n <TabsRovingIndicator\n borderRadius=\"$4\"\n theme=\"active\"\n width={activeAt.width}\n height={activeAt.height}\n x={activeAt.x}\n y={activeAt.y}\n />\n )}\n </AnimatePresence>\n\n <Tabs.List\n disablePassBorderRadius\n loop={false}\n aria-label=\"Manage your account\"\n space=\"$2\"\n backgroundColor=\"transparent\"\n >\n <Tabs.Tab unstyled value=\"tab1\" onInteraction={handleOnInteraction}>\n <SizableText>Profile</SizableText>\n </Tabs.Tab>\n <Tabs.Tab unstyled value=\"tab2\" onInteraction={handleOnInteraction}>\n <SizableText>Connections</SizableText>\n </Tabs.Tab>\n <Tabs.Tab unstyled value=\"tab3\" onInteraction={handleOnInteraction}>\n <SizableText>Notifications</SizableText>\n </Tabs.Tab>\n </Tabs.List>\n </YStack>\n\n <AnimatePresence\n exitBeforeEnter\n enterVariant={enterVariant}\n exitVariant={exitVariant}\n >\n <AnimatedYStack key={currentTab} animation=\"100ms\" x={0} opacity={1} flex={1}>\n <Tabs.Content value={currentTab} forceMount flex={1} justifyContent=\"center\">\n <H5 textAlign=\"center\">{currentTab}</H5>\n </Tabs.Content>\n </AnimatedYStack>\n </AnimatePresence>\n </Tabs>\n )\n}\n\nconst TabsAdvancedUnderline = () => {\n const [tabState, setTabState] = useState<{\n currentTab: string\n /**\n * Layout of the Tab user might intend to select (hovering / focusing)\n */\n intentAt: TabLayout | null\n /**\n * Layout of the Tab user selected\n */\n activeAt: TabLayout | null\n /**\n * Used to get the direction of activation for animating the active indicator\n */\n prevActiveAt: TabLayout | null\n }>({\n activeAt: null,\n currentTab: 'tab1',\n intentAt: null,\n prevActiveAt: null,\n })\n\n const setCurrentTab = (currentTab: string) => setTabState({ ...tabState, currentTab })\n const setIntentIndicator = (intentAt) => setTabState({ ...tabState, intentAt })\n const setActiveIndicator = (activeAt) =>\n setTabState({ ...tabState, prevActiveAt: tabState.activeAt, activeAt })\n const { activeAt, intentAt, prevActiveAt, currentTab } = tabState\n\n /**\n * -1: from left\n * 0: n/a\n * 1: from right\n */\n const direction = (() => {\n if (!activeAt || !prevActiveAt || activeAt.x === prevActiveAt.x) {\n return 0\n }\n return activeAt.x > prevActiveAt.x ? -1 : 1\n })()\n\n const enterVariant =\n direction === 1 ? 'isLeft' : direction === -1 ? 'isRight' : 'defaultFade'\n const exitVariant =\n direction === 1 ? 'isRight' : direction === -1 ? 'isLeft' : 'defaultFade'\n\n const handleOnInteraction: TabsTabProps['onInteraction'] = (type, layout) => {\n if (type === 'select') {\n setActiveIndicator(layout)\n } else {\n setIntentIndicator(layout)\n }\n }\n\n return (\n <Tabs\n value={currentTab}\n onValueChange={setCurrentTab}\n orientation=\"horizontal\"\n size=\"$4\"\n height={150}\n flexDirection=\"column\"\n activationMode=\"manual\"\n backgroundColor=\"$background\"\n borderRadius=\"$4\"\n >\n <YStack>\n <AnimatePresence>\n {intentAt && (\n <TabsRovingIndicator\n width={intentAt.width}\n height=\"$0.5\"\n x={intentAt.x}\n bottom={0}\n />\n )}\n </AnimatePresence>\n <AnimatePresence>\n {activeAt && (\n <TabsRovingIndicator\n theme=\"active\"\n active\n width={activeAt.width}\n height=\"$0.5\"\n x={activeAt.x}\n bottom={0}\n />\n )}\n </AnimatePresence>\n <Tabs.List\n disablePassBorderRadius\n loop={false}\n aria-label=\"Manage your account\"\n borderBottomLeftRadius={0}\n borderBottomRightRadius={0}\n paddingBottom=\"$1.5\"\n borderColor=\"$color3\"\n borderBottomWidth=\"$0.5\"\n backgroundColor=\"transparent\"\n >\n <Tabs.Tab\n unstyled\n padding=\"$5\"\n value=\"tab1\"\n onInteraction={handleOnInteraction}\n >\n <SizableText>Profile</SizableText>\n </Tabs.Tab>\n <Tabs.Tab\n unstyled\n padding=\"$5\"\n value=\"tab2\"\n onInteraction={handleOnInteraction}\n >\n <SizableText>Connections</SizableText>\n </Tabs.Tab>\n <Tabs.Tab\n unstyled\n padding=\"$5\"\n value=\"tab3\"\n onInteraction={handleOnInteraction}\n >\n <SizableText>Notifications</SizableText>\n </Tabs.Tab>\n </Tabs.List>\n </YStack>\n\n <AnimatePresence\n exitBeforeEnter\n enterVariant={enterVariant}\n exitVariant={exitVariant}\n >\n <AnimatedYStack key={currentTab} animation=\"100ms\" x={0} opacity={1} flex={1}>\n <Tabs.Content value={currentTab} forceMount flex={1} justifyContent=\"center\">\n <H5 textAlign=\"center\">{currentTab}</H5>\n </Tabs.Content>\n </AnimatedYStack>\n </AnimatePresence>\n </Tabs>\n )\n}\n\nconst TabsRovingIndicator = styled(Stack, {\n position: 'absolute',\n backgroundColor: '$color5',\n opacity: 0.7,\n animation: '100ms',\n enterStyle: {\n opacity: 0,\n },\n exitStyle: {\n opacity: 0,\n },\n variants: {\n active: {\n true: {\n backgroundColor: '$color8',\n opacity: 0.6,\n },\n },\n },\n})\n\nconst AnimatedYStack = styled(YStack, {\n variants: {\n isLeft: { true: { x: -25, opacity: 0 } },\n isRight: { true: { x: 25, opacity: 0 } },\n defaultFade: { true: { opacity: 0 } },\n } as const,\n})\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["currentTab", "intentAt", "activeAt"]
|
|
7
7
|
}
|
|
@@ -11,12 +11,16 @@ import {
|
|
|
11
11
|
styled
|
|
12
12
|
} from "tamagui";
|
|
13
13
|
const demos = ["background", "underline"];
|
|
14
|
+
const demosTitle = {
|
|
15
|
+
background: "Background Indicator",
|
|
16
|
+
underline: "Underline Indicator"
|
|
17
|
+
};
|
|
14
18
|
const TabsAdvancedDemo = () => {
|
|
15
19
|
const [demoIndex, setDemoIndex] = useState(0);
|
|
16
20
|
const demo = demos[demoIndex];
|
|
17
21
|
return <>
|
|
18
22
|
{demo === "underline" ? <TabsAdvancedUnderline /> : <TabsAdvancedBackground />}
|
|
19
|
-
<XStack
|
|
23
|
+
<XStack ai="center" space pos="absolute" b="$3" l="$4" $xxs={{ dsp: "none" }}><Button size="$2" onPress={() => setDemoIndex((x) => (x + 1) % demos.length)}>{demosTitle[demo]}</Button></XStack>
|
|
20
24
|
</>;
|
|
21
25
|
};
|
|
22
26
|
const TabsAdvancedBackground = () => {
|
|
@@ -49,34 +53,43 @@ const TabsAdvancedBackground = () => {
|
|
|
49
53
|
value={currentTab}
|
|
50
54
|
onValueChange={setCurrentTab}
|
|
51
55
|
orientation="horizontal"
|
|
52
|
-
size="$
|
|
56
|
+
size="$4"
|
|
53
57
|
padding="$2"
|
|
54
58
|
height={150}
|
|
55
59
|
flexDirection="column"
|
|
56
60
|
activationMode="manual"
|
|
61
|
+
backgroundColor="$background"
|
|
62
|
+
borderRadius="$4"
|
|
63
|
+
position="relative"
|
|
57
64
|
>
|
|
58
|
-
<
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
disablePassBorderRadius
|
|
62
|
-
>
|
|
63
|
-
{intentAt && <TabsRovingIndicator
|
|
65
|
+
<YStack>
|
|
66
|
+
<AnimatePresence>{intentAt && <TabsRovingIndicator
|
|
67
|
+
borderRadius="$4"
|
|
64
68
|
width={intentAt.width}
|
|
65
69
|
height={intentAt.height}
|
|
66
70
|
x={intentAt.x}
|
|
67
71
|
y={intentAt.y}
|
|
68
|
-
/>}
|
|
69
|
-
{activeAt && <TabsRovingIndicator
|
|
72
|
+
/>}</AnimatePresence>
|
|
73
|
+
<AnimatePresence>{activeAt && <TabsRovingIndicator
|
|
74
|
+
borderRadius="$4"
|
|
70
75
|
theme="active"
|
|
71
76
|
width={activeAt.width}
|
|
72
77
|
height={activeAt.height}
|
|
73
78
|
x={activeAt.x}
|
|
74
79
|
y={activeAt.y}
|
|
75
|
-
/>}
|
|
76
|
-
<Tabs.
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
+
/>}</AnimatePresence>
|
|
81
|
+
<Tabs.List
|
|
82
|
+
disablePassBorderRadius
|
|
83
|
+
loop={false}
|
|
84
|
+
aria-label="Manage your account"
|
|
85
|
+
space="$2"
|
|
86
|
+
backgroundColor="transparent"
|
|
87
|
+
>
|
|
88
|
+
<Tabs.Tab unstyled value="tab1" onInteraction={handleOnInteraction}><SizableText>Profile</SizableText></Tabs.Tab>
|
|
89
|
+
<Tabs.Tab unstyled value="tab2" onInteraction={handleOnInteraction}><SizableText>Connections</SizableText></Tabs.Tab>
|
|
90
|
+
<Tabs.Tab unstyled value="tab3" onInteraction={handleOnInteraction}><SizableText>Notifications</SizableText></Tabs.Tab>
|
|
91
|
+
</Tabs.List>
|
|
92
|
+
</YStack>
|
|
80
93
|
<AnimatePresence
|
|
81
94
|
exitBeforeEnter
|
|
82
95
|
enterVariant={enterVariant}
|
|
@@ -114,40 +127,59 @@ const TabsAdvancedUnderline = () => {
|
|
|
114
127
|
value={currentTab}
|
|
115
128
|
onValueChange={setCurrentTab}
|
|
116
129
|
orientation="horizontal"
|
|
117
|
-
size="$
|
|
118
|
-
padding="$2"
|
|
130
|
+
size="$4"
|
|
119
131
|
height={150}
|
|
120
132
|
flexDirection="column"
|
|
121
133
|
activationMode="manual"
|
|
134
|
+
backgroundColor="$background"
|
|
135
|
+
borderRadius="$4"
|
|
122
136
|
>
|
|
123
|
-
<YStack
|
|
124
|
-
|
|
125
|
-
aria-label="Manage your account"
|
|
126
|
-
disablePassBorderRadius
|
|
127
|
-
borderBottomLeftRadius={0}
|
|
128
|
-
borderBottomRightRadius={0}
|
|
129
|
-
paddingBottom="$1.5"
|
|
130
|
-
>
|
|
131
|
-
{intentAt && <TabsRovingIndicator
|
|
137
|
+
<YStack>
|
|
138
|
+
<AnimatePresence>{intentAt && <TabsRovingIndicator
|
|
132
139
|
width={intentAt.width}
|
|
133
|
-
height="$0.
|
|
140
|
+
height="$0.5"
|
|
134
141
|
x={intentAt.x}
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
{activeAt && <TabsRovingIndicator
|
|
142
|
+
bottom={0}
|
|
143
|
+
/>}</AnimatePresence>
|
|
144
|
+
<AnimatePresence>{activeAt && <TabsRovingIndicator
|
|
139
145
|
theme="active"
|
|
140
146
|
active
|
|
141
147
|
width={activeAt.width}
|
|
142
|
-
height="$0.
|
|
148
|
+
height="$0.5"
|
|
143
149
|
x={activeAt.x}
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
150
|
+
bottom={0}
|
|
151
|
+
/>}</AnimatePresence>
|
|
152
|
+
<Tabs.List
|
|
153
|
+
disablePassBorderRadius
|
|
154
|
+
loop={false}
|
|
155
|
+
aria-label="Manage your account"
|
|
156
|
+
borderBottomLeftRadius={0}
|
|
157
|
+
borderBottomRightRadius={0}
|
|
158
|
+
paddingBottom="$1.5"
|
|
159
|
+
borderColor="$color3"
|
|
160
|
+
borderBottomWidth="$0.5"
|
|
161
|
+
backgroundColor="transparent"
|
|
162
|
+
>
|
|
163
|
+
<Tabs.Tab
|
|
164
|
+
unstyled
|
|
165
|
+
padding="$5"
|
|
166
|
+
value="tab1"
|
|
167
|
+
onInteraction={handleOnInteraction}
|
|
168
|
+
><SizableText>Profile</SizableText></Tabs.Tab>
|
|
169
|
+
<Tabs.Tab
|
|
170
|
+
unstyled
|
|
171
|
+
padding="$5"
|
|
172
|
+
value="tab2"
|
|
173
|
+
onInteraction={handleOnInteraction}
|
|
174
|
+
><SizableText>Connections</SizableText></Tabs.Tab>
|
|
175
|
+
<Tabs.Tab
|
|
176
|
+
unstyled
|
|
177
|
+
padding="$5"
|
|
178
|
+
value="tab3"
|
|
179
|
+
onInteraction={handleOnInteraction}
|
|
180
|
+
><SizableText>Notifications</SizableText></Tabs.Tab>
|
|
181
|
+
</Tabs.List>
|
|
182
|
+
</YStack>
|
|
151
183
|
<AnimatePresence
|
|
152
184
|
exitBeforeEnter
|
|
153
185
|
enterVariant={enterVariant}
|
|
@@ -158,13 +190,19 @@ const TabsAdvancedUnderline = () => {
|
|
|
158
190
|
const TabsRovingIndicator = styled(Stack, {
|
|
159
191
|
position: "absolute",
|
|
160
192
|
backgroundColor: "$color5",
|
|
161
|
-
opacity:
|
|
193
|
+
opacity: 0.7,
|
|
162
194
|
animation: "100ms",
|
|
163
|
-
|
|
195
|
+
enterStyle: {
|
|
196
|
+
opacity: 0
|
|
197
|
+
},
|
|
198
|
+
exitStyle: {
|
|
199
|
+
opacity: 0
|
|
200
|
+
},
|
|
164
201
|
variants: {
|
|
165
202
|
active: {
|
|
166
203
|
true: {
|
|
167
|
-
backgroundColor: "$color8"
|
|
204
|
+
backgroundColor: "$color8",
|
|
205
|
+
opacity: 0.6
|
|
168
206
|
}
|
|
169
207
|
}
|
|
170
208
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/TabsAdvancedDemo.tsx"],
|
|
4
|
-
"sourcesContent": ["import {
|
|
5
|
-
"mappings": "AAAA,
|
|
4
|
+
"sourcesContent": ["import { useState } from 'react'\nimport {\n AnimatePresence,\n Button,\n H5,\n SizableText,\n Stack,\n TabLayout,\n Tabs,\n TabsTabProps,\n XStack,\n YStack,\n styled,\n} from 'tamagui'\n\nconst demos = ['background', 'underline'] as const\nconst demosTitle: Record<(typeof demos)[number], string> = {\n background: 'Background Indicator',\n underline: 'Underline Indicator',\n}\n\nexport const TabsAdvancedDemo = () => {\n const [demoIndex, setDemoIndex] = useState(0)\n const demo = demos[demoIndex]\n return (\n <>\n {demo === 'underline' ? <TabsAdvancedUnderline /> : <TabsAdvancedBackground />}\n\n <XStack ai=\"center\" space pos=\"absolute\" b=\"$3\" l=\"$4\" $xxs={{ dsp: 'none' }}>\n <Button size=\"$2\" onPress={() => setDemoIndex((x) => (x + 1) % demos.length)}>\n {demosTitle[demo]}\n </Button>\n </XStack>\n </>\n )\n}\n\nconst TabsAdvancedBackground = () => {\n const [tabState, setTabState] = useState<{\n currentTab: string\n /**\n * Layout of the Tab user might intend to select (hovering / focusing)\n */\n intentAt: TabLayout | null\n /**\n * Layout of the Tab user selected\n */\n activeAt: TabLayout | null\n /**\n * Used to get the direction of activation for animating the active indicator\n */\n prevActiveAt: TabLayout | null\n }>({\n activeAt: null,\n currentTab: 'tab1',\n intentAt: null,\n prevActiveAt: null,\n })\n\n const setCurrentTab = (currentTab: string) => setTabState({ ...tabState, currentTab })\n const setIntentIndicator = (intentAt) => setTabState({ ...tabState, intentAt })\n const setActiveIndicator = (activeAt) =>\n setTabState({ ...tabState, prevActiveAt: tabState.activeAt, activeAt })\n const { activeAt, intentAt, prevActiveAt, currentTab } = tabState\n\n /**\n * -1: from left\n * 0: n/a\n * 1: from right\n */\n const direction = (() => {\n if (!activeAt || !prevActiveAt || activeAt.x === prevActiveAt.x) {\n return 0\n }\n return activeAt.x > prevActiveAt.x ? -1 : 1\n })()\n\n const enterVariant =\n direction === 1 ? 'isLeft' : direction === -1 ? 'isRight' : 'defaultFade'\n const exitVariant =\n direction === 1 ? 'isRight' : direction === -1 ? 'isLeft' : 'defaultFade'\n\n const handleOnInteraction: TabsTabProps['onInteraction'] = (type, layout) => {\n if (type === 'select') {\n setActiveIndicator(layout)\n } else {\n setIntentIndicator(layout)\n }\n }\n\n return (\n <Tabs\n value={currentTab}\n onValueChange={setCurrentTab}\n orientation=\"horizontal\"\n size=\"$4\"\n padding=\"$2\"\n height={150}\n flexDirection=\"column\"\n activationMode=\"manual\"\n backgroundColor=\"$background\"\n borderRadius=\"$4\"\n position=\"relative\"\n >\n <YStack>\n <AnimatePresence>\n {intentAt && (\n <TabsRovingIndicator\n borderRadius=\"$4\"\n width={intentAt.width}\n height={intentAt.height}\n x={intentAt.x}\n y={intentAt.y}\n />\n )}\n </AnimatePresence>\n <AnimatePresence>\n {activeAt && (\n <TabsRovingIndicator\n borderRadius=\"$4\"\n theme=\"active\"\n width={activeAt.width}\n height={activeAt.height}\n x={activeAt.x}\n y={activeAt.y}\n />\n )}\n </AnimatePresence>\n\n <Tabs.List\n disablePassBorderRadius\n loop={false}\n aria-label=\"Manage your account\"\n space=\"$2\"\n backgroundColor=\"transparent\"\n >\n <Tabs.Tab unstyled value=\"tab1\" onInteraction={handleOnInteraction}>\n <SizableText>Profile</SizableText>\n </Tabs.Tab>\n <Tabs.Tab unstyled value=\"tab2\" onInteraction={handleOnInteraction}>\n <SizableText>Connections</SizableText>\n </Tabs.Tab>\n <Tabs.Tab unstyled value=\"tab3\" onInteraction={handleOnInteraction}>\n <SizableText>Notifications</SizableText>\n </Tabs.Tab>\n </Tabs.List>\n </YStack>\n\n <AnimatePresence\n exitBeforeEnter\n enterVariant={enterVariant}\n exitVariant={exitVariant}\n >\n <AnimatedYStack key={currentTab} animation=\"100ms\" x={0} opacity={1} flex={1}>\n <Tabs.Content value={currentTab} forceMount flex={1} justifyContent=\"center\">\n <H5 textAlign=\"center\">{currentTab}</H5>\n </Tabs.Content>\n </AnimatedYStack>\n </AnimatePresence>\n </Tabs>\n )\n}\n\nconst TabsAdvancedUnderline = () => {\n const [tabState, setTabState] = useState<{\n currentTab: string\n /**\n * Layout of the Tab user might intend to select (hovering / focusing)\n */\n intentAt: TabLayout | null\n /**\n * Layout of the Tab user selected\n */\n activeAt: TabLayout | null\n /**\n * Used to get the direction of activation for animating the active indicator\n */\n prevActiveAt: TabLayout | null\n }>({\n activeAt: null,\n currentTab: 'tab1',\n intentAt: null,\n prevActiveAt: null,\n })\n\n const setCurrentTab = (currentTab: string) => setTabState({ ...tabState, currentTab })\n const setIntentIndicator = (intentAt) => setTabState({ ...tabState, intentAt })\n const setActiveIndicator = (activeAt) =>\n setTabState({ ...tabState, prevActiveAt: tabState.activeAt, activeAt })\n const { activeAt, intentAt, prevActiveAt, currentTab } = tabState\n\n /**\n * -1: from left\n * 0: n/a\n * 1: from right\n */\n const direction = (() => {\n if (!activeAt || !prevActiveAt || activeAt.x === prevActiveAt.x) {\n return 0\n }\n return activeAt.x > prevActiveAt.x ? -1 : 1\n })()\n\n const enterVariant =\n direction === 1 ? 'isLeft' : direction === -1 ? 'isRight' : 'defaultFade'\n const exitVariant =\n direction === 1 ? 'isRight' : direction === -1 ? 'isLeft' : 'defaultFade'\n\n const handleOnInteraction: TabsTabProps['onInteraction'] = (type, layout) => {\n if (type === 'select') {\n setActiveIndicator(layout)\n } else {\n setIntentIndicator(layout)\n }\n }\n\n return (\n <Tabs\n value={currentTab}\n onValueChange={setCurrentTab}\n orientation=\"horizontal\"\n size=\"$4\"\n height={150}\n flexDirection=\"column\"\n activationMode=\"manual\"\n backgroundColor=\"$background\"\n borderRadius=\"$4\"\n >\n <YStack>\n <AnimatePresence>\n {intentAt && (\n <TabsRovingIndicator\n width={intentAt.width}\n height=\"$0.5\"\n x={intentAt.x}\n bottom={0}\n />\n )}\n </AnimatePresence>\n <AnimatePresence>\n {activeAt && (\n <TabsRovingIndicator\n theme=\"active\"\n active\n width={activeAt.width}\n height=\"$0.5\"\n x={activeAt.x}\n bottom={0}\n />\n )}\n </AnimatePresence>\n <Tabs.List\n disablePassBorderRadius\n loop={false}\n aria-label=\"Manage your account\"\n borderBottomLeftRadius={0}\n borderBottomRightRadius={0}\n paddingBottom=\"$1.5\"\n borderColor=\"$color3\"\n borderBottomWidth=\"$0.5\"\n backgroundColor=\"transparent\"\n >\n <Tabs.Tab\n unstyled\n padding=\"$5\"\n value=\"tab1\"\n onInteraction={handleOnInteraction}\n >\n <SizableText>Profile</SizableText>\n </Tabs.Tab>\n <Tabs.Tab\n unstyled\n padding=\"$5\"\n value=\"tab2\"\n onInteraction={handleOnInteraction}\n >\n <SizableText>Connections</SizableText>\n </Tabs.Tab>\n <Tabs.Tab\n unstyled\n padding=\"$5\"\n value=\"tab3\"\n onInteraction={handleOnInteraction}\n >\n <SizableText>Notifications</SizableText>\n </Tabs.Tab>\n </Tabs.List>\n </YStack>\n\n <AnimatePresence\n exitBeforeEnter\n enterVariant={enterVariant}\n exitVariant={exitVariant}\n >\n <AnimatedYStack key={currentTab} animation=\"100ms\" x={0} opacity={1} flex={1}>\n <Tabs.Content value={currentTab} forceMount flex={1} justifyContent=\"center\">\n <H5 textAlign=\"center\">{currentTab}</H5>\n </Tabs.Content>\n </AnimatedYStack>\n </AnimatePresence>\n </Tabs>\n )\n}\n\nconst TabsRovingIndicator = styled(Stack, {\n position: 'absolute',\n backgroundColor: '$color5',\n opacity: 0.7,\n animation: '100ms',\n enterStyle: {\n opacity: 0,\n },\n exitStyle: {\n opacity: 0,\n },\n variants: {\n active: {\n true: {\n backgroundColor: '$color8',\n opacity: 0.6,\n },\n },\n },\n})\n\nconst AnimatedYStack = styled(YStack, {\n variants: {\n isLeft: { true: { x: -25, opacity: 0 } },\n isRight: { true: { x: 25, opacity: 0 } },\n defaultFade: { true: { opacity: 0 } },\n } as const,\n})\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["currentTab", "intentAt", "activeAt"]
|
|
7
7
|
}
|