@urbint/cl 1.0.1
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/.cursor/rules +313 -0
- package/.rnstorybook/index.ts +11 -0
- package/.rnstorybook/main.ts +8 -0
- package/.rnstorybook/preview.tsx +14 -0
- package/.rnstorybook/storybook.requires.ts +49 -0
- package/.storybook/main.ts +16 -0
- package/.storybook/preview.ts +32 -0
- package/.storybook/vitest.setup.ts +7 -0
- package/App.tsx +422 -0
- package/README.md +229 -0
- package/app.json +33 -0
- package/assets/adaptive-icon.png +0 -0
- package/assets/favicon.png +0 -0
- package/assets/icon.png +0 -0
- package/assets/splash-icon.png +0 -0
- package/babel.config.js +16 -0
- package/docs/components/CodeBlock.tsx +80 -0
- package/docs/components/PropTable.tsx +93 -0
- package/docs/components/Sidebar.tsx +199 -0
- package/docs/components/index.ts +8 -0
- package/docs/data/colorTokens.ts +70 -0
- package/docs/data/componentData.tsx +1685 -0
- package/docs/data/index.ts +7 -0
- package/docs/index.ts +19 -0
- package/docs/navigation.ts +94 -0
- package/docs/pages/ColorsPage.tsx +226 -0
- package/docs/pages/ComponentPage.tsx +235 -0
- package/docs/pages/InstallationPage.tsx +232 -0
- package/docs/pages/IntroductionPage.tsx +163 -0
- package/docs/pages/ThemingPage.tsx +251 -0
- package/docs/pages/index.ts +10 -0
- package/docs/theme.ts +64 -0
- package/docs/types.ts +54 -0
- package/index.ts +8 -0
- package/llms.txt +1893 -0
- package/mcp-config.example.json +10 -0
- package/mcp-server/README.md +192 -0
- package/mcp-server/package-lock.json +1707 -0
- package/mcp-server/package.json +38 -0
- package/mcp-server/src/index.ts +1136 -0
- package/mcp-server/src/registry/components.ts +1446 -0
- package/mcp-server/src/registry/index.ts +3 -0
- package/mcp-server/src/registry/tokens.ts +256 -0
- package/mcp-server/tsconfig.json +19 -0
- package/package.json +92 -0
- package/src/components/Accordion/Accordion.stories.tsx +226 -0
- package/src/components/Accordion/Accordion.tsx +255 -0
- package/src/components/Accordion/index.ts +12 -0
- package/src/components/ActionSheet/ActionSheet.stories.tsx +393 -0
- package/src/components/ActionSheet/ActionSheet.tsx +258 -0
- package/src/components/ActionSheet/index.ts +2 -0
- package/src/components/Alert/Alert.stories.tsx +165 -0
- package/src/components/Alert/Alert.tsx +164 -0
- package/src/components/Alert/index.ts +2 -0
- package/src/components/AlertDialog/AlertDialog.stories.tsx +330 -0
- package/src/components/AlertDialog/AlertDialog.tsx +234 -0
- package/src/components/AlertDialog/index.ts +2 -0
- package/src/components/Avatar/Avatar.stories.tsx +154 -0
- package/src/components/Avatar/Avatar.tsx +219 -0
- package/src/components/Avatar/index.ts +2 -0
- package/src/components/Badge/Badge.stories.tsx +146 -0
- package/src/components/Badge/Badge.tsx +125 -0
- package/src/components/Badge/index.ts +2 -0
- package/src/components/Box/Box.stories.tsx +192 -0
- package/src/components/Box/Box.tsx +184 -0
- package/src/components/Box/index.ts +2 -0
- package/src/components/Button/Button.stories.tsx +157 -0
- package/src/components/Button/Button.tsx +180 -0
- package/src/components/Button/index.ts +2 -0
- package/src/components/Card/Card.stories.tsx +145 -0
- package/src/components/Card/Card.tsx +169 -0
- package/src/components/Card/index.ts +11 -0
- package/src/components/Center/Center.stories.tsx +215 -0
- package/src/components/Center/Center.tsx +29 -0
- package/src/components/Center/index.ts +2 -0
- package/src/components/Checkbox/Checkbox.stories.tsx +94 -0
- package/src/components/Checkbox/Checkbox.tsx +242 -0
- package/src/components/Checkbox/index.ts +2 -0
- package/src/components/DatePicker/DatePicker.stories.tsx +623 -0
- package/src/components/DatePicker/DatePicker.tsx +1228 -0
- package/src/components/DatePicker/index.ts +8 -0
- package/src/components/Divider/Divider.stories.tsx +224 -0
- package/src/components/Divider/Divider.tsx +73 -0
- package/src/components/Divider/index.ts +2 -0
- package/src/components/Drawer/Drawer.stories.tsx +414 -0
- package/src/components/Drawer/Drawer.tsx +342 -0
- package/src/components/Drawer/index.ts +11 -0
- package/src/components/Fab/Fab.stories.tsx +360 -0
- package/src/components/Fab/Fab.tsx +185 -0
- package/src/components/Fab/index.ts +2 -0
- package/src/components/FormControl/FormControl.stories.tsx +276 -0
- package/src/components/FormControl/FormControl.tsx +185 -0
- package/src/components/FormControl/index.ts +12 -0
- package/src/components/Grid/Grid.stories.tsx +244 -0
- package/src/components/Grid/Grid.tsx +93 -0
- package/src/components/Grid/index.ts +2 -0
- package/src/components/HStack/HStack.stories.tsx +230 -0
- package/src/components/HStack/HStack.tsx +80 -0
- package/src/components/HStack/index.ts +2 -0
- package/src/components/Heading/Heading.stories.tsx +111 -0
- package/src/components/Heading/Heading.tsx +85 -0
- package/src/components/Heading/index.ts +2 -0
- package/src/components/Icon/Icon.stories.tsx +320 -0
- package/src/components/Icon/Icon.tsx +117 -0
- package/src/components/Icon/index.ts +2 -0
- package/src/components/Image/Image.stories.tsx +357 -0
- package/src/components/Image/Image.tsx +168 -0
- package/src/components/Image/index.ts +2 -0
- package/src/components/Input/Input.stories.tsx +164 -0
- package/src/components/Input/Input.tsx +274 -0
- package/src/components/Input/index.ts +2 -0
- package/src/components/Link/Link.stories.tsx +187 -0
- package/src/components/Link/Link.tsx +104 -0
- package/src/components/Link/index.ts +2 -0
- package/src/components/Menu/Menu.stories.tsx +363 -0
- package/src/components/Menu/Menu.tsx +238 -0
- package/src/components/Menu/index.ts +2 -0
- package/src/components/Modal/Modal.stories.tsx +156 -0
- package/src/components/Modal/Modal.tsx +280 -0
- package/src/components/Modal/index.ts +11 -0
- package/src/components/Popover/Popover.stories.tsx +330 -0
- package/src/components/Popover/Popover.tsx +315 -0
- package/src/components/Popover/index.ts +11 -0
- package/src/components/Portal/Portal.stories.tsx +376 -0
- package/src/components/Portal/Portal.tsx +100 -0
- package/src/components/Portal/index.ts +2 -0
- package/src/components/Pressable/Pressable.stories.tsx +338 -0
- package/src/components/Pressable/Pressable.tsx +71 -0
- package/src/components/Pressable/index.ts +2 -0
- package/src/components/Progress/Progress.stories.tsx +131 -0
- package/src/components/Progress/Progress.tsx +219 -0
- package/src/components/Progress/index.ts +2 -0
- package/src/components/Radio/Radio.stories.tsx +101 -0
- package/src/components/Radio/Radio.tsx +234 -0
- package/src/components/Radio/index.ts +2 -0
- package/src/components/Select/Select.stories.tsx +908 -0
- package/src/components/Select/Select.tsx +659 -0
- package/src/components/Select/index.ts +8 -0
- package/src/components/Skeleton/Skeleton.stories.tsx +154 -0
- package/src/components/Skeleton/Skeleton.tsx +192 -0
- package/src/components/Skeleton/index.ts +8 -0
- package/src/components/Slider/Slider.stories.tsx +363 -0
- package/src/components/Slider/Slider.tsx +209 -0
- package/src/components/Slider/index.ts +2 -0
- package/src/components/Spinner/Spinner.stories.tsx +108 -0
- package/src/components/Spinner/Spinner.tsx +121 -0
- package/src/components/Spinner/index.ts +2 -0
- package/src/components/Switch/Switch.stories.tsx +116 -0
- package/src/components/Switch/Switch.tsx +172 -0
- package/src/components/Switch/index.ts +2 -0
- package/src/components/Table/Table.stories.tsx +417 -0
- package/src/components/Table/Table.tsx +233 -0
- package/src/components/Table/index.ts +2 -0
- package/src/components/Text/Text.stories.tsx +93 -0
- package/src/components/Text/Text.tsx +119 -0
- package/src/components/Text/index.ts +2 -0
- package/src/components/Textarea/Textarea.stories.tsx +280 -0
- package/src/components/Textarea/Textarea.tsx +212 -0
- package/src/components/Textarea/index.ts +2 -0
- package/src/components/Toast/Toast.stories.tsx +446 -0
- package/src/components/Toast/Toast.tsx +221 -0
- package/src/components/Toast/index.ts +2 -0
- package/src/components/Tooltip/Tooltip.stories.tsx +354 -0
- package/src/components/Tooltip/Tooltip.tsx +261 -0
- package/src/components/Tooltip/index.ts +2 -0
- package/src/components/VStack/VStack.stories.tsx +183 -0
- package/src/components/VStack/VStack.tsx +76 -0
- package/src/components/VStack/index.ts +2 -0
- package/src/components/index.ts +62 -0
- package/src/hooks/index.ts +7 -0
- package/src/hooks/useControllableState.ts +41 -0
- package/src/hooks/useDisclosure.ts +51 -0
- package/src/index.ts +22 -0
- package/src/stories/Button.stories.tsx +53 -0
- package/src/stories/Button.tsx +101 -0
- package/src/stories/Configure.mdx +364 -0
- package/src/stories/Header.stories.tsx +33 -0
- package/src/stories/Header.tsx +75 -0
- package/src/stories/Page.stories.tsx +25 -0
- package/src/stories/Page.tsx +154 -0
- package/src/stories/assets/accessibility.png +0 -0
- package/src/stories/assets/accessibility.svg +1 -0
- package/src/stories/assets/addon-library.png +0 -0
- package/src/stories/assets/assets.png +0 -0
- package/src/stories/assets/avif-test-image.avif +0 -0
- package/src/stories/assets/context.png +0 -0
- package/src/stories/assets/discord.svg +1 -0
- package/src/stories/assets/docs.png +0 -0
- package/src/stories/assets/figma-plugin.png +0 -0
- package/src/stories/assets/github.svg +1 -0
- package/src/stories/assets/share.png +0 -0
- package/src/stories/assets/styling.png +0 -0
- package/src/stories/assets/testing.png +0 -0
- package/src/stories/assets/theming.png +0 -0
- package/src/stories/assets/tutorials.svg +1 -0
- package/src/stories/assets/youtube.svg +1 -0
- package/src/styles/index.ts +7 -0
- package/src/styles/tokens.ts +318 -0
- package/src/styles/unistyles.ts +254 -0
- package/src/utils/createContext.tsx +25 -0
- package/src/utils/index.ts +7 -0
- package/src/utils/mergeRefs.ts +21 -0
- package/tsconfig.json +26 -0
- package/urbint-cl-1.0.0.tgz +0 -0
- package/vitest.config.ts +37 -0
- package/vitest.shims.d.ts +1 -0
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
2
|
+
import { Heading } from './Heading';
|
|
3
|
+
import { VStack } from '../VStack';
|
|
4
|
+
import { Text } from '../Text';
|
|
5
|
+
import { Divider } from '../Divider';
|
|
6
|
+
import { colors, spacing } from '../../styles/tokens';
|
|
7
|
+
|
|
8
|
+
const meta: Meta<typeof Heading> = {
|
|
9
|
+
title: 'Components/Heading',
|
|
10
|
+
component: Heading,
|
|
11
|
+
argTypes: {
|
|
12
|
+
as: {
|
|
13
|
+
control: 'select',
|
|
14
|
+
options: ['h1', 'h2', 'h3', 'h4'],
|
|
15
|
+
},
|
|
16
|
+
align: {
|
|
17
|
+
control: 'select',
|
|
18
|
+
options: ['left', 'center', 'right'],
|
|
19
|
+
},
|
|
20
|
+
},
|
|
21
|
+
args: {
|
|
22
|
+
children: 'Heading Text',
|
|
23
|
+
as: 'h2',
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export default meta;
|
|
28
|
+
|
|
29
|
+
type Story = StoryObj<typeof Heading>;
|
|
30
|
+
|
|
31
|
+
export const Default: Story = {};
|
|
32
|
+
|
|
33
|
+
export const AllLevels: Story = {
|
|
34
|
+
render: () => (
|
|
35
|
+
<VStack space={spacing.lg}>
|
|
36
|
+
<VStack space={spacing.xs}>
|
|
37
|
+
<Heading as="h1">H1 Page Heading</Heading>
|
|
38
|
+
<Text variant="caption" color={colors.text.secondary}>
|
|
39
|
+
26px, Regular (400), Line Height 150%
|
|
40
|
+
</Text>
|
|
41
|
+
</VStack>
|
|
42
|
+
<Divider />
|
|
43
|
+
<VStack space={spacing.xs}>
|
|
44
|
+
<Heading as="h2">H2 Section Heading</Heading>
|
|
45
|
+
<Text variant="caption" color={colors.text.secondary}>
|
|
46
|
+
22px, Semi-Bold (600), Line Height 150%
|
|
47
|
+
</Text>
|
|
48
|
+
</VStack>
|
|
49
|
+
<Divider />
|
|
50
|
+
<VStack space={spacing.xs}>
|
|
51
|
+
<Heading as="h3">H3 Section Subheading</Heading>
|
|
52
|
+
<Text variant="caption" color={colors.text.secondary}>
|
|
53
|
+
20px, Semi-Bold (600), Line Height 150%
|
|
54
|
+
</Text>
|
|
55
|
+
</VStack>
|
|
56
|
+
<Divider />
|
|
57
|
+
<VStack space={spacing.xs}>
|
|
58
|
+
<Heading as="h4">H4 Subheading</Heading>
|
|
59
|
+
<Text variant="caption" color={colors.text.secondary}>
|
|
60
|
+
18px, Semi-Bold (600), Line Height 150%
|
|
61
|
+
</Text>
|
|
62
|
+
</VStack>
|
|
63
|
+
</VStack>
|
|
64
|
+
),
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
export const Usage: Story = {
|
|
68
|
+
render: () => (
|
|
69
|
+
<VStack space={spacing.lg}>
|
|
70
|
+
<VStack space={spacing.sm}>
|
|
71
|
+
<Heading as="h1">Dashboard Overview</Heading>
|
|
72
|
+
<Text color={colors.text.secondary}>
|
|
73
|
+
Welcome to your personalized dashboard. Here you can view all your
|
|
74
|
+
important metrics and manage your account settings.
|
|
75
|
+
</Text>
|
|
76
|
+
</VStack>
|
|
77
|
+
|
|
78
|
+
<VStack space={spacing.sm}>
|
|
79
|
+
<Heading as="h2">Recent Activity</Heading>
|
|
80
|
+
<Text color={colors.text.secondary}>
|
|
81
|
+
Track your recent actions and view updates from your team members.
|
|
82
|
+
</Text>
|
|
83
|
+
</VStack>
|
|
84
|
+
|
|
85
|
+
<VStack space={spacing.sm}>
|
|
86
|
+
<Heading as="h3">Project Status</Heading>
|
|
87
|
+
<Text color={colors.text.secondary}>
|
|
88
|
+
All projects are on track with expected completion dates.
|
|
89
|
+
</Text>
|
|
90
|
+
</VStack>
|
|
91
|
+
|
|
92
|
+
<VStack space={spacing.sm}>
|
|
93
|
+
<Heading as="h4">Quick Actions</Heading>
|
|
94
|
+
<Text color={colors.text.secondary}>
|
|
95
|
+
Frequently used actions for quick access.
|
|
96
|
+
</Text>
|
|
97
|
+
</VStack>
|
|
98
|
+
</VStack>
|
|
99
|
+
),
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
export const Alignment: Story = {
|
|
103
|
+
render: () => (
|
|
104
|
+
<VStack space={spacing.md}>
|
|
105
|
+
<Heading as="h3" align="left">Left Aligned</Heading>
|
|
106
|
+
<Heading as="h3" align="center">Center Aligned</Heading>
|
|
107
|
+
<Heading as="h3" align="right">Right Aligned</Heading>
|
|
108
|
+
</VStack>
|
|
109
|
+
),
|
|
110
|
+
};
|
|
111
|
+
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Heading Component
|
|
3
|
+
* Typography component for headings (H1-H4)
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import React, { forwardRef } from 'react';
|
|
7
|
+
import { Text as RNText, TextProps as RNTextProps, TextStyle, StyleSheet } from 'react-native';
|
|
8
|
+
import { colors, typography } from '../../styles/tokens';
|
|
9
|
+
|
|
10
|
+
export interface HeadingProps extends RNTextProps {
|
|
11
|
+
/** Heading level */
|
|
12
|
+
as?: 'h1' | 'h2' | 'h3' | 'h4';
|
|
13
|
+
/** Text color */
|
|
14
|
+
color?: string;
|
|
15
|
+
/** Text alignment */
|
|
16
|
+
align?: TextStyle['textAlign'];
|
|
17
|
+
/** Truncate with ellipsis */
|
|
18
|
+
truncate?: boolean;
|
|
19
|
+
/** Number of lines before truncating */
|
|
20
|
+
noOfLines?: number;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export const Heading = forwardRef<RNText, HeadingProps>(
|
|
24
|
+
(
|
|
25
|
+
{
|
|
26
|
+
style,
|
|
27
|
+
as = 'h2',
|
|
28
|
+
color,
|
|
29
|
+
align,
|
|
30
|
+
truncate,
|
|
31
|
+
noOfLines,
|
|
32
|
+
children,
|
|
33
|
+
...props
|
|
34
|
+
},
|
|
35
|
+
ref
|
|
36
|
+
) => {
|
|
37
|
+
return (
|
|
38
|
+
<RNText
|
|
39
|
+
ref={ref}
|
|
40
|
+
numberOfLines={truncate ? 1 : noOfLines}
|
|
41
|
+
ellipsizeMode={truncate || noOfLines ? 'tail' : undefined}
|
|
42
|
+
accessibilityRole="header"
|
|
43
|
+
style={[
|
|
44
|
+
styles.base,
|
|
45
|
+
styles[as],
|
|
46
|
+
color && { color },
|
|
47
|
+
align && { textAlign: align },
|
|
48
|
+
style,
|
|
49
|
+
]}
|
|
50
|
+
{...props}
|
|
51
|
+
>
|
|
52
|
+
{children}
|
|
53
|
+
</RNText>
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
);
|
|
57
|
+
|
|
58
|
+
Heading.displayName = 'Heading';
|
|
59
|
+
|
|
60
|
+
const styles = StyleSheet.create({
|
|
61
|
+
base: {
|
|
62
|
+
color: colors.text.default,
|
|
63
|
+
},
|
|
64
|
+
h1: {
|
|
65
|
+
fontSize: typography.fontSize.h1,
|
|
66
|
+
fontWeight: typography.fontWeight.regular,
|
|
67
|
+
lineHeight: typography.fontSize.h1 * typography.lineHeight.normal,
|
|
68
|
+
},
|
|
69
|
+
h2: {
|
|
70
|
+
fontSize: typography.fontSize.h2,
|
|
71
|
+
fontWeight: typography.fontWeight.semiBold,
|
|
72
|
+
lineHeight: typography.fontSize.h2 * typography.lineHeight.normal,
|
|
73
|
+
},
|
|
74
|
+
h3: {
|
|
75
|
+
fontSize: typography.fontSize.h3,
|
|
76
|
+
fontWeight: typography.fontWeight.semiBold,
|
|
77
|
+
lineHeight: typography.fontSize.h3 * typography.lineHeight.normal,
|
|
78
|
+
},
|
|
79
|
+
h4: {
|
|
80
|
+
fontSize: typography.fontSize.h4,
|
|
81
|
+
fontWeight: typography.fontWeight.semiBold,
|
|
82
|
+
lineHeight: typography.fontSize.h4 * typography.lineHeight.normal,
|
|
83
|
+
},
|
|
84
|
+
});
|
|
85
|
+
|
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
2
|
+
import { Icon, iconPaths } from './Icon';
|
|
3
|
+
import { VStack } from '../VStack';
|
|
4
|
+
import { HStack } from '../HStack';
|
|
5
|
+
import { Text } from '../Text';
|
|
6
|
+
import { Box } from '../Box';
|
|
7
|
+
import { Grid, GridItem } from '../Grid';
|
|
8
|
+
import { colors, spacing, borderRadius } from '../../styles/tokens';
|
|
9
|
+
|
|
10
|
+
const meta: Meta<typeof Icon> = {
|
|
11
|
+
title: 'Data Display/Icon',
|
|
12
|
+
component: Icon,
|
|
13
|
+
argTypes: {
|
|
14
|
+
name: {
|
|
15
|
+
control: 'select',
|
|
16
|
+
options: Object.keys(iconPaths),
|
|
17
|
+
},
|
|
18
|
+
size: {
|
|
19
|
+
control: 'select',
|
|
20
|
+
options: ['xs', 'sm', 'md', 'lg', 'xl'],
|
|
21
|
+
},
|
|
22
|
+
color: { control: 'color' },
|
|
23
|
+
},
|
|
24
|
+
args: {
|
|
25
|
+
name: 'check',
|
|
26
|
+
size: 'md',
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
export default meta;
|
|
31
|
+
|
|
32
|
+
type Story = StoryObj<typeof Icon>;
|
|
33
|
+
|
|
34
|
+
export const Default: Story = {
|
|
35
|
+
render: (args) => <Icon {...args} />,
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
export const Sizes: Story = {
|
|
39
|
+
render: () => (
|
|
40
|
+
<VStack space={spacing.lg}>
|
|
41
|
+
<Text weight="semiBold">Icon Sizes</Text>
|
|
42
|
+
<HStack space={spacing.lg} alignItems="center">
|
|
43
|
+
<VStack space={spacing.xs} alignItems="center">
|
|
44
|
+
<Icon name="check" size="xs" />
|
|
45
|
+
<Text size="sm" color={colors.text.secondary}>xs (12)</Text>
|
|
46
|
+
</VStack>
|
|
47
|
+
<VStack space={spacing.xs} alignItems="center">
|
|
48
|
+
<Icon name="check" size="sm" />
|
|
49
|
+
<Text size="sm" color={colors.text.secondary}>sm (16)</Text>
|
|
50
|
+
</VStack>
|
|
51
|
+
<VStack space={spacing.xs} alignItems="center">
|
|
52
|
+
<Icon name="check" size="md" />
|
|
53
|
+
<Text size="sm" color={colors.text.secondary}>md (20)</Text>
|
|
54
|
+
</VStack>
|
|
55
|
+
<VStack space={spacing.xs} alignItems="center">
|
|
56
|
+
<Icon name="check" size="lg" />
|
|
57
|
+
<Text size="sm" color={colors.text.secondary}>lg (24)</Text>
|
|
58
|
+
</VStack>
|
|
59
|
+
<VStack space={spacing.xs} alignItems="center">
|
|
60
|
+
<Icon name="check" size="xl" />
|
|
61
|
+
<Text size="sm" color={colors.text.secondary}>xl (32)</Text>
|
|
62
|
+
</VStack>
|
|
63
|
+
</HStack>
|
|
64
|
+
</VStack>
|
|
65
|
+
),
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
export const CustomSize: Story = {
|
|
69
|
+
render: () => (
|
|
70
|
+
<VStack space={spacing.lg}>
|
|
71
|
+
<Text weight="semiBold">Custom Numeric Sizes</Text>
|
|
72
|
+
<HStack space={spacing.lg} alignItems="center">
|
|
73
|
+
<Icon name="star" size={16} />
|
|
74
|
+
<Icon name="star" size={24} />
|
|
75
|
+
<Icon name="star" size={32} />
|
|
76
|
+
<Icon name="star" size={48} />
|
|
77
|
+
<Icon name="star" size={64} />
|
|
78
|
+
</HStack>
|
|
79
|
+
</VStack>
|
|
80
|
+
),
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
export const Colors: Story = {
|
|
84
|
+
render: () => (
|
|
85
|
+
<VStack space={spacing.lg}>
|
|
86
|
+
<Text weight="semiBold">Icon Colors</Text>
|
|
87
|
+
<HStack space={spacing.lg}>
|
|
88
|
+
<Icon name="heart" size="lg" color={colors.feedback.error.content} />
|
|
89
|
+
<Icon name="star" size="lg" color={colors.feedback.warning.content} />
|
|
90
|
+
<Icon name="check" size="lg" color={colors.feedback.success.content} />
|
|
91
|
+
<Icon name="info" size="lg" color={colors.brand.blue} />
|
|
92
|
+
<Icon name="warning" size="lg" color={colors.badge.purple} />
|
|
93
|
+
</HStack>
|
|
94
|
+
</VStack>
|
|
95
|
+
),
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
export const AllIcons: Story = {
|
|
99
|
+
render: () => (
|
|
100
|
+
<VStack space={spacing.lg}>
|
|
101
|
+
<Text weight="semiBold">All Available Icons</Text>
|
|
102
|
+
<Grid columns={6} gap={spacing.lg}>
|
|
103
|
+
{(Object.keys(iconPaths) as Array<keyof typeof iconPaths>).map((name) => (
|
|
104
|
+
<GridItem key={name}>
|
|
105
|
+
<VStack space={spacing.sm} alignItems="center">
|
|
106
|
+
<Box
|
|
107
|
+
p={spacing.md}
|
|
108
|
+
bg={colors.background.secondary}
|
|
109
|
+
rounded="lg"
|
|
110
|
+
alignItems="center"
|
|
111
|
+
justifyContent="center"
|
|
112
|
+
>
|
|
113
|
+
<Icon name={name} size="lg" />
|
|
114
|
+
</Box>
|
|
115
|
+
<Text size="sm" color={colors.text.secondary} style={{ textAlign: 'center' }}>
|
|
116
|
+
{name}
|
|
117
|
+
</Text>
|
|
118
|
+
</VStack>
|
|
119
|
+
</GridItem>
|
|
120
|
+
))}
|
|
121
|
+
</Grid>
|
|
122
|
+
</VStack>
|
|
123
|
+
),
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
export const NavigationIcons: Story = {
|
|
127
|
+
render: () => (
|
|
128
|
+
<VStack space={16}>
|
|
129
|
+
<Text weight="semiBold">Navigation Icons</Text>
|
|
130
|
+
<HStack space={16}>
|
|
131
|
+
<VStack space={4} alignItems="center">
|
|
132
|
+
<Icon name="chevronLeft" size="lg" />
|
|
133
|
+
<Text size="sm" color="#64748b">chevronLeft</Text>
|
|
134
|
+
</VStack>
|
|
135
|
+
<VStack space={4} alignItems="center">
|
|
136
|
+
<Icon name="chevronRight" size="lg" />
|
|
137
|
+
<Text size="sm" color="#64748b">chevronRight</Text>
|
|
138
|
+
</VStack>
|
|
139
|
+
<VStack space={4} alignItems="center">
|
|
140
|
+
<Icon name="chevronUp" size="lg" />
|
|
141
|
+
<Text size="sm" color="#64748b">chevronUp</Text>
|
|
142
|
+
</VStack>
|
|
143
|
+
<VStack space={4} alignItems="center">
|
|
144
|
+
<Icon name="chevronDown" size="lg" />
|
|
145
|
+
<Text size="sm" color="#64748b">chevronDown</Text>
|
|
146
|
+
</VStack>
|
|
147
|
+
<VStack space={4} alignItems="center">
|
|
148
|
+
<Icon name="arrowLeft" size="lg" />
|
|
149
|
+
<Text size="sm" color="#64748b">arrowLeft</Text>
|
|
150
|
+
</VStack>
|
|
151
|
+
<VStack space={4} alignItems="center">
|
|
152
|
+
<Icon name="arrowRight" size="lg" />
|
|
153
|
+
<Text size="sm" color="#64748b">arrowRight</Text>
|
|
154
|
+
</VStack>
|
|
155
|
+
</HStack>
|
|
156
|
+
</VStack>
|
|
157
|
+
),
|
|
158
|
+
};
|
|
159
|
+
|
|
160
|
+
export const ActionIcons: Story = {
|
|
161
|
+
render: () => (
|
|
162
|
+
<VStack space={16}>
|
|
163
|
+
<Text weight="semiBold">Action Icons</Text>
|
|
164
|
+
<HStack space={16}>
|
|
165
|
+
<VStack space={4} alignItems="center">
|
|
166
|
+
<Icon name="plus" size="lg" />
|
|
167
|
+
<Text size="sm" color="#64748b">plus</Text>
|
|
168
|
+
</VStack>
|
|
169
|
+
<VStack space={4} alignItems="center">
|
|
170
|
+
<Icon name="minus" size="lg" />
|
|
171
|
+
<Text size="sm" color="#64748b">minus</Text>
|
|
172
|
+
</VStack>
|
|
173
|
+
<VStack space={4} alignItems="center">
|
|
174
|
+
<Icon name="edit" size="lg" />
|
|
175
|
+
<Text size="sm" color="#64748b">edit</Text>
|
|
176
|
+
</VStack>
|
|
177
|
+
<VStack space={4} alignItems="center">
|
|
178
|
+
<Icon name="trash" size="lg" />
|
|
179
|
+
<Text size="sm" color="#64748b">trash</Text>
|
|
180
|
+
</VStack>
|
|
181
|
+
<VStack space={4} alignItems="center">
|
|
182
|
+
<Icon name="copy" size="lg" />
|
|
183
|
+
<Text size="sm" color="#64748b">copy</Text>
|
|
184
|
+
</VStack>
|
|
185
|
+
<VStack space={4} alignItems="center">
|
|
186
|
+
<Icon name="share" size="lg" />
|
|
187
|
+
<Text size="sm" color="#64748b">share</Text>
|
|
188
|
+
</VStack>
|
|
189
|
+
</HStack>
|
|
190
|
+
</VStack>
|
|
191
|
+
),
|
|
192
|
+
};
|
|
193
|
+
|
|
194
|
+
export const StatusIcons: Story = {
|
|
195
|
+
render: () => (
|
|
196
|
+
<VStack space={spacing.lg}>
|
|
197
|
+
<Text weight="semiBold">Status Icons</Text>
|
|
198
|
+
<HStack space={spacing.lg}>
|
|
199
|
+
<VStack space={spacing.xs} alignItems="center">
|
|
200
|
+
<Box p={spacing.sm} bg={colors.feedback.success.background} rounded="full">
|
|
201
|
+
<Icon name="success" size="lg" color={colors.feedback.success.content} />
|
|
202
|
+
</Box>
|
|
203
|
+
<Text size="sm" color={colors.text.secondary}>success</Text>
|
|
204
|
+
</VStack>
|
|
205
|
+
<VStack space={spacing.xs} alignItems="center">
|
|
206
|
+
<Box p={spacing.sm} bg={colors.feedback.warning.background} rounded="full">
|
|
207
|
+
<Icon name="warning" size="lg" color={colors.feedback.warning.content} />
|
|
208
|
+
</Box>
|
|
209
|
+
<Text size="sm" color={colors.text.secondary}>warning</Text>
|
|
210
|
+
</VStack>
|
|
211
|
+
<VStack space={spacing.xs} alignItems="center">
|
|
212
|
+
<Box p={spacing.sm} bg={colors.feedback.error.background} rounded="full">
|
|
213
|
+
<Icon name="error" size="lg" color={colors.feedback.error.content} />
|
|
214
|
+
</Box>
|
|
215
|
+
<Text size="sm" color={colors.text.secondary}>error</Text>
|
|
216
|
+
</VStack>
|
|
217
|
+
<VStack space={spacing.xs} alignItems="center">
|
|
218
|
+
<Box p={spacing.sm} bg={colors.feedback.info.background} rounded="full">
|
|
219
|
+
<Icon name="info" size="lg" color={colors.brand.blue} />
|
|
220
|
+
</Box>
|
|
221
|
+
<Text size="sm" color={colors.text.secondary}>info</Text>
|
|
222
|
+
</VStack>
|
|
223
|
+
</HStack>
|
|
224
|
+
</VStack>
|
|
225
|
+
),
|
|
226
|
+
};
|
|
227
|
+
|
|
228
|
+
export const InButtons: Story = {
|
|
229
|
+
render: () => (
|
|
230
|
+
<VStack space={16}>
|
|
231
|
+
<Text weight="semiBold">Icons in UI Elements</Text>
|
|
232
|
+
<HStack space={12}>
|
|
233
|
+
<Box
|
|
234
|
+
flexDirection="row"
|
|
235
|
+
alignItems="center"
|
|
236
|
+
p={12}
|
|
237
|
+
bg="#3b82f6"
|
|
238
|
+
rounded="lg"
|
|
239
|
+
>
|
|
240
|
+
<Icon name="plus" size="sm" color="white" />
|
|
241
|
+
<Text style={{ color: 'white', marginLeft: 8 }}>Add Item</Text>
|
|
242
|
+
</Box>
|
|
243
|
+
<Box
|
|
244
|
+
flexDirection="row"
|
|
245
|
+
alignItems="center"
|
|
246
|
+
p={12}
|
|
247
|
+
bg="#f1f5f9"
|
|
248
|
+
rounded="lg"
|
|
249
|
+
>
|
|
250
|
+
<Icon name="search" size="sm" />
|
|
251
|
+
<Text style={{ marginLeft: 8 }}>Search</Text>
|
|
252
|
+
</Box>
|
|
253
|
+
<Box
|
|
254
|
+
flexDirection="row"
|
|
255
|
+
alignItems="center"
|
|
256
|
+
p={12}
|
|
257
|
+
bg="#fee2e2"
|
|
258
|
+
rounded="lg"
|
|
259
|
+
>
|
|
260
|
+
<Icon name="trash" size="sm" color="#ef4444" />
|
|
261
|
+
<Text style={{ color: '#ef4444', marginLeft: 8 }}>Delete</Text>
|
|
262
|
+
</Box>
|
|
263
|
+
</HStack>
|
|
264
|
+
</VStack>
|
|
265
|
+
),
|
|
266
|
+
};
|
|
267
|
+
|
|
268
|
+
export const IconOnlyButtons: Story = {
|
|
269
|
+
render: () => (
|
|
270
|
+
<VStack space={16}>
|
|
271
|
+
<Text weight="semiBold">Icon-Only Buttons</Text>
|
|
272
|
+
<HStack space={8}>
|
|
273
|
+
<Box p={10} bg="#f1f5f9" rounded="md">
|
|
274
|
+
<Icon name="home" size="md" />
|
|
275
|
+
</Box>
|
|
276
|
+
<Box p={10} bg="#f1f5f9" rounded="md">
|
|
277
|
+
<Icon name="settings" size="md" />
|
|
278
|
+
</Box>
|
|
279
|
+
<Box p={10} bg="#f1f5f9" rounded="md">
|
|
280
|
+
<Icon name="bell" size="md" />
|
|
281
|
+
</Box>
|
|
282
|
+
<Box p={10} bg="#f1f5f9" rounded="md">
|
|
283
|
+
<Icon name="user" size="md" />
|
|
284
|
+
</Box>
|
|
285
|
+
<Box p={10} bg="#f1f5f9" rounded="full">
|
|
286
|
+
<Icon name="plus" size="md" />
|
|
287
|
+
</Box>
|
|
288
|
+
</HStack>
|
|
289
|
+
</VStack>
|
|
290
|
+
),
|
|
291
|
+
};
|
|
292
|
+
|
|
293
|
+
export const ListWithIcons: Story = {
|
|
294
|
+
render: () => (
|
|
295
|
+
<VStack space={16}>
|
|
296
|
+
<Text weight="semiBold">List with Icons</Text>
|
|
297
|
+
<Box p={16} bg="#ffffff" rounded="lg" shadow="10">
|
|
298
|
+
<VStack space={12}>
|
|
299
|
+
<HStack space={12} alignItems="center">
|
|
300
|
+
<Icon name="mail" color="#64748b" />
|
|
301
|
+
<Text>Messages</Text>
|
|
302
|
+
</HStack>
|
|
303
|
+
<HStack space={12} alignItems="center">
|
|
304
|
+
<Icon name="calendar" color="#64748b" />
|
|
305
|
+
<Text>Calendar</Text>
|
|
306
|
+
</HStack>
|
|
307
|
+
<HStack space={12} alignItems="center">
|
|
308
|
+
<Icon name="phone" color="#64748b" />
|
|
309
|
+
<Text>Contacts</Text>
|
|
310
|
+
</HStack>
|
|
311
|
+
<HStack space={12} alignItems="center">
|
|
312
|
+
<Icon name="location" color="#64748b" />
|
|
313
|
+
<Text>Locations</Text>
|
|
314
|
+
</HStack>
|
|
315
|
+
</VStack>
|
|
316
|
+
</Box>
|
|
317
|
+
</VStack>
|
|
318
|
+
),
|
|
319
|
+
};
|
|
320
|
+
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Icon Component
|
|
3
|
+
* Wrapper for vector icons with consistent sizing and colors
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import React, { forwardRef } from 'react';
|
|
7
|
+
import { View, ViewProps, StyleSheet } from 'react-native';
|
|
8
|
+
import Svg, { Path, SvgProps } from 'react-native-svg';
|
|
9
|
+
import { colors } from '../../styles/tokens';
|
|
10
|
+
|
|
11
|
+
export interface IconProps extends ViewProps {
|
|
12
|
+
/** Icon name (maps to built-in icons) */
|
|
13
|
+
name?: keyof typeof iconPaths;
|
|
14
|
+
/** Icon size */
|
|
15
|
+
size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | number;
|
|
16
|
+
/** Icon color */
|
|
17
|
+
color?: string;
|
|
18
|
+
/** Custom SVG content */
|
|
19
|
+
as?: React.ComponentType<SvgProps>;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const sizeMap = {
|
|
23
|
+
xs: 12,
|
|
24
|
+
sm: 16,
|
|
25
|
+
md: 20,
|
|
26
|
+
lg: 24,
|
|
27
|
+
xl: 32,
|
|
28
|
+
} as const;
|
|
29
|
+
|
|
30
|
+
const iconPaths = {
|
|
31
|
+
check: 'M20 6L9 17l-5-5',
|
|
32
|
+
close: 'M18 6L6 18M6 6l12 12',
|
|
33
|
+
chevronDown: 'M6 9l6 6 6-6',
|
|
34
|
+
chevronUp: 'M18 15l-6-6-6 6',
|
|
35
|
+
chevronLeft: 'M15 18l-6-6 6-6',
|
|
36
|
+
chevronRight: 'M9 18l6-6-6-6',
|
|
37
|
+
plus: 'M12 5v14M5 12h14',
|
|
38
|
+
minus: 'M5 12h14',
|
|
39
|
+
search: 'M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z',
|
|
40
|
+
menu: 'M4 6h16M4 12h16M4 18h16',
|
|
41
|
+
user: 'M20 21v-2a4 4 0 00-4-4H8a4 4 0 00-4 4v2M12 11a4 4 0 100-8 4 4 0 000 8z',
|
|
42
|
+
settings: 'M12 15a3 3 0 100-6 3 3 0 000 6z',
|
|
43
|
+
info: 'M12 16v-4m0-4h.01M22 12a10 10 0 11-20 0 10 10 0 0120 0z',
|
|
44
|
+
warning: 'M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z',
|
|
45
|
+
error: 'M12 8v4m0 4h.01M22 12a10 10 0 11-20 0 10 10 0 0120 0z',
|
|
46
|
+
success: 'M9 12l2 2 4-4m6 2a10 10 0 11-20 0 10 10 0 0120 0z',
|
|
47
|
+
eye: 'M15 12a3 3 0 11-6 0 3 3 0 016 0zM2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z',
|
|
48
|
+
eyeOff: 'M13.875 18.825A10.05 10.05 0 0112 19c-4.478 0-8.268-2.943-9.543-7a9.97 9.97 0 011.563-3.029m5.858.908a3 3 0 114.243 4.243M9.878 9.878l4.242 4.242M9.88 9.88l-3.29-3.29m7.532 7.532l3.29 3.29M3 3l3.59 3.59m0 0A9.953 9.953 0 0112 5c4.478 0 8.268 2.943 9.543 7a10.025 10.025 0 01-4.132 5.411m0 0L21 21',
|
|
49
|
+
arrowLeft: 'M19 12H5M12 19l-7-7 7-7',
|
|
50
|
+
arrowRight: 'M5 12h14M12 5l7 7-7 7',
|
|
51
|
+
arrowUp: 'M12 19V5M5 12l7-7 7 7',
|
|
52
|
+
arrowDown: 'M12 5v14M19 12l-7 7-7-7',
|
|
53
|
+
calendar: 'M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z',
|
|
54
|
+
clock: 'M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z',
|
|
55
|
+
filter: 'M3 4a1 1 0 011-1h16a1 1 0 011 1v2.586a1 1 0 01-.293.707l-6.414 6.414a1 1 0 00-.293.707V17l-4 4v-6.586a1 1 0 00-.293-.707L3.293 7.293A1 1 0 013 6.586V4z',
|
|
56
|
+
sort: 'M3 4h13M3 8h9m-9 4h6m4 0l4-4m0 0l4 4m-4-4v12',
|
|
57
|
+
download: 'M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4',
|
|
58
|
+
upload: 'M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-8l-4-4m0 0L8 8m4-4v12',
|
|
59
|
+
trash: 'M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16',
|
|
60
|
+
edit: 'M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z',
|
|
61
|
+
copy: 'M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z',
|
|
62
|
+
share: 'M8.684 13.342C8.886 12.938 9 12.482 9 12c0-.482-.114-.938-.316-1.342m0 2.684a3 3 0 110-2.684m0 2.684l6.632 3.316m-6.632-6l6.632-3.316m0 0a3 3 0 105.367-2.684 3 3 0 00-5.367 2.684zm0 9.316a3 3 0 105.368 2.684 3 3 0 00-5.368-2.684z',
|
|
63
|
+
heart: 'M4.318 6.318a4.5 4.5 0 000 6.364L12 20.364l7.682-7.682a4.5 4.5 0 00-6.364-6.364L12 7.636l-1.318-1.318a4.5 4.5 0 00-6.364 0z',
|
|
64
|
+
star: 'M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z',
|
|
65
|
+
bell: 'M15 17h5l-1.405-1.405A2.032 2.032 0 0118 14.158V11a6.002 6.002 0 00-4-5.659V5a2 2 0 10-4 0v.341C7.67 6.165 6 8.388 6 11v3.159c0 .538-.214 1.055-.595 1.436L4 17h5m6 0v1a3 3 0 11-6 0v-1m6 0H9',
|
|
66
|
+
mail: 'M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z',
|
|
67
|
+
phone: 'M3 5a2 2 0 012-2h3.28a1 1 0 01.948.684l1.498 4.493a1 1 0 01-.502 1.21l-2.257 1.13a11.042 11.042 0 005.516 5.516l1.13-2.257a1 1 0 011.21-.502l4.493 1.498a1 1 0 01.684.949V19a2 2 0 01-2 2h-1C9.716 21 3 14.284 3 6V5z',
|
|
68
|
+
location: 'M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z M15 11a3 3 0 11-6 0 3 3 0 016 0z',
|
|
69
|
+
home: 'M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6',
|
|
70
|
+
} as const;
|
|
71
|
+
|
|
72
|
+
export const Icon = forwardRef<View, IconProps>(
|
|
73
|
+
({ style, name, size = 'md', color, as: CustomIcon, ...props }, ref) => {
|
|
74
|
+
const iconSize = typeof size === 'number' ? size : sizeMap[size];
|
|
75
|
+
const iconColor = color || colors.text.default;
|
|
76
|
+
|
|
77
|
+
if (CustomIcon) {
|
|
78
|
+
return (
|
|
79
|
+
<View ref={ref} style={[styles.container, style]} {...props}>
|
|
80
|
+
<CustomIcon width={iconSize} height={iconSize} color={iconColor} />
|
|
81
|
+
</View>
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
if (!name || !iconPaths[name]) {
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
return (
|
|
90
|
+
<View ref={ref} style={[styles.container, style]} {...props}>
|
|
91
|
+
<Svg
|
|
92
|
+
width={iconSize}
|
|
93
|
+
height={iconSize}
|
|
94
|
+
viewBox="0 0 24 24"
|
|
95
|
+
fill="none"
|
|
96
|
+
stroke={iconColor}
|
|
97
|
+
strokeWidth={2}
|
|
98
|
+
strokeLinecap="round"
|
|
99
|
+
strokeLinejoin="round"
|
|
100
|
+
>
|
|
101
|
+
<Path d={iconPaths[name]} />
|
|
102
|
+
</Svg>
|
|
103
|
+
</View>
|
|
104
|
+
);
|
|
105
|
+
}
|
|
106
|
+
);
|
|
107
|
+
|
|
108
|
+
Icon.displayName = 'Icon';
|
|
109
|
+
|
|
110
|
+
const styles = StyleSheet.create({
|
|
111
|
+
container: {
|
|
112
|
+
alignItems: 'center',
|
|
113
|
+
justifyContent: 'center',
|
|
114
|
+
},
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
export { iconPaths };
|