@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.
- package/CLAUDE.md +199 -232
- package/README.md +5 -5
- package/package.json +20 -2
- package/plugin/README.md +272 -0
- package/plugin/test-cases.jsx +112 -0
- package/plugin/web-legacy.js +320 -0
- package/plugin/web.js +422 -124
- package/src/Accordion/Accordion.native.tsx +182 -0
- package/src/Accordion/Accordion.styles.tsx +260 -0
- package/src/Accordion/Accordion.web.tsx +147 -0
- package/src/Accordion/index.native.tsx +3 -0
- package/src/Accordion/index.ts +3 -0
- package/src/Accordion/index.web.tsx +3 -0
- package/src/Accordion/types.ts +23 -0
- package/src/ActivityIndicator/ActivityIndicator.native.tsx +17 -12
- package/src/ActivityIndicator/ActivityIndicator.styles.tsx +83 -109
- package/src/ActivityIndicator/ActivityIndicator.web.tsx +23 -17
- package/src/ActivityIndicator/index.ts +5 -2
- package/src/ActivityIndicator/index.web.ts +5 -2
- package/src/ActivityIndicator/types.ts +15 -10
- package/src/Alert/Alert.native.tsx +113 -0
- package/src/Alert/Alert.styles.tsx +304 -0
- package/src/Alert/Alert.web.tsx +123 -0
- package/src/Alert/index.native.ts +5 -0
- package/src/Alert/index.ts +5 -0
- package/src/Alert/index.web.ts +5 -0
- package/src/Alert/types.ts +21 -0
- package/src/Avatar/Avatar.native.tsx +8 -6
- package/src/Avatar/Avatar.styles.tsx +64 -58
- package/src/Avatar/Avatar.web.tsx +13 -8
- package/src/Avatar/index.ts +5 -2
- package/src/Avatar/index.web.ts +5 -2
- package/src/Avatar/types.ts +19 -13
- package/src/Badge/Badge.native.tsx +59 -14
- package/src/Badge/Badge.styles.tsx +125 -139
- package/src/Badge/Badge.web.tsx +72 -16
- package/src/Badge/index.ts +5 -2
- package/src/Badge/index.web.ts +5 -2
- package/src/Badge/types.ts +23 -11
- package/src/Breadcrumb/Breadcrumb.native.tsx +225 -0
- package/src/Breadcrumb/Breadcrumb.styles.tsx +234 -0
- package/src/Breadcrumb/Breadcrumb.web.tsx +268 -0
- package/src/Breadcrumb/index.native.ts +5 -0
- package/src/Breadcrumb/index.ts +5 -0
- package/src/Breadcrumb/index.web.ts +5 -0
- package/src/Breadcrumb/types.ts +56 -0
- package/src/Button/Button.native.tsx +75 -24
- package/src/Button/Button.styles.tsx +248 -205
- package/src/Button/Button.web.tsx +82 -25
- package/src/Button/index.ts +5 -5
- package/src/Button/index.web.ts +5 -3
- package/src/Button/types.ts +32 -15
- package/src/Card/Card.native.tsx +14 -11
- package/src/Card/Card.styles.tsx +146 -220
- package/src/Card/Card.web.tsx +20 -21
- package/src/Card/index.ts +5 -5
- package/src/Card/index.web.ts +5 -3
- package/src/Card/types.ts +24 -17
- package/src/Checkbox/Checkbox.native.tsx +24 -34
- package/src/Checkbox/Checkbox.styles.tsx +223 -275
- package/src/Checkbox/Checkbox.web.tsx +30 -37
- package/src/Checkbox/index.ts +5 -5
- package/src/Checkbox/index.web.ts +5 -3
- package/src/Checkbox/types.ts +26 -20
- package/src/Chip/Chip.native.tsx +126 -0
- package/src/Chip/Chip.styles.tsx +138 -0
- package/src/Chip/Chip.web.tsx +154 -0
- package/src/Chip/index.native.ts +5 -0
- package/src/Chip/index.ts +5 -0
- package/src/Chip/index.web.ts +5 -0
- package/src/Chip/types.ts +51 -0
- package/src/Dialog/Dialog.native.tsx +65 -12
- package/src/Dialog/Dialog.styles.tsx +154 -136
- package/src/Dialog/Dialog.web.tsx +16 -11
- package/src/Dialog/index.ts +5 -2
- package/src/Dialog/index.web.ts +5 -2
- package/src/Dialog/types.ts +22 -16
- package/src/Divider/Divider.native.tsx +19 -14
- package/src/Divider/Divider.styles.tsx +273 -595
- package/src/Divider/Divider.web.tsx +19 -12
- package/src/Divider/index.ts +5 -5
- package/src/Divider/index.web.ts +5 -3
- package/src/Divider/types.ts +28 -19
- package/src/Icon/Icon.native.tsx +17 -24
- package/src/Icon/Icon.styles.tsx +64 -48
- package/src/Icon/Icon.web.tsx +14 -11
- package/src/Icon/IconSvg/IconSvg.native.tsx +42 -0
- package/src/Icon/IconSvg/IconSvg.web.tsx +40 -0
- package/src/Icon/IconSvg/index.native.ts +1 -0
- package/src/Icon/IconSvg/index.ts +1 -0
- package/src/Icon/icon-resolver.native.ts +27 -0
- package/src/Icon/icon-resolver.ts +70 -0
- package/src/Icon/index.ts +5 -5
- package/src/Icon/index.web.ts +5 -3
- package/src/Icon/types.ts +17 -11
- package/src/Image/Image.native.tsx +86 -0
- package/src/Image/Image.styles.tsx +57 -0
- package/src/Image/Image.web.tsx +92 -0
- package/src/Image/index.native.ts +5 -0
- package/src/Image/index.ts +5 -0
- package/src/Image/types.ts +21 -0
- package/src/Input/Input.native.tsx +103 -26
- package/src/Input/Input.styles.tsx +240 -177
- package/src/Input/Input.web.tsx +141 -38
- package/src/Input/index.ts +5 -5
- package/src/Input/index.web.ts +5 -3
- package/src/Input/types.ts +43 -20
- package/src/List/List.native.tsx +56 -0
- package/src/List/List.styles.tsx +257 -0
- package/src/List/List.web.tsx +43 -0
- package/src/List/ListContext.tsx +16 -0
- package/src/List/ListItem.native.tsx +111 -0
- package/src/List/ListItem.web.tsx +110 -0
- package/src/List/ListSection.native.tsx +31 -0
- package/src/List/ListSection.web.tsx +33 -0
- package/src/List/index.native.tsx +5 -0
- package/src/List/index.ts +5 -0
- package/src/List/index.web.tsx +5 -0
- package/src/List/types.ts +42 -0
- package/src/Menu/Menu.native.tsx +150 -0
- package/src/Menu/Menu.styles.tsx +185 -0
- package/src/Menu/Menu.web.tsx +99 -0
- package/src/Menu/MenuItem.native.tsx +66 -0
- package/src/Menu/MenuItem.styles.tsx +119 -0
- package/src/Menu/MenuItem.web.tsx +67 -0
- package/src/Menu/index.native.ts +3 -0
- package/src/Menu/index.ts +3 -0
- package/src/Menu/index.web.ts +3 -0
- package/src/Menu/types.ts +30 -0
- package/src/Popover/Popover.native.tsx +102 -32
- package/src/Popover/Popover.styles.tsx +100 -67
- package/src/Popover/Popover.web.tsx +36 -260
- package/src/Popover/index.ts +5 -2
- package/src/Popover/index.web.ts +5 -2
- package/src/Popover/types.ts +14 -13
- package/src/Pressable/Pressable.native.tsx +7 -6
- package/src/Pressable/Pressable.web.tsx +8 -6
- package/src/Pressable/index.ts +5 -2
- package/src/Pressable/index.web.ts +5 -2
- package/src/Pressable/types.ts +11 -10
- package/src/Progress/Progress.native.tsx +179 -0
- package/src/Progress/Progress.styles.tsx +164 -0
- package/src/Progress/Progress.web.tsx +144 -0
- package/src/Progress/index.native.ts +1 -0
- package/src/Progress/index.ts +5 -0
- package/src/Progress/index.web.ts +5 -0
- package/src/Progress/types.ts +21 -0
- package/src/RadioButton/RadioButton.native.tsx +88 -0
- package/src/RadioButton/RadioButton.styles.tsx +163 -0
- package/src/RadioButton/RadioButton.web.tsx +85 -0
- package/src/RadioButton/RadioGroup.native.tsx +43 -0
- package/src/RadioButton/RadioGroup.web.tsx +49 -0
- package/src/RadioButton/index.native.ts +2 -0
- package/src/RadioButton/index.ts +2 -0
- package/src/RadioButton/index.web.ts +2 -0
- package/src/RadioButton/types.ts +29 -0
- package/src/SVGImage/SVGImage.native.tsx +9 -7
- package/src/SVGImage/SVGImage.styles.tsx +63 -55
- package/src/SVGImage/SVGImage.web.tsx +16 -13
- package/src/SVGImage/index.ts +5 -5
- package/src/SVGImage/index.web.ts +5 -2
- package/src/SVGImage/types.ts +7 -3
- package/src/Screen/Screen.native.tsx +43 -17
- package/src/Screen/Screen.styles.tsx +58 -54
- package/src/Screen/Screen.web.tsx +11 -5
- package/src/Screen/index.ts +5 -2
- package/src/Screen/index.web.ts +5 -2
- package/src/Screen/types.ts +23 -9
- package/src/Select/Select.native.tsx +140 -63
- package/src/Select/Select.styles.tsx +312 -302
- package/src/Select/Select.web.tsx +156 -316
- package/src/Select/index.ts +5 -2
- package/src/Select/index.web.ts +5 -2
- package/src/Select/types.ts +13 -7
- package/src/Skeleton/Skeleton.native.tsx +139 -0
- package/src/Skeleton/Skeleton.styles.tsx +59 -0
- package/src/Skeleton/Skeleton.web.tsx +112 -0
- package/src/Skeleton/index.native.ts +4 -0
- package/src/Skeleton/index.ts +5 -0
- package/src/Skeleton/index.web.ts +5 -0
- package/src/Skeleton/types.ts +75 -0
- package/src/Slider/Slider.native.tsx +248 -0
- package/src/Slider/Slider.styles.tsx +241 -0
- package/src/Slider/Slider.web.tsx +226 -0
- package/src/Slider/index.native.ts +3 -0
- package/src/Slider/index.ts +5 -0
- package/src/Slider/index.web.ts +5 -0
- package/src/Slider/types.ts +31 -0
- package/src/Switch/Switch.native.tsx +131 -0
- package/src/Switch/Switch.styles.tsx +169 -0
- package/src/Switch/Switch.web.tsx +121 -0
- package/src/Switch/index.native.ts +3 -0
- package/src/Switch/index.ts +5 -0
- package/src/Switch/index.web.ts +5 -0
- package/src/Switch/types.ts +21 -0
- package/src/TabBar/TabBar.native.tsx +142 -0
- package/src/TabBar/TabBar.styles.tsx +399 -0
- package/src/TabBar/TabBar.web.tsx +205 -0
- package/src/TabBar/index.native.tsx +3 -0
- package/src/TabBar/index.ts +3 -0
- package/src/TabBar/index.web.tsx +3 -0
- package/src/TabBar/types.ts +26 -0
- package/src/Table/Table.native.tsx +122 -0
- package/src/Table/Table.styles.tsx +283 -0
- package/src/Table/Table.web.tsx +112 -0
- package/src/Table/index.native.tsx +3 -0
- package/src/Table/index.ts +3 -0
- package/src/Table/index.web.tsx +3 -0
- package/src/Table/types.ts +28 -0
- package/src/Text/Text.native.tsx +12 -11
- package/src/Text/Text.styles.tsx +76 -64
- package/src/Text/Text.web.tsx +14 -9
- package/src/Text/index.ts +5 -5
- package/src/Text/index.web.ts +5 -3
- package/src/Text/types.ts +20 -13
- package/src/TextArea/TextArea.native.tsx +134 -0
- package/src/TextArea/TextArea.styles.tsx +175 -0
- package/src/TextArea/TextArea.web.tsx +156 -0
- package/src/TextArea/index.native.ts +3 -0
- package/src/TextArea/index.ts +3 -0
- package/src/TextArea/index.web.ts +3 -0
- package/src/TextArea/types.ts +30 -0
- package/src/Tooltip/Tooltip.native.tsx +165 -0
- package/src/Tooltip/Tooltip.styles.tsx +73 -0
- package/src/Tooltip/Tooltip.web.tsx +87 -0
- package/src/Tooltip/index.native.ts +3 -0
- package/src/Tooltip/index.ts +3 -0
- package/src/Tooltip/types.ts +18 -0
- package/src/Video/Video.native.tsx +105 -0
- package/src/Video/Video.styles.tsx +39 -0
- package/src/Video/Video.web.tsx +115 -0
- package/src/Video/index.native.ts +5 -0
- package/src/Video/index.ts +5 -0
- package/src/Video/types.ts +29 -0
- package/src/View/View.native.tsx +9 -14
- package/src/View/View.styles.tsx +101 -93
- package/src/View/View.web.tsx +16 -17
- package/src/View/index.ts +5 -5
- package/src/View/index.web.ts +5 -3
- package/src/View/types.ts +29 -21
- package/src/examples/AccordionExamples.tsx +126 -0
- package/src/examples/AlertExamples.tsx +280 -0
- package/src/examples/AvatarExamples.tsx +23 -23
- package/src/examples/BadgeExamples.tsx +109 -41
- package/src/examples/BreadcrumbExamples.tsx +312 -0
- package/src/examples/ButtonExamples.tsx +160 -33
- package/src/examples/CardExamples.tsx +40 -40
- package/src/examples/CheckboxExamples.tsx +12 -12
- package/src/examples/ChipExamples.tsx +197 -0
- package/src/examples/DialogExamples.tsx +22 -22
- package/src/examples/DividerExamples.tsx +49 -49
- package/src/examples/IconExamples.tsx +270 -54
- package/src/examples/ImageExamples.tsx +174 -0
- package/src/examples/InputExamples.tsx +75 -17
- package/src/examples/ListExamples.tsx +288 -0
- package/src/examples/MenuExamples.tsx +144 -0
- package/src/examples/PopoverExamples.tsx +69 -73
- package/src/examples/ProgressExamples.tsx +137 -0
- package/src/examples/RadioButtonExamples.tsx +161 -0
- package/src/examples/SVGImageExamples.tsx +19 -17
- package/src/examples/ScreenExamples.tsx +31 -31
- package/src/examples/SelectExamples.tsx +67 -67
- package/src/examples/SkeletonExamples.tsx +206 -0
- package/src/examples/SliderExamples.tsx +200 -0
- package/src/examples/SwitchExamples.tsx +182 -0
- package/src/examples/TabBarExamples.tsx +143 -0
- package/src/examples/TableExamples.tsx +280 -0
- package/src/examples/TextAreaExamples.tsx +173 -0
- package/src/examples/TextExamples.tsx +28 -32
- package/src/examples/ThemeExtensionExamples.tsx +10 -10
- package/src/examples/TooltipExamples.tsx +126 -0
- package/src/examples/VideoExamples.tsx +144 -0
- package/src/examples/ViewExamples.tsx +64 -56
- package/src/examples/index.ts +17 -3
- package/src/hooks/useMergeRefs.ts +16 -0
- package/src/hooks/useSmartPosition.native.ts +169 -0
- package/src/index.native.ts +80 -9
- package/src/index.ts +71 -1
- package/src/internal/BoundedModalContent.native.tsx +58 -0
- package/src/internal/PositionedPortal.tsx +254 -0
- package/src/internal/SafeAreaDebugOverlay.native.tsx +173 -0
- package/src/unistyles.d.ts +6 -0
- package/src/utils/buildSizeVariants.ts +16 -0
- package/src/utils/deepMerge.ts +43 -0
- package/src/utils/positionUtils.native.ts +280 -0
- package/src/utils/styleHelpers.ts +48 -0
- package/LLM-ACCESS-GUIDE.md +0 -143
- package/src/ActivityIndicator/README.md +0 -132
- package/src/Avatar/README.md +0 -139
- package/src/Badge/README.md +0 -170
- package/src/Button/Button.types.ts +0 -12
- package/src/Button/README.md +0 -262
- package/src/Card/README.md +0 -258
- package/src/Checkbox/README.md +0 -102
- package/src/Dialog/README.md +0 -210
- package/src/Divider/README.md +0 -108
- package/src/Icon/README.md +0 -81
- package/src/Input/README.md +0 -100
- package/src/SVGImage/README.md +0 -209
- package/src/Screen/README.md +0 -86
- package/src/Select/README.md +0 -166
- package/src/Text/README.md +0 -94
- package/src/View/README.md +0 -107
- package/src/examples/AllExamples.tsx +0 -88
- package/src/examples/README.md +0 -136
- package/src/examples/ValidationExamples.tsx +0 -95
- package/src/examples/extendedTheme.ts +0 -329
- package/src/theme/breakpoints.ts +0 -8
- package/src/theme/colorResolver.ts +0 -218
- package/src/theme/colors.ts +0 -315
- package/src/theme/defaultThemes.ts +0 -326
- package/src/theme/index.ts +0 -188
- package/src/theme/themeBuilder.ts +0 -602
- package/src/theme/unistyles.d.ts +0 -6
- package/src/theme/variantHelpers.ts +0 -584
- package/src/theme/variants.ts +0 -56
package/CLAUDE.md
CHANGED
|
@@ -1,236 +1,203 @@
|
|
|
1
|
-
#
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
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
|
-
###
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
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
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
<
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
##
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
-
|
|
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="
|
|
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="
|
|
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="
|
|
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="
|
|
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="
|
|
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.
|
|
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,7 +41,7 @@
|
|
|
41
41
|
"publish:npm": "npm publish"
|
|
42
42
|
},
|
|
43
43
|
"peerDependencies": {
|
|
44
|
-
"@idealyst/theme": "^1.0.
|
|
44
|
+
"@idealyst/theme": "^1.0.84",
|
|
45
45
|
"@mdi/js": ">=7.0.0",
|
|
46
46
|
"@mdi/react": ">=1.0.0",
|
|
47
47
|
"@react-native-vector-icons/common": ">=12.0.0",
|
|
@@ -51,6 +51,8 @@
|
|
|
51
51
|
"react-native": ">=0.60.0",
|
|
52
52
|
"react-native-edge-to-edge": "*",
|
|
53
53
|
"react-native-nitro-modules": "*",
|
|
54
|
+
"react-native-reanimated": ">=3.0.0",
|
|
55
|
+
"react-native-safe-area-context": ">=5.0.0",
|
|
54
56
|
"react-native-unistyles": ">=3.0.0"
|
|
55
57
|
},
|
|
56
58
|
"peerDependenciesMeta": {
|
|
@@ -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": [
|