@idealyst/components 1.0.82 → 1.0.84

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 (316) hide show
  1. package/CLAUDE.md +199 -232
  2. package/README.md +5 -5
  3. package/package.json +25 -7
  4. package/plugin/README.md +272 -0
  5. package/plugin/test-cases.jsx +112 -0
  6. package/plugin/web-legacy.js +320 -0
  7. package/plugin/web.js +422 -124
  8. package/src/Accordion/Accordion.native.tsx +182 -0
  9. package/src/Accordion/Accordion.styles.tsx +260 -0
  10. package/src/Accordion/Accordion.web.tsx +147 -0
  11. package/src/Accordion/index.native.tsx +3 -0
  12. package/src/Accordion/index.ts +3 -0
  13. package/src/Accordion/index.web.tsx +3 -0
  14. package/src/Accordion/types.ts +23 -0
  15. package/src/ActivityIndicator/ActivityIndicator.native.tsx +17 -12
  16. package/src/ActivityIndicator/ActivityIndicator.styles.tsx +83 -109
  17. package/src/ActivityIndicator/ActivityIndicator.web.tsx +23 -17
  18. package/src/ActivityIndicator/index.ts +5 -2
  19. package/src/ActivityIndicator/index.web.ts +5 -2
  20. package/src/ActivityIndicator/types.ts +15 -10
  21. package/src/Alert/Alert.native.tsx +113 -0
  22. package/src/Alert/Alert.styles.tsx +304 -0
  23. package/src/Alert/Alert.web.tsx +123 -0
  24. package/src/Alert/index.native.ts +5 -0
  25. package/src/Alert/index.ts +5 -0
  26. package/src/Alert/index.web.ts +5 -0
  27. package/src/Alert/types.ts +21 -0
  28. package/src/Avatar/Avatar.native.tsx +8 -6
  29. package/src/Avatar/Avatar.styles.tsx +64 -58
  30. package/src/Avatar/Avatar.web.tsx +13 -8
  31. package/src/Avatar/index.ts +5 -2
  32. package/src/Avatar/index.web.ts +5 -2
  33. package/src/Avatar/types.ts +19 -13
  34. package/src/Badge/Badge.native.tsx +59 -14
  35. package/src/Badge/Badge.styles.tsx +125 -139
  36. package/src/Badge/Badge.web.tsx +72 -16
  37. package/src/Badge/index.ts +5 -2
  38. package/src/Badge/index.web.ts +5 -2
  39. package/src/Badge/types.ts +23 -11
  40. package/src/Breadcrumb/Breadcrumb.native.tsx +225 -0
  41. package/src/Breadcrumb/Breadcrumb.styles.tsx +234 -0
  42. package/src/Breadcrumb/Breadcrumb.web.tsx +268 -0
  43. package/src/Breadcrumb/index.native.ts +5 -0
  44. package/src/Breadcrumb/index.ts +5 -0
  45. package/src/Breadcrumb/index.web.ts +5 -0
  46. package/src/Breadcrumb/types.ts +56 -0
  47. package/src/Button/Button.native.tsx +75 -24
  48. package/src/Button/Button.styles.tsx +248 -205
  49. package/src/Button/Button.web.tsx +82 -25
  50. package/src/Button/index.ts +5 -5
  51. package/src/Button/index.web.ts +5 -3
  52. package/src/Button/types.ts +32 -15
  53. package/src/Card/Card.native.tsx +14 -11
  54. package/src/Card/Card.styles.tsx +146 -220
  55. package/src/Card/Card.web.tsx +20 -21
  56. package/src/Card/index.ts +5 -5
  57. package/src/Card/index.web.ts +5 -3
  58. package/src/Card/types.ts +24 -17
  59. package/src/Checkbox/Checkbox.native.tsx +24 -34
  60. package/src/Checkbox/Checkbox.styles.tsx +223 -275
  61. package/src/Checkbox/Checkbox.web.tsx +30 -37
  62. package/src/Checkbox/index.ts +5 -5
  63. package/src/Checkbox/index.web.ts +5 -3
  64. package/src/Checkbox/types.ts +26 -20
  65. package/src/Chip/Chip.native.tsx +126 -0
  66. package/src/Chip/Chip.styles.tsx +138 -0
  67. package/src/Chip/Chip.web.tsx +154 -0
  68. package/src/Chip/index.native.ts +5 -0
  69. package/src/Chip/index.ts +5 -0
  70. package/src/Chip/index.web.ts +5 -0
  71. package/src/Chip/types.ts +51 -0
  72. package/src/Dialog/Dialog.native.tsx +65 -12
  73. package/src/Dialog/Dialog.styles.tsx +154 -136
  74. package/src/Dialog/Dialog.web.tsx +16 -11
  75. package/src/Dialog/index.ts +5 -2
  76. package/src/Dialog/index.web.ts +5 -2
  77. package/src/Dialog/types.ts +22 -16
  78. package/src/Divider/Divider.native.tsx +19 -14
  79. package/src/Divider/Divider.styles.tsx +273 -595
  80. package/src/Divider/Divider.web.tsx +19 -12
  81. package/src/Divider/index.ts +5 -5
  82. package/src/Divider/index.web.ts +5 -3
  83. package/src/Divider/types.ts +28 -19
  84. package/src/Icon/Icon.native.tsx +17 -24
  85. package/src/Icon/Icon.styles.tsx +64 -48
  86. package/src/Icon/Icon.web.tsx +14 -11
  87. package/src/Icon/IconSvg/IconSvg.native.tsx +42 -0
  88. package/src/Icon/IconSvg/IconSvg.web.tsx +40 -0
  89. package/src/Icon/IconSvg/index.native.ts +1 -0
  90. package/src/Icon/IconSvg/index.ts +1 -0
  91. package/src/Icon/icon-resolver.native.ts +27 -0
  92. package/src/Icon/icon-resolver.ts +70 -0
  93. package/src/Icon/index.ts +5 -5
  94. package/src/Icon/index.web.ts +5 -3
  95. package/src/Icon/types.ts +17 -11
  96. package/src/Image/Image.native.tsx +86 -0
  97. package/src/Image/Image.styles.tsx +57 -0
  98. package/src/Image/Image.web.tsx +92 -0
  99. package/src/Image/index.native.ts +5 -0
  100. package/src/Image/index.ts +5 -0
  101. package/src/Image/types.ts +21 -0
  102. package/src/Input/Input.native.tsx +103 -26
  103. package/src/Input/Input.styles.tsx +240 -177
  104. package/src/Input/Input.web.tsx +141 -38
  105. package/src/Input/index.ts +5 -5
  106. package/src/Input/index.web.ts +5 -3
  107. package/src/Input/types.ts +43 -20
  108. package/src/List/List.native.tsx +56 -0
  109. package/src/List/List.styles.tsx +257 -0
  110. package/src/List/List.web.tsx +43 -0
  111. package/src/List/ListContext.tsx +16 -0
  112. package/src/List/ListItem.native.tsx +111 -0
  113. package/src/List/ListItem.web.tsx +110 -0
  114. package/src/List/ListSection.native.tsx +31 -0
  115. package/src/List/ListSection.web.tsx +33 -0
  116. package/src/List/index.native.tsx +5 -0
  117. package/src/List/index.ts +5 -0
  118. package/src/List/index.web.tsx +5 -0
  119. package/src/List/types.ts +42 -0
  120. package/src/Menu/Menu.native.tsx +150 -0
  121. package/src/Menu/Menu.styles.tsx +185 -0
  122. package/src/Menu/Menu.web.tsx +99 -0
  123. package/src/Menu/MenuItem.native.tsx +66 -0
  124. package/src/Menu/MenuItem.styles.tsx +119 -0
  125. package/src/Menu/MenuItem.web.tsx +67 -0
  126. package/src/Menu/index.native.ts +3 -0
  127. package/src/Menu/index.ts +3 -0
  128. package/src/Menu/index.web.ts +3 -0
  129. package/src/Menu/types.ts +30 -0
  130. package/src/Popover/Popover.native.tsx +102 -32
  131. package/src/Popover/Popover.styles.tsx +100 -67
  132. package/src/Popover/Popover.web.tsx +36 -260
  133. package/src/Popover/index.ts +5 -2
  134. package/src/Popover/index.web.ts +5 -2
  135. package/src/Popover/types.ts +14 -13
  136. package/src/Pressable/Pressable.native.tsx +7 -6
  137. package/src/Pressable/Pressable.web.tsx +8 -6
  138. package/src/Pressable/index.ts +5 -2
  139. package/src/Pressable/index.web.ts +5 -2
  140. package/src/Pressable/types.ts +11 -10
  141. package/src/Progress/Progress.native.tsx +179 -0
  142. package/src/Progress/Progress.styles.tsx +164 -0
  143. package/src/Progress/Progress.web.tsx +144 -0
  144. package/src/Progress/index.native.ts +1 -0
  145. package/src/Progress/index.ts +5 -0
  146. package/src/Progress/index.web.ts +5 -0
  147. package/src/Progress/types.ts +21 -0
  148. package/src/RadioButton/RadioButton.native.tsx +88 -0
  149. package/src/RadioButton/RadioButton.styles.tsx +163 -0
  150. package/src/RadioButton/RadioButton.web.tsx +85 -0
  151. package/src/RadioButton/RadioGroup.native.tsx +43 -0
  152. package/src/RadioButton/RadioGroup.web.tsx +49 -0
  153. package/src/RadioButton/index.native.ts +2 -0
  154. package/src/RadioButton/index.ts +2 -0
  155. package/src/RadioButton/index.web.ts +2 -0
  156. package/src/RadioButton/types.ts +29 -0
  157. package/src/SVGImage/SVGImage.native.tsx +9 -7
  158. package/src/SVGImage/SVGImage.styles.tsx +63 -55
  159. package/src/SVGImage/SVGImage.web.tsx +16 -13
  160. package/src/SVGImage/index.ts +5 -5
  161. package/src/SVGImage/index.web.ts +5 -2
  162. package/src/SVGImage/types.ts +7 -3
  163. package/src/Screen/Screen.native.tsx +43 -17
  164. package/src/Screen/Screen.styles.tsx +58 -54
  165. package/src/Screen/Screen.web.tsx +11 -5
  166. package/src/Screen/index.ts +5 -2
  167. package/src/Screen/index.web.ts +5 -2
  168. package/src/Screen/types.ts +23 -9
  169. package/src/Select/Select.native.tsx +347 -0
  170. package/src/Select/Select.styles.tsx +335 -0
  171. package/src/Select/Select.web.tsx +276 -0
  172. package/src/Select/index.native.ts +2 -0
  173. package/src/Select/index.ts +5 -0
  174. package/src/Select/index.web.ts +5 -0
  175. package/src/Select/types.ts +124 -0
  176. package/src/Skeleton/Skeleton.native.tsx +139 -0
  177. package/src/Skeleton/Skeleton.styles.tsx +59 -0
  178. package/src/Skeleton/Skeleton.web.tsx +112 -0
  179. package/src/Skeleton/index.native.ts +4 -0
  180. package/src/Skeleton/index.ts +5 -0
  181. package/src/Skeleton/index.web.ts +5 -0
  182. package/src/Skeleton/types.ts +75 -0
  183. package/src/Slider/Slider.native.tsx +248 -0
  184. package/src/Slider/Slider.styles.tsx +241 -0
  185. package/src/Slider/Slider.web.tsx +226 -0
  186. package/src/Slider/index.native.ts +3 -0
  187. package/src/Slider/index.ts +5 -0
  188. package/src/Slider/index.web.ts +5 -0
  189. package/src/Slider/types.ts +31 -0
  190. package/src/Switch/Switch.native.tsx +131 -0
  191. package/src/Switch/Switch.styles.tsx +169 -0
  192. package/src/Switch/Switch.web.tsx +121 -0
  193. package/src/Switch/index.native.ts +3 -0
  194. package/src/Switch/index.ts +5 -0
  195. package/src/Switch/index.web.ts +5 -0
  196. package/src/Switch/types.ts +21 -0
  197. package/src/TabBar/TabBar.native.tsx +142 -0
  198. package/src/TabBar/TabBar.styles.tsx +399 -0
  199. package/src/TabBar/TabBar.web.tsx +205 -0
  200. package/src/TabBar/index.native.tsx +3 -0
  201. package/src/TabBar/index.ts +3 -0
  202. package/src/TabBar/index.web.tsx +3 -0
  203. package/src/TabBar/types.ts +26 -0
  204. package/src/Table/Table.native.tsx +122 -0
  205. package/src/Table/Table.styles.tsx +283 -0
  206. package/src/Table/Table.web.tsx +112 -0
  207. package/src/Table/index.native.tsx +3 -0
  208. package/src/Table/index.ts +3 -0
  209. package/src/Table/index.web.tsx +3 -0
  210. package/src/Table/types.ts +28 -0
  211. package/src/Text/Text.native.tsx +12 -11
  212. package/src/Text/Text.styles.tsx +76 -64
  213. package/src/Text/Text.web.tsx +14 -9
  214. package/src/Text/index.ts +5 -5
  215. package/src/Text/index.web.ts +5 -3
  216. package/src/Text/types.ts +20 -13
  217. package/src/TextArea/TextArea.native.tsx +134 -0
  218. package/src/TextArea/TextArea.styles.tsx +175 -0
  219. package/src/TextArea/TextArea.web.tsx +156 -0
  220. package/src/TextArea/index.native.ts +3 -0
  221. package/src/TextArea/index.ts +3 -0
  222. package/src/TextArea/index.web.ts +3 -0
  223. package/src/TextArea/types.ts +30 -0
  224. package/src/Tooltip/Tooltip.native.tsx +165 -0
  225. package/src/Tooltip/Tooltip.styles.tsx +73 -0
  226. package/src/Tooltip/Tooltip.web.tsx +87 -0
  227. package/src/Tooltip/index.native.ts +3 -0
  228. package/src/Tooltip/index.ts +3 -0
  229. package/src/Tooltip/types.ts +18 -0
  230. package/src/Video/Video.native.tsx +105 -0
  231. package/src/Video/Video.styles.tsx +39 -0
  232. package/src/Video/Video.web.tsx +115 -0
  233. package/src/Video/index.native.ts +5 -0
  234. package/src/Video/index.ts +5 -0
  235. package/src/Video/types.ts +29 -0
  236. package/src/View/View.native.tsx +9 -14
  237. package/src/View/View.styles.tsx +101 -93
  238. package/src/View/View.web.tsx +16 -17
  239. package/src/View/index.ts +5 -5
  240. package/src/View/index.web.ts +5 -3
  241. package/src/View/types.ts +29 -21
  242. package/src/examples/AccordionExamples.tsx +126 -0
  243. package/src/examples/AlertExamples.tsx +280 -0
  244. package/src/examples/AvatarExamples.tsx +23 -23
  245. package/src/examples/BadgeExamples.tsx +109 -41
  246. package/src/examples/BreadcrumbExamples.tsx +312 -0
  247. package/src/examples/ButtonExamples.tsx +160 -33
  248. package/src/examples/CardExamples.tsx +40 -40
  249. package/src/examples/CheckboxExamples.tsx +12 -12
  250. package/src/examples/ChipExamples.tsx +197 -0
  251. package/src/examples/DialogExamples.tsx +22 -22
  252. package/src/examples/DividerExamples.tsx +49 -49
  253. package/src/examples/IconExamples.tsx +270 -54
  254. package/src/examples/ImageExamples.tsx +174 -0
  255. package/src/examples/InputExamples.tsx +75 -17
  256. package/src/examples/ListExamples.tsx +288 -0
  257. package/src/examples/MenuExamples.tsx +144 -0
  258. package/src/examples/PopoverExamples.tsx +69 -73
  259. package/src/examples/ProgressExamples.tsx +137 -0
  260. package/src/examples/RadioButtonExamples.tsx +161 -0
  261. package/src/examples/SVGImageExamples.tsx +19 -17
  262. package/src/examples/ScreenExamples.tsx +31 -31
  263. package/src/examples/SelectExamples.tsx +423 -0
  264. package/src/examples/SkeletonExamples.tsx +206 -0
  265. package/src/examples/SliderExamples.tsx +200 -0
  266. package/src/examples/SwitchExamples.tsx +182 -0
  267. package/src/examples/TabBarExamples.tsx +143 -0
  268. package/src/examples/TableExamples.tsx +280 -0
  269. package/src/examples/TextAreaExamples.tsx +173 -0
  270. package/src/examples/TextExamples.tsx +28 -32
  271. package/src/examples/ThemeExtensionExamples.tsx +10 -10
  272. package/src/examples/TooltipExamples.tsx +126 -0
  273. package/src/examples/VideoExamples.tsx +144 -0
  274. package/src/examples/ViewExamples.tsx +64 -56
  275. package/src/examples/index.ts +18 -3
  276. package/src/hooks/useMergeRefs.ts +16 -0
  277. package/src/hooks/useSmartPosition.native.ts +169 -0
  278. package/src/index.native.ts +80 -9
  279. package/src/index.ts +75 -1
  280. package/src/internal/BoundedModalContent.native.tsx +58 -0
  281. package/src/internal/PositionedPortal.tsx +254 -0
  282. package/src/internal/SafeAreaDebugOverlay.native.tsx +173 -0
  283. package/src/unistyles.d.ts +6 -0
  284. package/src/utils/buildSizeVariants.ts +16 -0
  285. package/src/utils/deepMerge.ts +43 -0
  286. package/src/utils/positionUtils.native.ts +280 -0
  287. package/src/utils/styleHelpers.ts +48 -0
  288. package/LLM-ACCESS-GUIDE.md +0 -143
  289. package/src/ActivityIndicator/README.md +0 -132
  290. package/src/Avatar/README.md +0 -139
  291. package/src/Badge/README.md +0 -170
  292. package/src/Button/Button.types.ts +0 -12
  293. package/src/Button/README.md +0 -262
  294. package/src/Card/README.md +0 -258
  295. package/src/Checkbox/README.md +0 -102
  296. package/src/Dialog/README.md +0 -210
  297. package/src/Divider/README.md +0 -108
  298. package/src/Icon/README.md +0 -81
  299. package/src/Input/README.md +0 -100
  300. package/src/SVGImage/README.md +0 -209
  301. package/src/Screen/README.md +0 -86
  302. package/src/Text/README.md +0 -94
  303. package/src/View/README.md +0 -107
  304. package/src/examples/AllExamples.tsx +0 -84
  305. package/src/examples/README.md +0 -136
  306. package/src/examples/ValidationExamples.tsx +0 -95
  307. package/src/examples/extendedTheme.ts +0 -329
  308. package/src/theme/breakpoints.ts +0 -8
  309. package/src/theme/colorResolver.ts +0 -218
  310. package/src/theme/colors.ts +0 -315
  311. package/src/theme/defaultThemes.ts +0 -326
  312. package/src/theme/index.ts +0 -188
  313. package/src/theme/themeBuilder.ts +0 -602
  314. package/src/theme/unistyles.d.ts +0 -6
  315. package/src/theme/variantHelpers.ts +0 -584
  316. package/src/theme/variants.ts +0 -56
