@idealyst/components 1.1.6 → 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 (144) hide show
  1. package/package.json +8 -3
  2. package/src/Accordion/Accordion.native.tsx +22 -14
  3. package/src/Accordion/Accordion.styles.old.tsx +298 -0
  4. package/src/Accordion/Accordion.styles.tsx +139 -248
  5. package/src/Accordion/Accordion.web.tsx +12 -7
  6. package/src/ActivityIndicator/ActivityIndicator.native.tsx +3 -2
  7. package/src/ActivityIndicator/ActivityIndicator.styles.old.tsx +94 -0
  8. package/src/ActivityIndicator/ActivityIndicator.styles.tsx +43 -62
  9. package/src/ActivityIndicator/ActivityIndicator.web.tsx +2 -2
  10. package/src/Alert/Alert.native.tsx +26 -15
  11. package/src/Alert/Alert.styles.old.tsx +209 -0
  12. package/src/Alert/Alert.styles.tsx +108 -281
  13. package/src/Alert/Alert.web.tsx +6 -10
  14. package/src/Avatar/Avatar.native.tsx +5 -2
  15. package/src/Avatar/Avatar.styles.old.tsx +99 -0
  16. package/src/Avatar/Avatar.styles.tsx +47 -62
  17. package/src/Avatar/Avatar.web.tsx +2 -2
  18. package/src/Badge/Badge.native.tsx +2 -2
  19. package/src/Badge/Badge.styles.old.tsx +157 -0
  20. package/src/Badge/Badge.styles.tsx +69 -108
  21. package/src/Badge/Badge.web.tsx +6 -6
  22. package/src/Breadcrumb/Breadcrumb.native.tsx +12 -5
  23. package/src/Breadcrumb/Breadcrumb.styles.old.tsx +231 -0
  24. package/src/Breadcrumb/Breadcrumb.styles.tsx +93 -209
  25. package/src/Breadcrumb/Breadcrumb.web.tsx +39 -27
  26. package/src/Button/Button.native.tsx +39 -14
  27. package/src/Button/Button.styles.tsx +99 -253
  28. package/src/Button/Button.web.tsx +10 -8
  29. package/src/Card/Card.native.tsx +8 -4
  30. package/src/Card/Card.styles.old.tsx +160 -0
  31. package/src/Card/Card.styles.tsx +107 -142
  32. package/src/Card/Card.web.tsx +6 -4
  33. package/src/Checkbox/Checkbox.native.tsx +14 -6
  34. package/src/Checkbox/Checkbox.styles.old.tsx +271 -0
  35. package/src/Checkbox/Checkbox.styles.tsx +109 -197
  36. package/src/Checkbox/Checkbox.web.tsx +7 -7
  37. package/src/Chip/Chip.native.tsx +5 -5
  38. package/src/Chip/Chip.styles.old.tsx +184 -0
  39. package/src/Chip/Chip.styles.tsx +34 -22
  40. package/src/Chip/Chip.web.tsx +5 -5
  41. package/src/Dialog/Dialog.native.tsx +16 -7
  42. package/src/Dialog/Dialog.styles.old.tsx +202 -0
  43. package/src/Dialog/Dialog.styles.tsx +108 -132
  44. package/src/Dialog/Dialog.web.tsx +4 -4
  45. package/src/Divider/Divider.native.tsx +29 -42
  46. package/src/Divider/Divider.styles.old.tsx +172 -0
  47. package/src/Divider/Divider.styles.tsx +116 -242
  48. package/src/Divider/Divider.web.tsx +17 -14
  49. package/src/Icon/Icon.native.tsx +12 -4
  50. package/src/Icon/Icon.styles.old.tsx +81 -0
  51. package/src/Icon/Icon.styles.tsx +52 -60
  52. package/src/Icon/Icon.web.tsx +43 -7
  53. package/src/Icon/IconSvg/IconSvg.web.tsx +2 -0
  54. package/src/Image/Image.styles.old.tsx +69 -0
  55. package/src/Image/Image.styles.tsx +45 -43
  56. package/src/Input/Input.native.tsx +140 -56
  57. package/src/Input/Input.styles.old.tsx +289 -0
  58. package/src/Input/Input.styles.tsx +177 -228
  59. package/src/Input/Input.web.tsx +5 -8
  60. package/src/Link/Link.native.tsx +4 -1
  61. package/src/List/List.native.tsx +5 -2
  62. package/src/List/List.styles.old.tsx +242 -0
  63. package/src/List/List.styles.tsx +178 -240
  64. package/src/List/ListItem.native.tsx +16 -8
  65. package/src/List/ListItem.web.tsx +26 -15
  66. package/src/Menu/Menu.native.tsx +1 -1
  67. package/src/Menu/Menu.styles.old.tsx +197 -0
  68. package/src/Menu/Menu.styles.tsx +90 -156
  69. package/src/Menu/Menu.web.tsx +2 -2
  70. package/src/Menu/MenuItem.native.tsx +9 -5
  71. package/src/Menu/MenuItem.styles.old.tsx +114 -0
  72. package/src/Menu/MenuItem.styles.tsx +71 -104
  73. package/src/Menu/MenuItem.web.tsx +23 -5
  74. package/src/Popover/Popover.native.tsx +10 -4
  75. package/src/Popover/Popover.styles.old.tsx +135 -0
  76. package/src/Popover/Popover.styles.tsx +46 -96
  77. package/src/Popover/Popover.web.tsx +1 -1
  78. package/src/Pressable/Pressable.native.tsx +3 -1
  79. package/src/Pressable/Pressable.styles.old.tsx +27 -0
  80. package/src/Pressable/Pressable.styles.tsx +35 -20
  81. package/src/Pressable/Pressable.web.tsx +1 -1
  82. package/src/Progress/Progress.native.tsx +15 -6
  83. package/src/Progress/Progress.styles.old.tsx +200 -0
  84. package/src/Progress/Progress.styles.tsx +69 -118
  85. package/src/Progress/Progress.web.tsx +10 -9
  86. package/src/RadioButton/RadioButton.native.tsx +10 -4
  87. package/src/RadioButton/RadioButton.styles.old.tsx +175 -0
  88. package/src/RadioButton/RadioButton.styles.tsx +81 -145
  89. package/src/RadioButton/RadioButton.web.tsx +4 -4
  90. package/src/SVGImage/SVGImage.styles.old.tsx +86 -0
  91. package/src/SVGImage/SVGImage.styles.tsx +35 -66
  92. package/src/Screen/Screen.native.tsx +30 -27
  93. package/src/Screen/Screen.styles.old.tsx +87 -0
  94. package/src/Screen/Screen.styles.tsx +120 -71
  95. package/src/Screen/Screen.web.tsx +2 -2
  96. package/src/Select/Select.native.tsx +44 -29
  97. package/src/Select/Select.styles.old.tsx +353 -0
  98. package/src/Select/Select.styles.tsx +244 -293
  99. package/src/Select/Select.web.tsx +5 -5
  100. package/src/Skeleton/Skeleton.styles.old.tsx +67 -0
  101. package/src/Skeleton/Skeleton.styles.tsx +31 -43
  102. package/src/Slider/Slider.native.tsx +9 -5
  103. package/src/Slider/Slider.styles.old.tsx +259 -0
  104. package/src/Slider/Slider.styles.tsx +157 -227
  105. package/src/Slider/Slider.web.tsx +5 -5
  106. package/src/Switch/Switch.native.tsx +11 -5
  107. package/src/Switch/Switch.styles.old.tsx +203 -0
  108. package/src/Switch/Switch.styles.tsx +103 -149
  109. package/src/Switch/Switch.web.tsx +8 -8
  110. package/src/TabBar/TabBar.native.tsx +24 -31
  111. package/src/TabBar/TabBar.styles.old.tsx +343 -0
  112. package/src/TabBar/TabBar.styles.tsx +204 -494
  113. package/src/TabBar/TabBar.web.tsx +21 -33
  114. package/src/Table/Table.native.tsx +18 -9
  115. package/src/Table/Table.styles.old.tsx +311 -0
  116. package/src/Table/Table.styles.tsx +151 -278
  117. package/src/Table/Table.web.tsx +1 -1
  118. package/src/Text/Text.native.tsx +1 -4
  119. package/src/Text/Text.style.demo.tsx +16 -0
  120. package/src/Text/Text.styles.old.tsx +219 -0
  121. package/src/Text/Text.styles.tsx +94 -78
  122. package/src/Text/Text.web.tsx +2 -2
  123. package/src/Text/index.ts +1 -0
  124. package/src/TextArea/TextArea.styles.old.tsx +213 -0
  125. package/src/TextArea/TextArea.styles.tsx +101 -157
  126. package/src/Tooltip/Tooltip.native.tsx +2 -2
  127. package/src/Tooltip/Tooltip.styles.old.tsx +82 -0
  128. package/src/Tooltip/Tooltip.styles.tsx +38 -53
  129. package/src/Tooltip/Tooltip.web.tsx +2 -2
  130. package/src/Video/Video.styles.old.tsx +51 -0
  131. package/src/Video/Video.styles.tsx +32 -28
  132. package/src/View/View.native.tsx +12 -12
  133. package/src/View/View.styles.old.tsx +125 -0
  134. package/src/View/View.styles.tsx +84 -103
  135. package/src/View/View.web.tsx +14 -2
  136. package/src/examples/CardExamples.tsx +0 -6
  137. package/src/extensions/applyExtension.ts +210 -0
  138. package/src/extensions/extendComponent.ts +438 -0
  139. package/src/extensions/index.ts +102 -0
  140. package/src/extensions/types.ts +497 -0
  141. package/src/globals.ts +16 -0
  142. package/src/index.native.ts +4 -0
  143. package/src/index.ts +28 -0
  144. package/src/utils/deepMerge.ts +54 -2
