@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
package/CLAUDE.md CHANGED
@@ -1,236 +1,203 @@
1
- # @idealyst/components - LLM Documentation
2
-
3
- This file provides comprehensive component documentation for LLMs working with the @idealyst/components library.
4
-
5
- ## Library Overview
6
-
7
- @idealyst/components is a cross-platform React/React Native component library with:
8
- - 14 core components organized into 7 categories
9
- - Theme-based styling with Unistyles
10
- - Intent-based color system (primary, neutral, success, error, warning)
11
- - Cross-platform compatibility (React & React Native)
12
- - TypeScript support
13
-
14
- ## Component Categories
15
-
16
- ### Layout Components
17
- - **View**: Container with spacing system (`spacing="xs|sm|md|lg|xl|xxl"`)
18
- - **Screen**: Full-screen container (`background="primary|secondary|tertiary|inverse"`, `safeArea`, `padding`)
19
- - **Divider**: Content separator (`orientation="horizontal|vertical"`, `spacing`, `intent`)
20
-
21
- ### Typography
22
- - **Text**: Styled text (`size="small|medium|large|xlarge"`, `weight="light|normal|medium|semibold|bold"`, `color`, `intent`, `align`)
23
-
24
- ### Form Components
25
- - **Button**: Interactive button (`variant="contained|outlined|text"`, `intent="primary|neutral|success|error|warning"`, `size="small|medium|large"`)
26
- - **Input**: Text input (`label`, `placeholder`, `error`, `helperText`, `multiline`, `secureTextEntry`)
27
- - **Checkbox**: Form checkbox (`checked`, `onCheckedChange`, `label`, `disabled`, `intent`)
28
-
29
- ### Display Components
30
- - **Card**: Content container (`variant="default|outlined|elevated|filled"`, `padding`, `radius`, `clickable`, `intent`)
31
- - **Badge**: Status indicator (`variant="filled|outlined|dot"`, `color`, `size="small|medium|large"`)
32
- - **Avatar**: Profile picture (`src`, `fallback`, `size="small|medium|large|xlarge"`, `shape="circle|square"`)
33
-
34
- ### Utility Components
35
- - **Icon**: Icon display (`name`, `size`, `color`, `intent`)
36
- - **SVGImage**: SVG rendering (`source`, `width`, `height`, `size`, `color`, `intent`)
37
-
38
- ### Overlay Components
39
- - **Dialog**: Modal dialog (`open`, `onOpenChange`, `title`, `size="small|medium|large"`, `variant="default"`, `showCloseButton`, `closeOnBackdropClick`, `closeOnEscapeKey`)
40
- - **Popover**: Contextual overlay (`open`, `onOpenChange`, `anchor`, `placement="top|bottom|left|right"`, `offset`, `closeOnClickOutside`, `closeOnEscapeKey`, `showArrow`)
41
-
42
- ## Intent System
43
-
44
- All components use a consistent intent-based color system:
45
- - `primary`: Main brand actions
46
- - `neutral`: Secondary actions
47
- - `success`: Positive actions (save, confirm)
48
- - `error`: Destructive actions (delete, cancel)
49
- - `warning`: Caution actions
50
-
51
- ## Common Patterns
52
-
53
- ### Basic Layout
54
- ```tsx
55
- <Screen background="primary" safeArea>
56
- <View spacing="lg">
57
- <Text size="xlarge" weight="bold">Title</Text>
58
- <Text>Content</Text>
59
- </View>
60
- </Screen>
1
+ # Components Package - Style System Refactoring
2
+
3
+ ## Current Task: Converting to Static Style Pattern
4
+
5
+ We are systematically converting all component style files from dynamic functions to static styles with proper variants and compound variants.
6
+
7
+ ## The Correct Pattern (Reference: Button.styles.tsx)
8
+
9
+ ### 1. Style File Structure
10
+
11
+ ```typescript
12
+ import { StyleSheet } from 'react-native-unistyles';
13
+ import { Theme, Intent, CompoundVariants } from '@idealyst/theme';
14
+ import { buildSizeVariants } from '../utils/buildSizeVariants';
15
+
16
+ // Export the Variants type for component use
17
+ export type ButtonVariants = {
18
+ size: ButtonSize;
19
+ intent: ButtonIntent;
20
+ type: ButtonType;
21
+ disabled: boolean;
22
+ }
23
+
24
+ // Create intent variants dynamically from theme (NO HARDCODED ARRAYS)
25
+ function createIntentVariants(theme: Theme) {
26
+ const variants: any = {};
27
+ for (const intent in theme.intents) {
28
+ variants[intent] = {};
29
+ }
30
+ return variants;
31
+ }
32
+
33
+ // Create type variants (structure only)
34
+ function createTypeVariants(theme: Theme) {
35
+ return {
36
+ contained: {
37
+ borderWidth: 0,
38
+ },
39
+ outlined: {
40
+ borderWidth: 2,
41
+ borderStyle: 'solid' as const,
42
+ },
43
+ } as const;
44
+ }
45
+
46
+ // Create compound variants for multi-variant combinations
47
+ function createButtonCompoundVariants(theme: Theme) {
48
+ const compoundVariants: CompoundVariants<keyof ButtonVariants> = [];
49
+
50
+ for (const intent in theme.intents) {
51
+ const intentValue = theme.intents[intent as Intent];
52
+
53
+ compoundVariants.push({
54
+ intent,
55
+ type: 'contained',
56
+ styles: {
57
+ backgroundColor: intentValue.primary,
58
+ color: intentValue.contrast,
59
+ },
60
+ });
61
+ }
62
+
63
+ return compoundVariants;
64
+ }
65
+
66
+ // Export styles - NO explicit return type annotation
67
+ export const buttonStyles = StyleSheet.create((theme: Theme) => {
68
+ return {
69
+ button: {
70
+ alignItems: 'center',
71
+ variants: {
72
+ size: buildSizeVariants(theme, 'button', ...),
73
+ intent: createIntentVariants(theme),
74
+ type: createTypeVariants(theme),
75
+ disabled: { true: {}, false: {} },
76
+ },
77
+ compoundVariants: createButtonCompoundVariants(theme),
78
+ },
79
+ };
80
+ });
61
81
  ```
62
82
 
63
- ### Form Layout
64
- ```tsx
65
- <View spacing="md">
66
- <Input label="Email" value={email} onChangeText={setEmail} />
67
- <Button variant="contained" intent="primary" onPress={submit}>Submit</Button>
68
- </View>
83
+ ### 2. Component Implementation
84
+
85
+ ```typescript
86
+ import React, { forwardRef, ComponentRef } from 'react';
87
+ import { TouchableOpacity } from 'react-native';
88
+ import { buttonStyles } from './Button.styles';
89
+ import type { ButtonProps } from './types';
90
+
91
+ const Button = forwardRef<ComponentRef<typeof TouchableOpacity>, ButtonProps>((props, ref) => {
92
+ const { size = 'md', intent = 'primary', type = 'contained', disabled = false } = props;
93
+
94
+ // Apply variants (intent is now a proper variant)
95
+ buttonStyles.useVariants({
96
+ size,
97
+ intent,
98
+ type,
99
+ disabled,
100
+ });
101
+
102
+ return (
103
+ <TouchableOpacity
104
+ ref={ref}
105
+ style={[buttonStyles.button, style]} // Static style, no function call
106
+ >
107
+ <Text style={buttonStyles.text}>{children}</Text>
108
+ </TouchableOpacity>
109
+ );
110
+ });
69
111
  ```
