import { H1, H2, H3, H4, H5, H6 } from '@expo/html-elements';
import {
AnimatePresence,
AnimatedPressable,
AnimatedView,
} from '@gluestack-style/animation-resolver';
import { styled, AsForwarder } from '@gluestack-style/react';
import { createActionsheet } from '@gluestack-ui/actionsheet';
import { createSelect } from '@gluestack-ui/select';
import { TextInput } from 'react-native';
import {
Pressable,
View,
Text,
ScrollView,
VirtualizedList,
FlatList,
SectionList,
} from 'react-native';
const StyledRoot = styled(View, {
width: '$full',
height: '$full',
_web: {
pointerEvents: 'none',
},
});
const StyledContent = styled(
AnimatedView,
{
alignItems: 'center',
borderTopLeftRadius: '$3xl',
borderTopRightRadius: '$3xl',
h: '$full',
p: '$2',
bg: '$background0',
_sectionHeaderBackground: {
bg: '$background0',
},
defaultProps: {
hardShadow: '5',
},
_web: {
userSelect: 'none',
pointerEvents: 'auto',
},
},
{
descendantStyle: ['_sectionHeaderBackground'],
}
);
const StyledItem = styled(
Pressable,
{
'p': '$3',
'flexDirection': 'row',
'alignItems': 'center',
'rounded': '$sm',
'w': '$full',
':disabled': {
opacity: 0.4,
_web: {
// @ts-ignore
pointerEvents: 'all !important',
cursor: 'not-allowed',
},
},
':hover': {
bg: '$background50',
},
':active': {
bg: '$background100',
},
':focus': {
bg: '$background100',
},
'_web': {
':focusVisible': {
bg: '$background100',
},
},
},
{
descendantStyle: ['_text', '_icon'],
}
);
const StyledText = styled(
Text,
{
color: '$text700',
flex: 1,
fontWeight: '$normal',
fontFamily: '$body',
fontStyle: 'normal',
letterSpacing: '$md',
variants: {
isTruncated: {
true: {
props: {
// @ts-ignore
numberOfLines: 1,
ellipsizeMode: 'tail',
},
},
},
bold: {
true: {
fontWeight: '$bold',
},
},
underline: {
true: {
textDecorationLine: 'underline',
},
},
strikeThrough: {
true: {
textDecorationLine: 'line-through',
},
},
size: {
'2xs': {
fontSize: '$2xs',
},
'xs': {
fontSize: '$xs',
},
'sm': {
fontSize: '$sm',
},
'md': {
fontSize: '$md',
},
'lg': {
fontSize: '$lg',
},
'xl': {
fontSize: '$xl',
},
'2xl': {
fontSize: '$2xl',
},
'3xl': {
fontSize: '$3xl',
},
'4xl': {
fontSize: '$4xl',
},
'5xl': {
fontSize: '$5xl',
},
'6xl': {
fontSize: '$6xl',
},
},
sub: {
true: {
fontSize: '$xs',
},
},
italic: {
true: {
fontStyle: 'italic',
},
},
highlight: {
true: {
bg: '$yellow500',
},
},
},
defaultProps: {
size: 'md',
},
},
{
ancestorStyle: ['_text'],
}
);
const StyledItemText = styled(
StyledText,
{
mx: '$2',
props: {
size: 'md',
},
color: '$text800',
},
{
ancestorStyle: ['_text'],
}
);
const StyledDragIndicator = styled(View, {
w: '$16',
h: '$1',
bg: '$background400',
rounded: '$full',
});
const StyledDragIndicatorWrapper = styled(View, {
py: '$1',
w: '$full',
alignItems: 'center',
});
const StyledBackdrop = styled(AnimatedPressable, {
':initial': {
opacity: 0,
},
':animate': {
opacity: 0.5,
},
':exit': {
opacity: 0,
},
'position': 'absolute',
'left': 0,
'top': 0,
'right': 0,
'bottom': 0,
'bg': '$background950',
'_web': {
cursor: 'default',
pointerEvents: 'auto',
},
});
const StyledScrollView = styled(ScrollView, {
w: '$full',
h: 'auto',
});
const StyledVirtualizedList = styled(VirtualizedList, {
w: '$full',
h: 'auto',
});
const StyledFlatList = styled(FlatList, {
w: '$full',
h: 'auto',
});
const StyledSectionList = styled(SectionList, {
w: '$full',
h: 'auto',
});
const StyledSectionHeaderText = styled(H4, {
letterSpacing: '$sm',
fontWeight: '$bold',
fontFamily: '$heading',
// Overrides expo-html default styling
marginVertical: 0,
variants: {
isTruncated: {
true: {
props: {
// @ts-ignore
numberOfLines: 1,
ellipsizeMode: 'tail',
},
},
},
bold: {
true: {
fontWeight: '$bold',
},
},
underline: {
true: {
textDecorationLine: 'underline',
},
},
strikeThrough: {
true: {
textDecorationLine: 'line-through',
},
},
size: {
'5xl': {
//@ts-ignore
props: { as: H1 },
fontSize: '$6xl',
},
'4xl': {
//@ts-ignore
props: { as: H1 },
fontSize: '$5xl',
},
'3xl': {
//@ts-ignore
props: { as: H1 },
fontSize: '$4xl',
},
'2xl': {
//@ts-ignore
props: { as: H2 },
fontSize: '$3xl',
},
'xl': {
//@ts-ignore
props: { as: H3 },
fontSize: '$2xl',
},
'lg': {
//@ts-ignore
props: { as: H4 },
fontSize: '$xl',
},
'md': {
//@ts-ignore
props: { as: H5 },
fontSize: '$lg',
},
'sm': {
//@ts-ignore
props: { as: H6 },
fontSize: '$md',
},
'xs': {
//@ts-ignore
props: { as: H6 },
fontSize: '$sm',
},
},
sub: {
true: {
fontSize: '$xs',
},
},
italic: {
true: {
fontStyle: 'italic',
},
},
highlight: {
true: {
bg: '$yellow500',
},
},
},
color: '$text500',
props: { size: 'xs' },
textTransform: 'uppercase',
p: '$3',
});
const StyledIcon = styled(
AsForwarder,
{
variants: {
size: {
'2xs': {
h: '$3',
w: '$3',
props: {
// @ts-ignore
size: 12,
},
},
'xs': {
h: '$3.5',
w: '$3.5',
props: {
//@ts-ignore
size: 14,
},
},
'sm': {
h: '$4',
w: '$4',
props: {
//@ts-ignore
size: 16,
},
},
'md': {
h: '$4.5',
w: '$4.5',
props: {
//@ts-ignore
size: 18,
},
},
'lg': {
h: '$5',
w: '$5',
props: {
//@ts-ignore
size: 20,
},
},
'xl': {
h: '$6',
w: '$6',
props: {
//@ts-ignore
size: 24,
},
},
},
},
props: {
size: 'sm',
// @ts-ignore
fill: 'none',
},
color: '$background500',
},
{
componentName: 'BaseIcon',
resolveProps: ['stroke', 'fill'],
} as const,
{
propertyTokenMap: {
stroke: 'colors',
fill: 'colors',
},
}
);
const StyledSelectRoot = styled(View, {});
const StyledSelectTrigger = styled(
Pressable,
{
'borderWidth': 1,
'borderColor': '$background300',
'borderRadius': '$sm',
'flexDirection': 'row',
'overflow': 'hidden',
'alignItems': 'center',
':hover': {
borderColor: '$border400',
},
':focus': {
borderColor: '$primary700',
},
':disabled': {
'opacity': 0.4,
':hover': {
borderColor: '$background300',
},
},
'_input': {
py: 'auto',
px: '$3',
},
'_icon': {
color: '$background500',
},
'variants': {
size: {
xl: {
h: '$12',
_input: {
fontSize: '$xl',
},
_icon: {
h: '$6',
w: '$6',
},
},
lg: {
h: '$11',
_input: {
fontSize: '$lg',
},
_icon: {
h: '$5',
w: '$5',
},
},
md: {
h: '$10',
_input: {
fontSize: '$md',
},
_icon: {
h: '$4',
w: '$4',
},
},
sm: {
h: '$9',
_input: {
fontSize: '$sm',
},
_icon: {
h: '$3.5',
w: '$3.5',
},
},
},
variant: {
underlined: {
'_input': {
_web: {
outlineWidth: 0,
outline: 'none',
},
px: '$0',
},
'borderWidth': 0,
'borderRadius': 0,
'borderBottomWidth': '$1',
':focus': {
'borderColor': '$primary700',
'_web': {
boxShadow: 'inset 0 -1px 0 0 $primary700',
},
':hover': {
borderColor: '$primary700',
_web: {
boxShadow: 'inset 0 -1px 0 0 $primary600',
},
},
},
':invalid': {
'borderBottomWidth': 2,
'borderBottomColor': '$error700',
'_web': {
boxShadow: 'inset 0 -1px 0 0 $error700',
},
':hover': {
borderBottomColor: '$error700',
},
':focus': {
'borderBottomColor': '$error700',
':hover': {
borderBottomColor: '$error700',
_web: {
boxShadow: 'inset 0 -1px 0 0 $error700',
},
},
},
':disabled': {
':hover': {
borderBottomColor: '$error700',
_web: {
boxShadow: 'inset 0 -1px 0 0 $error700',
},
},
},
},
},
outline: {
'_input': {
_web: {
outlineWidth: 0,
outline: 'none',
},
},
':focus': {
'borderColor': '$primary700',
'_web': {
boxShadow: 'inset 0 0 0 1px $primary700',
},
':hover': {
borderColor: '$primary700',
_web: {
boxShadow: 'inset 0 0 0 1px $primary600',
},
},
},
':invalid': {
'borderColor': '$error700',
'_web': {
boxShadow: 'inset 0 0 0 1px $error700',
},
':hover': {
borderColor: '$error700',
},
':focus': {
'borderColor': '$error700',
':hover': {
borderColor: '$error700',
_web: {
boxShadow: 'inset 0 0 0 1px $error700',
},
},
},
':disabled': {
':hover': {
borderColor: '$error700',
_web: {
boxShadow: 'inset 0 0 0 1px $error700',
},
},
},
},
},
rounded: {
'borderRadius': 999,
'_input': {
px: '$4',
_web: {
outlineWidth: 0,
outline: 'none',
},
},
':focus': {
'borderColor': '$primary700',
'_web': {
boxShadow: 'inset 0 0 0 1px $primary700',
},
':hover': {
borderColor: '$primary700',
_web: {
boxShadow: 'inset 0 0 0 1px $primary600',
},
},
},
':invalid': {
'borderColor': '$error700',
'_web': {
boxShadow: 'inset 0 0 0 1px $error700',
},
':hover': {
borderColor: '$error700',
},
':focus': {
'borderColor': '$error700',
':hover': {
borderColor: '$error700',
_web: {
boxShadow: 'inset 0 0 0 1px $error700',
},
},
},
':disabled': {
':hover': {
borderColor: '$error700',
_web: {
boxShadow: 'inset 0 0 0 1px $error700',
},
},
},
},
},
},
},
'defaultProps': {
size: 'md',
variant: 'outline',
},
},
{
descendantStyle: ['_input', '_icon'],
}
);
const StyledSelectInput = styled(
TextInput,
{
_web: {
w: '$full',
},
pointerEvents: 'none',
flex: 1,
h: '$full',
color: '$text900',
props: {
placeholderTextColor: '$text500',
},
},
{
ancestorStyle: ['_input'],
resolveProps: ['placeholderTextColor'],
},
{
propertyTokenMap: {
placeholderTextColor: 'colors',
},
}
);
const Actionsheet = createActionsheet({
Root: StyledRoot,
Content: StyledContent,
Item: StyledItem,
ItemText: StyledItemText,
DragIndicator: StyledDragIndicator,
IndicatorWrapper: StyledDragIndicatorWrapper,
Backdrop: StyledBackdrop,
ScrollView: StyledScrollView,
VirtualizedList: StyledVirtualizedList,
FlatList: StyledFlatList,
SectionList: StyledSectionList,
SectionHeaderText: StyledSectionHeaderText,
Icon: StyledIcon,
AnimatePresence: AnimatePresence,
});
export const Select = createSelect(
{
Root: StyledSelectRoot,
Trigger: StyledSelectTrigger,
Input: StyledSelectInput,
Icon: StyledIcon,
},
{
Portal: Actionsheet,
Backdrop: Actionsheet.Backdrop,
Content: Actionsheet.Content,
DragIndicator: Actionsheet.DragIndicator,
DragIndicatorWrapper: Actionsheet.DragIndicatorWrapper,
Item: Actionsheet.Item,
ItemText: Actionsheet.ItemText,
ScrollView: Actionsheet.ScrollView,
VirtualizedList: Actionsheet.VirtualizedList,
FlatList: Actionsheet.FlatList,
SectionList: Actionsheet.SectionList,
SectionHeaderText: Actionsheet.SectionHeaderText,
}
);
export const SelectTrigger = Select.Trigger;
export const SelectInput = Select.Input;
export const SelectIcon = Select.Icon;
export const SelectPortal = Select.Portal;
export const SelectBackdrop = Select.Backdrop;
export const SelectContent = Select.Content;
export const SelectDragIndicator = Select.DragIndicator;
export const SelectDragIndicatorWrapper = Select.DragIndicatorWrapper;
export const SelectItem = Select.Item;
export const SelectItemText = Select.ItemText;
export const SelectScrollView = Select.ScrollView;
export const SelectVirtualizedList = Select.VirtualizedList;
export const SelectFlatList = Select.FlatList;
export const SelectSectionList = Select.SectionList;
export const SelectSectionHeaderText = Select.SectionHeaderText;