@tamagui/list-item 1.2.8 → 1.2.10

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.
@@ -0,0 +1,174 @@
1
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
2
+ import {
3
+ Spacer,
4
+ getTokens,
5
+ getVariableValue,
6
+ styled,
7
+ themeable,
8
+ useMediaPropsActive,
9
+ withStaticProperties
10
+ } from "@tamagui/core";
11
+ import { getFontSize } from "@tamagui/font-size";
12
+ import { getSpace, useGetThemedIcon } from "@tamagui/helpers-tamagui";
13
+ import { ThemeableStack, YStack } from "@tamagui/stacks";
14
+ import { SizableText, wrapChildrenInText } from "@tamagui/text";
15
+ import { forwardRef } from "react";
16
+ const NAME = "ListItem";
17
+ const ListItemFrame = styled(ThemeableStack, {
18
+ name: NAME,
19
+ tag: "li",
20
+ alignItems: "center",
21
+ flexWrap: "nowrap",
22
+ width: "100%",
23
+ borderColor: "$borderColor",
24
+ maxWidth: "100%",
25
+ overflow: "hidden",
26
+ flexDirection: "row",
27
+ variants: {
28
+ size: {
29
+ "...size": (val, { tokens }) => {
30
+ return {
31
+ minHeight: tokens.size[val],
32
+ paddingHorizontal: tokens.space[val],
33
+ paddingVertical: getSpace(val, -2)
34
+ };
35
+ }
36
+ },
37
+ active: {
38
+ true: {
39
+ hoverStyle: {
40
+ backgroundColor: "$background"
41
+ }
42
+ }
43
+ },
44
+ disabled: {
45
+ true: {
46
+ opacity: 0.5,
47
+ // TODO breaking types
48
+ pointerEvents: "none"
49
+ }
50
+ }
51
+ },
52
+ defaultVariants: {
53
+ size: "$true"
54
+ }
55
+ });
56
+ const ListItemText = styled(SizableText, {
57
+ name: "ListItemText",
58
+ color: "$color",
59
+ userSelect: "none",
60
+ flexGrow: 1,
61
+ flexShrink: 1,
62
+ ellipse: true,
63
+ cursor: "default"
64
+ });
65
+ const ListItemSubtitle = styled(ListItemText, {
66
+ name: "ListItemSubtitle",
67
+ color: "$colorPress",
68
+ marginTop: "$-2",
69
+ opacity: 0.65,
70
+ maxWidth: "100%",
71
+ size: "$3"
72
+ });
73
+ const ListItemTitle = styled(ListItemText, {
74
+ name: "ListItemTitle"
75
+ });
76
+ const useListItem = (props, {
77
+ Text = ListItemText,
78
+ Subtitle = ListItemSubtitle,
79
+ Title = ListItemTitle
80
+ } = { Text: ListItemText, Subtitle: ListItemSubtitle, Title: ListItemTitle }) => {
81
+ const {
82
+ children,
83
+ icon,
84
+ iconAfter,
85
+ noTextWrap,
86
+ theme: themeName,
87
+ space,
88
+ spaceFlex,
89
+ scaleIcon = 1,
90
+ scaleSpace = 1,
91
+ subTitle,
92
+ // text props
93
+ color,
94
+ fontWeight,
95
+ letterSpacing,
96
+ fontSize,
97
+ fontFamily,
98
+ textAlign,
99
+ textProps,
100
+ title,
101
+ ...rest
102
+ } = props;
103
+ const mediaActiveProps = useMediaPropsActive(props);
104
+ const size = mediaActiveProps.size || "$true";
105
+ const subtitleSize = `$${+String(size).replace("$", "") - 1}`;
106
+ const iconSize = getFontSize(size) * scaleIcon;
107
+ const getThemedIcon = useGetThemedIcon({ size: iconSize, color });
108
+ const [themedIcon, themedIconAfter] = [icon, iconAfter].map(getThemedIcon);
109
+ const spaceSize = getVariableValue(getTokens().space[mediaActiveProps.space] ?? iconSize) * scaleSpace;
110
+ const contents = wrapChildrenInText(Text, mediaActiveProps);
111
+ return {
112
+ props: {
113
+ fontFamily,
114
+ ...rest,
115
+ children: /* @__PURE__ */ jsxs(Fragment, { children: [
116
+ themedIcon ? /* @__PURE__ */ jsxs(Fragment, { children: [
117
+ themedIcon,
118
+ /* @__PURE__ */ jsx(Spacer, { size: spaceSize })
119
+ ] }) : null,
120
+ title || subTitle ? /* @__PURE__ */ jsxs(YStack, { flex: 1, children: [
121
+ noTextWrap === "all" ? title : /* @__PURE__ */ jsx(Title, { size, children: title }),
122
+ subTitle ? /* @__PURE__ */ jsxs(Fragment, { children: [
123
+ /* @__PURE__ */ jsx(Spacer, { flex: true, size: spaceSize * 0.333 }),
124
+ typeof subTitle === "string" && noTextWrap !== "all" ? (
125
+ // TODO can use theme but we need to standardize to alt themes
126
+ // or standardize on subtle colors in themes
127
+ /* @__PURE__ */ jsx(Subtitle, { size: subtitleSize, children: subTitle })
128
+ ) : subTitle
129
+ ] }) : null,
130
+ contents
131
+ ] }) : contents,
132
+ themedIconAfter ? /* @__PURE__ */ jsxs(Fragment, { children: [
133
+ /* @__PURE__ */ jsx(Spacer, { size: spaceSize }),
134
+ themedIconAfter
135
+ ] }) : null
136
+ ] })
137
+ }
138
+ };
139
+ };
140
+ const ListItemComponent = forwardRef((props, ref) => {
141
+ const { props: listItemProps } = useListItem(props);
142
+ return /* @__PURE__ */ jsx(ListItemFrame, { ref, justifyContent: "space-between", ...listItemProps });
143
+ });
144
+ const listItemStaticConfig = {
145
+ inlineProps: /* @__PURE__ */ new Set([
146
+ // text props go here (can't really optimize them, but we never fully extract listItem anyway)
147
+ "color",
148
+ "fontWeight",
149
+ "fontSize",
150
+ "fontFamily",
151
+ "letterSpacing",
152
+ "textAlign"
153
+ ])
154
+ };
155
+ const ListItem = withStaticProperties(
156
+ ListItemFrame.extractable(
157
+ themeable(ListItemComponent, { componentName: NAME }),
158
+ listItemStaticConfig
159
+ ),
160
+ {
161
+ Text: ListItemText,
162
+ Subtitle: ListItemSubtitle
163
+ }
164
+ );
165
+ export {
166
+ ListItem,
167
+ ListItemFrame,
168
+ ListItemSubtitle,
169
+ ListItemText,
170
+ ListItemTitle,
171
+ listItemStaticConfig,
172
+ useListItem
173
+ };
174
+ //# sourceMappingURL=ListItem.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/ListItem.tsx"],
4
+ "sourcesContent": ["import {\n FontSizeTokens,\n GetProps,\n Spacer,\n TamaguiElement,\n ThemeableProps,\n getTokens,\n getVariableValue,\n styled,\n themeable,\n useMediaPropsActive,\n withStaticProperties,\n} from '@tamagui/core'\nimport { getFontSize } from '@tamagui/font-size'\nimport { getSize } from '@tamagui/get-size'\nimport { getSpace, useGetThemedIcon } from '@tamagui/helpers-tamagui'\nimport { ThemeableStack, YStack } from '@tamagui/stacks'\nimport { SizableText, TextParentStyles, wrapChildrenInText } from '@tamagui/text'\nimport React, { FunctionComponent, forwardRef } from 'react'\n\ntype ListItemIconProps = { color?: string; size?: number }\ntype IconProp = JSX.Element | FunctionComponent<ListItemIconProps> | null\n\nexport type ListItemProps = Omit<TextParentStyles, 'TextComponent' | 'noTextWrap'> &\n GetProps<typeof ListItemFrame> &\n ThemeableProps & {\n /**\n * add icon before, passes color and size automatically if Component\n */\n icon?: IconProp\n /**\n * add icon after, passes color and size automatically if Component\n */\n iconAfter?: IconProp\n /**\n * adjust icon relative to size\n */\n /**\n * default: -1\n */\n scaleIcon?: number\n /**\n * make the spacing elements flex\n */\n spaceFlex?: number | boolean\n /**\n * adjust internal space relative to icon size\n */\n scaleSpace?: number\n /**\n * title\n */\n title?: React.ReactNode\n /**\n * subtitle\n */\n subTitle?: React.ReactNode\n /**\n * will not wrap text around `children` only, \"all\" will not wrap title or subTitle\n */\n noTextWrap?: boolean | 'all'\n }\n\nconst NAME = 'ListItem'\n\nexport const ListItemFrame = styled(ThemeableStack, {\n name: NAME,\n tag: 'li',\n alignItems: 'center',\n flexWrap: 'nowrap',\n width: '100%',\n borderColor: '$borderColor',\n maxWidth: '100%',\n overflow: 'hidden',\n flexDirection: 'row',\n\n variants: {\n size: {\n '...size': (val, { tokens }) => {\n return {\n minHeight: tokens.size[val],\n paddingHorizontal: tokens.space[val],\n paddingVertical: getSpace(val, -2),\n }\n },\n },\n\n active: {\n true: {\n hoverStyle: {\n backgroundColor: '$background',\n },\n },\n },\n\n disabled: {\n true: {\n opacity: 0.5,\n // TODO breaking types\n pointerEvents: 'none' as any,\n },\n },\n } as const,\n\n defaultVariants: {\n size: '$true',\n },\n})\n\nexport const ListItemText = styled(SizableText, {\n name: 'ListItemText',\n color: '$color',\n userSelect: 'none',\n flexGrow: 1,\n flexShrink: 1,\n ellipse: true,\n cursor: 'default',\n})\n\nexport const ListItemSubtitle = styled(ListItemText, {\n name: 'ListItemSubtitle',\n color: '$colorPress',\n marginTop: '$-2',\n opacity: 0.65,\n maxWidth: '100%',\n size: '$3',\n})\n\nexport const ListItemTitle = styled(ListItemText, {\n name: 'ListItemTitle',\n})\n\nexport const useListItem = (\n props: ListItemProps,\n {\n Text = ListItemText,\n Subtitle = ListItemSubtitle,\n Title = ListItemTitle,\n }: {\n Title?: any\n Subtitle?: any\n Text?: any\n } = { Text: ListItemText, Subtitle: ListItemSubtitle, Title: ListItemTitle }\n) => {\n // careful not to desctructure and re-order props, order is important\n const {\n children,\n icon,\n iconAfter,\n noTextWrap,\n theme: themeName,\n space,\n spaceFlex,\n scaleIcon = 1,\n scaleSpace = 1,\n subTitle,\n\n // text props\n color,\n fontWeight,\n letterSpacing,\n fontSize,\n fontFamily,\n textAlign,\n textProps,\n title,\n ...rest\n } = props\n\n const mediaActiveProps = useMediaPropsActive(props)\n const size = mediaActiveProps.size || '$true'\n const subtitleSize = `$${+String(size).replace('$', '') - 1}` as FontSizeTokens\n const iconSize = getFontSize(size) * scaleIcon\n const getThemedIcon = useGetThemedIcon({ size: iconSize, color })\n const [themedIcon, themedIconAfter] = [icon, iconAfter].map(getThemedIcon)\n const spaceSize =\n getVariableValue(getTokens().space[mediaActiveProps.space as any] ?? iconSize) *\n scaleSpace\n // @ts-ignore noTextWrap = all is ok\n const contents = wrapChildrenInText(Text, mediaActiveProps)\n\n return {\n props: {\n fontFamily,\n ...rest,\n children: (\n <>\n {themedIcon ? (\n <>\n {themedIcon}\n <Spacer size={spaceSize} />\n </>\n ) : null}\n {/* helper for common title/subtitle pttern */}\n {title || subTitle ? (\n <YStack flex={1}>\n {noTextWrap === 'all' ? title : <Title size={size}>{title}</Title>}\n {subTitle ? (\n <>\n <Spacer flex size={spaceSize * 0.333} />\n {typeof subTitle === 'string' && noTextWrap !== 'all' ? (\n // TODO can use theme but we need to standardize to alt themes\n // or standardize on subtle colors in themes\n <Subtitle size={subtitleSize}>{subTitle}</Subtitle>\n ) : (\n subTitle\n )}\n </>\n ) : null}\n {contents}\n </YStack>\n ) : (\n contents\n )}\n {themedIconAfter ? (\n <>\n <Spacer size={spaceSize} />\n {themedIconAfter}\n </>\n ) : null}\n </>\n ),\n },\n }\n}\n\nconst ListItemComponent = forwardRef<TamaguiElement, ListItemProps>((props, ref) => {\n const { props: listItemProps } = useListItem(props)\n return <ListItemFrame ref={ref} justifyContent=\"space-between\" {...listItemProps} />\n})\n\nexport const listItemStaticConfig = {\n inlineProps: new Set([\n // text props go here (can't really optimize them, but we never fully extract listItem anyway)\n 'color',\n 'fontWeight',\n 'fontSize',\n 'fontFamily',\n 'letterSpacing',\n 'textAlign',\n ]),\n}\n\nexport const ListItem = withStaticProperties(\n ListItemFrame.extractable(\n themeable(ListItemComponent, { componentName: NAME }),\n listItemStaticConfig\n ),\n {\n Text: ListItemText,\n Subtitle: ListItemSubtitle,\n }\n)\n"],
5
+ "mappings": "AA4LY,mBAEE,KAFF;AA5LZ;AAAA,EAGE;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,mBAAmB;AAE5B,SAAS,UAAU,wBAAwB;AAC3C,SAAS,gBAAgB,cAAc;AACvC,SAAS,aAA+B,0BAA0B;AAClE,SAAmC,kBAAkB;AA6CrD,MAAM,OAAO;AAEN,MAAM,gBAAgB,OAAO,gBAAgB;AAAA,EAClD,MAAM;AAAA,EACN,KAAK;AAAA,EACL,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,OAAO;AAAA,EACP,aAAa;AAAA,EACb,UAAU;AAAA,EACV,UAAU;AAAA,EACV,eAAe;AAAA,EAEf,UAAU;AAAA,IACR,MAAM;AAAA,MACJ,WAAW,CAAC,KAAK,EAAE,OAAO,MAAM;AAC9B,eAAO;AAAA,UACL,WAAW,OAAO,KAAK,GAAG;AAAA,UAC1B,mBAAmB,OAAO,MAAM,GAAG;AAAA,UACnC,iBAAiB,SAAS,KAAK,EAAE;AAAA,QACnC;AAAA,MACF;AAAA,IACF;AAAA,IAEA,QAAQ;AAAA,MACN,MAAM;AAAA,QACJ,YAAY;AAAA,UACV,iBAAiB;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AAAA,IAEA,UAAU;AAAA,MACR,MAAM;AAAA,QACJ,SAAS;AAAA;AAAA,QAET,eAAe;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,iBAAiB;AAAA,IACf,MAAM;AAAA,EACR;AACF,CAAC;AAEM,MAAM,eAAe,OAAO,aAAa;AAAA,EAC9C,MAAM;AAAA,EACN,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,QAAQ;AACV,CAAC;AAEM,MAAM,mBAAmB,OAAO,cAAc;AAAA,EACnD,MAAM;AAAA,EACN,OAAO;AAAA,EACP,WAAW;AAAA,EACX,SAAS;AAAA,EACT,UAAU;AAAA,EACV,MAAM;AACR,CAAC;AAEM,MAAM,gBAAgB,OAAO,cAAc;AAAA,EAChD,MAAM;AACR,CAAC;AAEM,MAAM,cAAc,CACzB,OACA;AAAA,EACE,OAAO;AAAA,EACP,WAAW;AAAA,EACX,QAAQ;AACV,IAII,EAAE,MAAM,cAAc,UAAU,kBAAkB,OAAO,cAAc,MACxE;AAEH,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA,YAAY;AAAA,IACZ,aAAa;AAAA,IACb;AAAA;AAAA,IAGA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,IAAI;AAEJ,QAAM,mBAAmB,oBAAoB,KAAK;AAClD,QAAM,OAAO,iBAAiB,QAAQ;AACtC,QAAM,eAAe,IAAI,CAAC,OAAO,IAAI,EAAE,QAAQ,KAAK,EAAE,IAAI;AAC1D,QAAM,WAAW,YAAY,IAAI,IAAI;AACrC,QAAM,gBAAgB,iBAAiB,EAAE,MAAM,UAAU,MAAM,CAAC;AAChE,QAAM,CAAC,YAAY,eAAe,IAAI,CAAC,MAAM,SAAS,EAAE,IAAI,aAAa;AACzE,QAAM,YACJ,iBAAiB,UAAU,EAAE,MAAM,iBAAiB,KAAY,KAAK,QAAQ,IAC7E;AAEF,QAAM,WAAW,mBAAmB,MAAM,gBAAgB;AAE1D,SAAO;AAAA,IACL,OAAO;AAAA,MACL;AAAA,MACA,GAAG;AAAA,MACH,UACE,iCACG;AAAA,qBACC,iCACG;AAAA;AAAA,UACD,oBAAC,UAAO,MAAM,WAAW;AAAA,WAC3B,IACE;AAAA,QAEH,SAAS,WACR,qBAAC,UAAO,MAAM,GACX;AAAA,yBAAe,QAAQ,QAAQ,oBAAC,SAAM,MAAa,iBAAM;AAAA,UACzD,WACC,iCACE;AAAA,gCAAC,UAAO,MAAI,MAAC,MAAM,YAAY,OAAO;AAAA,YACrC,OAAO,aAAa,YAAY,eAAe;AAAA;AAAA;AAAA,cAG9C,oBAAC,YAAS,MAAM,cAAe,oBAAS;AAAA,gBAExC;AAAA,aAEJ,IACE;AAAA,UACH;AAAA,WACH,IAEA;AAAA,QAED,kBACC,iCACE;AAAA,8BAAC,UAAO,MAAM,WAAW;AAAA,UACxB;AAAA,WACH,IACE;AAAA,SACN;AAAA,IAEJ;AAAA,EACF;AACF;AAEA,MAAM,oBAAoB,WAA0C,CAAC,OAAO,QAAQ;AAClF,QAAM,EAAE,OAAO,cAAc,IAAI,YAAY,KAAK;AAClD,SAAO,oBAAC,iBAAc,KAAU,gBAAe,iBAAiB,GAAG,eAAe;AACpF,CAAC;AAEM,MAAM,uBAAuB;AAAA,EAClC,aAAa,oBAAI,IAAI;AAAA;AAAA,IAEnB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAEO,MAAM,WAAW;AAAA,EACtB,cAAc;AAAA,IACZ,UAAU,mBAAmB,EAAE,eAAe,KAAK,CAAC;AAAA,IACpD;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,UAAU;AAAA,EACZ;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,2 @@
1
+ export * from "./ListItem";
2
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/index.ts"],
4
+ "sourcesContent": ["export * from './ListItem'\n"],
5
+ "mappings": "AAAA,cAAc;",
6
+ "names": []
7
+ }
@@ -0,0 +1,173 @@
1
+ import {
2
+ Spacer,
3
+ getTokens,
4
+ getVariableValue,
5
+ styled,
6
+ themeable,
7
+ useMediaPropsActive,
8
+ withStaticProperties
9
+ } from "@tamagui/core";
10
+ import { getFontSize } from "@tamagui/font-size";
11
+ import { getSpace, useGetThemedIcon } from "@tamagui/helpers-tamagui";
12
+ import { ThemeableStack, YStack } from "@tamagui/stacks";
13
+ import { SizableText, wrapChildrenInText } from "@tamagui/text";
14
+ import { forwardRef } from "react";
15
+ const NAME = "ListItem";
16
+ const ListItemFrame = styled(ThemeableStack, {
17
+ name: NAME,
18
+ tag: "li",
19
+ alignItems: "center",
20
+ flexWrap: "nowrap",
21
+ width: "100%",
22
+ borderColor: "$borderColor",
23
+ maxWidth: "100%",
24
+ overflow: "hidden",
25
+ flexDirection: "row",
26
+ variants: {
27
+ size: {
28
+ "...size": (val, { tokens }) => {
29
+ return {
30
+ minHeight: tokens.size[val],
31
+ paddingHorizontal: tokens.space[val],
32
+ paddingVertical: getSpace(val, -2)
33
+ };
34
+ }
35
+ },
36
+ active: {
37
+ true: {
38
+ hoverStyle: {
39
+ backgroundColor: "$background"
40
+ }
41
+ }
42
+ },
43
+ disabled: {
44
+ true: {
45
+ opacity: 0.5,
46
+ // TODO breaking types
47
+ pointerEvents: "none"
48
+ }
49
+ }
50
+ },
51
+ defaultVariants: {
52
+ size: "$true"
53
+ }
54
+ });
55
+ const ListItemText = styled(SizableText, {
56
+ name: "ListItemText",
57
+ color: "$color",
58
+ userSelect: "none",
59
+ flexGrow: 1,
60
+ flexShrink: 1,
61
+ ellipse: true,
62
+ cursor: "default"
63
+ });
64
+ const ListItemSubtitle = styled(ListItemText, {
65
+ name: "ListItemSubtitle",
66
+ color: "$colorPress",
67
+ marginTop: "$-2",
68
+ opacity: 0.65,
69
+ maxWidth: "100%",
70
+ size: "$3"
71
+ });
72
+ const ListItemTitle = styled(ListItemText, {
73
+ name: "ListItemTitle"
74
+ });
75
+ const useListItem = (props, {
76
+ Text = ListItemText,
77
+ Subtitle = ListItemSubtitle,
78
+ Title = ListItemTitle
79
+ } = { Text: ListItemText, Subtitle: ListItemSubtitle, Title: ListItemTitle }) => {
80
+ const {
81
+ children,
82
+ icon,
83
+ iconAfter,
84
+ noTextWrap,
85
+ theme: themeName,
86
+ space,
87
+ spaceFlex,
88
+ scaleIcon = 1,
89
+ scaleSpace = 1,
90
+ subTitle,
91
+ // text props
92
+ color,
93
+ fontWeight,
94
+ letterSpacing,
95
+ fontSize,
96
+ fontFamily,
97
+ textAlign,
98
+ textProps,
99
+ title,
100
+ ...rest
101
+ } = props;
102
+ const mediaActiveProps = useMediaPropsActive(props);
103
+ const size = mediaActiveProps.size || "$true";
104
+ const subtitleSize = `$${+String(size).replace("$", "") - 1}`;
105
+ const iconSize = getFontSize(size) * scaleIcon;
106
+ const getThemedIcon = useGetThemedIcon({ size: iconSize, color });
107
+ const [themedIcon, themedIconAfter] = [icon, iconAfter].map(getThemedIcon);
108
+ const spaceSize = getVariableValue(getTokens().space[mediaActiveProps.space] ?? iconSize) * scaleSpace;
109
+ const contents = wrapChildrenInText(Text, mediaActiveProps);
110
+ return {
111
+ props: {
112
+ fontFamily,
113
+ ...rest,
114
+ children: <>
115
+ {themedIcon ? <>
116
+ {themedIcon}
117
+ <Spacer size={spaceSize} />
118
+ </> : null}
119
+ {title || subTitle ? <YStack flex={1}>
120
+ {noTextWrap === "all" ? title : <Title size={size}>{title}</Title>}
121
+ {subTitle ? <>
122
+ <Spacer flex size={spaceSize * 0.333} />
123
+ {typeof subTitle === "string" && noTextWrap !== "all" ? (
124
+ // TODO can use theme but we need to standardize to alt themes
125
+ // or standardize on subtle colors in themes
126
+ <Subtitle size={subtitleSize}>{subTitle}</Subtitle>
127
+ ) : subTitle}
128
+ </> : null}
129
+ {contents}
130
+ </YStack> : contents}
131
+ {themedIconAfter ? <>
132
+ <Spacer size={spaceSize} />
133
+ {themedIconAfter}
134
+ </> : null}
135
+ </>
136
+ }
137
+ };
138
+ };
139
+ const ListItemComponent = forwardRef((props, ref) => {
140
+ const { props: listItemProps } = useListItem(props);
141
+ return <ListItemFrame ref={ref} justifyContent="space-between" {...listItemProps} />;
142
+ });
143
+ const listItemStaticConfig = {
144
+ inlineProps: /* @__PURE__ */ new Set([
145
+ // text props go here (can't really optimize them, but we never fully extract listItem anyway)
146
+ "color",
147
+ "fontWeight",
148
+ "fontSize",
149
+ "fontFamily",
150
+ "letterSpacing",
151
+ "textAlign"
152
+ ])
153
+ };
154
+ const ListItem = withStaticProperties(
155
+ ListItemFrame.extractable(
156
+ themeable(ListItemComponent, { componentName: NAME }),
157
+ listItemStaticConfig
158
+ ),
159
+ {
160
+ Text: ListItemText,
161
+ Subtitle: ListItemSubtitle
162
+ }
163
+ );
164
+ export {
165
+ ListItem,
166
+ ListItemFrame,
167
+ ListItemSubtitle,
168
+ ListItemText,
169
+ ListItemTitle,
170
+ listItemStaticConfig,
171
+ useListItem
172
+ };
173
+ //# sourceMappingURL=ListItem.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/ListItem.tsx"],
4
+ "sourcesContent": ["import {\n FontSizeTokens,\n GetProps,\n Spacer,\n TamaguiElement,\n ThemeableProps,\n getTokens,\n getVariableValue,\n styled,\n themeable,\n useMediaPropsActive,\n withStaticProperties,\n} from '@tamagui/core'\nimport { getFontSize } from '@tamagui/font-size'\nimport { getSize } from '@tamagui/get-size'\nimport { getSpace, useGetThemedIcon } from '@tamagui/helpers-tamagui'\nimport { ThemeableStack, YStack } from '@tamagui/stacks'\nimport { SizableText, TextParentStyles, wrapChildrenInText } from '@tamagui/text'\nimport React, { FunctionComponent, forwardRef } from 'react'\n\ntype ListItemIconProps = { color?: string; size?: number }\ntype IconProp = JSX.Element | FunctionComponent<ListItemIconProps> | null\n\nexport type ListItemProps = Omit<TextParentStyles, 'TextComponent' | 'noTextWrap'> &\n GetProps<typeof ListItemFrame> &\n ThemeableProps & {\n /**\n * add icon before, passes color and size automatically if Component\n */\n icon?: IconProp\n /**\n * add icon after, passes color and size automatically if Component\n */\n iconAfter?: IconProp\n /**\n * adjust icon relative to size\n */\n /**\n * default: -1\n */\n scaleIcon?: number\n /**\n * make the spacing elements flex\n */\n spaceFlex?: number | boolean\n /**\n * adjust internal space relative to icon size\n */\n scaleSpace?: number\n /**\n * title\n */\n title?: React.ReactNode\n /**\n * subtitle\n */\n subTitle?: React.ReactNode\n /**\n * will not wrap text around `children` only, \"all\" will not wrap title or subTitle\n */\n noTextWrap?: boolean | 'all'\n }\n\nconst NAME = 'ListItem'\n\nexport const ListItemFrame = styled(ThemeableStack, {\n name: NAME,\n tag: 'li',\n alignItems: 'center',\n flexWrap: 'nowrap',\n width: '100%',\n borderColor: '$borderColor',\n maxWidth: '100%',\n overflow: 'hidden',\n flexDirection: 'row',\n\n variants: {\n size: {\n '...size': (val, { tokens }) => {\n return {\n minHeight: tokens.size[val],\n paddingHorizontal: tokens.space[val],\n paddingVertical: getSpace(val, -2),\n }\n },\n },\n\n active: {\n true: {\n hoverStyle: {\n backgroundColor: '$background',\n },\n },\n },\n\n disabled: {\n true: {\n opacity: 0.5,\n // TODO breaking types\n pointerEvents: 'none' as any,\n },\n },\n } as const,\n\n defaultVariants: {\n size: '$true',\n },\n})\n\nexport const ListItemText = styled(SizableText, {\n name: 'ListItemText',\n color: '$color',\n userSelect: 'none',\n flexGrow: 1,\n flexShrink: 1,\n ellipse: true,\n cursor: 'default',\n})\n\nexport const ListItemSubtitle = styled(ListItemText, {\n name: 'ListItemSubtitle',\n color: '$colorPress',\n marginTop: '$-2',\n opacity: 0.65,\n maxWidth: '100%',\n size: '$3',\n})\n\nexport const ListItemTitle = styled(ListItemText, {\n name: 'ListItemTitle',\n})\n\nexport const useListItem = (\n props: ListItemProps,\n {\n Text = ListItemText,\n Subtitle = ListItemSubtitle,\n Title = ListItemTitle,\n }: {\n Title?: any\n Subtitle?: any\n Text?: any\n } = { Text: ListItemText, Subtitle: ListItemSubtitle, Title: ListItemTitle }\n) => {\n // careful not to desctructure and re-order props, order is important\n const {\n children,\n icon,\n iconAfter,\n noTextWrap,\n theme: themeName,\n space,\n spaceFlex,\n scaleIcon = 1,\n scaleSpace = 1,\n subTitle,\n\n // text props\n color,\n fontWeight,\n letterSpacing,\n fontSize,\n fontFamily,\n textAlign,\n textProps,\n title,\n ...rest\n } = props\n\n const mediaActiveProps = useMediaPropsActive(props)\n const size = mediaActiveProps.size || '$true'\n const subtitleSize = `$${+String(size).replace('$', '') - 1}` as FontSizeTokens\n const iconSize = getFontSize(size) * scaleIcon\n const getThemedIcon = useGetThemedIcon({ size: iconSize, color })\n const [themedIcon, themedIconAfter] = [icon, iconAfter].map(getThemedIcon)\n const spaceSize =\n getVariableValue(getTokens().space[mediaActiveProps.space as any] ?? iconSize) *\n scaleSpace\n // @ts-ignore noTextWrap = all is ok\n const contents = wrapChildrenInText(Text, mediaActiveProps)\n\n return {\n props: {\n fontFamily,\n ...rest,\n children: (\n <>\n {themedIcon ? (\n <>\n {themedIcon}\n <Spacer size={spaceSize} />\n </>\n ) : null}\n {/* helper for common title/subtitle pttern */}\n {title || subTitle ? (\n <YStack flex={1}>\n {noTextWrap === 'all' ? title : <Title size={size}>{title}</Title>}\n {subTitle ? (\n <>\n <Spacer flex size={spaceSize * 0.333} />\n {typeof subTitle === 'string' && noTextWrap !== 'all' ? (\n // TODO can use theme but we need to standardize to alt themes\n // or standardize on subtle colors in themes\n <Subtitle size={subtitleSize}>{subTitle}</Subtitle>\n ) : (\n subTitle\n )}\n </>\n ) : null}\n {contents}\n </YStack>\n ) : (\n contents\n )}\n {themedIconAfter ? (\n <>\n <Spacer size={spaceSize} />\n {themedIconAfter}\n </>\n ) : null}\n </>\n ),\n },\n }\n}\n\nconst ListItemComponent = forwardRef<TamaguiElement, ListItemProps>((props, ref) => {\n const { props: listItemProps } = useListItem(props)\n return <ListItemFrame ref={ref} justifyContent=\"space-between\" {...listItemProps} />\n})\n\nexport const listItemStaticConfig = {\n inlineProps: new Set([\n // text props go here (can't really optimize them, but we never fully extract listItem anyway)\n 'color',\n 'fontWeight',\n 'fontSize',\n 'fontFamily',\n 'letterSpacing',\n 'textAlign',\n ]),\n}\n\nexport const ListItem = withStaticProperties(\n ListItemFrame.extractable(\n themeable(ListItemComponent, { componentName: NAME }),\n listItemStaticConfig\n ),\n {\n Text: ListItemText,\n Subtitle: ListItemSubtitle,\n }\n)\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,2 @@
1
+ export * from "./ListItem";
2
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/index.ts"],
4
+ "sourcesContent": ["export * from './ListItem'\n"],
5
+ "mappings": "AAAA,cAAc;",
6
+ "names": []
7
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tamagui/list-item",
3
- "version": "1.2.8",
3
+ "version": "1.2.10",
4
4
  "sideEffects": [
5
5
  "*.css"
6
6
  ],
@@ -21,18 +21,18 @@
21
21
  "watch": "tamagui-build --watch"
22
22
  },
23
23
  "dependencies": {
24
- "@tamagui/core": "^1.2.8",
25
- "@tamagui/font-size": "^1.2.8",
26
- "@tamagui/get-size": "^1.2.8",
27
- "@tamagui/helpers-tamagui": "^1.2.8",
28
- "@tamagui/text": "^1.2.8"
24
+ "@tamagui/core": "^1.2.10",
25
+ "@tamagui/font-size": "^1.2.10",
26
+ "@tamagui/get-size": "^1.2.10",
27
+ "@tamagui/helpers-tamagui": "^1.2.10",
28
+ "@tamagui/text": "^1.2.10"
29
29
  },
30
30
  "peerDependencies": {
31
31
  "react": "*",
32
32
  "react-dom": "*"
33
33
  },
34
34
  "devDependencies": {
35
- "@tamagui/build": "^1.2.8",
35
+ "@tamagui/build": "^1.2.10",
36
36
  "react": "^18.2.0",
37
37
  "react-dom": "^18.2.0"
38
38
  },