@idealyst/components 1.1.7 → 1.1.8

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.
Files changed (105) hide show
  1. package/package.json +3 -3
  2. package/src/Accordion/Accordion.native.tsx +8 -6
  3. package/src/Accordion/Accordion.styles.old.tsx +298 -0
  4. package/src/Accordion/Accordion.styles.tsx +102 -236
  5. package/src/ActivityIndicator/ActivityIndicator.styles.old.tsx +94 -0
  6. package/src/ActivityIndicator/ActivityIndicator.styles.tsx +44 -74
  7. package/src/Alert/Alert.native.tsx +16 -6
  8. package/src/Alert/Alert.styles.old.tsx +209 -0
  9. package/src/Alert/Alert.styles.tsx +67 -149
  10. package/src/Avatar/Avatar.styles.old.tsx +99 -0
  11. package/src/Avatar/Avatar.styles.tsx +35 -80
  12. package/src/Badge/Badge.styles.old.tsx +157 -0
  13. package/src/Badge/Badge.styles.tsx +61 -121
  14. package/src/Breadcrumb/Breadcrumb.styles.old.tsx +231 -0
  15. package/src/Breadcrumb/Breadcrumb.styles.tsx +83 -200
  16. package/src/Breadcrumb/Breadcrumb.web.tsx +28 -23
  17. package/src/Button/Button.styles.tsx +89 -141
  18. package/src/Card/Card.native.tsx +7 -11
  19. package/src/Card/Card.styles.old.tsx +160 -0
  20. package/src/Card/Card.styles.tsx +105 -142
  21. package/src/Card/Card.web.tsx +5 -4
  22. package/src/Checkbox/Checkbox.native.tsx +9 -5
  23. package/src/Checkbox/Checkbox.styles.old.tsx +271 -0
  24. package/src/Checkbox/Checkbox.styles.tsx +104 -216
  25. package/src/Checkbox/Checkbox.web.tsx +6 -6
  26. package/src/Chip/Chip.styles.old.tsx +184 -0
  27. package/src/Chip/Chip.styles.tsx +34 -72
  28. package/src/Dialog/Dialog.native.tsx +7 -4
  29. package/src/Dialog/Dialog.styles.old.tsx +202 -0
  30. package/src/Dialog/Dialog.styles.tsx +69 -133
  31. package/src/Divider/Divider.styles.old.tsx +172 -0
  32. package/src/Divider/Divider.styles.tsx +62 -84
  33. package/src/Icon/Icon.native.tsx +8 -8
  34. package/src/Icon/Icon.styles.old.tsx +81 -0
  35. package/src/Icon/Icon.styles.tsx +52 -66
  36. package/src/Icon/Icon.web.tsx +43 -7
  37. package/src/Icon/IconSvg/IconSvg.web.tsx +2 -0
  38. package/src/Image/Image.styles.old.tsx +69 -0
  39. package/src/Image/Image.styles.tsx +46 -60
  40. package/src/Input/Input.native.tsx +138 -53
  41. package/src/Input/Input.styles.old.tsx +289 -0
  42. package/src/Input/Input.styles.tsx +127 -198
  43. package/src/List/List.native.tsx +5 -2
  44. package/src/List/List.styles.old.tsx +242 -0
  45. package/src/List/List.styles.tsx +179 -215
  46. package/src/List/ListItem.native.tsx +12 -6
  47. package/src/List/ListItem.web.tsx +23 -13
  48. package/src/Menu/Menu.styles.old.tsx +197 -0
  49. package/src/Menu/Menu.styles.tsx +68 -150
  50. package/src/Menu/MenuItem.native.tsx +5 -3
  51. package/src/Menu/MenuItem.styles.old.tsx +114 -0
  52. package/src/Menu/MenuItem.styles.tsx +57 -89
  53. package/src/Menu/MenuItem.web.tsx +8 -3
  54. package/src/Popover/Popover.native.tsx +10 -4
  55. package/src/Popover/Popover.styles.old.tsx +135 -0
  56. package/src/Popover/Popover.styles.tsx +51 -112
  57. package/src/Pressable/Pressable.styles.old.tsx +27 -0
  58. package/src/Pressable/Pressable.styles.tsx +35 -27
  59. package/src/Progress/Progress.styles.old.tsx +200 -0
  60. package/src/Progress/Progress.styles.tsx +75 -164
  61. package/src/RadioButton/RadioButton.native.tsx +4 -3
  62. package/src/RadioButton/RadioButton.styles.old.tsx +175 -0
  63. package/src/RadioButton/RadioButton.styles.tsx +83 -154
  64. package/src/RadioButton/RadioButton.web.tsx +2 -2
  65. package/src/SVGImage/SVGImage.styles.old.tsx +86 -0
  66. package/src/SVGImage/SVGImage.styles.tsx +35 -78
  67. package/src/Screen/Screen.native.tsx +18 -25
  68. package/src/Screen/Screen.styles.old.tsx +87 -0
  69. package/src/Screen/Screen.styles.tsx +105 -67
  70. package/src/Screen/Screen.web.tsx +1 -1
  71. package/src/Select/Select.native.tsx +42 -33
  72. package/src/Select/Select.styles.old.tsx +353 -0
  73. package/src/Select/Select.styles.tsx +223 -292
  74. package/src/Skeleton/Skeleton.styles.old.tsx +67 -0
  75. package/src/Skeleton/Skeleton.styles.tsx +29 -53
  76. package/src/Slider/Slider.styles.old.tsx +259 -0
  77. package/src/Slider/Slider.styles.tsx +153 -234
  78. package/src/Switch/Switch.native.tsx +7 -5
  79. package/src/Switch/Switch.styles.old.tsx +203 -0
  80. package/src/Switch/Switch.styles.tsx +101 -174
  81. package/src/Switch/Switch.web.tsx +5 -5
  82. package/src/TabBar/TabBar.native.tsx +3 -2
  83. package/src/TabBar/TabBar.styles.old.tsx +343 -0
  84. package/src/TabBar/TabBar.styles.tsx +145 -279
  85. package/src/Table/Table.native.tsx +18 -9
  86. package/src/Table/Table.styles.old.tsx +311 -0
  87. package/src/Table/Table.styles.tsx +152 -286
  88. package/src/Text/Text.native.tsx +1 -3
  89. package/src/Text/Text.style.demo.tsx +16 -0
  90. package/src/Text/Text.styles.old.tsx +219 -0
  91. package/src/Text/Text.styles.tsx +94 -84
  92. package/src/Text/Text.web.tsx +2 -2
  93. package/src/Text/index.ts +1 -0
  94. package/src/TextArea/TextArea.styles.old.tsx +213 -0
  95. package/src/TextArea/TextArea.styles.tsx +93 -181
  96. package/src/Tooltip/Tooltip.styles.old.tsx +82 -0
  97. package/src/Tooltip/Tooltip.styles.tsx +32 -56
  98. package/src/Video/Video.styles.old.tsx +51 -0
  99. package/src/Video/Video.styles.tsx +32 -44
  100. package/src/View/View.native.tsx +12 -14
  101. package/src/View/View.styles.old.tsx +125 -0
  102. package/src/View/View.styles.tsx +76 -106
  103. package/src/View/View.web.tsx +1 -0
  104. package/src/examples/CardExamples.tsx +0 -6
  105. package/src/extensions/extendComponent.ts +61 -0
