rn-feav-ui 1.0.2 → 1.0.3

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 (56) hide show
  1. package/dist/components/Accordion/index.d.ts +8 -0
  2. package/dist/components/Accordion/index.js +65 -0
  3. package/dist/components/Alert/index.d.ts +10 -0
  4. package/dist/components/Alert/index.js +84 -0
  5. package/dist/components/Avatar/index.d.ts +7 -0
  6. package/dist/components/Avatar/index.js +66 -0
  7. package/dist/components/Badge/index.d.ts +4 -2
  8. package/dist/components/Badge/index.js +29 -6
  9. package/dist/components/BottomSheet/index.d.ts +2 -2
  10. package/dist/components/BottomSheet/index.js +21 -8
  11. package/dist/components/Button/index.d.ts +11 -3
  12. package/dist/components/Button/index.js +133 -23
  13. package/dist/components/Card/index.d.ts +8 -0
  14. package/dist/components/Card/index.js +59 -0
  15. package/dist/components/Checkbox/index.d.ts +7 -0
  16. package/dist/components/Checkbox/index.js +75 -0
  17. package/dist/components/Dialog/index.d.ts +14 -0
  18. package/dist/components/Dialog/index.js +77 -0
  19. package/dist/components/GlassCard/index.d.ts +1 -1
  20. package/dist/components/GlassCard/index.js +10 -5
  21. package/dist/components/GlassCard/styles.d.ts +23 -1
  22. package/dist/components/GlassCard/styles.js +17 -2
  23. package/dist/components/Input/index.d.ts +4 -2
  24. package/dist/components/Input/index.js +20 -13
  25. package/dist/components/Label/index.d.ts +6 -0
  26. package/dist/components/Label/index.js +52 -0
  27. package/dist/components/ListItem/index.d.ts +2 -2
  28. package/dist/components/ListItem/index.js +27 -9
  29. package/dist/components/Modal/index.d.ts +2 -2
  30. package/dist/components/Modal/index.js +29 -9
  31. package/dist/components/Navbar/index.d.ts +2 -2
  32. package/dist/components/Navbar/index.js +19 -8
  33. package/dist/components/Progress/index.d.ts +6 -0
  34. package/dist/components/Progress/index.js +65 -0
  35. package/dist/components/Separator/index.d.ts +5 -0
  36. package/dist/components/Separator/index.js +57 -0
  37. package/dist/components/Skeleton/index.d.ts +1 -1
  38. package/dist/components/Skeleton/index.js +18 -5
  39. package/dist/components/Switch/index.d.ts +9 -0
  40. package/dist/components/Switch/index.js +47 -0
  41. package/dist/components/TabBar/index.d.ts +2 -2
  42. package/dist/components/TabBar/index.js +20 -6
  43. package/dist/components/Tabs/index.d.ts +18 -0
  44. package/dist/components/Tabs/index.js +102 -0
  45. package/dist/components/Textarea/index.d.ts +6 -0
  46. package/dist/components/Textarea/index.js +62 -0
  47. package/dist/components/ThemeSwitch/index.d.ts +1 -1
  48. package/dist/components/ThemeSwitch/index.js +3 -3
  49. package/dist/components/Typography/index.d.ts +9 -0
  50. package/dist/components/Typography/index.js +64 -0
  51. package/dist/components/index.d.ts +14 -0
  52. package/dist/components/index.js +14 -0
  53. package/dist/examples/Showcase.d.ts +2 -0
  54. package/dist/examples/Showcase.js +131 -0
  55. package/package.json +21 -4
  56. package/readme.md +80 -14
