@teardown/cli 1.2.39 → 2.0.41
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/bin/teardown.js +11 -1
- package/package.json +77 -57
- package/src/cli/commands/init.ts +254 -0
- package/src/cli/commands/plugins.ts +93 -0
- package/src/cli/commands/prebuild.ts +168 -0
- package/src/cli/commands/run.ts +727 -0
- package/src/cli/commands/start.ts +87 -0
- package/src/cli/commands/validate.ts +62 -0
- package/src/cli/index.ts +59 -0
- package/src/config/index.ts +45 -0
- package/src/config/loader.ts +366 -0
- package/src/config/schema.ts +235 -0
- package/src/config/types.ts +322 -0
- package/src/index.ts +177 -0
- package/src/pipeline/cache.ts +179 -0
- package/src/pipeline/index.ts +10 -0
- package/src/pipeline/stages.ts +692 -0
- package/src/plugins/base.ts +370 -0
- package/src/plugins/capabilities/biometrics.ts +64 -0
- package/src/plugins/capabilities/bluetooth.ts +86 -0
- package/src/plugins/capabilities/calendar.ts +57 -0
- package/src/plugins/capabilities/camera.ts +77 -0
- package/src/plugins/capabilities/contacts.ts +57 -0
- package/src/plugins/capabilities/deep-linking.ts +124 -0
- package/src/plugins/capabilities/firebase.ts +138 -0
- package/src/plugins/capabilities/index.ts +96 -0
- package/src/plugins/capabilities/location.ts +87 -0
- package/src/plugins/capabilities/photo-library.ts +80 -0
- package/src/plugins/capabilities/push-notifications.ts +98 -0
- package/src/plugins/capabilities/sign-in-with-apple.ts +53 -0
- package/src/plugins/context.ts +220 -0
- package/src/plugins/index.ts +26 -0
- package/src/plugins/resolver.ts +321 -0
- package/src/templates/generator.ts +507 -0
- package/src/templates/index.ts +9 -0
- package/src/templates/paths.ts +25 -0
- package/src/transformers/android/gradle.ts +400 -0
- package/src/transformers/android/index.ts +19 -0
- package/src/transformers/android/manifest.ts +506 -0
- package/src/transformers/index.ts +39 -0
- package/src/transformers/ios/entitlements.ts +283 -0
- package/src/transformers/ios/index.ts +10 -0
- package/src/transformers/ios/pbxproj.ts +267 -0
- package/src/transformers/ios/plist.ts +198 -0
- package/src/utils/fs.ts +429 -0
- package/src/utils/index.ts +21 -0
- package/src/utils/logger.ts +203 -0
- package/templates/.gitignore +63 -0
- package/templates/Gemfile +3 -0
- package/templates/android/app/build.gradle.kts +97 -0
- package/templates/android/app/proguard-rules.pro +10 -0
- package/templates/android/app/src/main/AndroidManifest.xml +26 -0
- package/templates/android/app/src/main/java/com/appname/MainActivity.kt +22 -0
- package/templates/android/app/src/main/java/com/appname/MainApplication.kt +44 -0
- package/templates/android/app/src/main/res/values/strings.xml +3 -0
- package/templates/android/app/src/main/res/values/styles.xml +7 -0
- package/templates/android/build.gradle.kts +44 -0
- package/templates/android/gradle.properties +39 -0
- package/templates/android/settings.gradle.kts +12 -0
- package/templates/babel.config.js +15 -0
- package/templates/index.js +7 -0
- package/templates/ios/.xcode.env +11 -0
- package/templates/ios/AppName/AppDelegate.swift +25 -0
- package/templates/ios/AppName/AppName-Bridging-Header.h +4 -0
- package/templates/ios/AppName/AppName.entitlements +6 -0
- package/templates/ios/AppName/Images.xcassets/AppIcon.appiconset/Contents.json +35 -0
- package/templates/ios/AppName/Images.xcassets/Contents.json +6 -0
- package/templates/ios/AppName/Info.plist +49 -0
- package/templates/ios/AppName/LaunchScreen.storyboard +38 -0
- package/templates/ios/AppName.xcodeproj/project.pbxproj +402 -0
- package/templates/ios/AppName.xcodeproj/xcshareddata/xcschemes/AppName.xcscheme +78 -0
- package/templates/ios/Podfile +35 -0
- package/templates/metro.config.js +41 -0
- package/templates/package.json +57 -0
- package/templates/react-native.config.js +8 -0
- package/templates/src/app/index.tsx +34 -0
- package/templates/src/assets/fonts/.gitkeep +1 -0
- package/templates/src/assets/images/.gitkeep +1 -0
- package/templates/src/components/ui/accordion.tsx +114 -0
- package/templates/src/components/ui/avatar.tsx +75 -0
- package/templates/src/components/ui/button.tsx +93 -0
- package/templates/src/components/ui/card.tsx +120 -0
- package/templates/src/components/ui/checkbox.tsx +133 -0
- package/templates/src/components/ui/chip.tsx +95 -0
- package/templates/src/components/ui/dialog.tsx +134 -0
- package/templates/src/components/ui/divider.tsx +67 -0
- package/templates/src/components/ui/error-view.tsx +82 -0
- package/templates/src/components/ui/form-field.tsx +101 -0
- package/templates/src/components/ui/index.ts +100 -0
- package/templates/src/components/ui/popover.tsx +92 -0
- package/templates/src/components/ui/pressable-feedback.tsx +88 -0
- package/templates/src/components/ui/radio-group.tsx +153 -0
- package/templates/src/components/ui/scroll-shadow.tsx +108 -0
- package/templates/src/components/ui/select.tsx +165 -0
- package/templates/src/components/ui/skeleton-group.tsx +97 -0
- package/templates/src/components/ui/skeleton.tsx +87 -0
- package/templates/src/components/ui/spinner.tsx +87 -0
- package/templates/src/components/ui/surface.tsx +95 -0
- package/templates/src/components/ui/switch.tsx +124 -0
- package/templates/src/components/ui/tabs.tsx +154 -0
- package/templates/src/components/ui/text-field.tsx +106 -0
- package/templates/src/components/ui/toast.tsx +129 -0
- package/templates/src/contexts/.gitkeep +2 -0
- package/templates/src/core/clients/api/api.client.ts +113 -0
- package/templates/src/core/clients/api/index.ts +1 -0
- package/templates/src/core/clients/storage/index.ts +1 -0
- package/templates/src/core/clients/storage/storage.client.ts +121 -0
- package/templates/src/core/constants/index.ts +19 -0
- package/templates/src/core/core.ts +40 -0
- package/templates/src/core/index.ts +10 -0
- package/templates/src/global.css +87 -0
- package/templates/src/hooks/index.ts +6 -0
- package/templates/src/hooks/use-debounce.ts +23 -0
- package/templates/src/hooks/use-mounted.ts +21 -0
- package/templates/src/index.ts +28 -0
- package/templates/src/lib/index.ts +5 -0
- package/templates/src/lib/utils.ts +115 -0
- package/templates/src/modules/.gitkeep +6 -0
- package/templates/src/navigation/index.ts +8 -0
- package/templates/src/navigation/navigation-provider.tsx +36 -0
- package/templates/src/navigation/router.tsx +137 -0
- package/templates/src/providers/app.provider.tsx +29 -0
- package/templates/src/providers/index.ts +5 -0
- package/templates/src/routes/(tabs)/_layout.tsx +42 -0
- package/templates/src/routes/(tabs)/explore.tsx +161 -0
- package/templates/src/routes/(tabs)/home.tsx +138 -0
- package/templates/src/routes/(tabs)/profile.tsx +151 -0
- package/templates/src/routes/_layout.tsx +18 -0
- package/templates/src/routes/settings.tsx +194 -0
- package/templates/src/screens/auth/index.ts +6 -0
- package/templates/src/screens/auth/login.tsx +165 -0
- package/templates/src/screens/auth/register.tsx +203 -0
- package/templates/src/screens/home.tsx +204 -0
- package/templates/src/screens/index.ts +17 -0
- package/templates/src/screens/profile.tsx +210 -0
- package/templates/src/screens/settings.tsx +216 -0
- package/templates/src/screens/welcome.tsx +101 -0
- package/templates/src/styles/index.ts +103 -0
- package/templates/src/types/common.ts +71 -0
- package/templates/src/types/index.ts +5 -0
- package/templates/tsconfig.json +14 -0
- package/README.md +0 -15
- package/assets/favicon.ico +0 -0
- package/dist/commands/dev/dev.d.ts +0 -22
- package/dist/commands/dev/dev.js +0 -56
- package/dist/commands/dev/dev.js.map +0 -1
- package/dist/commands/init/init-teardown.d.ts +0 -9
- package/dist/commands/init/init-teardown.js +0 -27
- package/dist/commands/init/init-teardown.js.map +0 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.js +0 -21
- package/dist/index.js.map +0 -1
- package/dist/modules/dev/dev-menu/keyboard-handler.d.ts +0 -21
- package/dist/modules/dev/dev-menu/keyboard-handler.js +0 -139
- package/dist/modules/dev/dev-menu/keyboard-handler.js.map +0 -1
- package/dist/modules/dev/dev-menu/open-debugger-keyboard-handler.d.ts +0 -18
- package/dist/modules/dev/dev-menu/open-debugger-keyboard-handler.js +0 -106
- package/dist/modules/dev/dev-menu/open-debugger-keyboard-handler.js.map +0 -1
- package/dist/modules/dev/dev-server/cdp/cdp.adapter.d.ts +0 -6
- package/dist/modules/dev/dev-server/cdp/cdp.adapter.js +0 -13
- package/dist/modules/dev/dev-server/cdp/cdp.adapter.js.map +0 -1
- package/dist/modules/dev/dev-server/cdp/index.d.ts +0 -2
- package/dist/modules/dev/dev-server/cdp/index.js +0 -19
- package/dist/modules/dev/dev-server/cdp/index.js.map +0 -1
- package/dist/modules/dev/dev-server/cdp/types.d.ts +0 -107
- package/dist/modules/dev/dev-server/cdp/types.js +0 -3
- package/dist/modules/dev/dev-server/cdp/types.js.map +0 -1
- package/dist/modules/dev/dev-server/dev-server-checker.d.ts +0 -22
- package/dist/modules/dev/dev-server/dev-server-checker.js +0 -73
- package/dist/modules/dev/dev-server/dev-server-checker.js.map +0 -1
- package/dist/modules/dev/dev-server/dev-server.d.ts +0 -74
- package/dist/modules/dev/dev-server/dev-server.js +0 -272
- package/dist/modules/dev/dev-server/dev-server.js.map +0 -1
- package/dist/modules/dev/dev-server/inspector/device.d.ts +0 -46
- package/dist/modules/dev/dev-server/inspector/device.event-reporter.d.ts +0 -37
- package/dist/modules/dev/dev-server/inspector/device.event-reporter.js +0 -166
- package/dist/modules/dev/dev-server/inspector/device.event-reporter.js.map +0 -1
- package/dist/modules/dev/dev-server/inspector/device.js +0 -578
- package/dist/modules/dev/dev-server/inspector/device.js.map +0 -1
- package/dist/modules/dev/dev-server/inspector/inspector.d.ts +0 -27
- package/dist/modules/dev/dev-server/inspector/inspector.js +0 -225
- package/dist/modules/dev/dev-server/inspector/inspector.js.map +0 -1
- package/dist/modules/dev/dev-server/inspector/types.d.ts +0 -156
- package/dist/modules/dev/dev-server/inspector/types.js +0 -3
- package/dist/modules/dev/dev-server/inspector/types.js.map +0 -1
- package/dist/modules/dev/dev-server/inspector/wss/servers/debugger-connection.server.d.ts +0 -14
- package/dist/modules/dev/dev-server/inspector/wss/servers/debugger-connection.server.js +0 -63
- package/dist/modules/dev/dev-server/inspector/wss/servers/debugger-connection.server.js.map +0 -1
- package/dist/modules/dev/dev-server/inspector/wss/servers/device-connection.server.d.ts +0 -19
- package/dist/modules/dev/dev-server/inspector/wss/servers/device-connection.server.js +0 -66
- package/dist/modules/dev/dev-server/inspector/wss/servers/device-connection.server.js.map +0 -1
- package/dist/modules/dev/dev-server/plugins/devtools.plugin.d.ts +0 -1
- package/dist/modules/dev/dev-server/plugins/devtools.plugin.js +0 -51
- package/dist/modules/dev/dev-server/plugins/devtools.plugin.js.map +0 -1
- package/dist/modules/dev/dev-server/plugins/favicon.plugin.d.ts +0 -1
- package/dist/modules/dev/dev-server/plugins/favicon.plugin.js +0 -19
- package/dist/modules/dev/dev-server/plugins/favicon.plugin.js.map +0 -1
- package/dist/modules/dev/dev-server/plugins/multipart.plugin.d.ts +0 -1
- package/dist/modules/dev/dev-server/plugins/multipart.plugin.js +0 -63
- package/dist/modules/dev/dev-server/plugins/multipart.plugin.js.map +0 -1
- package/dist/modules/dev/dev-server/plugins/systrace.plugin.d.ts +0 -1
- package/dist/modules/dev/dev-server/plugins/systrace.plugin.js +0 -29
- package/dist/modules/dev/dev-server/plugins/systrace.plugin.js.map +0 -1
- package/dist/modules/dev/dev-server/plugins/types.d.ts +0 -11
- package/dist/modules/dev/dev-server/plugins/types.js +0 -3
- package/dist/modules/dev/dev-server/plugins/types.js.map +0 -1
- package/dist/modules/dev/dev-server/plugins/wss/index.d.ts +0 -3
- package/dist/modules/dev/dev-server/plugins/wss/index.js +0 -20
- package/dist/modules/dev/dev-server/plugins/wss/index.js.map +0 -1
- package/dist/modules/dev/dev-server/plugins/wss/servers/web-socket-api.server.d.ts +0 -37
- package/dist/modules/dev/dev-server/plugins/wss/servers/web-socket-api.server.js +0 -67
- package/dist/modules/dev/dev-server/plugins/wss/servers/web-socket-api.server.js.map +0 -1
- package/dist/modules/dev/dev-server/plugins/wss/servers/web-socket-debugger.server.d.ts +0 -63
- package/dist/modules/dev/dev-server/plugins/wss/servers/web-socket-debugger.server.js +0 -129
- package/dist/modules/dev/dev-server/plugins/wss/servers/web-socket-debugger.server.js.map +0 -1
- package/dist/modules/dev/dev-server/plugins/wss/servers/web-socket-dev-client.server.d.ts +0 -32
- package/dist/modules/dev/dev-server/plugins/wss/servers/web-socket-dev-client.server.js +0 -76
- package/dist/modules/dev/dev-server/plugins/wss/servers/web-socket-dev-client.server.js.map +0 -1
- package/dist/modules/dev/dev-server/plugins/wss/servers/web-socket-events.server.d.ts +0 -75
- package/dist/modules/dev/dev-server/plugins/wss/servers/web-socket-events.server.js +0 -199
- package/dist/modules/dev/dev-server/plugins/wss/servers/web-socket-events.server.js.map +0 -1
- package/dist/modules/dev/dev-server/plugins/wss/servers/web-socket-hmr.server.d.ts +0 -44
- package/dist/modules/dev/dev-server/plugins/wss/servers/web-socket-hmr.server.js +0 -121
- package/dist/modules/dev/dev-server/plugins/wss/servers/web-socket-hmr.server.js.map +0 -1
- package/dist/modules/dev/dev-server/plugins/wss/servers/web-socket-message.server.d.ts +0 -135
- package/dist/modules/dev/dev-server/plugins/wss/servers/web-socket-message.server.js +0 -364
- package/dist/modules/dev/dev-server/plugins/wss/servers/web-socket-message.server.js.map +0 -1
- package/dist/modules/dev/dev-server/plugins/wss/types.d.ts +0 -6
- package/dist/modules/dev/dev-server/plugins/wss/types.js +0 -3
- package/dist/modules/dev/dev-server/plugins/wss/types.js.map +0 -1
- package/dist/modules/dev/dev-server/plugins/wss/web-socket-router.d.ts +0 -32
- package/dist/modules/dev/dev-server/plugins/wss/web-socket-router.js +0 -58
- package/dist/modules/dev/dev-server/plugins/wss/web-socket-router.js.map +0 -1
- package/dist/modules/dev/dev-server/plugins/wss/web-socket-server-adapter.d.ts +0 -13
- package/dist/modules/dev/dev-server/plugins/wss/web-socket-server-adapter.js +0 -27
- package/dist/modules/dev/dev-server/plugins/wss/web-socket-server-adapter.js.map +0 -1
- package/dist/modules/dev/dev-server/plugins/wss/web-socket-server.d.ts +0 -39
- package/dist/modules/dev/dev-server/plugins/wss/web-socket-server.js +0 -47
- package/dist/modules/dev/dev-server/plugins/wss/web-socket-server.js.map +0 -1
- package/dist/modules/dev/dev-server/plugins/wss/wss.plugin.d.ts +0 -24
- package/dist/modules/dev/dev-server/plugins/wss/wss.plugin.js +0 -56
- package/dist/modules/dev/dev-server/plugins/wss/wss.plugin.js.map +0 -1
- package/dist/modules/dev/dev-server/sybmolicate/sybmolicate.plugin.d.ts +0 -7
- package/dist/modules/dev/dev-server/sybmolicate/sybmolicate.plugin.js +0 -41
- package/dist/modules/dev/dev-server/sybmolicate/sybmolicate.plugin.js.map +0 -1
- package/dist/modules/dev/dev-server/sybmolicate/types.d.ts +0 -64
- package/dist/modules/dev/dev-server/sybmolicate/types.js +0 -3
- package/dist/modules/dev/dev-server/sybmolicate/types.js.map +0 -1
- package/dist/modules/dev/terminal/base.terminal.reporter.d.ts +0 -25
- package/dist/modules/dev/terminal/base.terminal.reporter.js +0 -79
- package/dist/modules/dev/terminal/base.terminal.reporter.js.map +0 -1
- package/dist/modules/dev/terminal/terminal.reporter.d.ts +0 -13
- package/dist/modules/dev/terminal/terminal.reporter.js +0 -83
- package/dist/modules/dev/terminal/terminal.reporter.js.map +0 -1
- package/dist/modules/dev/types.d.ts +0 -20
- package/dist/modules/dev/types.js +0 -3
- package/dist/modules/dev/types.js.map +0 -1
- package/dist/modules/dev/utils/log.d.ts +0 -23
- package/dist/modules/dev/utils/log.js +0 -74
- package/dist/modules/dev/utils/log.js.map +0 -1
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PressableFeedback Component
|
|
3
|
+
*
|
|
4
|
+
* A pressable component with visual feedback animations.
|
|
5
|
+
*
|
|
6
|
+
* @example Basic Usage
|
|
7
|
+
* ```tsx
|
|
8
|
+
* <PressableFeedback onPress={() => console.log('Pressed!')}>
|
|
9
|
+
* <Text>Press Me</Text>
|
|
10
|
+
* </PressableFeedback>
|
|
11
|
+
* ```
|
|
12
|
+
*
|
|
13
|
+
* @example Custom Feedback
|
|
14
|
+
* ```tsx
|
|
15
|
+
* <PressableFeedback
|
|
16
|
+
* onPress={handlePress}
|
|
17
|
+
* pressedOpacity={0.7}
|
|
18
|
+
* >
|
|
19
|
+
* <Card>
|
|
20
|
+
* <CardBody>
|
|
21
|
+
* <Text>Pressable Card</Text>
|
|
22
|
+
* </CardBody>
|
|
23
|
+
* </Card>
|
|
24
|
+
* </PressableFeedback>
|
|
25
|
+
* ```
|
|
26
|
+
*
|
|
27
|
+
* @example Scale Effect
|
|
28
|
+
* ```tsx
|
|
29
|
+
* <PressableFeedback
|
|
30
|
+
* onPress={handlePress}
|
|
31
|
+
* pressedScale={0.95}
|
|
32
|
+
* >
|
|
33
|
+
* <View style={styles.item}>
|
|
34
|
+
* <Text>Scale on press</Text>
|
|
35
|
+
* </View>
|
|
36
|
+
* </PressableFeedback>
|
|
37
|
+
* ```
|
|
38
|
+
*
|
|
39
|
+
* @example List Item
|
|
40
|
+
* ```tsx
|
|
41
|
+
* {items.map(item => (
|
|
42
|
+
* <PressableFeedback
|
|
43
|
+
* key={item.id}
|
|
44
|
+
* onPress={() => handleItemPress(item)}
|
|
45
|
+
* >
|
|
46
|
+
* <View style={styles.listItem}>
|
|
47
|
+
* <Text>{item.title}</Text>
|
|
48
|
+
* <Icon name="chevron-right" />
|
|
49
|
+
* </View>
|
|
50
|
+
* </PressableFeedback>
|
|
51
|
+
* ))}
|
|
52
|
+
* ```
|
|
53
|
+
*
|
|
54
|
+
* @example Disabled State
|
|
55
|
+
* ```tsx
|
|
56
|
+
* <PressableFeedback
|
|
57
|
+
* onPress={handlePress}
|
|
58
|
+
* isDisabled
|
|
59
|
+
* >
|
|
60
|
+
* <Text>Disabled</Text>
|
|
61
|
+
* </PressableFeedback>
|
|
62
|
+
* ```
|
|
63
|
+
*
|
|
64
|
+
* @example With Long Press
|
|
65
|
+
* ```tsx
|
|
66
|
+
* <PressableFeedback
|
|
67
|
+
* onPress={handlePress}
|
|
68
|
+
* onLongPress={handleLongPress}
|
|
69
|
+
* >
|
|
70
|
+
* <Text>Press or long press</Text>
|
|
71
|
+
* </PressableFeedback>
|
|
72
|
+
* ```
|
|
73
|
+
*/
|
|
74
|
+
|
|
75
|
+
import type { PressableFeedbackProps as HeroPressableFeedbackProps } from "heroui-native";
|
|
76
|
+
import { PressableFeedback as HeroPressableFeedback } from "heroui-native";
|
|
77
|
+
import { forwardRef } from "react";
|
|
78
|
+
import type { View as ViewRef } from "react-native";
|
|
79
|
+
|
|
80
|
+
const PressableFeedbackRoot = forwardRef<ViewRef, HeroPressableFeedbackProps>((props, ref) => {
|
|
81
|
+
return <HeroPressableFeedback ref={ref} {...props} />;
|
|
82
|
+
});
|
|
83
|
+
PressableFeedbackRoot.displayName = "PressableFeedback";
|
|
84
|
+
|
|
85
|
+
export const PressableFeedback = PressableFeedbackRoot;
|
|
86
|
+
|
|
87
|
+
// Re-export types for convenience
|
|
88
|
+
export type { HeroPressableFeedbackProps as PressableFeedbackProps };
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RadioGroup Component
|
|
3
|
+
*
|
|
4
|
+
* A group of radio buttons for single selection from multiple options.
|
|
5
|
+
*
|
|
6
|
+
* @example Basic Usage
|
|
7
|
+
* ```tsx
|
|
8
|
+
* <RadioGroup label="Select an option">
|
|
9
|
+
* <Radio value="option1">Option 1</Radio>
|
|
10
|
+
* <Radio value="option2">Option 2</Radio>
|
|
11
|
+
* <Radio value="option3">Option 3</Radio>
|
|
12
|
+
* </RadioGroup>
|
|
13
|
+
* ```
|
|
14
|
+
*
|
|
15
|
+
* @example Controlled
|
|
16
|
+
* ```tsx
|
|
17
|
+
* const [selected, setSelected] = useState('option1');
|
|
18
|
+
*
|
|
19
|
+
* <RadioGroup
|
|
20
|
+
* label="Choose one"
|
|
21
|
+
* value={selected}
|
|
22
|
+
* onValueChange={setSelected}
|
|
23
|
+
* >
|
|
24
|
+
* <Radio value="option1">Option 1</Radio>
|
|
25
|
+
* <Radio value="option2">Option 2</Radio>
|
|
26
|
+
* </RadioGroup>
|
|
27
|
+
* ```
|
|
28
|
+
*
|
|
29
|
+
* @example Default Value
|
|
30
|
+
* ```tsx
|
|
31
|
+
* <RadioGroup
|
|
32
|
+
* label="Shipping Method"
|
|
33
|
+
* defaultValue="standard"
|
|
34
|
+
* >
|
|
35
|
+
* <Radio value="standard">Standard Shipping</Radio>
|
|
36
|
+
* <Radio value="express">Express Shipping</Radio>
|
|
37
|
+
* <Radio value="overnight">Overnight Shipping</Radio>
|
|
38
|
+
* </RadioGroup>
|
|
39
|
+
* ```
|
|
40
|
+
*
|
|
41
|
+
* @example Colors
|
|
42
|
+
* ```tsx
|
|
43
|
+
* <RadioGroup color="primary">
|
|
44
|
+
* <Radio value="a">Primary</Radio>
|
|
45
|
+
* </RadioGroup>
|
|
46
|
+
* <RadioGroup color="secondary">
|
|
47
|
+
* <Radio value="a">Secondary</Radio>
|
|
48
|
+
* </RadioGroup>
|
|
49
|
+
* <RadioGroup color="success">
|
|
50
|
+
* <Radio value="a">Success</Radio>
|
|
51
|
+
* </RadioGroup>
|
|
52
|
+
* ```
|
|
53
|
+
*
|
|
54
|
+
* @example Sizes
|
|
55
|
+
* ```tsx
|
|
56
|
+
* <RadioGroup size="sm">
|
|
57
|
+
* <Radio value="a">Small</Radio>
|
|
58
|
+
* </RadioGroup>
|
|
59
|
+
* <RadioGroup size="md">
|
|
60
|
+
* <Radio value="a">Medium</Radio>
|
|
61
|
+
* </RadioGroup>
|
|
62
|
+
* <RadioGroup size="lg">
|
|
63
|
+
* <Radio value="a">Large</Radio>
|
|
64
|
+
* </RadioGroup>
|
|
65
|
+
* ```
|
|
66
|
+
*
|
|
67
|
+
* @example Horizontal Orientation
|
|
68
|
+
* ```tsx
|
|
69
|
+
* <RadioGroup
|
|
70
|
+
* label="Select Size"
|
|
71
|
+
* orientation="horizontal"
|
|
72
|
+
* >
|
|
73
|
+
* <Radio value="s">S</Radio>
|
|
74
|
+
* <Radio value="m">M</Radio>
|
|
75
|
+
* <Radio value="l">L</Radio>
|
|
76
|
+
* <Radio value="xl">XL</Radio>
|
|
77
|
+
* </RadioGroup>
|
|
78
|
+
* ```
|
|
79
|
+
*
|
|
80
|
+
* @example With Description
|
|
81
|
+
* ```tsx
|
|
82
|
+
* <RadioGroup
|
|
83
|
+
* label="Plan"
|
|
84
|
+
* description="Choose your subscription plan"
|
|
85
|
+
* >
|
|
86
|
+
* <Radio value="free" description="Limited features">
|
|
87
|
+
* Free
|
|
88
|
+
* </Radio>
|
|
89
|
+
* <Radio value="pro" description="All features included">
|
|
90
|
+
* Pro
|
|
91
|
+
* </Radio>
|
|
92
|
+
* </RadioGroup>
|
|
93
|
+
* ```
|
|
94
|
+
*
|
|
95
|
+
* @example Disabled
|
|
96
|
+
* ```tsx
|
|
97
|
+
* <RadioGroup label="Options" isDisabled>
|
|
98
|
+
* <Radio value="a">Option A</Radio>
|
|
99
|
+
* <Radio value="b">Option B</Radio>
|
|
100
|
+
* </RadioGroup>
|
|
101
|
+
* ```
|
|
102
|
+
*
|
|
103
|
+
* @example Individual Disabled Radio
|
|
104
|
+
* ```tsx
|
|
105
|
+
* <RadioGroup label="Options">
|
|
106
|
+
* <Radio value="a">Option A</Radio>
|
|
107
|
+
* <Radio value="b" isDisabled>Option B (Unavailable)</Radio>
|
|
108
|
+
* <Radio value="c">Option C</Radio>
|
|
109
|
+
* </RadioGroup>
|
|
110
|
+
* ```
|
|
111
|
+
*
|
|
112
|
+
* @example Invalid State
|
|
113
|
+
* ```tsx
|
|
114
|
+
* <RadioGroup
|
|
115
|
+
* label="Required Selection"
|
|
116
|
+
* isRequired
|
|
117
|
+
* isInvalid={!hasSelection}
|
|
118
|
+
* errorMessage="Please select an option"
|
|
119
|
+
* >
|
|
120
|
+
* <Radio value="a">Option A</Radio>
|
|
121
|
+
* <Radio value="b">Option B</Radio>
|
|
122
|
+
* </RadioGroup>
|
|
123
|
+
* ```
|
|
124
|
+
*/
|
|
125
|
+
|
|
126
|
+
import type {
|
|
127
|
+
RadioGroupProps as HeroRadioGroupProps,
|
|
128
|
+
RadioProps as HeroRadioProps,
|
|
129
|
+
} from "heroui-native";
|
|
130
|
+
import { Radio as HeroRadio, RadioGroup as HeroRadioGroup } from "heroui-native";
|
|
131
|
+
import { forwardRef } from "react";
|
|
132
|
+
import type { View as ViewRef } from "react-native";
|
|
133
|
+
|
|
134
|
+
// Radio component
|
|
135
|
+
const RadioRoot = forwardRef<ViewRef, HeroRadioProps>((props, ref) => {
|
|
136
|
+
return <HeroRadio ref={ref} {...props} />;
|
|
137
|
+
});
|
|
138
|
+
RadioRoot.displayName = "Radio";
|
|
139
|
+
|
|
140
|
+
// Radio Group component
|
|
141
|
+
const RadioGroupComponent = forwardRef<ViewRef, HeroRadioGroupProps>((props, ref) => {
|
|
142
|
+
return <HeroRadioGroup ref={ref} {...props} />;
|
|
143
|
+
});
|
|
144
|
+
RadioGroupComponent.displayName = "RadioGroup";
|
|
145
|
+
|
|
146
|
+
export const Radio = RadioRoot;
|
|
147
|
+
export const RadioGroup = RadioGroupComponent;
|
|
148
|
+
|
|
149
|
+
// Re-export types for convenience
|
|
150
|
+
export type {
|
|
151
|
+
HeroRadioProps as RadioProps,
|
|
152
|
+
HeroRadioGroupProps as RadioGroupProps,
|
|
153
|
+
};
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ScrollShadow Component
|
|
3
|
+
*
|
|
4
|
+
* A scroll container that displays shadow indicators when content is scrollable.
|
|
5
|
+
*
|
|
6
|
+
* @example Basic Usage
|
|
7
|
+
* ```tsx
|
|
8
|
+
* <ScrollShadow style={{ height: 200 }}>
|
|
9
|
+
* <Text>Scrollable content...</Text>
|
|
10
|
+
* <Text>More content...</Text>
|
|
11
|
+
* <Text>Even more content...</Text>
|
|
12
|
+
* </ScrollShadow>
|
|
13
|
+
* ```
|
|
14
|
+
*
|
|
15
|
+
* @example Horizontal Scroll
|
|
16
|
+
* ```tsx
|
|
17
|
+
* <ScrollShadow
|
|
18
|
+
* orientation="horizontal"
|
|
19
|
+
* style={{ width: '100%' }}
|
|
20
|
+
* >
|
|
21
|
+
* <View style={{ flexDirection: 'row', gap: 8 }}>
|
|
22
|
+
* {items.map(item => (
|
|
23
|
+
* <Card key={item.id} style={{ width: 200 }}>
|
|
24
|
+
* <Text>{item.title}</Text>
|
|
25
|
+
* </Card>
|
|
26
|
+
* ))}
|
|
27
|
+
* </View>
|
|
28
|
+
* </ScrollShadow>
|
|
29
|
+
* ```
|
|
30
|
+
*
|
|
31
|
+
* @example Custom Shadow Size
|
|
32
|
+
* ```tsx
|
|
33
|
+
* <ScrollShadow
|
|
34
|
+
* size={40}
|
|
35
|
+
* style={{ height: 300 }}
|
|
36
|
+
* >
|
|
37
|
+
* <Text>Content with larger shadows</Text>
|
|
38
|
+
* </ScrollShadow>
|
|
39
|
+
* ```
|
|
40
|
+
*
|
|
41
|
+
* @example Hide Scroll Indicator
|
|
42
|
+
* ```tsx
|
|
43
|
+
* <ScrollShadow
|
|
44
|
+
* hideScrollBar
|
|
45
|
+
* style={{ height: 200 }}
|
|
46
|
+
* >
|
|
47
|
+
* <Text>No visible scrollbar</Text>
|
|
48
|
+
* </ScrollShadow>
|
|
49
|
+
* ```
|
|
50
|
+
*
|
|
51
|
+
* @example In a Card
|
|
52
|
+
* ```tsx
|
|
53
|
+
* <Card>
|
|
54
|
+
* <CardHeader>
|
|
55
|
+
* <Text>Long List</Text>
|
|
56
|
+
* </CardHeader>
|
|
57
|
+
* <ScrollShadow style={{ maxHeight: 300 }}>
|
|
58
|
+
* <CardBody>
|
|
59
|
+
* {items.map(item => (
|
|
60
|
+
* <Text key={item.id}>{item.title}</Text>
|
|
61
|
+
* ))}
|
|
62
|
+
* </CardBody>
|
|
63
|
+
* </ScrollShadow>
|
|
64
|
+
* </Card>
|
|
65
|
+
* ```
|
|
66
|
+
*
|
|
67
|
+
* @example With Offset
|
|
68
|
+
* ```tsx
|
|
69
|
+
* <ScrollShadow
|
|
70
|
+
* offset={20}
|
|
71
|
+
* style={{ height: 200 }}
|
|
72
|
+
* >
|
|
73
|
+
* <Text>Content with offset shadow</Text>
|
|
74
|
+
* </ScrollShadow>
|
|
75
|
+
* ```
|
|
76
|
+
*
|
|
77
|
+
* @example Visibility Control
|
|
78
|
+
* ```tsx
|
|
79
|
+
* <ScrollShadow
|
|
80
|
+
* visibility="top"
|
|
81
|
+
* style={{ height: 200 }}
|
|
82
|
+
* >
|
|
83
|
+
* <Text>Only top shadow visible</Text>
|
|
84
|
+
* </ScrollShadow>
|
|
85
|
+
*
|
|
86
|
+
* <ScrollShadow
|
|
87
|
+
* visibility="bottom"
|
|
88
|
+
* style={{ height: 200 }}
|
|
89
|
+
* >
|
|
90
|
+
* <Text>Only bottom shadow visible</Text>
|
|
91
|
+
* </ScrollShadow>
|
|
92
|
+
* ```
|
|
93
|
+
*/
|
|
94
|
+
|
|
95
|
+
import type { ScrollShadowProps as HeroScrollShadowProps } from "heroui-native";
|
|
96
|
+
import { ScrollShadow as HeroScrollShadow } from "heroui-native";
|
|
97
|
+
import { forwardRef } from "react";
|
|
98
|
+
import type { View as ViewRef } from "react-native";
|
|
99
|
+
|
|
100
|
+
const ScrollShadowRoot = forwardRef<ViewRef, HeroScrollShadowProps>((props, ref) => {
|
|
101
|
+
return <HeroScrollShadow ref={ref} {...props} />;
|
|
102
|
+
});
|
|
103
|
+
ScrollShadowRoot.displayName = "ScrollShadow";
|
|
104
|
+
|
|
105
|
+
export const ScrollShadow = ScrollShadowRoot;
|
|
106
|
+
|
|
107
|
+
// Re-export types for convenience
|
|
108
|
+
export type { HeroScrollShadowProps as ScrollShadowProps };
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Select Component
|
|
3
|
+
*
|
|
4
|
+
* A dropdown select component for choosing from a list of options.
|
|
5
|
+
*
|
|
6
|
+
* @example Basic Usage
|
|
7
|
+
* ```tsx
|
|
8
|
+
* <Select label="Country">
|
|
9
|
+
* <SelectItem key="us">United States</SelectItem>
|
|
10
|
+
* <SelectItem key="uk">United Kingdom</SelectItem>
|
|
11
|
+
* <SelectItem key="ca">Canada</SelectItem>
|
|
12
|
+
* </Select>
|
|
13
|
+
* ```
|
|
14
|
+
*
|
|
15
|
+
* @example Controlled
|
|
16
|
+
* ```tsx
|
|
17
|
+
* const [value, setValue] = useState(new Set(['us']));
|
|
18
|
+
*
|
|
19
|
+
* <Select
|
|
20
|
+
* label="Country"
|
|
21
|
+
* selectedKeys={value}
|
|
22
|
+
* onSelectionChange={setValue}
|
|
23
|
+
* >
|
|
24
|
+
* <SelectItem key="us">United States</SelectItem>
|
|
25
|
+
* <SelectItem key="uk">United Kingdom</SelectItem>
|
|
26
|
+
* </Select>
|
|
27
|
+
* ```
|
|
28
|
+
*
|
|
29
|
+
* @example With Placeholder
|
|
30
|
+
* ```tsx
|
|
31
|
+
* <Select
|
|
32
|
+
* label="Status"
|
|
33
|
+
* placeholder="Select a status"
|
|
34
|
+
* >
|
|
35
|
+
* <SelectItem key="active">Active</SelectItem>
|
|
36
|
+
* <SelectItem key="inactive">Inactive</SelectItem>
|
|
37
|
+
* <SelectItem key="pending">Pending</SelectItem>
|
|
38
|
+
* </Select>
|
|
39
|
+
* ```
|
|
40
|
+
*
|
|
41
|
+
* @example With Description
|
|
42
|
+
* ```tsx
|
|
43
|
+
* <Select
|
|
44
|
+
* label="Plan"
|
|
45
|
+
* description="Choose your subscription plan"
|
|
46
|
+
* >
|
|
47
|
+
* <SelectItem key="free" description="Basic features">
|
|
48
|
+
* Free
|
|
49
|
+
* </SelectItem>
|
|
50
|
+
* <SelectItem key="pro" description="All features">
|
|
51
|
+
* Pro
|
|
52
|
+
* </SelectItem>
|
|
53
|
+
* </Select>
|
|
54
|
+
* ```
|
|
55
|
+
*
|
|
56
|
+
* @example Required
|
|
57
|
+
* ```tsx
|
|
58
|
+
* <Select
|
|
59
|
+
* label="Category"
|
|
60
|
+
* isRequired
|
|
61
|
+
* >
|
|
62
|
+
* <SelectItem key="tech">Technology</SelectItem>
|
|
63
|
+
* <SelectItem key="health">Health</SelectItem>
|
|
64
|
+
* </Select>
|
|
65
|
+
* ```
|
|
66
|
+
*
|
|
67
|
+
* @example Disabled
|
|
68
|
+
* ```tsx
|
|
69
|
+
* <Select
|
|
70
|
+
* label="Disabled Select"
|
|
71
|
+
* isDisabled
|
|
72
|
+
* >
|
|
73
|
+
* <SelectItem key="a">Option A</SelectItem>
|
|
74
|
+
* </Select>
|
|
75
|
+
* ```
|
|
76
|
+
*
|
|
77
|
+
* @example Disabled Items
|
|
78
|
+
* ```tsx
|
|
79
|
+
* <Select label="Options">
|
|
80
|
+
* <SelectItem key="a">Available</SelectItem>
|
|
81
|
+
* <SelectItem key="b" isDisabled>Unavailable</SelectItem>
|
|
82
|
+
* <SelectItem key="c">Available</SelectItem>
|
|
83
|
+
* </Select>
|
|
84
|
+
* ```
|
|
85
|
+
*
|
|
86
|
+
* @example Invalid State
|
|
87
|
+
* ```tsx
|
|
88
|
+
* <Select
|
|
89
|
+
* label="Required Field"
|
|
90
|
+
* isInvalid
|
|
91
|
+
* errorMessage="Please select an option"
|
|
92
|
+
* >
|
|
93
|
+
* <SelectItem key="a">Option A</SelectItem>
|
|
94
|
+
* <SelectItem key="b">Option B</SelectItem>
|
|
95
|
+
* </Select>
|
|
96
|
+
* ```
|
|
97
|
+
*
|
|
98
|
+
* @example Variants
|
|
99
|
+
* ```tsx
|
|
100
|
+
* <Select variant="flat" label="Flat">...</Select>
|
|
101
|
+
* <Select variant="bordered" label="Bordered">...</Select>
|
|
102
|
+
* <Select variant="faded" label="Faded">...</Select>
|
|
103
|
+
* <Select variant="underlined" label="Underlined">...</Select>
|
|
104
|
+
* ```
|
|
105
|
+
*
|
|
106
|
+
* @example Sizes
|
|
107
|
+
* ```tsx
|
|
108
|
+
* <Select size="sm" label="Small">...</Select>
|
|
109
|
+
* <Select size="md" label="Medium">...</Select>
|
|
110
|
+
* <Select size="lg" label="Large">...</Select>
|
|
111
|
+
* ```
|
|
112
|
+
*
|
|
113
|
+
* @example With Start Content
|
|
114
|
+
* ```tsx
|
|
115
|
+
* <Select
|
|
116
|
+
* label="Select Country"
|
|
117
|
+
* startContent={<GlobeIcon />}
|
|
118
|
+
* >
|
|
119
|
+
* <SelectItem key="us" startContent={<UsFlag />}>
|
|
120
|
+
* United States
|
|
121
|
+
* </SelectItem>
|
|
122
|
+
* </Select>
|
|
123
|
+
* ```
|
|
124
|
+
*
|
|
125
|
+
* @example Multiple Selection
|
|
126
|
+
* ```tsx
|
|
127
|
+
* <Select
|
|
128
|
+
* label="Tags"
|
|
129
|
+
* selectionMode="multiple"
|
|
130
|
+
* >
|
|
131
|
+
* <SelectItem key="react">React</SelectItem>
|
|
132
|
+
* <SelectItem key="vue">Vue</SelectItem>
|
|
133
|
+
* <SelectItem key="angular">Angular</SelectItem>
|
|
134
|
+
* </Select>
|
|
135
|
+
* ```
|
|
136
|
+
*/
|
|
137
|
+
|
|
138
|
+
import type {
|
|
139
|
+
SelectItemProps as HeroSelectItemProps,
|
|
140
|
+
SelectProps as HeroSelectProps,
|
|
141
|
+
} from "heroui-native";
|
|
142
|
+
import { Select as HeroSelect, SelectItem as HeroSelectItem } from "heroui-native";
|
|
143
|
+
import { forwardRef } from "react";
|
|
144
|
+
import type { View as ViewRef } from "react-native";
|
|
145
|
+
|
|
146
|
+
// Select component
|
|
147
|
+
const SelectRoot = forwardRef<ViewRef, HeroSelectProps>((props, ref) => {
|
|
148
|
+
return <HeroSelect ref={ref} {...props} />;
|
|
149
|
+
});
|
|
150
|
+
SelectRoot.displayName = "Select";
|
|
151
|
+
|
|
152
|
+
// Select Item component
|
|
153
|
+
const SelectItemComponent = forwardRef<ViewRef, HeroSelectItemProps>((props, ref) => {
|
|
154
|
+
return <HeroSelectItem ref={ref} {...props} />;
|
|
155
|
+
});
|
|
156
|
+
SelectItemComponent.displayName = "SelectItem";
|
|
157
|
+
|
|
158
|
+
export const Select = SelectRoot;
|
|
159
|
+
export const SelectItem = SelectItemComponent;
|
|
160
|
+
|
|
161
|
+
// Re-export types for convenience
|
|
162
|
+
export type {
|
|
163
|
+
HeroSelectProps as SelectProps,
|
|
164
|
+
HeroSelectItemProps as SelectItemProps,
|
|
165
|
+
};
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SkeletonGroup Component
|
|
3
|
+
*
|
|
4
|
+
* A container for grouping multiple skeletons with coordinated loading states.
|
|
5
|
+
*
|
|
6
|
+
* @example Basic Usage
|
|
7
|
+
* ```tsx
|
|
8
|
+
* <SkeletonGroup isLoaded={!isLoading}>
|
|
9
|
+
* <Skeleton style={{ width: 200, height: 20 }} />
|
|
10
|
+
* <Skeleton style={{ width: 150, height: 20 }} />
|
|
11
|
+
* <Skeleton style={{ width: 180, height: 20 }} />
|
|
12
|
+
* </SkeletonGroup>
|
|
13
|
+
* ```
|
|
14
|
+
*
|
|
15
|
+
* @example User Profile
|
|
16
|
+
* ```tsx
|
|
17
|
+
* <SkeletonGroup isLoaded={!isLoading}>
|
|
18
|
+
* <View style={{ alignItems: 'center', gap: 12 }}>
|
|
19
|
+
* <Skeleton style={{ width: 80, height: 80, borderRadius: 40 }} />
|
|
20
|
+
* <Skeleton style={{ width: 120, height: 24 }} />
|
|
21
|
+
* <Skeleton style={{ width: 200, height: 16 }} />
|
|
22
|
+
* </View>
|
|
23
|
+
* </SkeletonGroup>
|
|
24
|
+
* ```
|
|
25
|
+
*
|
|
26
|
+
* @example Card Loading State
|
|
27
|
+
* ```tsx
|
|
28
|
+
* <Card>
|
|
29
|
+
* <CardBody>
|
|
30
|
+
* <SkeletonGroup isLoaded={!isLoading}>
|
|
31
|
+
* <View style={{ flexDirection: 'row', gap: 12 }}>
|
|
32
|
+
* <Skeleton style={{ width: 48, height: 48, borderRadius: 24 }} />
|
|
33
|
+
* <View style={{ flex: 1, gap: 8 }}>
|
|
34
|
+
* <Skeleton style={{ width: '80%', height: 16 }} />
|
|
35
|
+
* <Skeleton style={{ width: '60%', height: 14 }} />
|
|
36
|
+
* </View>
|
|
37
|
+
* </View>
|
|
38
|
+
* </SkeletonGroup>
|
|
39
|
+
* </CardBody>
|
|
40
|
+
* </Card>
|
|
41
|
+
* ```
|
|
42
|
+
*
|
|
43
|
+
* @example List Loading State
|
|
44
|
+
* ```tsx
|
|
45
|
+
* <SkeletonGroup isLoaded={!isLoading}>
|
|
46
|
+
* {[1, 2, 3, 4, 5].map(i => (
|
|
47
|
+
* <View key={i} style={{ padding: 12 }}>
|
|
48
|
+
* <Skeleton style={{ width: '100%', height: 60 }} />
|
|
49
|
+
* </View>
|
|
50
|
+
* ))}
|
|
51
|
+
* </SkeletonGroup>
|
|
52
|
+
* ```
|
|
53
|
+
*
|
|
54
|
+
* @example Staggered Animation
|
|
55
|
+
* ```tsx
|
|
56
|
+
* <SkeletonGroup
|
|
57
|
+
* isLoaded={!isLoading}
|
|
58
|
+
* disableAnimation={false}
|
|
59
|
+
* >
|
|
60
|
+
* <Skeleton style={{ width: '90%', height: 16 }} />
|
|
61
|
+
* <Skeleton style={{ width: '75%', height: 16, marginTop: 8 }} />
|
|
62
|
+
* <Skeleton style={{ width: '85%', height: 16, marginTop: 8 }} />
|
|
63
|
+
* </SkeletonGroup>
|
|
64
|
+
* ```
|
|
65
|
+
*
|
|
66
|
+
* @example With Real Content
|
|
67
|
+
* ```tsx
|
|
68
|
+
* <SkeletonGroup isLoaded={data !== undefined}>
|
|
69
|
+
* {data ? (
|
|
70
|
+
* <View>
|
|
71
|
+
* <Text>{data.title}</Text>
|
|
72
|
+
* <Text>{data.description}</Text>
|
|
73
|
+
* </View>
|
|
74
|
+
* ) : (
|
|
75
|
+
* <View>
|
|
76
|
+
* <Skeleton style={{ width: 200, height: 24 }} />
|
|
77
|
+
* <Skeleton style={{ width: 300, height: 16, marginTop: 8 }} />
|
|
78
|
+
* </View>
|
|
79
|
+
* )}
|
|
80
|
+
* </SkeletonGroup>
|
|
81
|
+
* ```
|
|
82
|
+
*/
|
|
83
|
+
|
|
84
|
+
import type { SkeletonGroupProps as HeroSkeletonGroupProps } from "heroui-native";
|
|
85
|
+
import { SkeletonGroup as HeroSkeletonGroup } from "heroui-native";
|
|
86
|
+
import { forwardRef } from "react";
|
|
87
|
+
import type { View as ViewRef } from "react-native";
|
|
88
|
+
|
|
89
|
+
const SkeletonGroupRoot = forwardRef<ViewRef, HeroSkeletonGroupProps>((props, ref) => {
|
|
90
|
+
return <HeroSkeletonGroup ref={ref} {...props} />;
|
|
91
|
+
});
|
|
92
|
+
SkeletonGroupRoot.displayName = "SkeletonGroup";
|
|
93
|
+
|
|
94
|
+
export const SkeletonGroup = SkeletonGroupRoot;
|
|
95
|
+
|
|
96
|
+
// Re-export types for convenience
|
|
97
|
+
export type { HeroSkeletonGroupProps as SkeletonGroupProps };
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skeleton Component
|
|
3
|
+
*
|
|
4
|
+
* A placeholder loading component that mimics content shapes.
|
|
5
|
+
*
|
|
6
|
+
* @example Basic Usage
|
|
7
|
+
* ```tsx
|
|
8
|
+
* <Skeleton style={{ width: 200, height: 20 }} />
|
|
9
|
+
* ```
|
|
10
|
+
*
|
|
11
|
+
* @example Content Placeholder
|
|
12
|
+
* ```tsx
|
|
13
|
+
* {isLoading ? (
|
|
14
|
+
* <Skeleton style={{ width: '100%', height: 40 }} />
|
|
15
|
+
* ) : (
|
|
16
|
+
* <Text>{data.title}</Text>
|
|
17
|
+
* )}
|
|
18
|
+
* ```
|
|
19
|
+
*
|
|
20
|
+
* @example Card Skeleton
|
|
21
|
+
* ```tsx
|
|
22
|
+
* <Card>
|
|
23
|
+
* <CardBody>
|
|
24
|
+
* <Skeleton style={{ width: 50, height: 50, borderRadius: 25 }} />
|
|
25
|
+
* <View style={{ marginTop: 8 }}>
|
|
26
|
+
* <Skeleton style={{ width: '80%', height: 16 }} />
|
|
27
|
+
* <Skeleton style={{ width: '60%', height: 16, marginTop: 4 }} />
|
|
28
|
+
* </View>
|
|
29
|
+
* </CardBody>
|
|
30
|
+
* </Card>
|
|
31
|
+
* ```
|
|
32
|
+
*
|
|
33
|
+
* @example List Skeleton
|
|
34
|
+
* ```tsx
|
|
35
|
+
* {[1, 2, 3].map(i => (
|
|
36
|
+
* <View key={i} style={{ flexDirection: 'row', gap: 12, padding: 8 }}>
|
|
37
|
+
* <Skeleton style={{ width: 48, height: 48, borderRadius: 24 }} />
|
|
38
|
+
* <View style={{ flex: 1 }}>
|
|
39
|
+
* <Skeleton style={{ width: '70%', height: 16 }} />
|
|
40
|
+
* <Skeleton style={{ width: '50%', height: 14, marginTop: 4 }} />
|
|
41
|
+
* </View>
|
|
42
|
+
* </View>
|
|
43
|
+
* ))}
|
|
44
|
+
* ```
|
|
45
|
+
*
|
|
46
|
+
* @example Profile Skeleton
|
|
47
|
+
* ```tsx
|
|
48
|
+
* <View style={{ alignItems: 'center', gap: 12 }}>
|
|
49
|
+
* <Skeleton style={{ width: 80, height: 80, borderRadius: 40 }} />
|
|
50
|
+
* <Skeleton style={{ width: 120, height: 20 }} />
|
|
51
|
+
* <Skeleton style={{ width: 200, height: 14 }} />
|
|
52
|
+
* </View>
|
|
53
|
+
* ```
|
|
54
|
+
*
|
|
55
|
+
* @example Without Animation
|
|
56
|
+
* ```tsx
|
|
57
|
+
* <Skeleton
|
|
58
|
+
* isLoaded={!isLoading}
|
|
59
|
+
* style={{ width: 200, height: 20 }}
|
|
60
|
+
* >
|
|
61
|
+
* <Text>Content when loaded</Text>
|
|
62
|
+
* </Skeleton>
|
|
63
|
+
* ```
|
|
64
|
+
*
|
|
65
|
+
* @example Custom Animation
|
|
66
|
+
* ```tsx
|
|
67
|
+
* <Skeleton
|
|
68
|
+
* disableAnimation={false}
|
|
69
|
+
* style={{ width: 200, height: 20 }}
|
|
70
|
+
* />
|
|
71
|
+
* ```
|
|
72
|
+
*/
|
|
73
|
+
|
|
74
|
+
import type { SkeletonProps as HeroSkeletonProps } from "heroui-native";
|
|
75
|
+
import { Skeleton as HeroSkeleton } from "heroui-native";
|
|
76
|
+
import { forwardRef } from "react";
|
|
77
|
+
import type { View as ViewRef } from "react-native";
|
|
78
|
+
|
|
79
|
+
const SkeletonRoot = forwardRef<ViewRef, HeroSkeletonProps>((props, ref) => {
|
|
80
|
+
return <HeroSkeleton ref={ref} {...props} />;
|
|
81
|
+
});
|
|
82
|
+
SkeletonRoot.displayName = "Skeleton";
|
|
83
|
+
|
|
84
|
+
export const Skeleton = SkeletonRoot;
|
|
85
|
+
|
|
86
|
+
// Re-export types for convenience
|
|
87
|
+
export type { HeroSkeletonProps as SkeletonProps };
|