@@ -1,347 +1,213 @@
1
+ /**
2
+ * TabBar styles using defineStyle with dynamic props.
3
+ */
1
4
  import { StyleSheet } from 'react-native-unistyles';
2
- import { Theme } from '@idealyst/theme';
3
- import { buildSizeVariants } from '../utils/buildSizeVariants';
4
- import {
5
- buildGapVariants,
6
- buildPaddingVariants,
7
- buildPaddingVerticalVariants,
8
- buildPaddingHorizontalVariants,
9
- buildMarginVariants,
10
- buildMarginVerticalVariants,
11
- buildMarginHorizontalVariants,
12
- } from '../utils/buildViewStyleVariants';
13
- import { TabBarPillMode, TabBarSizeVariant, TabBarType, TabBarIconPosition, TabBarJustify } from './types';
14
- import { applyExtensions } from '../extensions/applyExtension';
5
+ import { defineStyle, ThemeStyleWrapper } from '@idealyst/theme';
6
+ import type { Theme as BaseTheme, Size } from '@idealyst/theme';
7
+ import { ViewStyleSize } from '../utils/viewStyleProps';
15
8
 
16
- type ContainerDynamicProps = {
17
- type?: TabBarType;
18
- pillMode?: TabBarPillMode;
19
- };
9
+ // Required: Unistyles must see StyleSheet usage in original source to process this file
10
+ void StyleSheet;
20
11
 