@@ -0,0 +1,131 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.Showcase = void 0;
37
+ var React = __importStar(require("react"));
38
+ var react_native_1 = require("react-native");
39
+ var ThemeFEAVUiProvider_1 = require("../theme/ThemeFEAVUiProvider");
40
+ var components_1 = require("../components");
41
+ var ShowcaseContent = function () {
42
+ var _a = (0, ThemeFEAVUiProvider_1.useTheme)(), theme = _a.theme, toggleTheme = _a.toggleTheme;
43
+ var _b = React.useState(true), checked = _b[0], setChecked = _b[1];
44
+ var _c = React.useState(false), switchOn = _c[0], setSwitchOn = _c[1];
45
+ var _d = React.useState(false), dialogOpen = _d[0], setDialogOpen = _d[1];
46
+ var _e = React.useState(false), modalOpen = _e[0], setModalOpen = _e[1];
47
+ return (React.createElement(react_native_1.View, { style: { flex: 1, backgroundColor: theme.colors.bg } },
48
+ React.createElement(react_native_1.ScrollView, { contentContainerStyle: { padding: 16, gap: 14 } },
49
+ React.createElement(components_1.NavbarFEA, { title: "FEAV UI Showcase" }),
50
+ React.createElement(components_1.CardFEA, null,
51
+ React.createElement(components_1.TypographyFEA, { variant: "h2" }, "Theme"),
52
+ React.createElement(components_1.TypographyFEA, { variant: "muted" },
53
+ "Current: ",
54
+ theme.mode),
55
+ React.createElement(react_native_1.View, { style: { marginTop: 10 } },
56
+ React.createElement(components_1.ButtonFEA, { title: "Toggle Theme", variant: "outline", onPress: toggleTheme }))),
57
+ React.createElement(components_1.CardFEA, null,
58
+ React.createElement(components_1.TypographyFEA, { variant: "h2" }, "Buttons"),
59
+ React.createElement(react_native_1.View, { style: { gap: 8, marginTop: 10 } },
60
+ React.createElement(components_1.ButtonFEA, { title: "Primary", onPress: function () { return null; } }),
61
+ React.createElement(components_1.ButtonFEA, { title: "Secondary / Soft", variant: "soft", onPress: function () { return null; } }),
62
+ React.createElement(components_1.ButtonFEA, { title: "Outline", variant: "outline", onPress: function () { return null; } }),
63
+ React.createElement(components_1.ButtonFEA, { title: "Ghost", variant: "ghost", onPress: function () { return null; } }),
64
+ React.createElement(components_1.ButtonFEA, { title: "Glass", variant: "glass", onPress: function () { return null; } }))),
65
+ React.createElement(components_1.CardFEA, null,
66
+ React.createElement(components_1.TypographyFEA, { variant: "h2" }, "Inputs"),
67
+ React.createElement(react_native_1.View, { style: { marginTop: 10 } },
68
+ React.createElement(components_1.LabelFEA, null, "Username"),
69
+ React.createElement(components_1.InputFEA, { placeholder: "Enter username" }),
70
+ React.createElement(components_1.LabelFEA, null, "Description"),
71
+ React.createElement(components_1.TextareaFEA, { placeholder: "Write something..." }))),
72
+ React.createElement(components_1.CardFEA, null,
73
+ React.createElement(components_1.TypographyFEA, { variant: "h2" }, "Selection"),
74
+ React.createElement(react_native_1.View, { style: { marginTop: 10, gap: 12 } },
75
+ React.createElement(components_1.CheckboxFEA, { checked: checked, onChange: setChecked, label: "Accept terms" }),
76
+ React.createElement(components_1.SwitchFEA, { value: switchOn, onValueChange: setSwitchOn, label: "Enable notifications" }))),
77
+ React.createElement(components_1.CardFEA, null,
78
+ React.createElement(components_1.TypographyFEA, { variant: "h2" }, "Status & Feedback"),
79
+ React.createElement(react_native_1.View, { style: { marginTop: 10, gap: 10 } },
80
+ React.createElement(components_1.BadgeFEA, { label: "Beta" }),
81
+ React.createElement(components_1.AlertFEA, { title: "Heads up!", description: "This is a default alert." }),
82
+ React.createElement(components_1.AlertFEA, { variant: "destructive", title: "Something went wrong", description: "Please try again later." }),
83
+ React.createElement(components_1.ProgressFEA, { value: 66 }),
84
+ React.createElement(components_1.SkeletonFEA, { height: 40 }))),
85
+ React.createElement(components_1.CardFEA, null,
86
+ React.createElement(components_1.TypographyFEA, { variant: "h2" }, "Display"),
87
+ React.createElement(react_native_1.View, { style: { marginTop: 10, gap: 12 } },
88
+ React.createElement(react_native_1.View, { style: { flexDirection: "row", gap: 8 } },
89
+ React.createElement(components_1.AvatarFEA, { fallback: "NT" }),
90
+ React.createElement(components_1.AvatarFEA, { fallback: "UI", size: 32 })),
91
+ React.createElement(components_1.SeparatorFEA, null),
92
+ React.createElement(components_1.ListItemFEA, { title: "List title", subtitle: "Supporting text for list item." }))),
93
+ React.createElement(components_1.CardFEA, null,
94
+ React.createElement(components_1.TypographyFEA, { variant: "h2" }, "Tabs"),
95
+ React.createElement(components_1.TabsFEA, { defaultValue: "account" },
96
+ React.createElement(components_1.TabsListFEA, { style: { marginTop: 10 } },
97
+ React.createElement(components_1.TabsTriggerFEA, { value: "account" }, "Account"),
98
+ React.createElement(components_1.TabsTriggerFEA, { value: "password" }, "Password")),
99
+ React.createElement(components_1.TabsContentFEA, { value: "account" },
100
+ React.createElement(components_1.TypographyFEA, { variant: "p" }, "Manage your account settings here.")),
101
+ React.createElement(components_1.TabsContentFEA, { value: "password" },
102
+ React.createElement(components_1.TypographyFEA, { variant: "p" }, "Change your password from this tab.")))),
103
+ React.createElement(components_1.AccordionFEA, { title: "Accordion Example" },
104
+ React.createElement(components_1.TypographyFEA, { variant: "p" }, "This content is shown when accordion is open.")),
105
+ React.createElement(components_1.TabBarFEA, null,
106
+ React.createElement(components_1.ButtonFEA, { title: "Home", variant: "ghost", onPress: function () { return null; } }),
107
+ React.createElement(components_1.ButtonFEA, { title: "Search", variant: "ghost", onPress: function () { return null; } }),
108
+ React.createElement(components_1.ButtonFEA, { title: "Profile", variant: "ghost", onPress: function () { return null; } })),
109
+ React.createElement(components_1.CardFEA, null,
110
+ React.createElement(components_1.TypographyFEA, { variant: "h2" }, "Overlays"),
111
+ React.createElement(react_native_1.View, { style: { marginTop: 10, gap: 8 } },
112
+ React.createElement(components_1.ButtonFEA, { title: "Open Dialog", onPress: function () { return setDialogOpen(true); } }),
113
+ React.createElement(components_1.ButtonFEA, { title: "Open Modal", variant: "outline", onPress: function () { return setModalOpen(true); } }))),
114
+ React.createElement(components_1.BottomSheetFEA, null,
115
+ React.createElement(components_1.TypographyFEA, { variant: "small" }, "BottomSheet preview area"))),
116
+ React.createElement(components_1.DialogFEA, { open: dialogOpen, onOpenChange: setDialogOpen },
117
+ React.createElement(components_1.DialogHeaderFEA, null,
118
+ React.createElement(components_1.TypographyFEA, { variant: "h3" }, "Confirm Action"),
119
+ React.createElement(components_1.TypographyFEA, { variant: "muted" }, "This is a shadcn-style dialog on React Native.")),
120
+ React.createElement(components_1.DialogFooterFEA, null,
121
+ React.createElement(components_1.ButtonFEA, { title: "Cancel", variant: "ghost", onPress: function () { return setDialogOpen(false); } }),
122
+ React.createElement(components_1.ButtonFEA, { title: "Continue", onPress: function () { return setDialogOpen(false); } }))),
123
+ React.createElement(components_1.ModalFEA, { visible: modalOpen },
124
+ React.createElement(components_1.TypographyFEA, { variant: "h3" }, "Modal Content"),
125
+ React.createElement(components_1.TypographyFEA, { variant: "muted" }, "This is the modal component preview."),
126
+ React.createElement(react_native_1.View, { style: { marginTop: 12 } },
127
+ React.createElement(components_1.ButtonFEA, { title: "Close", onPress: function () { return setModalOpen(false); } })))));
128
+ };
129
+ var Showcase = function () { return (React.createElement(ThemeFEAVUiProvider_1.ThemeFEAVUiProvider, null,
130
+ React.createElement(ShowcaseContent, null))); };
131
+ exports.Showcase = Showcase;
package/package.json CHANGED
@@ -1,14 +1,31 @@
1
1
  {
2
2
  "name": "rn-feav-ui",
3
- "version": "1.0.2",
3
+ "version": "1.0.3",
4
+ "description": "Shadcn-style React Native UI kit with theme support.",
4
5
  "main": "dist/index.js",
5
6
  "types": "dist/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "types": "./dist/index.d.ts",
10
+ "default": "./dist/index.js"
11
+ }
12
+ },
13
+ "react-native": "dist/index.js",
14
+ "sideEffects": false,
6
15
  "files": [
7
16
  "dist"
8
17
  ],