70
112
 
71
- ### SVG Usage
72
- ```tsx
73
- import MyIcon from './assets/icon.svg';
74
-
75
- <SVGImage source={MyIcon} size={24} intent="primary" />
76
- <SVGImage source={{ uri: "https://cdn.jsdelivr.net/npm/simple-icons@v9/icons/react.svg" }} size={32} color="#61dafb" />
77
- ```
78
-
79
- ### Card with Content
80
- ```tsx
81
- <Card variant="outlined" clickable onPress={handlePress}>
82
- <View spacing="sm">
83
- <Text weight="bold">Title</Text>
84
- <Text size="small" color="secondary">Subtitle</Text>
85
- </View>
86
- </Card>
87
- ```
88
-
89
- ### Dialog Usage
90
- ```tsx
91
- const [dialogOpen, setDialogOpen] = useState(false);
92
-
93
- <Dialog
94
- open={dialogOpen}
95
- onOpenChange={setDialogOpen}
96
- title="Confirm Action"
97
- size="medium"
98
- >
99
- <View spacing="md">
100
- <Text>Are you sure you want to proceed?</Text>
101
- <View style={{ flexDirection: 'row', gap: 8 }}>
102
- <Button variant="outlined" onPress={() => setDialogOpen(false)}>
103
- Cancel
104
- </Button>
105
- <Button variant="contained" intent="primary" onPress={handleConfirm}>
106
- Confirm
107
- </Button>
108
- </View>
109
- </View>
110
- </Dialog>
111
- ```
112
-
113
- ### Popover Usage
114
- ```tsx
115
- const [popoverOpen, setPopoverOpen] = useState(false);
116
- const buttonRef = useRef<HTMLDivElement>(null);
117
-
118
- <div ref={buttonRef} style={{ display: 'inline-block' }}>
119
- <Button onPress={() => setPopoverOpen(true)}>
120
- Show Menu
121
- </Button>
122
- </div>
123
- <Popover
124
- open={popoverOpen}
125
- onOpenChange={setPopoverOpen}
126
- anchor={buttonRef}
127
- placement="bottom-start"
128
- showArrow
129
- >
130
- <View spacing="sm">
131
- <Button variant="text" onPress={handleAction}>Action 1</Button>
132
- <Button variant="text" onPress={handleAction}>Action 2</Button>
133
- </View>
134
- </Popover>
135
- ```
136
-
137
- ## Styling Guidelines
138
-
139
- 1. **Use variants over manual styles** - Components provide semantic variants
140
- 2. **Manual styles override variants** - Style prop takes precedence
141
- 3. **Consistent spacing** - Use View spacing prop for consistent gaps
142
- 4. **Intent-based colors** - Use intent props for semantic meaning
143
- 5. **Cross-platform compatibility** - All components work on React and React Native
144
-
145
- ## Import Patterns
146
-
147
- ```tsx
148
- // Individual imports (recommended)
149
- import { Button, Text, View, Dialog, Popover } from '@idealyst/components';
150
-
151
- // Documentation access
152
- import { componentDocs, getComponentDocs } from '@idealyst/components/docs';
153
-
154
- // Examples
155
- import { ButtonExamples, DialogExamples, PopoverExamples } from '@idealyst/components/examples';
156
- ```
157
-
158
- ## Key Props Reference
159
-
160
- ### Universal Props (most components)
161
- - `style`: Additional custom styles
162
- - `testID`: Test identifier
163
- - `disabled`: Disable interaction
164
-
165
- ### Layout Props
166
- - `spacing`: Gap between children (`View`)
167
- - `padding`: Internal padding (`Screen`, `Card`)
168
- - `background`: Background color variant (`Screen`)
169
-
170
- ### Styling Props
171
- - `variant`: Visual style variant
172
- - `intent`: Color scheme/semantic meaning
173
- - `size`: Component size
174
- - `color`: Color override
175
-
176
- ### Interactive Props
177
- - `onPress`: Press handler (`Button`, `Card`, `Checkbox`)
178
- - `clickable`: Enable interaction (`Card`)
179
- - `checked`: Checkbox state
180
- - `value`/`onChangeText`: Input state
181
-
182
- ## Accessibility Features
183
-
184
- - Proper ARIA roles and labels
185
- - Keyboard navigation support
186
- - Screen reader compatibility
187
- - Focus management
188
- - Touch target sizing (minimum 44px)
189
-
190
- ## Documentation Access for LLMs
191
-
192
- ### File-Based Documentation Access
193
- All documentation is available as markdown files in the package:
194
-
195
- ```bash
196
- # Quick overview - START HERE
197
- CLAUDE.md
198
-
199
- # Complete library overview with component table
200
- README.md
201
-
202
- # Detailed documentation for each component
203
- src/Avatar/README.md
204
- src/Badge/README.md
205
- src/Button/README.md
206
- src/Card/README.md
207
- src/Checkbox/README.md
208
- src/Dialog/README.md
209
- src/Divider/README.md
210
- src/Icon/README.md
211
- src/Input/README.md
212
- src/Popover/README.md
213
- src/Screen/README.md
214
- src/Text/README.md
215
- src/View/README.md
216
- ```
217
-
218
- ### Documentation Structure
219
- Each component has a detailed README.md file with:
220
- - Complete API reference with props table
221
- - Usage examples and common patterns
222
- - Best practices and accessibility guidelines
223
- - Cross-platform considerations
224
- - Feature overview
225
-
226
- ## Best Practices for LLMs
227
-
228
- 1. **Start with CLAUDE.md** for quick component overview and patterns
229
- 2. **Read individual README files** for detailed component documentation
230
- 3. **Always use intent props** for semantic meaning
231
- 4. **Prefer component variants** over manual styling
232
- 5. **Use View spacing** for consistent layouts
233
- 6. **Provide proper labels** for form components
234
- 7. **Consider accessibility** in component usage
235
- 8. **Test cross-platform** compatibility
236
- 9. **Use TypeScript** for better development experience
113
+ ## Key Rules
114
+
115
+ ### DO:
116
+ - Export `XVariants` type from style files
117
+ - Use `CompoundVariants<keyof XVariants>` for compound variants (NOT with extra `[]`)
118
+ - Get intents dynamically: `for (const intent in theme.intents)`
119
+ - Use `as const` for literal values in variant definitions
120
+ - Use `ComponentRef<typeof Component>` for ref types
121
+ - Use static styles: `buttonStyles.button` (NOT `buttonStyles.button()`)
122
+ - Pass all variants to `useVariants()` including intent
123
+
124
+ ### ❌ DON'T:
125
+ - Add explicit return types to `StyleSheet.create()` - let Unistyles infer
126
+ - Use dynamic style functions: `buttonStyles.button({ intent })` ❌
127
+ - Hardcode intent arrays: `['primary', 'success', 'error']` ❌
128
+ - Use deprecated ref types: `React.ElementRef` ❌
129
+ - Add extra `[]` to CompoundVariants: `CompoundVariants<V>[]` ❌
130
+ - Use `any` casts on refs: `ref as any` ❌
131
+
132
+ ## Common Issues to Check
133
+
134
+ ### 1. Invalid Imports in Style Files
135
+ **CRITICAL**: Check style files for invalid/circular imports that break TypeScript:
136
+ - ❌ Don't import from sibling component directories
137
+ - ❌ Don't import component types into style files (creates circular deps)
138
+ - ✅ Only import from: `@idealyst/theme`, `react-native-unistyles`, local utils
139
+ - ✅ Safe: Import from `./types` IF types.ts only imports from external packages (no circular dep)
140
+ - Example: Input.styles.tsx imports from ./types.ts (which only imports from react-native, @idealyst/theme)
141
+
142
+ ### 2. Border Style Values
143
+ - `borderStyle: 'none'` is INVALID (causes Unistyles errors)
144
+ - Either omit `borderStyle` or set `borderWidth: 0`
145
+
146
+ ### 3. Compound Variants Type
147
+ - ❌ `const compoundVariants: CompoundVariants<keyof XVariants>[] = [];`
148
+ - ✅ `const compoundVariants: CompoundVariants<keyof XVariants> = [];`
149
+ - (CompoundVariants is already an array type)
150
+
151
+ ## Progress Tracking
152
+
153
+ ### ✅ Completed
154
+ - [x] Button.styles.tsx + Button.native.tsx + Button.web.tsx
155
+ - [x] Chip.styles.tsx + Chip.native.tsx
156
+ - [x] Card.styles.tsx + Card.native.tsx
157
+ - [x] Alert.styles.tsx + Alert.native.tsx
158
+ - [x] Input.styles.tsx
159
+ - [x] Accordion.styles.tsx (already static)
160
+
161
+ ### 🔄 Needs Review/Update
162
+ Check these files for:
163
+ 1. Invalid imports in .styles.tsx files
164
+ 2. Dynamic style function calls in .native.tsx/.web.tsx
165
+ 3. Deprecated ref types
166
+
167
+ Priority files (have dynamic functions or need checking):
168
+ - [ ] Badge.styles.tsx (uses `color` param - may need to stay dynamic)
169
+ - [ ] Switch.styles.tsx (has dynamic functions with intent)
170
+ - [ ] TextArea.styles.tsx
171
+ - [ ] Checkbox.styles.tsx
172
+ - [ ] RadioButton.styles.tsx
173
+ - [ ] Select.styles.tsx
174
+ - [ ] Progress.styles.tsx
175
+ - [ ] Dialog.styles.tsx
176
+ - [ ] Menu.styles.tsx / MenuItem.styles.tsx
177
+
178
+ Already static (just verify):
179
+ - [ ] Divider.styles.tsx
180
+ - [ ] Text.styles.tsx
181
+ - [ ] View.styles.tsx
182
+ - [ ] Icon.styles.tsx
183
+
184
+ ### Special Cases
185
+ - **Badge**: Uses `color` prop which isn't a fixed set - may need dynamic styles
186
+ - **Switch**: Uses transform calculations - may need partial dynamic approach
187
+ - **Icon**: Uses dynamic color from `color` or `intent` props
188
+
189
+ ## Testing Checklist
190
+
191
+ Before marking a component as complete:
192
+ 1. [ ] No TypeScript errors in .styles.tsx file
193
+ 2. [ ] No invalid imports in .styles.tsx
194
+ 3. [ ] Component uses static styles (no function calls)
195
+ 4. [ ] Component passes all variants to `useVariants()`
196
+ 5. [ ] Ref types use `ComponentRef<typeof X>`
197
+ 6. [ ] All variant combinations work correctly
198
+ 7. [ ] No `ref as any` casts
199
+
200
+ ## Reference Files
201
+ - **Main Reference**: `src/Button/Button.styles.tsx` and `src/Button/Button.native.tsx`
202
+ - **Theme Types**: `@idealyst/theme/src/styles.ts`
203
+ - **Compound Variants Example**: See Button's `createButtonCompoundVariants`
package/README.md CHANGED
@@ -53,7 +53,7 @@ export default function App() {
53
53
  return (
54
54
  <Screen background="primary">
55
55
  <View spacing="lg" style={{ flex: 1, justifyContent: 'center' }}>
56
- <Text size="large" weight="bold" align="center">
56
+ <Text size="lg" weight="bold" align="center">
57
57
  Welcome to Idealyst Components
58
58
  </Text>
59
59
  <Button
@@ -125,7 +125,7 @@ import { Screen, View, Text, Button } from '@idealyst/components';
125
125
 
126
126
  <Screen background="primary" safeArea>
127
127
  <View spacing="lg">
128
- <Text size="xlarge" weight="bold">Welcome</Text>
128
+ <Text size="xl" weight="bold">Welcome</Text>
129
129
  <Text>Get started with your app</Text>
130
130
  <Button variant="contained" intent="primary" onPress={() => {}}>
131
131
  Get Started
@@ -139,7 +139,7 @@ import { Screen, View, Text, Button } from '@idealyst/components';
139
139
  import { View, Text, Input, Checkbox, Button } from '@idealyst/components';
140
140
 
141
141
  <View spacing="md">
142
- <Text size="large" weight="bold">Sign Up</Text>
142
+ <Text size="lg" weight="bold">Sign Up</Text>
143
143
  <Input label="Email" value={email} onChangeText={setEmail} />
144
144
  <Input label="Password" value={password} onChangeText={setPassword} secureTextEntry />
145
145
  <Checkbox checked={agreed} onCheckedChange={setAgreed} label="I agree to terms" />
@@ -155,7 +155,7 @@ import { SVGImage, View, Text } from '@idealyst/components';
155
155
  import LogoIcon from './assets/logo.svg';
156
156
 
157
157
  <View spacing="md">
158
- <Text size="large" weight="bold">My App</Text>
158
+ <Text size="lg" weight="bold">My App</Text>
159
159
 
160
160
  {/* Imported SVG */}
161
161
  <SVGImage source={LogoIcon} size={40} intent="primary" />
@@ -180,7 +180,7 @@ import { View, Card, Text, Avatar, Badge } from '@idealyst/components';
180
180
  <Avatar src={item.avatar} fallback={item.initials} />
181
181
  <View spacing="xs" style={{ flex: 1 }}>
182
182
  <Text weight="bold">{item.title}</Text>
183
- <Text size="small" color="secondary">{item.subtitle}</Text>
183
+ <Text size="sm" color="secondary">{item.subtitle}</Text>
184
184
  </View>
185
185
  {item.badge && <Badge color="red">{item.badge}</Badge>}
186
186
  </View>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@idealyst/components",
3
- "version": "1.0.82",
3
+ "version": "1.0.84",
4
4
  "description": "Shared component library for React and React Native",
5
5
  "documentation": "https://github.com/IdealystIO/idealyst-framework/tree/main/packages/components#readme",
6
6
  "readme": "README.md",
@@ -41,17 +41,19 @@
41
41
  "publish:npm": "npm publish"
42
42
  },
43
43
  "peerDependencies": {
44
- "@idealyst/theme": "^1.0.82",
45
- "@mdi/js": "^7.4.47",
46
- "@mdi/react": "^1.6.1",
47
- "@react-native-vector-icons/common": "^12.0.1",
48
- "@react-native-vector-icons/material-design-icons": "^12.0.1",
44
+ "@idealyst/theme": "^1.0.84",
45
+ "@mdi/js": ">=7.0.0",
46
+ "@mdi/react": ">=1.0.0",
47
+ "@react-native-vector-icons/common": ">=12.0.0",
48
+ "@react-native-vector-icons/material-design-icons": ">=12.0.0",
49
49
  "@react-native/normalize-colors": "*",
50
50
  "react": ">=16.8.0",
51
51
  "react-native": ">=0.60.0",
52
52
  "react-native-edge-to-edge": "*",
53
53
  "react-native-nitro-modules": "*",
54
- "react-native-unistyles": "^3.0.4"
54
+ "react-native-reanimated": ">=3.0.0",
55
+ "react-native-safe-area-context": ">=5.0.0",
56
+ "react-native-unistyles": ">=3.0.0"
55
57
  },
56
58
  "peerDependenciesMeta": {
57
59
  "@idealyst/theme": {
@@ -75,6 +77,12 @@
75
77
  "react-native-nitro-modules": {
76
78
  "optional": true
77
79
  },
80
+ "react-native-reanimated": {
81
+ "optional": true
82
+ },
83
+ "react-native-safe-area-context": {
84
+ "optional": true
85
+ },
78
86
  "react-native-unistyles": {
79
87
  "optional": true
80
88
  },
@@ -83,7 +91,17 @@
83
91
  }
84
92
  },
85
93
  "devDependencies": {
94
+ "@idealyst/theme": "^1.0.84",
95
+ "@mdi/react": "^1.6.1",
86
96
  "@types/react": "^19.1.0",
97
+ "react": "^19.1.0",
98
+ "react-native": "^0.80.1",
99
+ "react-native-gesture-handler": "^2.29.0",
100
+ "react-native-reanimated": "^4.1.3",
101
+ "react-native-safe-area-context": "^5.6.1",
102
+ "react-native-svg": "^15.14.0",
103
+ "react-native-unistyles": "^3.0.10",
104
+ "react-native-vector-icons": "^10.3.0",
87
105
  "typescript": "^5.0.0"
88
106
  },
89
107
  "files": [