@@ -1,113 +1,87 @@
1
1
  import { StyleSheet } from 'react-native-unistyles';
2
+ import { Theme, StylesheetStyles, Intent, Size} from '@idealyst/theme';
3
+ import { buildSizeVariants } from '../utils/buildSizeVariants';
2
4
 
3
- export const activityIndicatorStyles = StyleSheet.create((theme) => ({
4
- container: {
5
- alignItems: 'center',
6
- justifyContent: 'center',
7
-
8
- variants: {
9
- size: {
10
- small: {
11
- width: 20,
12
- height: 20,
13
- },
14
- medium: {
15
- width: 36,
16
- height: 36,
17
- },
18
- large: {
19
- width: 48,
20
- height: 48,
21
- },
22
- },
23
- intent: {
24
- primary: {},
25
- success: {},
26
- error: {},
27
- warning: {},
28
- neutral: {},
29
- },
30
- animating: {
31
- true: {
32
- opacity: 1,
33
- },
34
- false: {
35
- opacity: 0,
36
- },
37
- },
38
- },
39
- },
40
-
41
- spinner: {
42
- borderRadius: 9999,
43
- borderStyle: 'solid',
44
-
45
- // Web-specific animation styles
46
- _web: {
47
- borderColor: 'transparent',
48
- animation: 'spin 1s linear infinite',
49
- boxSizing: 'border-box',
50
- },
51
-
52
- variants: {
53
- size: {
54
- small: {
55
- width: 20,
56
- height: 20,
57
- borderWidth: 2,
58
- },
59
- medium: {
60
- width: 36,
61
- height: 36,
62
- borderWidth: 3,
63
- },
64
- large: {
65
- width: 48,
66
- height: 48,
67
- borderWidth: 4,
68
- },
69
- },
70
- intent: {
71
- primary: {
72
- color: theme.intents?.primary?.main || '#3b82f6',
73
- _web: {
74
- borderTopColor: theme.intents?.primary?.main || '#3b82f6',
75
- borderRightColor: theme.intents?.primary?.main || '#3b82f6',
76
- },
77
- },
78
- success: {
79
- color: theme.intents?.success?.main || '#22c55e',
80
- _web: {
81
- borderTopColor: theme.intents?.success?.main || '#22c55e',
82
- borderRightColor: theme.intents?.success?.main || '#22c55e',
83
- },
84
- },
85
- error: {
86
- color: theme.intents?.error?.main || '#ef4444',
87
- _web: {
88
- borderTopColor: theme.intents?.error?.main || '#ef4444',
89
- borderRightColor: theme.intents?.error?.main || '#ef4444',
90
- },
91
- },
92
- warning: {
93
- color: theme.intents?.warning?.main || '#f59e0b',
94
- _web: {
95
- borderTopColor: theme.intents?.warning?.main || '#f59e0b',
96
- borderRightColor: theme.intents?.warning?.main || '#f59e0b',
97
- },
98
- },
99
- neutral: {
100
- color: theme.intents?.neutral?.main || '#6b7280',
101
- _web: {
102
- borderTopColor: theme.intents?.neutral?.main || '#6b7280',
103
- borderRightColor: theme.intents?.neutral?.main || '#6b7280',
104
- },
5
+ type ActivityIndicatorSize = Size;
6
+ type ActivityIndicatorIntent = Intent;
7
+
8
+ type ActivityIndicatorVariants = {
9
+ size: ActivityIndicatorSize;
10
+ intent: ActivityIndicatorIntent;
11
+ animating: boolean;
12
+ }
13
+
14
+ export type ExpandedActivityIndicatorStyles = StylesheetStyles<keyof ActivityIndicatorVariants>;
15
+
16
+ export type ActivityIndicatorStylesheet = {
17
+ container: ExpandedActivityIndicatorStyles;
18
+ spinner: ExpandedActivityIndicatorStyles;
19
+ }
20
+
21
+ function createContainerSizeVariants(theme: Theme) {
22
+ return buildSizeVariants(theme, 'activityIndicator', (size) => ({
23
+ width: size.size,
24
+ height: size.size,
25
+ }));
26
+ }
27
+
28
+ function createSpinnerSizeVariants(theme: Theme) {
29
+ return buildSizeVariants(theme, 'activityIndicator', (size) => ({
30
+ width: size.size,
31
+ height: size.size,
32
+ borderWidth: size.borderWidth,
33
+ }));
34
+ }
35
+
36
+ function getSpinnerColor(theme: Theme, intent: ActivityIndicatorIntent) {
37
+ return theme.intents[intent].primary;
38
+ }
39
+
40
+ function createSpinnerStyles(theme: Theme) {
41
+ return ({ intent }: Partial<ActivityIndicatorVariants>) => {
42
+ const color = getSpinnerColor(theme, intent);
43
+ return {
44
+ borderRadius: 9999,
45
+ borderStyle: 'solid',
46
+ color,
47
+ variants: {
48
+ size: createSpinnerSizeVariants(theme),
49
+ animating: {
50
+ true: {},
51
+ false: {},
52
+ },
53
+ },
54
+ _web: {
55
+ borderColor: 'transparent',
56
+ borderTopColor: color,
57
+ borderRightColor: color,
58
+ animation: 'spin 1s linear infinite',
59
+ boxSizing: 'border-box',
60
+ },
61
+ } as const;
62
+ }
63
+ }
64
+
65
+ // Styles are inlined here instead of in @idealyst/theme because Unistyles' Babel
66
+ // transform on native cannot resolve function calls to extract variant structures.
67
+ // @ts-ignore - TS language server needs restart to pick up theme structure changes
68
+ export const activityIndicatorStyles = StyleSheet.create((theme: Theme) => {
69
+ return {
70
+ container: {
71
+ alignItems: 'center',
72
+ justifyContent: 'center',
73
+ variants: {
74
+ size: createContainerSizeVariants(theme),
75
+ animating: {
76
+ true: {
77
+ opacity: 1,
78
+ },
79
+ false: {
80
+ opacity: 0,
81
+ },
82
+ },
105
83
  },
106
- },
107
- animating: {
108
- true: {},
109
- false: {},
110
- },
111
84
  },
112
- },
113
- }));
85
+ spinner: createSpinnerStyles(theme),
86
+ };
87
+ });
@@ -1,26 +1,26 @@
1
- import React from 'react';
1
+ import React, { forwardRef } from 'react';
2
2
  import { getWebProps } from 'react-native-unistyles/web';
3
3
  import { ActivityIndicatorProps } from './types';
4
4
  import { activityIndicatorStyles } from './ActivityIndicator.styles';
5
+ import useMergeRefs from '../hooks/useMergeRefs';
5
6
 
6
- const ActivityIndicator: React.FC<ActivityIndicatorProps> = ({
7
+ const ActivityIndicator = forwardRef<HTMLDivElement, ActivityIndicatorProps>(({
7
8
  animating = true,
8
- size = 'medium',
9
+ size = 'md',
9
10
  intent = 'primary',
10
11
  color,
11
12
  style,
12
13
  testID,
13
14
  hidesWhenStopped = true,
14
- }) => {
15
+ }, ref) => {
15
16
  // Handle numeric size
16
- const sizeVariant = typeof size === 'number' ? 'medium' : size;
17
+ const sizeVariant = typeof size === 'number' ? 'md' : size;
17
18
  const customSize = typeof size === 'number' ? size : undefined;
18
-
19
+
19
20
  // Apply variants using the correct Unistyles 3.0 pattern
20
21
  activityIndicatorStyles.useVariants({
21
- size: sizeVariant as 'small' | 'medium' | 'large',
22
- intent: intent as 'primary' | 'success' | 'error' | 'warning' | 'neutral',
23
- animating: animating as boolean,
22
+ size: sizeVariant,
23
+ animating,
24
24
  });
25
25
 
26
26
  // Don't render if not animating and hidesWhenStopped is true
@@ -39,16 +39,18 @@ const ActivityIndicator: React.FC<ActivityIndicatorProps> = ({
39
39
  ];
40
40
 
41
41
  const spinnerStyleArray = [
42
- activityIndicatorStyles.spinner,
43
- customSize && {
42
+ activityIndicatorStyles.spinner({
43
+ intent,
44
+ }),
45
+ customSize ? {
44
46
  width: customSize,
45
47
  height: customSize,
46
48
  borderWidth: Math.max(2, customSize / 10),
47
- },
48
- color && { borderTopColor: color, borderRightColor: color },
49
+ } : {},
50
+ color ? { borderTopColor: color, borderRightColor: color } : {},
49
51
  // Add inline CSS animation
50
- animating && {
51
- animation: 'spin 1s linear infinite',
52
+ {
53
+ animation: animating ? 'spin 1s linear infinite' : undefined,
52
54
  },
53
55
  ];
54
56
 
@@ -56,6 +58,8 @@ const ActivityIndicator: React.FC<ActivityIndicatorProps> = ({
56
58
  const containerProps = getWebProps(containerStyleArray);
57
59
  const spinnerProps = getWebProps(spinnerStyleArray);
58
60
 
61
+ const mergedRef = useMergeRefs(ref, containerProps.ref);
62
+
59
63
  return (
60
64
  <>
61
65
  {/* Inject keyframes animation into the document head */}
@@ -67,11 +71,13 @@ const ActivityIndicator: React.FC<ActivityIndicatorProps> = ({
67
71
  }
68
72
  `}
69
73
  </style>
70
- <div {...containerProps} data-testid={testID}>
74
+ <div {...containerProps} ref={mergedRef} data-testid={testID}>
71
75
  <div {...spinnerProps} />
72
76
  </div>
73
77
  </>
74
78
  );
75
- };
79
+ });
80
+
81
+ ActivityIndicator.displayName = 'ActivityIndicator';
76
82
 
77
83
  export default ActivityIndicator;
@@ -1,2 +1,5 @@
1
- export { default } from './ActivityIndicator.web';
2
- export type { ActivityIndicatorProps } from './types';
1
+ import ActivityIndicatorComponent from './ActivityIndicator.web';
2
+
3
+ export default ActivityIndicatorComponent;
4
+ export { ActivityIndicatorComponent as ActivityIndicator };
5
+ export * from './types';
@@ -1,2 +1,5 @@
1
- export { default } from './ActivityIndicator.web';
2
- export type { ActivityIndicatorProps } from './types';
1
+ import ActivityIndicatorComponent from './ActivityIndicator.web';
2
+
3
+ export default ActivityIndicatorComponent;
4
+ export { ActivityIndicatorComponent as ActivityIndicator };
5
+ export * from './types';
@@ -1,4 +1,9 @@
1
- import { ViewStyle } from 'react-native';
1
+ import { Intent, Size } from '@idealyst/theme';
2
+ import type { StyleProp, ViewStyle } from 'react-native';
3
+
4
+ // Component-specific type aliases for future extensibility
5
+ export type ActivityIndicatorIntentVariant = Intent;
6
+ export type ActivityIndicatorSizeVariant = Size;
2
7
 
3
8
  export interface ActivityIndicatorProps {
4
9
  /**
@@ -6,34 +11,34 @@ export interface ActivityIndicatorProps {
6
11
  * @default true
7
12
  */
8
13
  animating?: boolean;
9
-
14
+
10
15
  /**
11
16
  * The size of the indicator
12
17
  * @default "medium"
13
18
  */
14
- size?: 'small' | 'medium' | 'large' | number;
15
-
19
+ size?: ActivityIndicatorSizeVariant;
20
+
16
21
  /**
17
22
  * The color/intent of the indicator
18
23
  * @default "primary"
19
24
  */
20
- intent?: 'primary' | 'neutral' | 'success' | 'error' | 'warning';
21
-
25
+ intent?: ActivityIndicatorIntentVariant;
26
+
22
27
  /**
23
28
  * Custom color to override intent
24
29
  */
25
30
  color?: string;
26
-
31
+
27
32
  /**
28
33
  * Additional styles to apply to the container
29
34
  */
30
- style?: ViewStyle;
31
-
35
+ style?: StyleProp<ViewStyle>;
36
+
32
37
  /**
33
38
  * Test identifier for testing
34
39
  */
35
40
  testID?: string;
36
-
41
+
37
42
  /**
38
43
  * Whether to hide the indicator when not animating
39
44
  * @default true
@@ -0,0 +1,113 @@
1
+ import React, { isValidElement, forwardRef, ComponentRef } from 'react';
2
+ import { View, Text, TouchableOpacity } from 'react-native';
3
+ import MaterialCommunityIcons from 'react-native-vector-icons/MaterialCommunityIcons';
4
+ import { alertStyles } from './Alert.styles';
5
+ import { isIconName } from '../Icon/icon-resolver';
6
+ import type { AlertProps } from './types';
7
+
8
+ // Default icon names for each intent
9
+ const defaultIcons = {
10
+ primary: 'information',
11
+ success: 'check-circle',
12
+ error: 'alert-circle',
13
+ warning: 'alert',
14
+ info: 'information',
15
+ neutral: 'circle',
16
+ };
17
+
18
+ const Alert = forwardRef<ComponentRef<typeof View>, AlertProps>(({
19
+ title,
20
+ message,
21
+ children,
22
+ intent = 'neutral',
23
+ type = 'soft',
24
+ icon,
25
+ showIcon = true,
26
+ dismissible = false,
27
+ onDismiss,
28
+ actions,
29
+ style,
30
+ testID,
31
+ }, ref) => {
32
+ // Apply variants to stylesheet
33
+ alertStyles.useVariants({
34
+ type,
35
+ intent,
36
+ });
37
+
38
+ const displayIcon = icon !== undefined ? icon : (showIcon ? defaultIcons[intent] : null);
39
+
40
+ // Helper to render icon
41
+ const renderIcon = () => {
42
+ if (!displayIcon) return null;
43
+
44
+ if (typeof displayIcon === 'string' && isIconName(displayIcon)) {
45
+ return (
46
+ <MaterialCommunityIcons
47
+ name={displayIcon}
48
+ size={20}
49
+ style={alertStyles.iconContainer}
50
+ />
51
+ );
52
+ } else if (isValidElement(displayIcon)) {
53
+ return displayIcon;
54
+ }
55
+ return null;
56
+ };
57
+
58
+ return (
59
+ <View
60
+ ref={ref}
61
+ style={[alertStyles.container, style]}
62
+ testID={testID}
63
+ accessibilityRole="alert"
64
+ >
65
+ {displayIcon && (
66
+ <View style={alertStyles.iconContainer}>
67
+ {renderIcon()}
68
+ </View>
69
+ )}
70
+
71
+ <View style={alertStyles.content}>
72
+ {title && (
73
+ <Text style={alertStyles.title}>
74
+ {title}
75
+ </Text>
76
+ )}
77
+
78
+ {message && (
79
+ <Text style={alertStyles.message}>
80
+ {message}
81
+ </Text>
82
+ )}
83
+
84
+ {children}
85
+
86
+ {actions && (
87
+ <View style={alertStyles.actions}>
88
+ {actions}
89
+ </View>
90
+ )}
91
+ </View>
92
+
93
+ {dismissible && onDismiss && (
94
+ <TouchableOpacity
95
+ style={alertStyles.closeButton}
96
+ onPress={onDismiss}
97
+ accessibilityLabel="Dismiss alert"
98
+ accessibilityRole="button"
99
+ >
100
+ <MaterialCommunityIcons
101
+ name="close"
102
+ size={16}
103
+ style={alertStyles.closeIcon}
104
+ />
105
+ </TouchableOpacity>
106
+ )}
107
+ </View>
108
+ );
109
+ });
110
+
111
+ Alert.displayName = 'Alert';
112
+
113
+ export default Alert;