@idealyst/components 1.0.83 → 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 +20 -2
  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 +140 -63
  170. package/src/Select/Select.styles.tsx +312 -302
  171. package/src/Select/Select.web.tsx +156 -316
  172. package/src/Select/index.ts +5 -2
  173. package/src/Select/index.web.ts +5 -2
  174. package/src/Select/types.ts +13 -7
  175. package/src/Skeleton/Skeleton.native.tsx +139 -0
  176. package/src/Skeleton/Skeleton.styles.tsx +59 -0
  177. package/src/Skeleton/Skeleton.web.tsx +112 -0
  178. package/src/Skeleton/index.native.ts +4 -0
  179. package/src/Skeleton/index.ts +5 -0
  180. package/src/Skeleton/index.web.ts +5 -0
  181. package/src/Skeleton/types.ts +75 -0
  182. package/src/Slider/Slider.native.tsx +248 -0
  183. package/src/Slider/Slider.styles.tsx +241 -0
  184. package/src/Slider/Slider.web.tsx +226 -0
  185. package/src/Slider/index.native.ts +3 -0
  186. package/src/Slider/index.ts +5 -0
  187. package/src/Slider/index.web.ts +5 -0
  188. package/src/Slider/types.ts +31 -0
  189. package/src/Switch/Switch.native.tsx +131 -0
  190. package/src/Switch/Switch.styles.tsx +169 -0
  191. package/src/Switch/Switch.web.tsx +121 -0
  192. package/src/Switch/index.native.ts +3 -0
  193. package/src/Switch/index.ts +5 -0
  194. package/src/Switch/index.web.ts +5 -0
  195. package/src/Switch/types.ts +21 -0
  196. package/src/TabBar/TabBar.native.tsx +142 -0
  197. package/src/TabBar/TabBar.styles.tsx +399 -0
  198. package/src/TabBar/TabBar.web.tsx +205 -0
  199. package/src/TabBar/index.native.tsx +3 -0
  200. package/src/TabBar/index.ts +3 -0
  201. package/src/TabBar/index.web.tsx +3 -0
  202. package/src/TabBar/types.ts +26 -0
  203. package/src/Table/Table.native.tsx +122 -0
  204. package/src/Table/Table.styles.tsx +283 -0
  205. package/src/Table/Table.web.tsx +112 -0
  206. package/src/Table/index.native.tsx +3 -0
  207. package/src/Table/index.ts +3 -0
  208. package/src/Table/index.web.tsx +3 -0
  209. package/src/Table/types.ts +28 -0
  210. package/src/Text/Text.native.tsx +12 -11
  211. package/src/Text/Text.styles.tsx +76 -64
  212. package/src/Text/Text.web.tsx +14 -9
  213. package/src/Text/index.ts +5 -5
  214. package/src/Text/index.web.ts +5 -3
  215. package/src/Text/types.ts +20 -13
  216. package/src/TextArea/TextArea.native.tsx +134 -0
  217. package/src/TextArea/TextArea.styles.tsx +175 -0
  218. package/src/TextArea/TextArea.web.tsx +156 -0
  219. package/src/TextArea/index.native.ts +3 -0
  220. package/src/TextArea/index.ts +3 -0
  221. package/src/TextArea/index.web.ts +3 -0
  222. package/src/TextArea/types.ts +30 -0
  223. package/src/Tooltip/Tooltip.native.tsx +165 -0
  224. package/src/Tooltip/Tooltip.styles.tsx +73 -0
  225. package/src/Tooltip/Tooltip.web.tsx +87 -0
  226. package/src/Tooltip/index.native.ts +3 -0
  227. package/src/Tooltip/index.ts +3 -0
  228. package/src/Tooltip/types.ts +18 -0
  229. package/src/Video/Video.native.tsx +105 -0
  230. package/src/Video/Video.styles.tsx +39 -0
  231. package/src/Video/Video.web.tsx +115 -0
  232. package/src/Video/index.native.ts +5 -0
  233. package/src/Video/index.ts +5 -0
  234. package/src/Video/types.ts +29 -0
  235. package/src/View/View.native.tsx +9 -14
  236. package/src/View/View.styles.tsx +101 -93
  237. package/src/View/View.web.tsx +16 -17
  238. package/src/View/index.ts +5 -5
  239. package/src/View/index.web.ts +5 -3
  240. package/src/View/types.ts +29 -21
  241. package/src/examples/AccordionExamples.tsx +126 -0
  242. package/src/examples/AlertExamples.tsx +280 -0
  243. package/src/examples/AvatarExamples.tsx +23 -23
  244. package/src/examples/BadgeExamples.tsx +109 -41
  245. package/src/examples/BreadcrumbExamples.tsx +312 -0
  246. package/src/examples/ButtonExamples.tsx +160 -33
  247. package/src/examples/CardExamples.tsx +40 -40
  248. package/src/examples/CheckboxExamples.tsx +12 -12
  249. package/src/examples/ChipExamples.tsx +197 -0
  250. package/src/examples/DialogExamples.tsx +22 -22
  251. package/src/examples/DividerExamples.tsx +49 -49
  252. package/src/examples/IconExamples.tsx +270 -54
  253. package/src/examples/ImageExamples.tsx +174 -0
  254. package/src/examples/InputExamples.tsx +75 -17
  255. package/src/examples/ListExamples.tsx +288 -0
  256. package/src/examples/MenuExamples.tsx +144 -0
  257. package/src/examples/PopoverExamples.tsx +69 -73
  258. package/src/examples/ProgressExamples.tsx +137 -0
  259. package/src/examples/RadioButtonExamples.tsx +161 -0
  260. package/src/examples/SVGImageExamples.tsx +19 -17
  261. package/src/examples/ScreenExamples.tsx +31 -31
  262. package/src/examples/SelectExamples.tsx +67 -67
  263. package/src/examples/SkeletonExamples.tsx +206 -0
  264. package/src/examples/SliderExamples.tsx +200 -0
  265. package/src/examples/SwitchExamples.tsx +182 -0
  266. package/src/examples/TabBarExamples.tsx +143 -0
  267. package/src/examples/TableExamples.tsx +280 -0
  268. package/src/examples/TextAreaExamples.tsx +173 -0
  269. package/src/examples/TextExamples.tsx +28 -32
  270. package/src/examples/ThemeExtensionExamples.tsx +10 -10
  271. package/src/examples/TooltipExamples.tsx +126 -0
  272. package/src/examples/VideoExamples.tsx +144 -0
  273. package/src/examples/ViewExamples.tsx +64 -56
  274. package/src/examples/index.ts +17 -3
  275. package/src/hooks/useMergeRefs.ts +16 -0
  276. package/src/hooks/useSmartPosition.native.ts +169 -0
  277. package/src/index.native.ts +80 -9
  278. package/src/index.ts +71 -1
  279. package/src/internal/BoundedModalContent.native.tsx +58 -0
  280. package/src/internal/PositionedPortal.tsx +254 -0
  281. package/src/internal/SafeAreaDebugOverlay.native.tsx +173 -0
  282. package/src/unistyles.d.ts +6 -0
  283. package/src/utils/buildSizeVariants.ts +16 -0
  284. package/src/utils/deepMerge.ts +43 -0
  285. package/src/utils/positionUtils.native.ts +280 -0
  286. package/src/utils/styleHelpers.ts +48 -0
  287. package/LLM-ACCESS-GUIDE.md +0 -143
  288. package/src/ActivityIndicator/README.md +0 -132
  289. package/src/Avatar/README.md +0 -139
  290. package/src/Badge/README.md +0 -170
  291. package/src/Button/Button.types.ts +0 -12
  292. package/src/Button/README.md +0 -262
  293. package/src/Card/README.md +0 -258
  294. package/src/Checkbox/README.md +0 -102
  295. package/src/Dialog/README.md +0 -210
  296. package/src/Divider/README.md +0 -108
  297. package/src/Icon/README.md +0 -81
  298. package/src/Input/README.md +0 -100
  299. package/src/SVGImage/README.md +0 -209
  300. package/src/Screen/README.md +0 -86
  301. package/src/Select/README.md +0 -166
  302. package/src/Text/README.md +0 -94
  303. package/src/View/README.md +0 -107
  304. package/src/examples/AllExamples.tsx +0 -88
  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,144 @@