21
- type TabDynamicProps = {
22
- type?: TabBarType;
23
- size?: TabBarSizeVariant;
24
- active?: boolean;
25
- pillMode?: TabBarPillMode;
26
- };
12
+ // Wrap theme for $iterator support
13
+ type Theme = ThemeStyleWrapper<BaseTheme>;
27
14
 
28
- type LabelDynamicProps = {
29
- type?: TabBarType;
30
- active?: boolean;
31
- pillMode?: TabBarPillMode;
32
- };
15
+ type TabBarType = 'standard' | 'underline' | 'pills';
16
+ type TabBarPillMode = 'light' | 'dark';
17
+ type TabBarIconPosition = 'left' | 'top';
18
+ type TabBarJustify = 'start' | 'center' | 'equal' | 'space-between';
33
19
 
34
- type IndicatorDynamicProps = {
20
+ export type TabBarDynamicProps = {
21
+ size?: Size;
35
22
  type?: TabBarType;
36
23
  pillMode?: TabBarPillMode;
24
+ active?: boolean;
25
+ disabled?: boolean;
26
+ iconPosition?: TabBarIconPosition;
27
+ justify?: TabBarJustify;
28
+ gap?: ViewStyleSize;
29
+ padding?: ViewStyleSize;
30
+ paddingVertical?: ViewStyleSize;
31
+ paddingHorizontal?: ViewStyleSize;
32
+ margin?: ViewStyleSize;
33
+ marginVertical?: ViewStyleSize;
34
+ marginHorizontal?: ViewStyleSize;
37
35
  };
38
36
 
39
37
  /**
40
- * Get container background color based on type and pillMode
41
- */
42
- function getContainerBackgroundColor(theme: Theme, type: TabBarType, pillMode: TabBarPillMode): string | undefined {
43
- if (type === 'pills') {
44
- return pillMode === 'dark' ? theme.colors.surface.inverse : theme.colors.surface.secondary;
45
- }
46
- return undefined;
47
- }
48
-
49
- /**
50
- * Get tab padding based on type and size (pills have compact padding)
51
- */
52
- function getTabPadding(type: TabBarType, size: TabBarSizeVariant): { paddingVertical?: number; paddingHorizontal?: number } {
53
- if (type !== 'pills') return {};
54
-
55
- const paddingMap: Record<TabBarSizeVariant, { paddingVertical: number; paddingHorizontal: number }> = {
56
- xs: { paddingVertical: 2, paddingHorizontal: 10 },
57
- sm: { paddingVertical: 4, paddingHorizontal: 12 },
58
- md: { paddingVertical: 6, paddingHorizontal: 16 },
59
- lg: { paddingVertical: 8, paddingHorizontal: 20 },
60
- xl: { paddingVertical: 10, paddingHorizontal: 24 },
61
- };
62
- return paddingMap[size] || paddingMap.md;
63
- }
64
-
65
- /**
66
- * Get tab text color based on type and active state
67
- */
68
- function getTabColor(theme: Theme, type: TabBarType, active: boolean): string | undefined {
69
- if (!active) return undefined;
70
- if (type === 'pills') return theme.intents.primary.contrast;
71
- if (type === 'underline') return theme.intents.primary.primary;
72
- return theme.colors.text.primary;
73
- }
74
-
75
- /**
76
- * Get label color based on type, pillMode, and active state
77
- */
78
- function getLabelColor(theme: Theme, type: TabBarType, pillMode: TabBarPillMode, active: boolean): string | undefined {
79
- if (!active) return undefined;
80
- if (type === 'pills') return theme.colors.text.primary;
81
- if (type === 'underline') return theme.intents.primary.primary;
82
- return theme.colors.text.primary;
83
- }
84
-
85
- /**
86
- * Get indicator background color based on type and pillMode
87
- */
88
- function getIndicatorBackgroundColor(theme: Theme, type: TabBarType, pillMode: TabBarPillMode): string | undefined {
89
- if (type === 'pills') {
90
- return pillMode === 'dark' ? theme.colors.surface.secondary : theme.colors.surface.tertiary;
91
- }
92
- return undefined;
93
- }
94
-
95
- /**
96
- * Create size variants for tab
97
- */
98
- function createTabSizeVariants(theme: Theme) {
99
- return buildSizeVariants(theme, 'tabBar', (size) => ({
100
- fontSize: size.fontSize,
101
- padding: size.padding,
102
- lineHeight: size.lineHeight,
103
- }));
104
- }
105
-
106
- /**
107
- * Create size variants for label
108
- */
109
- function createLabelSizeVariants(theme: Theme) {
110
- return buildSizeVariants(theme, 'tabBar', (size) => ({
111
- fontSize: size.fontSize,
112
- lineHeight: size.lineHeight,
113
- }));
114
- }
115
-
116
- /**
117
- * Create size variants for icon
38
+ * TabBar styles with type/pillMode/active handling.
118
39
  */
119
- function createIconSizeVariants(theme: Theme) {
120
- return buildSizeVariants(theme, 'tabBar', (size) => ({
121
- width: size.fontSize,
122
- height: size.fontSize,
123
- }));
124
- }
125
-
126
- /**
127
- * Create dynamic container styles
128
- */
129
- function createContainerStyles(theme: Theme) {
130
- return ({ type = 'standard', pillMode = 'light' }: ContainerDynamicProps) => {
131
- const bgColor = getContainerBackgroundColor(theme, type, pillMode);
40
+ export const tabBarStyles = defineStyle('TabBar', (theme: Theme) => ({
41
+ container: ({ type = 'standard', pillMode = 'light', justify = 'start' }: TabBarDynamicProps) => {
42
+ const backgroundColor = type === 'pills'
43
+ ? (pillMode === 'dark' ? theme.colors.surface.inverse : theme.colors.surface.secondary)
44
+ : undefined;
45
+
46
+ const justifyContent = {
47
+ start: 'flex-start',
48
+ center: 'center',
49
+ equal: 'stretch',
50
+ 'space-between': 'space-between',
51
+ }[justify];
132
52
 
133
53
  return {
134
- display: 'flex',
135
- flexDirection: 'row',
54
+ display: 'flex' as const,
55
+ flexDirection: 'row' as const,
136
56
  gap: type === 'pills' ? 4 : 0,
137
- position: 'relative',
57
+ position: 'relative' as const,
138
58
  borderBottomWidth: type === 'pills' ? 0 : 1,
139
59
  borderBottomStyle: 'solid' as const,
140
60
  borderBottomColor: theme.colors.border.primary,
141
61
  padding: type === 'pills' ? 4 : undefined,
142
- backgroundColor: bgColor || (type === 'pills' ? theme.colors.surface.secondary : undefined),
143
- overflow: type === 'pills' ? 'hidden' as const : undefined,
144
- alignSelf: type === 'pills' ? 'flex-start' as const : undefined,
62
+ backgroundColor: backgroundColor || (type === 'pills' ? theme.colors.surface.secondary : undefined),
63
+ overflow: type === 'pills' ? ('hidden' as const) : undefined,
64
+ alignSelf: type === 'pills' ? ('flex-start' as const) : undefined,
145
65
  width: type === 'pills' ? undefined : '100%',
146
66
  borderRadius: type === 'pills' ? 9999 : undefined,
67
+ justifyContent: justifyContent as any,
147
68
  variants: {
148
- justify: {
149
- start: { justifyContent: 'flex-start' },
150
- center: { justifyContent: 'center' },
151
- equal: { justifyContent: 'stretch', width: '100%' },
152
- 'space-between': { justifyContent: 'space-between', width: '100%' },
69
+ gap: {
70
+ gap: theme.sizes.$view.padding,
71
+ },
72
+ padding: {
73
+ padding: theme.sizes.$view.padding,
74
+ },
75
+ paddingVertical: {
76
+ paddingVertical: theme.sizes.$view.padding,
77
+ },
78
+ paddingHorizontal: {
79
+ paddingHorizontal: theme.sizes.$view.padding,
80
+ },
81
+ margin: {
82
+ margin: theme.sizes.$view.padding,
83
+ },
84
+ marginVertical: {
85
+ marginVertical: theme.sizes.$view.padding,
86
+ },
87
+ marginHorizontal: {
88
+ marginHorizontal: theme.sizes.$view.padding,
153
89
  },
154
- // Spacing variants from ContainerStyleProps
155
- gap: buildGapVariants(theme),
156
- padding: buildPaddingVariants(theme),
157
- paddingVertical: buildPaddingVerticalVariants(theme),
158
- paddingHorizontal: buildPaddingHorizontalVariants(theme),
159
- margin: buildMarginVariants(theme),
160
- marginVertical: buildMarginVerticalVariants(theme),
161
- marginHorizontal: buildMarginHorizontalVariants(theme),
162
- } as const,
90
+ },
163
91
  } as const;
164
- };
165
- }
92
+ },
93
+
94
+ tab: ({ type = 'standard', size = 'md', active = false, pillMode = 'light', disabled = false, iconPosition = 'left', justify = 'start' }: TabBarDynamicProps) => {
95
+ // Tab padding for pills
96
+ const paddingMap: Record<Size, { paddingVertical: number; paddingHorizontal: number }> = {
97
+ xs: { paddingVertical: 2, paddingHorizontal: 10 },
98
+ sm: { paddingVertical: 4, paddingHorizontal: 12 },
99
+ md: { paddingVertical: 6, paddingHorizontal: 16 },
100
+ lg: { paddingVertical: 8, paddingHorizontal: 20 },
101
+ xl: { paddingVertical: 10, paddingHorizontal: 24 },
102
+ };
103
+ const tabPadding = type === 'pills' ? paddingMap[size] : {};
166
104
 
167
- /**
168
- * Create dynamic tab styles
169
- */
170
- function createTabStyles(theme: Theme) {
171
- return ({ type = 'standard', size = 'md', active = false, pillMode = 'light', justify = 'start' }: TabDynamicProps) => {
172
- const tabPadding = getTabPadding(type, size);
173
- const color = getTabColor(theme, type, active);
105
+ // Color based on type and active state
106
+ let color = active ? theme.colors.text.primary : theme.colors.text.secondary;
107
+ if (active) {
108
+ if (type === 'pills') color = theme.intents.primary.contrast;
109
+ else if (type === 'underline') color = theme.intents.primary.primary;
110
+ }
174
111
 
175
112
  return {
176
- display: 'flex',
177
- flexDirection: 'row',
178
- alignItems: 'center',
179
- justifyContent: 'center',
180
- fontWeight: '500',
113
+ display: 'flex' as const,
114
+ flexDirection: iconPosition === 'top' ? ('column' as const) : ('row' as const),
115
+ alignItems: 'center' as const,
116
+ justifyContent: 'center' as const,
117
+ fontWeight: '500' as const,
181
118
  flex: justify === 'equal' ? 1 : undefined,
182
- color: color || (active ? theme.colors.text.primary : theme.colors.text.secondary),
183
- position: 'relative',
119
+ color,
120
+ position: 'relative' as const,
184
121
  zIndex: 2,
185
- backgroundColor: 'transparent',
122
+ backgroundColor: 'transparent' as const,
186
123
  gap: 6,
187
124
  borderRadius: type === 'pills' ? 9999 : undefined,
125
+ opacity: disabled ? 0.5 : 1,
188
126
  ...tabPadding,
189
127
  variants: {
190
- size: createTabSizeVariants(theme),
191
- disabled: {
192
- true: {
193
- opacity: 0.5,
194
- _web: { cursor: 'not-allowed' },
195
- },
196
- false: {
197
- _web: { _hover: { color: theme.colors.text.primary } },
198
- },
199
- },
200
- iconPosition: {
201
- left: { flexDirection: 'row' },
202
- top: { flexDirection: 'column' },
128
+ size: {
129
+ fontSize: theme.sizes.$tabBar.fontSize,
130
+ padding: theme.sizes.$tabBar.padding,
131
+ lineHeight: theme.sizes.$tabBar.lineHeight,
203
132
  },
204
- justify: {
205
- start: {},
206
- center: {},
207
- equal: { flex: 1 },
208
- 'space-between': {},
209
- },
210
- } as const,
133
+ },
211
134
  _web: {
212
135
  border: 'none',
213
- cursor: 'pointer',
136
+ cursor: disabled ? 'not-allowed' : 'pointer',
214
137
  outline: 'none',
215
138
  transition: 'color 0.2s ease',
139
+ _hover: disabled ? {} : { color: theme.colors.text.primary },
216
140
  },
217
141
  } as const;
218
- };
219
- }
142
+ },
220
143
 
221
- /**
222
- * Create dynamic tab label styles
223
- */
224
- function createTabLabelStyles(theme: Theme) {
225
- return ({ type = 'standard', active = false, pillMode = 'light' }: LabelDynamicProps) => {
226
- const color = getLabelColor(theme, type, pillMode, active);
144
+ tabLabel: ({ type = 'standard', active = false, pillMode = 'light', disabled = false }: TabBarDynamicProps) => {
145
+ let color = active ? theme.colors.text.primary : theme.colors.text.secondary;
146
+ if (active) {
147
+ if (type === 'pills') color = theme.colors.text.primary;
148
+ else if (type === 'underline') color = theme.intents.primary.primary;
149
+ }
227
150
 
228
151
  return {
229
- position: 'relative',
152
+ position: 'relative' as const,
230
153
  zIndex: 3,
231
- fontWeight: '500',
232
- color: color || (active ? theme.colors.text.primary : theme.colors.text.secondary),
154
+ fontWeight: '500' as const,
155
+ color,
156
+ opacity: disabled ? 0.5 : 1,
233
157
  variants: {
234
- size: createLabelSizeVariants(theme),
235
- disabled: {
236
- true: { opacity: 0.5 },
237
- false: {},
158
+ size: {
159
+ fontSize: theme.sizes.$tabBar.fontSize,
160
+ lineHeight: theme.sizes.$tabBar.lineHeight,
238
161
  },
239
162
  },
240
163
  } as const;
241
- };
242
- }
164
+ },
165
+
166
+ tabIcon: ({ active = false, disabled = false, iconPosition = 'left' }: TabBarDynamicProps) => ({
167
+ display: 'flex' as const,
168
+ alignItems: 'center' as const,
169
+ justifyContent: 'center' as const,
170
+ opacity: disabled ? 0.5 : 1,
171
+ marginBottom: iconPosition === 'top' ? 2 : 0,
172
+ variants: {
173
+ size: {
174
+ width: theme.sizes.$tabBar.fontSize,
175
+ height: theme.sizes.$tabBar.fontSize,
176
+ },
177
+ },
178
+ }),
243
179
 
244
- /**
245
- * Create dynamic indicator styles
246
- */
247
- function createIndicatorStyles(theme: Theme) {
248
- return ({ type = 'standard', pillMode = 'light' }: IndicatorDynamicProps) => {
249
- const bgColor = getIndicatorBackgroundColor(theme, type, pillMode);
180
+ indicator: ({ type = 'standard', pillMode = 'light' }: TabBarDynamicProps) => {
181
+ const backgroundColor = type === 'pills'
182
+ ? (pillMode === 'dark' ? theme.colors.surface.secondary : theme.colors.surface.tertiary)
183
+ : theme.intents.primary.primary;
250
184
 
251
185
  const typeStyles = type === 'pills' ? {
252
186
  borderRadius: 9999,
253
187
  bottom: 4,
254
188
  top: 4,
255
189
  left: 0,
256
- backgroundColor: bgColor,
257
190
  } : {
258
191
  bottom: -1,
259
192
  height: 2,
260
- backgroundColor: theme.intents.primary.primary,
261
193
  };
262
194
 
263
195
  return {
264
- position: 'absolute',
265
- pointerEvents: 'none',
196
+ position: 'absolute' as const,
197
+ pointerEvents: 'none' as const,
266
198
  zIndex: 1,
199
+ backgroundColor,
267
200
  ...typeStyles,
268
201
  _web: {
269
202
  transition: 'all 0.3s cubic-bezier(0.4, 0, 0.2, 1)',
270
203
  },
271
204
  } as const;
272
- };
273
- }
274
-
275
- /**
276
- * Create icon styles (static, no compound variants)
277
- */
278
- function createIconStyles(theme: Theme) {
279
- return {
280
- display: 'flex',
281
- alignItems: 'center',
282
- justifyContent: 'center',
283
- variants: {
284
- size: createIconSizeVariants(theme),
285
- active: {
286
- true: {},
287
- false: {},
288
- },
289
- disabled: {
290
- true: { opacity: 0.5 },
291
- false: {},
292
- },
293
- iconPosition: {
294
- left: {},
295
- top: { marginBottom: 2 },
296
- },
297
- } as const,
298
- } as const;
299
- }
300
-
301
- // Styles are inlined here instead of in @idealyst/theme because Unistyles' Babel transform on native cannot resolve function calls to extract variant structures.
302
- export const tabBarStyles = StyleSheet.create((theme: Theme) => {
303
- // Apply extensions to main visual elements
304
- const extended = applyExtensions('TabBar', theme, {
305
- container: createContainerStyles(theme),
306
- tab: createTabStyles(theme),
307
- indicator: createIndicatorStyles(theme),
308
- });
309
-
310
- return {
311
- ...extended,
312
- // Minor utility styles (not extended)
313
- tabLabel: createTabLabelStyles(theme),
314
- tabIcon: createIconStyles(theme),
315
- };
316
- });
205
+ },
206
+ }));
317
207
 
318
208
  // Export individual style sheets for backwards compatibility
319
- export const tabBarContainerStyles = StyleSheet.create((theme: Theme) => {
320
- return {
321
- container: createContainerStyles(theme),
322
- } as const;
323
- });
324
-
325
- export const tabBarTabStyles = StyleSheet.create((theme: Theme) => {
326
- return {
327
- tab: createTabStyles(theme),
328
- } as const;
329
- });
330
-
331
- export const tabBarLabelStyles = StyleSheet.create((theme: Theme) => {
332
- return {
333
- tabLabel: createTabLabelStyles(theme),
334
- } as const;
335
- });
336
-
337
- export const tabBarIndicatorStyles = StyleSheet.create((theme: Theme) => {
338
- return {
339
- indicator: createIndicatorStyles(theme),
340
- } as const;
341
- });
342
-
343
- export const tabBarIconStyles = StyleSheet.create((theme: Theme) => {
344
- return {
345
- tabIcon: createIconStyles(theme),
346
- } as const;
347
- });
209
+ export const tabBarContainerStyles = tabBarStyles;
210
+ export const tabBarTabStyles = tabBarStyles;
211
+ export const tabBarLabelStyles = tabBarStyles;
212
+ export const tabBarIndicatorStyles = tabBarStyles;
213
+ export const tabBarIconStyles = tabBarStyles;
@@ -50,6 +50,15 @@ function TableInner<T = any>({
50
50
  marginHorizontal,
51
51
  });
52
52
 
53
+ // Call styles as functions to get theme-reactive styles
54
+ const containerStyle = (tableStyles.container as any)({});
55
+ const tableStyle = (tableStyles.table as any)({});
56
+ const theadStyle = (tableStyles.thead as any)({});
57
+ const tbodyStyle = (tableStyles.tbody as any)({});
58
+ const rowStyle = (tableStyles.row as any)({});
59
+ const headerCellStyle = (tableStyles.headerCell as any)({});
60
+ const cellStyle = (tableStyles.cell as any)({});
61
+
53
62
  // Helper to get cell value
54
63
  const getCellValue = (column: TableColumn<T>, row: T, rowIndex: number) => {
55
64
  if (column.render) {
@@ -57,7 +66,7 @@ function TableInner<T = any>({
57
66
  return column.render(value, row, rowIndex);
58
67
  }
59
68
  const value = column.dataIndex ? (row as any)[column.dataIndex] : '';
60
- return <Text style={tableStyles.cell}>{String(value)}</Text>;
69
+ return <Text style={cellStyle}>{String(value)}</Text>;
61
70
  };
62
71
 
63
72
  const isClickable = !!onRowPress;
@@ -67,13 +76,13 @@ function TableInner<T = any>({
67
76
  ref={ref}
68
77
  nativeID={id}
69
78
  horizontal
70
- style={[(tableStyles.container as any)({}), style]}
79
+ style={[containerStyle, style]}
71
80
  testID={testID}
72
81
  {...nativeA11yProps}
73
82
  >
74
- <View style={tableStyles.table}>
83
+ <View style={tableStyle}>
75
84
  {/* Header */}
76
- <View style={tableStyles.thead}>
85
+ <View style={theadStyle}>
77
86
  <View style={{ flexDirection: 'row' }}>
78
87
  {columns.map((column) => {
79
88
  tableStyles.useVariants({
@@ -86,11 +95,11 @@ function TableInner<T = any>({
86
95
  <View
87
96
  key={column.key}
88
97
  style={[
89
- tableStyles.headerCell,
98
+ headerCellStyle,
90
99
  { width: column.width, flex: column.width ? undefined : 1 },
91
100
  ]}
92
101
  >
93
- <Text style={tableStyles.headerCell}>
102
+ <Text style={headerCellStyle}>
94
103
  {column.title}
95
104
  </Text>
96
105
  </View>
@@ -100,7 +109,7 @@ function TableInner<T = any>({
100
109
  </View>
101
110
 
102
111
  {/* Body */}
103
- <View style={tableStyles.tbody}>
112
+ <View style={tbodyStyle}>
104
113
  {data.map((row, rowIndex) => {
105
114
  tableStyles.useVariants({
106
115
  type,
@@ -112,7 +121,7 @@ function TableInner<T = any>({
112
121
  return (
113
122
  <RowComponent
114
123
  key={rowIndex}
115
- style={tableStyles.row}
124
+ style={rowStyle}
116
125
  onPress={isClickable ? () => onRowPress?.(row, rowIndex) : undefined}
117
126
  testID={`${testID}-row-${rowIndex}`}
118
127
  >
@@ -128,7 +137,7 @@ function TableInner<T = any>({
128
137
  <View
129
138
  key={column.key}
130
139
  style={[
131
- tableStyles.cell,
140
+ cellStyle,
132
141
  { width: column.width, flex: column.width ? undefined : 1 },
133
142
  ]}
134
143
  >