@@ -0,0 +1,343 @@
1
+ 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';
15
+
16
+ type ContainerDynamicProps = {
17
+ type?: TabBarType;
18
+ pillMode?: TabBarPillMode;
19
+ };
20
+
21
+ type TabDynamicProps = {
22
+ type?: TabBarType;
23
+ size?: TabBarSizeVariant;
24
+ active?: boolean;
25
+ pillMode?: TabBarPillMode;
26
+ };
27
+
28
+ type LabelDynamicProps = {
29
+ type?: TabBarType;
30
+ active?: boolean;
31
+ pillMode?: TabBarPillMode;
32
+ };
33
+
34
+ type IndicatorDynamicProps = {
35
+ type?: TabBarType;
36
+ pillMode?: TabBarPillMode;
37
+ };
38
+
39
+ /**
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
118
+ */
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);
132
+
133
+ return {
134
+ display: 'flex',
135
+ flexDirection: 'row',
136
+ gap: type === 'pills' ? 4 : 0,
137
+ position: 'relative',
138
+ borderBottomWidth: type === 'pills' ? 0 : 1,
139
+ borderBottomStyle: 'solid' as const,
140
+ borderBottomColor: theme.colors.border.primary,
141
+ 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,
145
+ width: type === 'pills' ? undefined : '100%',
146
+ borderRadius: type === 'pills' ? 9999 : undefined,
147
+ 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%' },
153
+ },
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,
163
+ } as const;
164
+ };
165
+ }
166
+
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);
174
+
175
+ return {
176
+ display: 'flex',
177
+ flexDirection: 'row',
178
+ alignItems: 'center',
179
+ justifyContent: 'center',
180
+ fontWeight: '500',
181
+ flex: justify === 'equal' ? 1 : undefined,
182
+ color: color || (active ? theme.colors.text.primary : theme.colors.text.secondary),
183
+ position: 'relative',
184
+ zIndex: 2,
185
+ backgroundColor: 'transparent',
186
+ gap: 6,
187
+ borderRadius: type === 'pills' ? 9999 : undefined,
188
+ ...tabPadding,
189
+ 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' },
203
+ },
204
+ justify: {
205
+ start: {},
206
+ center: {},
207
+ equal: { flex: 1 },
208
+ 'space-between': {},
209
+ },
210
+ } as const,
211
+ _web: {
212
+ border: 'none',
213
+ cursor: 'pointer',
214
+ outline: 'none',
215
+ transition: 'color 0.2s ease',
216
+ },
217
+ } as const;
218
+ };
219
+ }
220
+
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);
227
+
228
+ return {
229
+ position: 'relative',
230
+ zIndex: 3,
231
+ fontWeight: '500',
232
+ color: color || (active ? theme.colors.text.primary : theme.colors.text.secondary),
233
+ variants: {
234
+ size: createLabelSizeVariants(theme),
235
+ disabled: {
236
+ true: { opacity: 0.5 },
237
+ false: {},
238
+ },
239
+ },
240
+ } as const;
241
+ };
242
+ }
243
+
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);
250
+
251
+ const typeStyles = type === 'pills' ? {
252
+ borderRadius: 9999,
253
+ bottom: 4,
254
+ top: 4,
255
+ left: 0,
256
+ backgroundColor: bgColor,
257
+ } : {
258
+ bottom: -1,
259
+ height: 2,
260
+ backgroundColor: theme.intents.primary.primary,
261
+ };
262
+
263
+ return {
264
+ position: 'absolute',
265
+ pointerEvents: 'none',
266
+ zIndex: 1,
267
+ ...typeStyles,
268
+ _web: {
269
+ transition: 'all 0.3s cubic-bezier(0.4, 0, 0.2, 1)',
270
+ },
271
+ } 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
+
305
+ return applyExtensions('TabBar', theme, {container: createContainerStyles(theme),
306
+ tab: createTabStyles(theme),
307
+ indicator: createIndicatorStyles(theme),
308
+ // Additional styles (merged from return)
309
+ // Minor utility styles (not extended)
310
+ tabLabel: createTabLabelStyles(theme),
311
+ tabIcon: createIconStyles(theme)});
312
+ });
313
+
314
+ // Export individual style sheets for backwards compatibility
315
+ export const tabBarContainerStyles = StyleSheet.create((theme: Theme) => {
316
+ return {
317
+ container: createContainerStyles(theme),
318
+ } as const;
319
+ });
320
+
321
+ export const tabBarTabStyles = StyleSheet.create((theme: Theme) => {
322
+ return {
323
+ tab: createTabStyles(theme),
324
+ } as const;
325
+ });
326
+
327
+ export const tabBarLabelStyles = StyleSheet.create((theme: Theme) => {
328
+ return {
329
+ tabLabel: createTabLabelStyles(theme),
330
+ } as const;
331
+ });
332
+
333
+ export const tabBarIndicatorStyles = StyleSheet.create((theme: Theme) => {
334
+ return {
335
+ indicator: createIndicatorStyles(theme),
336
+ } as const;
337
+ });
338
+
339
+ export const tabBarIconStyles = StyleSheet.create((theme: Theme) => {
340
+ return {
341
+ tabIcon: createIconStyles(theme),
342
+ } as const;
343
+ });