@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
@@ -0,0 +1,423 @@
1
+ import React, { useState } from 'react';
2
+ import { Screen, View, Text, Select, Card, Button, Icon, Divider } from '../index';
3
+
4
+ // Mock data for examples
5
+ const fruitOptions = [
6
+ { value: 'apple', label: 'Apple' },
7
+ { value: 'banana', label: 'Banana' },
8
+ { value: 'orange', label: 'Orange' },
9
+ { value: 'grape', label: 'Grape' },
10
+ { value: 'strawberry', label: 'Strawberry' },
11
+ { value: 'pineapple', label: 'Pineapple' },
12
+ { value: 'mango', label: 'Mango' },
13
+ { value: 'kiwi', label: 'Kiwi' },
14
+ ];
15
+
16
+ const countryOptions = [
17
+ { value: 'us', label: 'United States', icon: <Text>🇺🇸</Text> },
18
+ { value: 'ca', label: 'Canada', icon: <Text>🇨🇦</Text> },
19
+ { value: 'uk', label: 'United Kingdom', icon: <Text>🇬🇧</Text> },
20
+ { value: 'de', label: 'Germany', icon: <Text>🇩🇪</Text> },
21
+ { value: 'fr', label: 'France', icon: <Text>🇫🇷</Text> },
22
+ { value: 'jp', label: 'Japan', icon: <Text>🇯🇵</Text> },
23
+ { value: 'au', label: 'Australia', icon: <Text>🇦🇺</Text> },
24
+ { value: 'in', label: 'India', icon: <Text>🇮🇳</Text> },
25
+ ];
26
+
27
+ const priorityOptions = [
28
+ {
29
+ value: 'low',
30
+ label: 'Low Priority',
31
+ icon: <Text style={{ color: '#22c55e' }}>●</Text>
32
+ },
33
+ {
34
+ value: 'medium',
35
+ label: 'Medium Priority',
36
+ icon: <Text style={{ color: '#f59e0b' }}>●</Text>
37
+ },
38
+ {
39
+ value: 'high',
40
+ label: 'High Priority',
41
+ icon: <Text style={{ color: '#ef4444' }}>●</Text>
42
+ },
43
+ {
44
+ value: 'urgent',
45
+ label: 'Urgent',
46
+ icon: <Text style={{ color: '#dc2626' }}>🔥</Text>
47
+ },
48
+ ];
49
+
50
+ const statusOptions = [
51
+ { value: 'draft', label: 'Draft', disabled: false },
52
+ { value: 'pending', label: 'Pending Review' },
53
+ { value: 'approved', label: 'Approved' },
54
+ { value: 'archived', label: 'Archived (Disabled)', disabled: true },
55
+ { value: 'deleted', label: 'Deleted (Disabled)', disabled: true },
56
+ ];
57
+
58
+ export const SelectExamples = () => {
59
+ // State for all select examples
60
+ const [basicSelect, setBasicSelect] = useState('');
61
+ const [fruitSelect, setFruitSelect] = useState('apple');
62
+ const [countrySelect, setCountrySelect] = useState('');
63
+ const [prioritySelect, setPrioritySelect] = useState('medium');
64
+ const [statusSelect, setStatusSelect] = useState('draft');
65
+ const [searchableSelect, setSearchableSelect] = useState('');
66
+ const [formSelect, setFormSelect] = useState('');
67
+ const [sizeSmall, setSizeSmall] = useState('');
68
+ const [sizeMedium, setSizeMedium] = useState('');
69
+ const [sizeLarge, setSizeLarge] = useState('');
70
+ const [outlinedSelect, setOutlinedSelect] = useState('');
71
+ const [filledSelect, setFilledSelect] = useState('');
72
+ const [primarySelect, setPrimarySelect] = useState('');
73
+ const [successSelect, setSuccessSelect] = useState('');
74
+ const [errorSelect, setErrorSelect] = useState('');
75
+ const [warningSelect, setWarningSelect] = useState('');
76
+
77
+ const [formErrors, setFormErrors] = useState<Record<string, string>>({});
78
+
79
+ const validateForm = () => {
80
+ const errors: Record<string, string> = {};
81
+ if (!formSelect) {
82
+ errors.formSelect = 'Please select a country';
83
+ }
84
+ setFormErrors(errors);
85
+ return Object.keys(errors).length === 0;
86
+ };
87
+
88
+ const handleFormSubmit = () => {
89
+ if (validateForm()) {
90
+ console.log('Form submitted successfully!', { country: formSelect });
91
+ } else {
92
+ console.log('Form has validation errors');
93
+ }
94
+ };
95
+
96
+ const resetAllSelections = () => {
97
+ setBasicSelect('');
98
+ setFruitSelect('');
99
+ setCountrySelect('');
100
+ setPrioritySelect('');
101
+ setStatusSelect('');
102
+ setSearchableSelect('');
103
+ setFormSelect('');
104
+ setSizeSmall('');
105
+ setSizeMedium('');
106
+ setSizeLarge('');
107
+ setOutlinedSelect('');
108
+ setFilledSelect('');
109
+ setPrimarySelect('');
110
+ setSuccessSelect('');
111
+ setErrorSelect('');
112
+ setWarningSelect('');
113
+ setFormErrors({});
114
+ };
115
+
116
+ return (
117
+ <Screen background="primary" padding="lg">
118
+ <View spacing="lg">
119
+ <View style={{ flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center' }}>
120
+ <Text size="lg" weight="bold">
121
+ Select Component Examples
122
+ </Text>
123
+ <Button
124
+ type="outlined"
125
+ intent="neutral"
126
+ size="sm"
127
+ onPress={resetAllSelections}
128
+ >
129
+ Reset All
130
+ </Button>
131
+ </View>
132
+
133
+ {/* Basic Usage */}
134
+ <Card type="outlined" padding="md">
135
+ <View spacing="md">
136
+ <Text size="md" weight="semibold">Basic Usage</Text>
137
+ <Select
138
+ options={fruitOptions}
139
+ value={basicSelect}
140
+ onValueChange={setBasicSelect}
141
+ placeholder="Choose a fruit"
142
+ />
143
+ <Text size="sm" color="secondary">
144
+ Selected: {basicSelect || 'None'}
145
+ </Text>
146
+ </View>
147
+ </Card>
148
+
149
+ {/* With Icons */}
150
+ <Card type="outlined" padding="md">
151
+ <View spacing="md">
152
+ <Text size="md" weight="semibold">With Icons</Text>
153
+ <Select
154
+ options={countryOptions}
155
+ value={countrySelect}
156
+ onValueChange={setCountrySelect}
157
+ placeholder="Select a country"
158
+ label="Country"
159
+ />
160
+ <Text size="sm" color="secondary">
161
+ Selected: {countrySelect || 'None'}
162
+ </Text>
163
+ </View>
164
+ </Card>
165
+
166
+ {/* Custom Icons */}
167
+ <Card type="outlined" padding="md">
168
+ <View spacing="md">
169
+ <Text size="md" weight="semibold">Custom Icon Components</Text>
170
+ <Select
171
+ options={priorityOptions}
172
+ value={prioritySelect}
173
+ onValueChange={setPrioritySelect}
174
+ placeholder="Select priority"
175
+ label="Task Priority"
176
+ />
177
+ <Text size="sm" color="secondary">
178
+ Selected: {prioritySelect || 'None'}
179
+ </Text>
180
+ </View>
181
+ </Card>
182
+
183
+ {/* Disabled Options */}
184
+ <Card type="outlined" padding="md">
185
+ <View spacing="md">
186
+ <Text size="md" weight="semibold">Disabled Options</Text>
187
+ <Select
188
+ options={statusOptions}
189
+ value={statusSelect}
190
+ onValueChange={setStatusSelect}
191
+ placeholder="Select status"
192
+ label="Document Status"
193
+ helperText="Some options are disabled"
194
+ />
195
+ <Text size="sm" color="secondary">
196
+ Selected: {statusSelect || 'None'}
197
+ </Text>
198
+ </View>
199
+ </Card>
200
+
201
+ {/* Searchable */}
202
+ <Card type="outlined" padding="md">
203
+ <View spacing="md">
204
+ <Text size="md" weight="semibold">Searchable Select</Text>
205
+ <Select
206
+ options={fruitOptions}
207
+ value={searchableSelect}
208
+ onValueChange={setSearchableSelect}
209
+ placeholder="Search for fruits..."
210
+ label="Fruit Search"
211
+ searchable
212
+ helperText="Type to filter options"
213
+ />
214
+ <Text size="sm" color="secondary">
215
+ Selected: {searchableSelect || 'None'}
216
+ </Text>
217
+ </View>
218
+ </Card>
219
+
220
+ {/* Sizes */}
221
+ <Card type="outlined" padding="md">
222
+ <View spacing="md">
223
+ <Text size="md" weight="semibold">Sizes</Text>
224
+ <View spacing="sm">
225
+ <View>
226
+ <Text size="sm" weight="medium">Small</Text>
227
+ <Select
228
+ options={fruitOptions.slice(0, 3)}
229
+ value={sizeSmall}
230
+ onValueChange={setSizeSmall}
231
+ placeholder="Small select"
232
+ size="sm"
233
+ />
234
+ </View>
235
+ <View>
236
+ <Text size="sm" weight="medium">Medium (Default)</Text>
237
+ <Select
238
+ options={fruitOptions.slice(0, 3)}
239
+ value={sizeMedium}
240
+ onValueChange={setSizeMedium}
241
+ placeholder="Medium select"
242
+ size="md"
243
+ />
244
+ </View>
245
+ <View>
246
+ <Text size="sm" weight="medium">Large</Text>
247
+ <Select
248
+ options={fruitOptions.slice(0, 3)}
249
+ value={sizeLarge}
250
+ onValueChange={setSizeLarge}
251
+ placeholder="Large select"
252
+ size="lg"
253
+ />
254
+ </View>
255
+ </View>
256
+ </View>
257
+ </Card>
258
+
259
+ {/* Variants */}
260
+ <Card type="outlined" padding="md">
261
+ <View spacing="md">
262
+ <Text size="md" weight="semibold">Variants</Text>
263
+ <View spacing="sm">
264
+ <View>
265
+ <Text size="sm" weight="medium">Outlined (Default)</Text>
266
+ <Select
267
+ options={fruitOptions.slice(0, 4)}
268
+ value={outlinedSelect}
269
+ onValueChange={setOutlinedSelect}
270
+ placeholder="Outlined variant"
271
+ type="outlined"
272
+ />
273
+ </View>
274
+ <View>
275
+ <Text size="sm" weight="medium">Filled</Text>
276
+ <Select
277
+ options={fruitOptions.slice(0, 4)}
278
+ value={filledSelect}
279
+ onValueChange={setFilledSelect}
280
+ placeholder="Filled variant"
281
+ type="filled"
282
+ />
283
+ </View>
284
+ </View>
285
+ </View>
286
+ </Card>
287
+
288
+ {/* Intents */}
289
+ <Card type="outlined" padding="md">
290
+ <View spacing="md">
291
+ <Text size="md" weight="semibold">Intent Colors</Text>
292
+ <View spacing="sm">
293
+ <View>
294
+ <Text size="sm" weight="medium">Primary</Text>
295
+ <Select
296
+ options={fruitOptions.slice(0, 3)}
297
+ value={primarySelect}
298
+ onValueChange={setPrimarySelect}
299
+ placeholder="Primary intent"
300
+ intent="primary"
301
+ type="outlined"
302
+ />
303
+ </View>
304
+ <View>
305
+ <Text size="sm" weight="medium">Success</Text>
306
+ <Select
307
+ options={fruitOptions.slice(0, 3)}
308
+ value={successSelect}
309
+ onValueChange={setSuccessSelect}
310
+ placeholder="Success intent"
311
+ intent="success"
312
+ type="outlined"
313
+ />
314
+ </View>
315
+ <View>
316
+ <Text size="sm" weight="medium">Warning</Text>
317
+ <Select
318
+ options={fruitOptions.slice(0, 3)}
319
+ value={warningSelect}
320
+ onValueChange={setWarningSelect}
321
+ placeholder="Warning intent"
322
+ intent="warning"
323
+ type="outlined"
324
+ />
325
+ </View>
326
+ <View>
327
+ <Text size="sm" weight="medium">Error</Text>
328
+ <Select
329
+ options={fruitOptions.slice(0, 3)}
330
+ value={errorSelect}
331
+ onValueChange={setErrorSelect}
332
+ placeholder="Error intent"
333
+ intent="error"
334
+ type="outlined"
335
+ />
336
+ </View>
337
+ </View>
338
+ </View>
339
+ </Card>
340
+
341
+ {/* Form Example */}
342
+ <Card type="outlined" padding="md">
343
+ <View spacing="md">
344
+ <Text size="md" weight="semibold">Form Integration</Text>
345
+ <Select
346
+ options={countryOptions}
347
+ value={formSelect}
348
+ onValueChange={(value) => {
349
+ setFormSelect(value);
350
+ if (formErrors.formSelect) {
351
+ setFormErrors(prev => ({ ...prev, formSelect: '' }));
352
+ }
353
+ }}
354
+ placeholder="Select your country"
355
+ label="Country *"
356
+ error={!!formErrors.formSelect}
357
+ helperText={formErrors.formSelect || "Required field"}
358
+ type="outlined"
359
+ intent="primary"
360
+ />
361
+ <Button
362
+ type="contained"
363
+ intent="primary"
364
+ onPress={handleFormSubmit}
365
+ >
366
+ Submit Form
367
+ </Button>
368
+ </View>
369
+ </Card>
370
+
371
+ {/* Disabled State */}
372
+ <Card type="outlined" padding="md">
373
+ <View spacing="md">
374
+ <Text size="md" weight="semibold">Disabled State</Text>
375
+ <Select
376
+ options={fruitOptions}
377
+ value="apple"
378
+ onValueChange={() => {}}
379
+ placeholder="This select is disabled"
380
+ label="Disabled Select"
381
+ disabled
382
+ helperText="This select cannot be interacted with"
383
+ />
384
+ </View>
385
+ </Card>
386
+
387
+ {/* Platform-specific Features */}
388
+ <Card type="outlined" padding="md">
389
+ <View spacing="md">
390
+ <Text size="md" weight="semibold">Platform Features</Text>
391
+ <Text size="sm" color="secondary">
392
+ On iOS: Try the ActionSheet presentation mode for native feel
393
+ </Text>
394
+ <Select
395
+ options={priorityOptions}
396
+ value={prioritySelect}
397
+ onValueChange={setPrioritySelect}
398
+ placeholder="Select priority"
399
+ label="iOS ActionSheet Mode"
400
+ presentationMode="actionSheet" // iOS only
401
+ helperText="Uses native ActionSheet on iOS"
402
+ />
403
+ </View>
404
+ </Card>
405
+
406
+ <Divider spacing="lg" />
407
+
408
+ {/* Summary */}
409
+ <Card type="filled" padding="md">
410
+ <View spacing="sm">
411
+ <Text size="md" weight="semibold">Current Selections Summary</Text>
412
+ <Text size="sm">Basic: {basicSelect || 'None'}</Text>
413
+ <Text size="sm">Country: {countrySelect || 'None'}</Text>
414
+ <Text size="sm">Priority: {prioritySelect || 'None'}</Text>
415
+ <Text size="sm">Status: {statusSelect || 'None'}</Text>
416
+ <Text size="sm">Searchable: {searchableSelect || 'None'}</Text>
417
+ <Text size="sm">Form: {formSelect || 'None'}</Text>
418
+ </View>
419
+ </Card>
420
+ </View>
421
+ </Screen>
422
+ );
423
+ };
@@ -0,0 +1,206 @@
1
+ import React from 'react';
2
+ import { Screen, View, Text, Skeleton, SkeletonGroup, Divider, Card } from '../index';
3
+
4
+ export const SkeletonExamples = () => {
5
+ return (
6
+ <Screen background="primary" safeArea>
7
+ <View spacing="lg" style={{ maxWidth: 800, width: '100%', paddingHorizontal: 16, marginHorizontal: 'auto' }}>
8
+ <Text size="xl" weight="bold">Skeleton Examples</Text>
9
+
10
+ <Divider spacing="md" />
11
+ <Text size="lg" weight="semibold">Basic Shapes</Text>
12
+
13
+ <Text size="md" weight="semibold">Rectangle (Default)</Text>
14
+ <Skeleton width="100%" height={40} shape="rectangle" />
15
+
16
+ <Text size="md" weight="semibold">Rounded</Text>
17
+ <Skeleton width="100%" height={40} shape="rounded" />
18
+
19
+ <Text size="md" weight="semibold">Circle</Text>
20
+ <Skeleton width={64} height={64} shape="circle" />
21
+
22
+ <Divider spacing="md" />
23
+ <Text size="lg" weight="semibold">Custom Border Radius</Text>
24
+
25
+ <Skeleton width="100%" height={40} shape="rounded" borderRadius={4} />
26
+ <Skeleton width="100%" height={40} shape="rounded" borderRadius={16} />
27
+ <Skeleton width="100%" height={40} shape="rounded" borderRadius={24} />
28
+
29
+ <Divider spacing="md" />
30
+ <Text size="lg" weight="semibold">Animation Types</Text>
31
+
32
+ <Text size="md" weight="semibold">Pulse (Default)</Text>
33
+ <Skeleton width="100%" height={40} animation="pulse" />
34
+
35
+ <Text size="md" weight="semibold">Wave</Text>
36
+ <Skeleton width="100%" height={40} animation="wave" />
37
+
38
+ <Text size="md" weight="semibold">None</Text>
39
+ <Skeleton width="100%" height={40} animation="none" />
40
+
41
+ <Divider spacing="md" />
42
+ <Text size="lg" weight="semibold">Skeleton Groups</Text>
43
+
44
+ <Text size="md" weight="semibold">Default Group (3 items)</Text>
45
+ <SkeletonGroup />
46
+
47
+ <Text size="md" weight="semibold">Custom Count (5 items)</Text>
48
+ <SkeletonGroup count={5} />
49
+
50
+ <Text size="md" weight="semibold">Custom Spacing</Text>
51
+ <SkeletonGroup count={3} spacing={20} />
52
+
53
+ <Text size="md" weight="semibold">Custom Skeleton Props</Text>
54
+ <SkeletonGroup
55
+ count={4}
56
+ spacing={16}
57
+ skeletonProps={{
58
+ height: 60,
59
+ shape: 'rounded',
60
+ animation: 'wave',
61
+ }}
62
+ />
63
+
64
+ <Divider spacing="md" />
65
+ <Text size="lg" weight="semibold">Profile Card Loading</Text>
66
+
67
+ <Card type="outlined">
68
+ <View spacing="md">
69
+ <View style={{ flexDirection: 'row', gap: 12, alignItems: 'center' }}>
70
+ <Skeleton width={64} height={64} shape="circle" />
71
+ <View style={{ flex: 1, gap: 8 }}>
72
+ <Skeleton width="60%" height={24} shape="rounded" />
73
+ <Skeleton width="40%" height={16} shape="rounded" />
74
+ </View>
75
+ </View>
76
+ <SkeletonGroup count={3} skeletonProps={{ height: 16, shape: 'rounded' }} />
77
+ </View>
78
+ </Card>
79
+
80
+ <Divider spacing="md" />
81
+ <Text size="lg" weight="semibold">Article Card Loading</Text>
82
+
83
+ <Card type="outlined">
84
+ <View spacing="md">
85
+ <Skeleton width="100%" height={200} shape="rounded" />
86
+ <Skeleton width="80%" height={28} shape="rounded" />
87
+ <SkeletonGroup
88
+ count={3}
89
+ spacing={8}
90
+ skeletonProps={{ height: 16, shape: 'rounded' }}
91
+ />
92
+ <View style={{ flexDirection: 'row', gap: 12, marginTop: 8 }}>
93
+ <Skeleton width={32} height={32} shape="circle" />
94
+ <Skeleton width={120} height={16} shape="rounded" />
95
+ </View>
96
+ </View>
97
+ </Card>
98
+
99
+ <Divider spacing="md" />
100
+ <Text size="lg" weight="semibold">List Item Loading</Text>
101
+
102
+ <Card type="outlined">
103
+ <View spacing="md">
104
+ {[1, 2, 3].map((item) => (
105
+ <View key={item} style={{ flexDirection: 'row', gap: 12, alignItems: 'center' }}>
106
+ <Skeleton width={48} height={48} shape="rounded" />
107
+ <View style={{ flex: 1, gap: 8 }}>
108
+ <Skeleton width="70%" height={18} shape="rounded" />
109
+ <Skeleton width="50%" height={14} shape="rounded" />
110
+ </View>
111
+ </View>
112
+ ))}
113
+ </View>
114
+ </Card>
115
+
116
+ <Divider spacing="md" />
117
+ <Text size="lg" weight="semibold">Table Loading</Text>
118
+
119
+ <Card type="outlined">
120
+ <View spacing="sm">
121
+ {/* Header */}
122
+ <View style={{ flexDirection: 'row', gap: 12 }}>
123
+ <Skeleton width={40} height={20} shape="rounded" />
124
+ <Skeleton width="25%" height={20} shape="rounded" />
125
+ <Skeleton width="25%" height={20} shape="rounded" />
126
+ <Skeleton width="25%" height={20} shape="rounded" />
127
+ </View>
128
+ <Divider spacing="sm" />
129
+ {/* Rows */}
130
+ {[1, 2, 3, 4, 5].map((row) => (
131
+ <View key={row} style={{ flexDirection: 'row', gap: 12, alignItems: 'center' }}>
132
+ <Skeleton width={40} height={16} shape="rounded" />
133
+ <Skeleton width="25%" height={16} shape="rounded" />
134
+ <Skeleton width="25%" height={16} shape="rounded" />
135
+ <Skeleton width="25%" height={16} shape="rounded" />
136
+ </View>
137
+ ))}
138
+ </View>
139
+ </Card>
140
+
141
+ <Divider spacing="md" />
142
+ <Text size="lg" weight="semibold">Dashboard Card Loading</Text>
143
+
144
+ <View style={{ flexDirection: 'row', gap: 16, flexWrap: 'wrap' }}>
145
+ {[1, 2, 3, 4].map((card) => (
146
+ <Card key={card} type="outlined" style={{ flex: 1, minWidth: 180 }}>
147
+ <View spacing="sm">
148
+ <Skeleton width="60%" height={16} shape="rounded" />
149
+ <Skeleton width="80%" height={32} shape="rounded" />
150
+ <Skeleton width="40%" height={12} shape="rounded" />
151
+ </View>
152
+ </Card>
153
+ ))}
154
+ </View>
155
+
156
+ <Divider spacing="md" />
157
+ <Text size="lg" weight="semibold">Comment Thread Loading</Text>
158
+
159
+ <Card type="outlined">
160
+ <View spacing="md">
161
+ {[1, 2, 3].map((comment) => (
162
+ <View key={comment} style={{ paddingLeft: comment > 1 ? 32 : 0 }}>
163
+ <View style={{ flexDirection: 'row', gap: 12 }}>
164
+ <Skeleton width={40} height={40} shape="circle" />
165
+ <View style={{ flex: 1, gap: 8 }}>
166
+ <Skeleton width="30%" height={16} shape="rounded" />
167
+ <SkeletonGroup
168
+ count={2}
169
+ spacing={6}
170
+ skeletonProps={{ height: 14, shape: 'rounded' }}
171
+ />
172
+ </View>
173
+ </View>
174
+ </View>
175
+ ))}
176
+ </View>
177
+ </Card>
178
+
179
+ <Divider spacing="md" />
180
+ <Text size="lg" weight="semibold">Mixed Shapes and Sizes</Text>
181
+
182
+ <View style={{ flexDirection: 'row', gap: 12, flexWrap: 'wrap' }}>
183
+ <Skeleton width={80} height={80} shape="circle" />
184
+ <Skeleton width={80} height={80} shape="rounded" borderRadius={16} />
185
+ <Skeleton width={80} height={80} shape="rectangle" />
186
+ </View>
187
+
188
+ <View style={{ flexDirection: 'row', gap: 12, alignItems: 'center' }}>
189
+ <Skeleton width={24} height={24} shape="circle" />
190
+ <Skeleton width={32} height={32} shape="circle" />
191
+ <Skeleton width={48} height={48} shape="circle" />
192
+ <Skeleton width={64} height={64} shape="circle" />
193
+ </View>
194
+
195
+ <Divider spacing="md" />
196
+ <Text size="lg" weight="semibold">Custom Widths</Text>
197
+
198
+ <Skeleton width={100} height={20} shape="rounded" />
199
+ <Skeleton width="25%" height={20} shape="rounded" />
200
+ <Skeleton width="50%" height={20} shape="rounded" />
201
+ <Skeleton width="75%" height={20} shape="rounded" />
202
+ <Skeleton width="100%" height={20} shape="rounded" />
203
+ </View>
204
+ </Screen>
205
+ );
206
+ };