9
- "scripts": {
10
- "build": "tsc"
11
- },
18
+ "scripts": {
19
+ "build": "tsc",
20
+ "dev": "tsc --watch",
21
+ "prepublishOnly": "npm run build"
22
+ },
23
+ "keywords": [
24
+ "react-native",
25
+ "ui-kit",
26
+ "components",
27
+ "shadcn"
28
+ ],
12
29
  "peerDependencies": {
13
30
  "expo-linear-gradient": ">=55.0.11",
14
31
  "react": ">=18",
package/readme.md CHANGED
@@ -1,21 +1,87 @@
1
- # 🌈 RN FEAV UI
1
+ # rn-feav-ui
2
2
 
3
- Modern **Glassmorphism + Soft UI** component library for React Native
4
- Lightweight • Beautiful • Dark Mode Ready
3
+ Shadcn-style React Native UI kit with theme support (light/dark).
5
4
 
6
- ---
5
+ ## Features
7
6
 
8
- ## Features
7
+ - Simple, consistent “shadcn-like” components (Button/Input/Card/etc.)
8
+ - Light/Dark mode via `ThemeFEAVUiProvider`
9
+ - Pure React Native primitives (minimal native dependencies)
9
10
 
10
- - 🧊 Glassmorphism UI (no blur, performance friendly)
11
- - 🌗 Light / Dark mode support
12
- - 🎨 Soft UI (neumorphism)
13
- - ⚡ Pure React Native (no native dependency)
14
- - 🎯 Easy to customize theme
11
+ ## Installation
15
12
 
16
- ---
13
+ ```bash
14
+ npm install rn-feav-ui
15
+ ```
17
16
 
18
- ## 📦 Installation
17
+ ### TypeScript IntelliSense (auto-complete)
19
18
 
20
- ```bash
21
- npm install rn-feav-ui
19
+ Thư viện đã cấu hình `types`/`exports` nên bạn có thể import trực tiếp từ package root để IDE gợi ý component:
20
+
21
+ ```ts
22
+ import { ButtonFEA, InputFEA, CardFEA, ThemeFEAVUiProvider } from "rn-feav-ui";
23
+ ```
24
+
25
+ ## Usage
26
+
27
+ Wrap your app with the theme provider:
28
+
29
+ ```tsx
30
+ import * as React from "react";
31
+ import { ThemeFEAVUiProvider } from "rn-feav-ui";
32
+
33
+ export default function App() {
34
+ return <ThemeFEAVUiProvider>{/* your screens */}</ThemeFEAVUiProvider>;
35
+ }
36
+ ```
37
+
38
+ Example (Button + Input + Dialog):
39
+
40
+ ```tsx
41
+ import * as React from "react";
42
+ import {
43
+ ButtonFEA,
44
+ InputFEA,
45
+ DialogFEA,
46
+ DialogHeaderFEA,
47
+ DialogFooterFEA,
48
+ TypographyFEA,
49
+ } from "rn-feav-ui";
50
+
51
+ export function Example() {
52
+ const [open, setOpen] = React.useState(false);
53
+
54
+ return (
55
+ <>
56
+ <InputFEA placeholder="Email" />
57
+ <ButtonFEA title="Open dialog" onPress={() => setOpen(true)} />
58
+ <DialogFEA open={open} onOpenChange={setOpen}>
59
+ <DialogHeaderFEA>
60
+ <TypographyFEA variant="h3">Confirm</TypographyFEA>
61
+ </DialogHeaderFEA>
62
+ <DialogFooterFEA>
63
+ <ButtonFEA title="Cancel" variant="ghost" onPress={() => setOpen(false)} />
64
+ <ButtonFEA title="OK" onPress={() => setOpen(false)} />
65
+ </DialogFooterFEA>
66
+ </DialogFEA>
67
+ </>
68
+ );
69
+ }
70
+ ```
71
+
72
+ ## Component List
73
+
74
+ Core components (exported from `rn-feav-ui`):
75
+ - Layout/Surface: `CardFEA`, `GlassCardFEA`, `SeparatorFEA`
76
+ - Navigation/Containers: `NavbarFEA`, `TabBarFEA`, `TabsFEA` (with `TabsListFEA`, `TabsTriggerFEA`, `TabsContentFEA`)
77
+ - Inputs/Form: `InputFEA`, `TextareaFEA`, `LabelFEA`, `CheckboxFEA`, `SwitchFEA`
78
+ - Feedback: `AlertFEA`, `ProgressFEA`, `SkeletonFEA`
79
+ - Data display: `AvatarFEA`, `ListItemFEA`, `BadgeFEA`
80
+ - Overlays: `ModalFEA`, `BottomSheetFEA`, `DialogFEA` (with `DialogHeaderFEA`, `DialogFooterFEA`)
81
+ - Misc: `AccordionFEA`, `TypographyFEA`, `ButtonFEA`
82
+
83
+ ## Showcase
84
+
85
+ There is a full demo inside the repo at:
86
+
87
+ - `src/examples/Showcase.tsx`