1
+ import React, { useState } from 'react';
2
+ import { Screen, View, Text, Button, Menu, MenuItem } from '@idealyst/components';
3
+
4
+ export const MenuExamples: React.FC = () => {
5
+ const [basicMenuOpen, setBasicMenuOpen] = useState(false);
6
+ const [placementMenuOpen, setPlacementMenuOpen] = useState(false);
7
+ const [iconNameMenuOpen, setIconNameMenuOpen] = useState(false);
8
+ const [intentMenuOpen, setIntentMenuOpen] = useState(false);
9
+ const [separatorMenuOpen, setSeparatorMenuOpen] = useState(false);
10
+ const [disabledMenuOpen, setDisabledMenuOpen] = useState(false);
11
+
12
+ const [selectedAction, setSelectedAction] = useState<string>('');
13
+
14
+ const basicItems: MenuItem[] = [
15
+ { id: 'action1', label: 'Action 1', onClick: () => setSelectedAction('Action 1') },
16
+ { id: 'action2', label: 'Action 2', onClick: () => setSelectedAction('Action 2') },
17
+ { id: 'action3', label: 'Action 3', onClick: () => setSelectedAction('Action 3') },
18
+ ];
19
+
20
+ const iconNameItems: MenuItem[] = [
21
+ { id: 'edit', label: 'Edit', icon: 'pencil', onClick: () => setSelectedAction('Edit') },
22
+ { id: 'copy', label: 'Copy', icon: 'content-copy', onClick: () => setSelectedAction('Copy') },
23
+ { id: 'share', label: 'Share', icon: 'share-variant', onClick: () => setSelectedAction('Share'), intent: 'primary' },
24
+ { id: 'delete', label: 'Delete', icon: 'delete', onClick: () => setSelectedAction('Delete'), intent: 'error' },
25
+ ];
26
+
27
+ const intentItems: MenuItem[] = [
28
+ { id: 'save', label: 'Save', intent: 'success', onClick: () => setSelectedAction('Save') },
29
+ { id: 'cancel', label: 'Cancel', intent: 'neutral', onClick: () => setSelectedAction('Cancel') },
30
+ { id: 'delete', label: 'Delete', intent: 'error', onClick: () => setSelectedAction('Delete') },
31
+ { id: 'warn', label: 'Warning Action', intent: 'warning', onClick: () => setSelectedAction('Warning') },
32
+ ];
33
+
34
+ const separatorItems: MenuItem[] = [
35
+ { id: 'new', label: 'New', onClick: () => setSelectedAction('New') },
36
+ { id: 'open', label: 'Open', onClick: () => setSelectedAction('Open') },
37
+ { id: 'sep1', label: '', separator: true },
38
+ { id: 'save', label: 'Save', onClick: () => setSelectedAction('Save') },
39
+ { id: 'saveas', label: 'Save As...', onClick: () => setSelectedAction('Save As') },
40
+ { id: 'sep2', label: '', separator: true },
41
+ { id: 'close', label: 'Close', onClick: () => setSelectedAction('Close') },
42
+ ];
43
+
44
+ const disabledItems: MenuItem[] = [
45
+ { id: 'enabled1', label: 'Enabled Action', onClick: () => setSelectedAction('Enabled') },
46
+ { id: 'disabled', label: 'Disabled Action', disabled: true },
47
+ { id: 'enabled2', label: 'Another Action', onClick: () => setSelectedAction('Another') },
48
+ ];
49
+
50
+ return (
51
+ <Screen background="primary" padding="lg">
52
+ <View spacing="lg">
53
+ <Text size="xl" weight="bold">Menu Examples</Text>
54
+
55
+ {selectedAction && (
56
+ <View spacing="sm" style={{ padding: 12, backgroundColor: '#f0f0f0', borderRadius: 8 }}>
57
+ <Text>Last selected action: <Text weight="bold">{selectedAction}</Text></Text>
58
+ </View>
59
+ )}
60
+
61
+ <View spacing="md">
62
+ <Text size="lg" weight="semibold">Basic Menu</Text>
63
+ <Menu
64
+ items={basicItems}
65
+ open={basicMenuOpen}
66
+ onOpenChange={setBasicMenuOpen}
67
+ >
68
+ <Button type="outlined">
69
+ Open Menu
70
+ </Button>
71
+ </Menu>
72
+ </View>
73
+
74
+ <View spacing="md">
75
+ <Text size="lg" weight="semibold">Placement Options</Text>
76
+ <Menu
77
+ items={basicItems}
78
+ open={placementMenuOpen}
79
+ onOpenChange={setPlacementMenuOpen}
80
+ placement="bottom-start"
81
+ >
82
+ <Button type="outlined">
83
+ Bottom Start (default)
84
+ </Button>
85
+ </Menu>
86
+ </View>
87
+
88
+ <View spacing="md">
89
+ <Text size="lg" weight="semibold">With Icons</Text>
90
+ <Menu
91
+ items={iconNameItems}
92
+ open={iconNameMenuOpen}
93
+ onOpenChange={setIconNameMenuOpen}
94
+ >
95
+ <Button type="outlined">
96
+ Menu with Icons
97
+ </Button>
98
+ </Menu>
99
+ </View>
100
+
101
+ <View spacing="md">
102
+ <Text size="lg" weight="semibold">Intent Colors</Text>
103
+ <Menu
104
+ items={intentItems}
105
+ open={intentMenuOpen}
106
+ onOpenChange={setIntentMenuOpen}
107
+ >
108
+ <Button type="outlined">
109
+ Intent Menu
110
+ </Button>
111
+ </Menu>
112
+ </View>
113
+
114
+ <View spacing="md">
115
+ <Text size="lg" weight="semibold">With Separators</Text>
116
+ <Menu
117
+ items={separatorItems}
118
+ open={separatorMenuOpen}
119
+ onOpenChange={setSeparatorMenuOpen}
120
+ >
121
+ <Button type="outlined">
122
+ File Menu
123
+ </Button>
124
+ </Menu>
125
+ </View>
126
+
127
+ <View spacing="md">
128
+ <Text size="lg" weight="semibold">Disabled Items</Text>
129
+ <Menu
130
+ items={disabledItems}
131
+ open={disabledMenuOpen}
132
+ onOpenChange={setDisabledMenuOpen}
133
+ >
134
+ <Button type="outlined">
135
+ Menu with Disabled
136
+ </Button>
137
+ </Menu>
138
+ </View>
139
+ </View>
140
+ </Screen>
141
+ );
142
+ };
143
+
144
+ export default MenuExamples;
@@ -6,32 +6,34 @@ export const PopoverExamples = () => {
6
6
  const [placementOpen, setPlacementOpen] = useState<string | null>(null);
7
7
  const [arrowOpen, setArrowOpen] = useState(false);
8
8
 
9
- const basicButtonRef = useRef<HTMLDivElement>(null);
10
- const placementButtonRefs = useRef<{ [key: string]: HTMLDivElement | null }>({});
11
- const arrowButtonRef = useRef<HTMLDivElement>(null);
9
+ const basicButtonRef = useRef<any>(null);
10
+ const placementButtonRefs = useRef<{ [key: string]: any }>({});
11
+ const arrowButtonRef = useRef<any>(null);
12
12
 
13
13
  const placements = [
14
- 'top', 'top-start', 'top-end',
15
- 'bottom', 'bottom-start', 'bottom-end',
16
- 'left', 'left-start', 'left-end',
17
- 'right', 'right-start', 'right-end',
14
+ { id: 'top', label: 'Top' },
15
+ { id: 'top-start', label: 'Top Start' },
16
+ { id: 'top-end', label: 'Top End' },
17
+ { id: 'bottom', label: 'Bottom' },
18
+ { id: 'bottom-start', label: 'Bottom Start' },
19
+ { id: 'bottom-end', label: 'Bottom End' },
18
20
  ];
19
21
 
20
22
  return (
21
23
  <Screen background="primary" padding="lg">
22
- <View spacing="none">
23
- <Text size="large" weight="bold" align="center">
24
+ <View spacing="lg">
25
+ <Text size="lg" weight="bold" align="center">
24
26
  Popover Examples
25
27
  </Text>
26
-
28
+
27
29
  {/* Basic Popover */}
28
30
  <View spacing="md">
29
- <Text size="medium" weight="semibold">Basic Popover</Text>
30
- <div ref={basicButtonRef} style={{ display: 'inline-block' }}>
31
- <Button onPress={() => setBasicOpen(true)}>
31
+ <Text size="md" weight="semibold">Basic Popover</Text>
32
+ <Button
33
+ ref={basicButtonRef}
34
+ onPress={() => setBasicOpen(true)}>
32
35
  Open Basic Popover
33
36
  </Button>
34
- </div>
35
37
  <Popover
36
38
  open={basicOpen}
37
39
  onOpenChange={setBasicOpen}
@@ -40,8 +42,8 @@ export const PopoverExamples = () => {
40
42
  >
41
43
  <View spacing="sm">
42
44
  <Text weight="bold">Basic Popover</Text>
43
- <Text size="small">This is a basic popover with some content.</Text>
44
- <Button size="small" onPress={() => setBasicOpen(false)}>
45
+ <Text size="sm">This is a basic popover with some content.</Text>
46
+ <Button size="sm" onPress={() => setBasicOpen(false)}>
45
47
  Close
46
48
  </Button>
47
49
  </View>
@@ -50,62 +52,56 @@ export const PopoverExamples = () => {
50
52
 
51
53
  {/* Placement Examples */}
52
54
  <View spacing="md">
53
- <Text size="medium" weight="semibold">Placement Options</Text>
54
- <View style={{
55
- display: 'grid',
56
- gridTemplateColumns: 'repeat(3, 1fr)',
57
- gap: 8,
58
- maxWidth: 400
59
- }}>
55
+ <Text size="md" weight="semibold">Placement Options</Text>
56
+ <View style={{ flexDirection: 'row', flexWrap: 'wrap', gap: 8 }}>
60
57
  {placements.map((placement) => (
61
- <div
62
- key={placement}
63
- ref={(ref) => placementButtonRefs.current[placement] = ref}
64
- style={{ display: 'inline-block' }}
65
- >
66
- <Button
67
- size="small"
68
- variant="outlined"
69
- onPress={() => setPlacementOpen(placement)}
58
+ <View key={placement.id}>
59
+ <View
60
+ ref={(ref) => (placementButtonRefs.current[placement.id] = ref) as any}
61
+ style={{ display: 'inline-block' }}
70
62
  >
71
- {placement}
72
- </Button>
73
- </div>
63
+ <Button
64
+ size="sm"
65
+ type="outlined"
66
+ onPress={() => setPlacementOpen(placement.id)}
67
+ >
68
+ {placement.label}
69
+ </Button>
70
+ </View>
71
+ {placementOpen === placement.id && (
72
+ <Popover
73
+ open={true}
74
+ onOpenChange={() => setPlacementOpen(null)}
75
+ anchor={{ current: placementButtonRefs.current[placement.id] }}
76
+ placement={placement.id as any}
77
+ >
78
+ <View spacing="sm">
79
+ <Text weight="bold">{placement.label} placement</Text>
80
+ <Text size="sm">
81
+ Positioned {placement.id} relative to the button
82
+ </Text>
83
+ <Button size="sm" onPress={() => setPlacementOpen(null)}>
84
+ Close
85
+ </Button>
86
+ </View>
87
+ </Popover>
88
+ )}
89
+ </View>
74
90
  ))}
75
91
  </View>
76
-
77
- {placementOpen && (
78
- <Popover
79
- open={!!placementOpen}
80
- onOpenChange={() => setPlacementOpen(null)}
81
- anchor={{ current: placementButtonRefs.current[placementOpen] }}
82
- placement={placementOpen as any}
83
- >
84
- <View spacing="sm">
85
- <Text weight="bold">{placementOpen} placement</Text>
86
- <Text size="small">
87
- Positioned {placementOpen} relative to the button
88
- </Text>
89
- <Button size="small" onPress={() => setPlacementOpen(null)}>
90
- Close
91
- </Button>
92
- </View>
93
- </Popover>
94
- )}
95
92
  </View>
96
93
 
97
94
  {/* Arrow Example */}
98
95
  <View spacing="md">
99
- <Text size="medium" weight="semibold">With Arrow</Text>
100
- <div ref={arrowButtonRef} style={{ display: 'inline-block' }}>
101
- <Button
102
- variant="contained"
103
- intent="success"
104
- onPress={() => setArrowOpen(true)}
105
- >
106
- Popover with Arrow
107
- </Button>
108
- </div>
96
+ <Text size="md" weight="semibold">With Arrow</Text>
97
+ <Button
98
+ ref={arrowButtonRef}
99
+ type="contained"
100
+ intent="success"
101
+ onPress={() => setArrowOpen(true)}
102
+ >
103
+ Popover with Arrow
104
+ </Button>
109
105
  <Popover
110
106
  open={arrowOpen}
111
107
  onOpenChange={setArrowOpen}
@@ -115,10 +111,10 @@ export const PopoverExamples = () => {
115
111
  >
116
112
  <View spacing="sm">
117
113
  <Text weight="bold">Arrow Popover</Text>
118
- <Text size="small">
114
+ <Text size="sm">
119
115
  This popover includes an arrow pointing to the anchor element.
120
116
  </Text>
121
- <Button size="small" onPress={() => setArrowOpen(false)}>
117
+ <Button size="sm" onPress={() => setArrowOpen(false)}>
122
118
  Close
123
119
  </Button>
124
120
  </View>
@@ -127,24 +123,24 @@ export const PopoverExamples = () => {
127
123
 
128
124
  {/* Features Description */}
129
125
  <View spacing="md">
130
- <Text size="medium" weight="semibold">Features</Text>
126
+ <Text size="md" weight="semibold">Features</Text>
131
127
  <View spacing="sm">
132
- <Text size="small" color="secondary">
128
+ <Text size="sm" color="secondary">
133
129
  • Automatically positions within viewport bounds
134
130
  </Text>
135
- <Text size="small" color="secondary">
131
+ <Text size="sm" color="secondary">
136
132
  • 12 placement options (top, bottom, left, right with start/end variants)
137
133
  </Text>
138
- <Text size="small" color="secondary">
134
+ <Text size="sm" color="secondary">
139
135
  • Optional arrow pointing to anchor element
140
136
  </Text>
141
- <Text size="small" color="secondary">
137
+ <Text size="sm" color="secondary">
142
138
  • Click outside or escape key to close
143
139
  </Text>
144
- <Text size="small" color="secondary">
140
+ <Text size="sm" color="secondary">
145
141
  • Smooth animations and transitions
146
142
  </Text>
147
- <Text size="small" color="secondary">
143
+ <Text size="sm" color="secondary">
148
144
  • Follows anchor element on scroll/resize (web)
149
145
  </Text>
150
146
  </View>
@@ -0,0 +1,137 @@
1
+ import React, { useState, useEffect } from 'react';
2
+ import { Screen, View, Text, Button } from '@idealyst/components';
3
+ import Progress from '../Progress';
4
+
5
+ export const ProgressExamples: React.FC = () => {
6
+ const [dynamicValue, setDynamicValue] = useState(0);
7
+ const [interactiveValue, setInteractiveValue] = useState(50);
8
+
9
+ useEffect(() => {
10
+ const interval = setInterval(() => {
11
+ setDynamicValue((prev) => (prev >= 100 ? 0 : prev + 10));
12
+ }, 1000);
13
+ return () => clearInterval(interval);
14
+ }, []);
15
+
16
+ return (
17
+ <Screen background="primary" padding="lg">
18
+ <View spacing="lg">
19
+ <Text size="xl" weight="bold">Progress Examples</Text>
20
+
21
+ <View spacing="md">
22
+ <Text size="lg" weight="semibold">Linear Progress</Text>
23
+ <View spacing="sm" style={{ display: 'flex', flexDirection: 'column', gap: 12 }}>
24
+ <Progress value={25} />
25
+ <Progress value={50} />
26
+ <Progress value={75} />
27
+ <Progress value={100} />
28
+ </View>
29
+ </View>
30
+
31
+ <View spacing="md">
32
+ <Text size="lg" weight="semibold">Sizes</Text>
33
+ <View spacing="sm" style={{ display: 'flex', flexDirection: 'column', gap: 12 }}>
34
+ <Progress value={60} size="sm" />
35
+ <Progress value={60} size="md" />
36
+ <Progress value={60} size="lg" />
37
+ </View>
38
+ </View>
39
+
40
+ <View spacing="md">
41
+ <Text size="lg" weight="semibold">Intent Colors</Text>
42
+ <View spacing="sm" style={{ display: 'flex', flexDirection: 'column', gap: 12 }}>
43
+ <Progress value={70} intent="primary" />
44
+ <Progress value={70} intent="success" />
45
+ <Progress value={70} intent="warning" />
46
+ <Progress value={70} intent="error" />
47
+ <Progress value={70} intent="neutral" />
48
+ </View>
49
+ </View>
50
+
51
+ <View spacing="md">
52
+ <Text size="lg" weight="semibold">With Labels</Text>
53
+ <View spacing="sm">
54
+ <Progress value={30} showLabel />
55
+ <Progress value={60} showLabel label="Loading..." />
56
+ <Progress value={90} showLabel label="Almost done!" />
57
+ </View>
58
+ </View>
59
+
60
+ <View spacing="md">
61
+ <Text size="lg" weight="semibold">Indeterminate</Text>
62
+ <View spacing="sm" style={{ display: 'flex', flexDirection: 'column', gap: 12 }}>
63
+ <Progress indeterminate />
64
+ <Progress indeterminate intent="success" />
65
+ <Progress indeterminate size="lg" intent="warning" />
66
+ </View>
67
+ </View>
68
+
69
+ <View spacing="md">
70
+ <Text size="lg" weight="semibold">Circular Progress</Text>
71
+ <View spacing="sm" style={{ flexDirection: 'row', gap: 16 }}>
72
+ <Progress variant="circular" value={25} size="sm" />
73
+ <Progress variant="circular" value={50} size="md" />
74
+ <Progress variant="circular" value={75} size="lg" />
75
+ </View>
76
+ </View>
77
+
78
+ <View spacing="md">
79
+ <Text size="lg" weight="semibold">Circular with Labels</Text>
80
+ <View spacing="sm" style={{ flexDirection: 'row', gap: 16 }}>
81
+ <Progress variant="circular" value={30} showLabel size="md" />
82
+ <Progress variant="circular" value={60} showLabel size="lg" intent="success" />
83
+ </View>
84
+ </View>
85
+
86
+ <View spacing="md">
87
+ <Text size="lg" weight="semibold">Circular Indeterminate</Text>
88
+ <View spacing="sm" style={{ flexDirection: 'row', gap: 16 }}>
89
+ <Progress variant="circular" indeterminate size="sm" />
90
+ <Progress variant="circular" indeterminate size="md" intent="primary" />
91
+ <Progress variant="circular" indeterminate size="lg" intent="warning" />
92
+ </View>
93
+ </View>
94
+
95
+ <View spacing="md">
96
+ <Text size="lg" weight="semibold">Rounded vs Straight</Text>
97
+ <View spacing="sm" style={{ display: 'flex', flexDirection: 'column', gap: 12 }}>
98
+ <View spacing="xs">
99
+ <Text size="sm">Rounded (default)</Text>
100
+ <Progress value={70} rounded={true} />
101
+ </View>
102
+ <View spacing="xs">
103
+ <Text size="sm">Straight edges</Text>
104
+ <Progress value={70} rounded={false} />
105
+ </View>
106
+ </View>
107
+ </View>
108
+
109
+ <View spacing="md">
110
+ <Text size="lg" weight="semibold">Dynamic Progress</Text>
111
+ <Progress value={dynamicValue} showLabel />
112
+ <Text size="sm" color="secondary">Automatically updating every second</Text>
113
+ </View>
114
+
115
+ <View spacing="md">
116
+ <Text size="lg" weight="semibold">Interactive Circular Progress</Text>
117
+ <View spacing="sm">
118
+ <View style={{ flexDirection: 'row', gap: 16, alignItems: 'center' }}>
119
+ <Progress variant="circular" value={interactiveValue} showLabel size="lg" />
120
+ <View spacing="sm">
121
+ <Button size="sm" onPress={() => setInteractiveValue(Math.max(0, interactiveValue - 10))}>
122
+ -10
123
+ </Button>
124
+ <Button size="sm" onPress={() => setInteractiveValue(Math.min(100, interactiveValue + 10))}>
125
+ +10
126
+ </Button>
127
+ </View>
128
+ </View>
129
+ <Text size="sm" color="secondary">Click buttons to change value</Text>
130
+ </View>
131
+ </View>
132
+ </View>
133
+ </Screen>
134
+ );
135
+ };
136
+
137
+ export default ProgressExamples;
@@ -0,0 +1,161 @@
1
+ import React, { useState } from 'react';
2
+ import { Screen, View, Text } from '@idealyst/components';
3
+ import { RadioButton, RadioGroup } from '../RadioButton';
4
+
5
+ export const RadioButtonExamples: React.FC = () => {
6
+ const [selectedValue, setSelectedValue] = useState('option1');
7
+ const [selectedColor, setSelectedColor] = useState('blue');
8
+ const [selectedSize, setSelectedSize] = useState('md');
9
+ const [selectedIntent, setSelectedIntent] = useState('primary');
10
+
11
+ return (
12
+ <Screen background="primary" padding="lg">
13
+ <View spacing="lg">
14
+ <Text size="xl" weight="bold">RadioButton Examples</Text>
15
+
16
+ <View spacing="md">
17
+ <Text size="lg" weight="semibold">Basic RadioGroup</Text>
18
+ <RadioGroup value={selectedValue} onValueChange={setSelectedValue}>
19
+ <RadioButton value="option1" label="Option 1" />
20
+ <RadioButton value="option2" label="Option 2" />
21
+ <RadioButton value="option3" label="Option 3" />
22
+ </RadioGroup>
23
+ <Text size="sm" color="secondary">Selected: {selectedValue}</Text>
24
+ </View>
25
+
26
+ <View spacing="md">
27
+ <Text size="lg" weight="semibold">Horizontal RadioGroup</Text>
28
+ <RadioGroup
29
+ value={selectedColor}
30
+ onValueChange={setSelectedColor}
31
+ orientation="horizontal"
32
+ >
33
+ <RadioButton value="red" label="Red" />
34
+ <RadioButton value="green" label="Green" />
35
+ <RadioButton value="blue" label="Blue" />
36
+ </RadioGroup>
37
+ <Text size="sm" color="secondary">Selected: {selectedColor}</Text>
38
+ </View>
39
+
40
+ <View spacing="md">
41
+ <Text size="lg" weight="semibold">With Disabled Options</Text>
42
+ <RadioGroup value={selectedSize} onValueChange={setSelectedSize}>
43
+ <RadioButton value="sm" label="Small" />
44
+ <RadioButton value="md" label="Medium" />
45
+ <RadioButton value="lg" label="Large" disabled />
46
+ <RadioButton value="xl" label="Extra Large" />
47
+ </RadioGroup>
48
+ </View>
49
+
50
+ <View spacing="md">
51
+ <Text size="lg" weight="semibold">Disabled Group</Text>
52
+ <RadioGroup value="option1" disabled>
53
+ <RadioButton value="option1" label="Option A" />
54
+ <RadioButton value="option2" label="Option B" />
55
+ <RadioButton value="option3" label="Option C" />
56
+ </RadioGroup>
57
+ </View>
58
+
59
+ <View spacing="md">
60
+ <Text size="lg" weight="semibold">Sizes</Text>
61
+ <View spacing="sm">
62
+ <RadioButton
63
+ value="sm"
64
+ label="Small"
65
+ size="sm"
66
+ checked={selectedSize === 'sm'}
67
+ onPress={() => setSelectedSize('sm')}
68
+ />
69
+ <RadioButton
70
+ value="md"
71
+ label="Medium"
72
+ size="md"
73
+ checked={selectedSize === 'md'}
74
+ onPress={() => setSelectedSize('md')}
75
+ />
76
+ <RadioButton
77
+ value="lg"
78
+ label="Large"
79
+ size="lg"
80
+ checked={selectedSize === 'lg'}
81
+ onPress={() => setSelectedSize('lg')}
82
+ />
83
+ </View>
84
+ </View>
85
+
86
+ <View spacing="md">
87
+ <Text size="lg" weight="semibold">Intents</Text>
88
+ <View spacing="sm">
89
+ <RadioButton
90
+ value="primary"
91
+ label="Primary"
92
+ intent="primary"
93
+ checked={selectedIntent === 'primary'}
94
+ onPress={() => setSelectedIntent('primary')}
95
+ />
96
+ <RadioButton
97
+ value="success"
98
+ label="Success"
99
+ intent="success"
100
+ checked={selectedIntent === 'success'}
101
+ onPress={() => setSelectedIntent('success')}
102
+ />
103
+ <RadioButton
104
+ value="error"
105
+ label="Error"
106
+ intent="error"
107
+ checked={selectedIntent === 'error'}
108
+ onPress={() => setSelectedIntent('error')}
109
+ />
110
+ <RadioButton
111
+ value="warning"
112
+ label="Warning"
113
+ intent="warning"
114
+ checked={selectedIntent === 'warning'}
115
+ onPress={() => setSelectedIntent('warning')}
116
+ />
117
+ <RadioButton
118
+ value="neutral"
119
+ label="Neutral"
120
+ intent="neutral"
121
+ checked={selectedIntent === 'neutral'}
122
+ onPress={() => setSelectedIntent('neutral')}
123
+ />
124
+ </View>
125
+ </View>
126
+
127
+ <View spacing="md">
128
+ <Text size="lg" weight="semibold">Standalone RadioButtons</Text>
129
+ <View spacing="sm">
130
+ <RadioButton
131
+ value="standalone1"
132
+ label="Unchecked"
133
+ checked={false}
134
+ onPress={() => console.log('Pressed')}
135
+ />
136
+ <RadioButton
137
+ value="standalone2"
138
+ label="Checked"
139
+ checked={true}
140
+ onPress={() => console.log('Pressed')}
141
+ />
142
+ <RadioButton
143
+ value="standalone3"
144
+ label="Disabled Unchecked"
145
+ checked={false}
146
+ disabled
147
+ />
148
+ <RadioButton
149
+ value="standalone4"
150
+ label="Disabled Checked"
151
+ checked={true}
152
+ disabled
153
+ />
154
+ </View>
155
+ </View>
156
+ </View>
157
+ </Screen>
158
+ );
159
+ };
160
+
161
+ export default RadioButtonExamples;