rn-feav-ui 1.0.6 → 1.0.8

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.
@@ -1,2 +1,10 @@
1
1
  import * as React from "react";
2
- export declare const Showcase: () => React.JSX.Element;
2
+ import { ViewStyle } from "react-native";
3
+ type ShowcaseScreenPropsFEA = {
4
+ contentContainerStyle?: ViewStyle;
5
+ };
6
+ export declare const ShowcaseScreenFEA: ({ contentContainerStyle }: ShowcaseScreenPropsFEA) => React.JSX.Element;
7
+ export declare const ShowcaseWithProviderFEA: (props: ShowcaseScreenPropsFEA) => React.JSX.Element;
8
+ export declare const ShowcaseFEA: (props: ShowcaseScreenPropsFEA) => React.JSX.Element;
9
+ export declare const Showcase: (props: ShowcaseScreenPropsFEA) => React.JSX.Element;
10
+ export {};
@@ -1,4 +1,15 @@
1
1
  "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
2
13
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
14
  if (k2 === undefined) k2 = k;
4
15
  var desc = Object.getOwnPropertyDescriptor(m, k);
@@ -33,212 +44,207 @@ var __importStar = (this && this.__importStar) || (function () {
33
44
  };
34
45
  })();
35
46
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.Showcase = void 0;
47
+ exports.Showcase = exports.ShowcaseFEA = exports.ShowcaseWithProviderFEA = exports.ShowcaseScreenFEA = void 0;
37
48
  var React = __importStar(require("react"));
38
49
  var react_native_1 = require("react-native");
39
50
  var ThemeFEAVUiProvider_1 = require("../theme/ThemeFEAVUiProvider");
40
51
  var components_1 = require("../components");
41
- var ShowcaseContent = function () {
42
- var _a = (0, ThemeFEAVUiProvider_1.useTheme)(), theme = _a.theme, toggleTheme = _a.toggleTheme;
52
+ var SectionFEA = function (_a) {
53
+ var title = _a.title, children = _a.children;
54
+ return (React.createElement(components_1.CardFEA, null,
55
+ React.createElement(components_1.TypographyFEA, { variant: "h2" }, title),
56
+ React.createElement(react_native_1.View, { style: styles.sectionBody }, children)));
57
+ };
58
+ var ShowcaseScreenFEA = function (_a) {
59
+ var contentContainerStyle = _a.contentContainerStyle;
60
+ var _b = (0, ThemeFEAVUiProvider_1.useTheme)(), theme = _b.theme, toggleTheme = _b.toggleTheme;
43
61
  var toast = (0, components_1.useToastFEA)().toast;
44
- var _b = React.useState(true), checked = _b[0], setChecked = _b[1];
45
- var _c = React.useState(false), switchOn = _c[0], setSwitchOn = _c[1];
46
- var _d = React.useState(false), dialogOpen = _d[0], setDialogOpen = _d[1];
47
- var _e = React.useState(false), modalOpen = _e[0], setModalOpen = _e[1];
48
- var _f = React.useState(false), sheetOpen = _f[0], setSheetOpen = _f[1];
49
- var _g = React.useState(false), drawerOpen = _g[0], setDrawerOpen = _g[1];
50
- var _h = React.useState(false), alertDialogOpen = _h[0], setAlertDialogOpen = _h[1];
51
- var _j = React.useState(false), popoverOpen = _j[0], setPopoverOpen = _j[1];
52
- var _k = React.useState(false), menuOpen = _k[0], setMenuOpen = _k[1];
53
- var _l = React.useState(false), commandOpen = _l[0], setCommandOpen = _l[1];
54
- var _m = React.useState("dashboard"), sidebarValue = _m[0], setSidebarValue = _m[1];
55
- var _o = React.useState("home"), navValue = _o[0], setNavValue = _o[1];
56
- var _p = React.useState(3), page = _p[0], setPage = _p[1];
57
- var _q = React.useState("personal"), radio = _q[0], setRadio = _q[1];
58
- var _r = React.useState(undefined), selectValue = _r[0], setSelectValue = _r[1];
59
- var _s = React.useState(undefined), comboValue = _s[0], setComboValue = _s[1];
60
- var _t = React.useState(""), otp = _t[0], setOtp = _t[1];
61
- var _u = React.useState(new Date()), date = _u[0], setDate = _u[1];
62
- var _v = React.useState(false), collapseOpen = _v[0], setCollapseOpen = _v[1];
63
- var _w = React.useState(false), togglePressed = _w[0], setTogglePressed = _w[1];
64
- var _x = React.useState("left"), toggleGroupValue = _x[0], setToggleGroupValue = _x[1];
65
- var _y = React.useState(35), sliderValue = _y[0], setSliderValue = _y[1];
66
- return (React.createElement(react_native_1.View, { style: { flex: 1, backgroundColor: theme.colors.background } },
67
- React.createElement(components_1.ScrollAreaFEA, { contentContainerStyle: { padding: 16, gap: 14 } },
68
- React.createElement(components_1.NavbarFEA, { title: "FEA Full Showcase" }),
69
- React.createElement(components_1.CardFEA, null,
70
- React.createElement(components_1.TypographyFEA, { variant: "h2" }, "Theme + Feedback"),
62
+ var _c = React.useState(true), checked = _c[0], setChecked = _c[1];
63
+ var _d = React.useState(false), switchOn = _d[0], setSwitchOn = _d[1];
64
+ var _e = React.useState(false), dialogOpen = _e[0], setDialogOpen = _e[1];
65
+ var _f = React.useState(false), modalOpen = _f[0], setModalOpen = _f[1];
66
+ var _g = React.useState(false), sheetOpen = _g[0], setSheetOpen = _g[1];
67
+ var _h = React.useState(false), drawerOpen = _h[0], setDrawerOpen = _h[1];
68
+ var _j = React.useState(false), alertDialogOpen = _j[0], setAlertDialogOpen = _j[1];
69
+ var _k = React.useState(false), popoverOpen = _k[0], setPopoverOpen = _k[1];
70
+ var _l = React.useState(false), menuOpen = _l[0], setMenuOpen = _l[1];
71
+ var _m = React.useState(false), commandOpen = _m[0], setCommandOpen = _m[1];
72
+ var _o = React.useState("dashboard"), sidebarValue = _o[0], setSidebarValue = _o[1];
73
+ var _p = React.useState("home"), navValue = _p[0], setNavValue = _p[1];
74
+ var _q = React.useState(3), page = _q[0], setPage = _q[1];
75
+ var _r = React.useState("personal"), radio = _r[0], setRadio = _r[1];
76
+ var _s = React.useState(undefined), selectValue = _s[0], setSelectValue = _s[1];
77
+ var _t = React.useState(undefined), comboValue = _t[0], setComboValue = _t[1];
78
+ var _u = React.useState(""), otp = _u[0], setOtp = _u[1];
79
+ var _v = React.useState(new Date()), date = _v[0], setDate = _v[1];
80
+ var _w = React.useState(false), collapseOpen = _w[0], setCollapseOpen = _w[1];
81
+ var _x = React.useState(false), togglePressed = _x[0], setTogglePressed = _x[1];
82
+ var _y = React.useState("left"), toggleGroupValue = _y[0], setToggleGroupValue = _y[1];
83
+ var _z = React.useState(35), sliderValue = _z[0], setSliderValue = _z[1];
84
+ return (React.createElement(react_native_1.View, { style: [styles.screen, { backgroundColor: theme.colors.background }] },
85
+ React.createElement(components_1.ScrollAreaFEA, { contentContainerStyle: [styles.container, contentContainerStyle] },
86
+ React.createElement(components_1.NavbarFEA, { title: "FEA UI Showcase" }),
87
+ React.createElement(SectionFEA, { title: "Theme + Feedback" },
71
88
  React.createElement(components_1.TypographyFEA, { variant: "muted" },
72
- "Current: ",
89
+ "Current theme: ",
73
90
  theme.mode),
74
- React.createElement(react_native_1.View, { style: { marginTop: 10, gap: 8 } },
91
+ React.createElement(react_native_1.View, { style: styles.stackSm },
75
92
  React.createElement(components_1.ButtonFEA, { title: "Toggle Theme", variant: "outline", onPress: toggleTheme }),
76
93
  React.createElement(components_1.ThemeSwitchFEA, null),
77
- React.createElement(components_1.ButtonFEA, { title: "Toast", onPress: function () { return toast({ title: "Saved", description: "Your changes are saved." }); } }))),
78
- React.createElement(components_1.CardFEA, null,
79
- React.createElement(components_1.TypographyFEA, { variant: "h2" }, "Core"),
80
- React.createElement(react_native_1.View, { style: { marginTop: 10, gap: 10 } },
81
- React.createElement(react_native_1.View, { style: { flexDirection: "row", gap: 8 } },
82
- React.createElement(components_1.AvatarFEA, { fallback: "NT" }),
83
- React.createElement(components_1.AvatarFEA, { fallback: "UI", size: 32 }),
84
- React.createElement(components_1.BadgeFEA, { label: "Beta" }),
85
- React.createElement(components_1.KbdFEA, null, "Cmd+K")),
86
- React.createElement(components_1.ButtonFEA, { title: "Primary", onPress: function () { return null; } }),
87
- React.createElement(components_1.ButtonFEA, { title: "Outline", variant: "outline", onPress: function () { return null; } }),
88
- React.createElement(components_1.ProgressFEA, { value: 66 }),
89
- React.createElement(components_1.SkeletonFEA, { height: 38 }),
90
- React.createElement(components_1.EmptyFEA, { title: "No notifications", description: "Everything is clean." }))),
91
- React.createElement(components_1.CardFEA, null,
92
- React.createElement(components_1.TypographyFEA, { variant: "h2" }, "Form"),
93
- React.createElement(react_native_1.View, { style: { marginTop: 10, gap: 10 } },
94
- React.createElement(components_1.FieldFEA, { label: "Username", description: "This will be visible publicly" },
95
- React.createElement(components_1.InputFEA, { placeholder: "nura.trong" })),
96
- React.createElement(components_1.FieldFEA, { label: "Bio" },
97
- React.createElement(components_1.TextareaFEA, { placeholder: "Write something..." })),
98
- React.createElement(react_native_1.View, { style: { gap: 8 } },
99
- React.createElement(components_1.CheckboxFEA, { checked: checked, onChange: setChecked, label: "Accept terms" }),
100
- React.createElement(components_1.SwitchFEA, { value: switchOn, onValueChange: setSwitchOn, label: "Enable notifications" }),
101
- React.createElement(components_1.RadioGroupFEA, { value: radio, onValueChange: setRadio, options: [
102
- { label: "Personal", value: "personal" },
103
- { label: "Business", value: "business" },
104
- ] })),
105
- React.createElement(components_1.NativeSelectFEA, { value: selectValue, onValueChange: setSelectValue, options: [
106
- { label: "Vietnam", value: "vn" },
107
- { label: "Japan", value: "jp" },
108
- { label: "US", value: "us" },
109
- ] }),
110
- React.createElement(components_1.SelectFEA, { value: selectValue, onValueChange: setSelectValue, options: [
111
- { label: "Vietnam", value: "vn" },
112
- { label: "Japan", value: "jp" },
113
- { label: "US", value: "us" },
114
- ] }),
115
- React.createElement(components_1.ComboboxFEA, { value: comboValue, onValueChange: setComboValue, options: [
116
- { label: "React Native", value: "rn" },
117
- { label: "TypeScript", value: "ts" },
118
- { label: "Expo", value: "expo" },
119
- ] }),
120
- React.createElement(components_1.InputOTPFEA, { value: otp, onChange: setOtp }))),
121
- React.createElement(components_1.CardFEA, null,
122
- React.createElement(components_1.TypographyFEA, { variant: "h2" }, "Navigation"),
123
- React.createElement(react_native_1.View, { style: { marginTop: 10, gap: 10 } },
124
- React.createElement(components_1.BreadcrumbFEA, { items: [
125
- { label: "Home", onPress: function () { return null; } },
126
- { label: "Docs", onPress: function () { return null; } },
127
- { label: "Components" },
128
- ] }),
129
- React.createElement(components_1.NavigationMenuFEA, { value: navValue, onValueChange: setNavValue, items: [
130
- { label: "Home", value: "home" },
131
- { label: "Pricing", value: "pricing" },
132
- { label: "About", value: "about" },
133
- ] }),
134
- React.createElement(components_1.MenubarFEA, { items: [
135
- {
136
- label: "File",
137
- items: [{ label: "New" }, { label: "Open" }, { label: "Save" }],
138
- },
139
- {
140
- label: "Edit",
141
- items: [{ label: "Undo" }, { label: "Redo" }],
142
- },
143
- ] }),
144
- React.createElement(components_1.PaginationFEA, { page: page, pageCount: 12, onPageChange: setPage }))),
145
- React.createElement(components_1.CardFEA, null,
146
- React.createElement(components_1.TypographyFEA, { variant: "h2" }, "Data Display"),
147
- React.createElement(react_native_1.View, { style: { marginTop: 10, gap: 12 } },
148
- React.createElement(components_1.TableFEA, null,
149
- React.createElement(components_1.TableHeadFEA, null,
150
- React.createElement(react_native_1.View, { style: { flexDirection: "row" } },
151
- React.createElement(components_1.TableCellFEA, { flex: 2 }, "Name"),
152
- React.createElement(components_1.TableCellFEA, null, "Status"))),
153
- React.createElement(components_1.SeparatorFEA, null),
154
- React.createElement(components_1.TableRowFEA, null,
155
- React.createElement(components_1.TableCellFEA, { flex: 2 }, "Nura"),
156
- React.createElement(components_1.TableCellFEA, null, "Active"))),
157
- React.createElement(components_1.DataTableFEA, { columns: [
158
- { key: "name", header: "Name", flex: 2 },
159
- { key: "role", header: "Role" },
160
- ], data: [
161
- { name: "Alice", role: "Admin" },
162
- { name: "Bob", role: "Editor" },
163
- ], rowKey: function (row) { return row.name; } }),
164
- React.createElement(components_1.CalendarFEA, { value: date, onChange: setDate }),
165
- React.createElement(components_1.ChartFEA, { title: "Sales", data: [
166
- { label: "Mon", value: 12 },
167
- { label: "Tue", value: 8 },
168
- { label: "Wed", value: 15 },
169
- { label: "Thu", value: 10 },
170
- { label: "Fri", value: 18 },
171
- ] }))),
172
- React.createElement(components_1.CardFEA, null,
173
- React.createElement(components_1.TypographyFEA, { variant: "h2" }, "Interaction"),
174
- React.createElement(react_native_1.View, { style: { marginTop: 10, gap: 10 } },
175
- React.createElement(components_1.CollapsibleFEA, { open: collapseOpen, onOpenChange: setCollapseOpen, trigger: React.createElement(components_1.CollapsibleTriggerFEA, { title: "Collapsible Section", open: collapseOpen, onPress: function () { return setCollapseOpen(function (v) { return !v; }); } }) },
176
- React.createElement(components_1.TypographyFEA, { variant: "p" }, "Hidden content here.")),
177
- React.createElement(react_native_1.View, { style: { flexDirection: "row", gap: 8, flexWrap: "wrap" } },
178
- React.createElement(components_1.ToggleFEA, { pressed: togglePressed, onPressedChange: setTogglePressed }, "Toggle"),
179
- React.createElement(components_1.ToggleGroupFEA, { type: "single", value: toggleGroupValue, onValueChange: setToggleGroupValue, items: [
180
- { label: "Left", value: "left" },
181
- { label: "Center", value: "center" },
182
- { label: "Right", value: "right" },
183
- ] })),
184
- React.createElement(components_1.SliderFEA, { value: sliderValue, onValueChange: setSliderValue }),
185
- React.createElement(components_1.TypographyFEA, { variant: "small" },
186
- "Slider value: ",
187
- Math.round(sliderValue)),
188
- React.createElement(components_1.CarouselFEA, null, [1, 2, 3].map(function (n) { return (React.createElement(components_1.CardFEA, { key: n },
189
- React.createElement(components_1.TypographyFEA, { variant: "h3" },
190
- "Slide ",
191
- n))); })),
192
- React.createElement(components_1.ResizableFEA, { width: "100%", height: 80 },
193
- React.createElement(components_1.CardFEA, null,
194
- React.createElement(components_1.TypographyFEA, { variant: "small" }, "Resizable Area"))))),
195
- React.createElement(components_1.CardFEA, null,
196
- React.createElement(components_1.TypographyFEA, { variant: "h2" }, "Overlay & Menu"),
197
- React.createElement(react_native_1.View, { style: { marginTop: 10, gap: 8 } },
198
- React.createElement(components_1.PopoverFEA, { open: popoverOpen, onOpenChange: setPopoverOpen, trigger: React.createElement(components_1.ButtonFEA, { title: "Open Popover", onPress: function () { return setPopoverOpen(true); } }) },
199
- React.createElement(components_1.TypographyFEA, { variant: "p" }, "Popover content")),
200
- React.createElement(components_1.DropdownMenuFEA, { open: menuOpen, onOpenChange: setMenuOpen, trigger: React.createElement(components_1.ButtonFEA, { title: "Open Dropdown", onPress: function () { return setMenuOpen(true); } }), items: [
201
- { label: "Profile", onSelect: function () { return null; } },
202
- { label: "Settings", onSelect: function () { return null; } },
203
- { label: "Delete", destructive: true, onSelect: function () { return null; } },
204
- ] }),
205
- React.createElement(components_1.CommandFEA, { open: commandOpen, onOpenChange: setCommandOpen, trigger: React.createElement(components_1.ButtonFEA, { title: "Open Command", onPress: function () { return setCommandOpen(true); } }), items: [
206
- { label: "Go to dashboard", value: "dashboard" },
207
- { label: "Open profile", value: "profile" },
208
- { label: "Open settings", value: "settings" },
209
- ] }),
210
- React.createElement(react_native_1.View, { style: { flexDirection: "row", gap: 8, flexWrap: "wrap" } },
211
- React.createElement(components_1.TooltipFEA, { text: "Tooltip example" },
212
- React.createElement(components_1.ButtonFEA, { title: "Tooltip", variant: "outline", onPress: function () { return null; } })),
213
- React.createElement(components_1.HoverCardFEA, { text: "Hover card style info" },
214
- React.createElement(components_1.ButtonFEA, { title: "HoverCard", variant: "outline", onPress: function () { return null; } })),
215
- React.createElement(components_1.ButtonFEA, { title: "Open Dialog", onPress: function () { return setDialogOpen(true); } }),
216
- React.createElement(components_1.ButtonFEA, { title: "Open AlertDialog", variant: "outline", onPress: function () { return setAlertDialogOpen(true); } }),
217
- React.createElement(components_1.ButtonFEA, { title: "Open Modal", variant: "outline", onPress: function () { return setModalOpen(true); } }),
218
- React.createElement(components_1.ButtonFEA, { title: "Open Sheet", variant: "outline", onPress: function () { return setSheetOpen(true); } }),
219
- React.createElement(components_1.ButtonFEA, { title: "Open Drawer", variant: "outline", onPress: function () { return setDrawerOpen(true); } }),
220
- React.createElement(components_1.ButtonFEA, { title: "Open Sidebar", variant: "outline", onPress: function () { return setDrawerOpen(true); } })))),
221
- React.createElement(components_1.CardFEA, null,
222
- React.createElement(components_1.TypographyFEA, { variant: "h2" }, "Legacy / Existing"),
223
- React.createElement(react_native_1.View, { style: { marginTop: 10, gap: 8 } },
224
- React.createElement(components_1.TabsFEA, { defaultValue: "account" },
225
- React.createElement(components_1.TabsListFEA, null,
226
- React.createElement(components_1.TabsTriggerFEA, { value: "account" }, "Account"),
227
- React.createElement(components_1.TabsTriggerFEA, { value: "password" }, "Password")),
228
- React.createElement(components_1.TabsContentFEA, { value: "account" },
229
- React.createElement(components_1.TypographyFEA, { variant: "p" }, "Account content.")),
230
- React.createElement(components_1.TabsContentFEA, { value: "password" },
231
- React.createElement(components_1.TypographyFEA, { variant: "p" }, "Password content."))),
232
- React.createElement(components_1.ListItemFEA, { title: "List title", subtitle: "Supporting text." }),
233
- React.createElement(components_1.TabBarFEA, null,
234
- React.createElement(components_1.ButtonFEA, { title: "Home", variant: "ghost", onPress: function () { return null; } }),
235
- React.createElement(components_1.ButtonFEA, { title: "Search", variant: "ghost", onPress: function () { return null; } }),
236
- React.createElement(components_1.ButtonFEA, { title: "Profile", variant: "ghost", onPress: function () { return null; } })),
237
- React.createElement(components_1.BottomSheetFEA, null,
238
- React.createElement(components_1.TypographyFEA, { variant: "small" }, "BottomSheet preview")))),
94
+ React.createElement(components_1.ButtonFEA, { title: "Show Toast", onPress: function () { return toast({ title: "Saved", description: "Your changes were saved." }); } }))),
95
+ React.createElement(SectionFEA, { title: "Core" },
96
+ React.createElement(react_native_1.View, { style: styles.rowWrap },
97
+ React.createElement(components_1.AvatarFEA, { fallback: "NT" }),
98
+ React.createElement(components_1.AvatarFEA, { fallback: "UI", size: 32 }),
99
+ React.createElement(components_1.BadgeFEA, { label: "Beta" }),
100
+ React.createElement(components_1.KbdFEA, null, "Cmd+K")),
101
+ React.createElement(components_1.ButtonFEA, { title: "Primary", onPress: function () { return null; } }),
102
+ React.createElement(components_1.ButtonFEA, { title: "Outline", variant: "outline", onPress: function () { return null; } }),
103
+ React.createElement(components_1.ProgressFEA, { value: 66 }),
104
+ React.createElement(components_1.SkeletonFEA, { height: 38 }),
105
+ React.createElement(components_1.EmptyFEA, { title: "No notifications", description: "Everything is clean." })),
106
+ React.createElement(SectionFEA, { title: "Form" },
107
+ React.createElement(components_1.FieldFEA, { label: "Username", description: "This will be visible publicly" },
108
+ React.createElement(components_1.InputFEA, { placeholder: "nura.trong" })),
109
+ React.createElement(components_1.FieldFEA, { label: "Bio" },
110
+ React.createElement(components_1.TextareaFEA, { placeholder: "Write something..." })),
111
+ React.createElement(react_native_1.View, { style: styles.stackSm },
112
+ React.createElement(components_1.CheckboxFEA, { checked: checked, onChange: setChecked, label: "Accept terms" }),
113
+ React.createElement(components_1.SwitchFEA, { value: switchOn, onValueChange: setSwitchOn, label: "Enable notifications" }),
114
+ React.createElement(components_1.RadioGroupFEA, { value: radio, onValueChange: setRadio, options: [
115
+ { label: "Personal", value: "personal" },
116
+ { label: "Business", value: "business" },
117
+ ] })),
118
+ React.createElement(components_1.NativeSelectFEA, { value: selectValue, onValueChange: setSelectValue, options: [
119
+ { label: "Vietnam", value: "vn" },
120
+ { label: "Japan", value: "jp" },
121
+ { label: "US", value: "us" },
122
+ ] }),
123
+ React.createElement(components_1.SelectFEA, { value: selectValue, onValueChange: setSelectValue, options: [
124
+ { label: "Vietnam", value: "vn" },
125
+ { label: "Japan", value: "jp" },
126
+ { label: "US", value: "us" },
127
+ ] }),
128
+ React.createElement(components_1.ComboboxFEA, { value: comboValue, onValueChange: setComboValue, options: [
129
+ { label: "React Native", value: "rn" },
130
+ { label: "TypeScript", value: "ts" },
131
+ { label: "Expo", value: "expo" },
132
+ ] }),
133
+ React.createElement(components_1.InputOTPFEA, { value: otp, onChange: setOtp })),
134
+ React.createElement(SectionFEA, { title: "Navigation" },
135
+ React.createElement(components_1.BreadcrumbFEA, { items: [
136
+ { label: "Home", onPress: function () { return null; } },
137
+ { label: "Docs", onPress: function () { return null; } },
138
+ { label: "Components" },
139
+ ] }),
140
+ React.createElement(components_1.NavigationMenuFEA, { value: navValue, onValueChange: setNavValue, items: [
141
+ { label: "Home", value: "home" },
142
+ { label: "Pricing", value: "pricing" },
143
+ { label: "About", value: "about" },
144
+ ] }),
145
+ React.createElement(components_1.MenubarFEA, { items: [
146
+ {
147
+ label: "File",
148
+ items: [{ label: "New" }, { label: "Open" }, { label: "Save" }],
149
+ },
150
+ {
151
+ label: "Edit",
152
+ items: [{ label: "Undo" }, { label: "Redo" }],
153
+ },
154
+ ] }),
155
+ React.createElement(components_1.PaginationFEA, { page: page, pageCount: 12, onPageChange: setPage })),
156
+ React.createElement(SectionFEA, { title: "Data Display" },
157
+ React.createElement(components_1.TableFEA, null,
158
+ React.createElement(components_1.TableHeadFEA, null,
159
+ React.createElement(react_native_1.View, { style: styles.row },
160
+ React.createElement(components_1.TableCellFEA, { flex: 2 }, "Name"),
161
+ React.createElement(components_1.TableCellFEA, null, "Status"))),
162
+ React.createElement(components_1.SeparatorFEA, null),
163
+ React.createElement(components_1.TableRowFEA, null,
164
+ React.createElement(components_1.TableCellFEA, { flex: 2 }, "Nura"),
165
+ React.createElement(components_1.TableCellFEA, null, "Active"))),
166
+ React.createElement(components_1.DataTableFEA, { columns: [
167
+ { key: "name", header: "Name", flex: 2 },
168
+ { key: "role", header: "Role" },
169
+ ], data: [
170
+ { name: "Alice", role: "Admin" },
171
+ { name: "Bob", role: "Editor" },
172
+ ], rowKey: function (row) { return row.name; } }),
173
+ React.createElement(components_1.CalendarFEA, { value: date, onChange: setDate }),
174
+ React.createElement(components_1.ChartFEA, { title: "Sales", data: [
175
+ { label: "Mon", value: 12 },
176
+ { label: "Tue", value: 8 },
177
+ { label: "Wed", value: 15 },
178
+ { label: "Thu", value: 10 },
179
+ { label: "Fri", value: 18 },
180
+ ] })),
181
+ React.createElement(SectionFEA, { title: "Interaction" },
182
+ React.createElement(components_1.AccordionFEA, { title: "Accordion Item" },
183
+ React.createElement(components_1.TypographyFEA, { variant: "small" }, "Accordion content here.")),
184
+ React.createElement(components_1.CollapsibleFEA, { open: collapseOpen, onOpenChange: setCollapseOpen, trigger: React.createElement(components_1.CollapsibleTriggerFEA, { title: "Collapsible Section", open: collapseOpen, onPress: function () { return setCollapseOpen(function (v) { return !v; }); } }) },
185
+ React.createElement(components_1.TypographyFEA, { variant: "p" }, "Hidden content here.")),
186
+ React.createElement(react_native_1.View, { style: styles.rowWrap },
187
+ React.createElement(components_1.ToggleFEA, { pressed: togglePressed, onPressedChange: setTogglePressed }, "Toggle"),
188
+ React.createElement(components_1.ToggleGroupFEA, { type: "single", value: toggleGroupValue, onValueChange: setToggleGroupValue, items: [
189
+ { label: "Left", value: "left" },
190
+ { label: "Center", value: "center" },
191
+ { label: "Right", value: "right" },
192
+ ] })),
193
+ React.createElement(components_1.SliderFEA, { value: sliderValue, onValueChange: setSliderValue }),
194
+ React.createElement(components_1.TypographyFEA, { variant: "small" },
195
+ "Slider value: ",
196
+ Math.round(sliderValue)),
197
+ React.createElement(components_1.CarouselFEA, null, [1, 2, 3].map(function (n) { return (React.createElement(components_1.CardFEA, { key: n },
198
+ React.createElement(components_1.TypographyFEA, { variant: "h3" },
199
+ "Slide ",
200
+ n))); })),
201
+ React.createElement(components_1.ResizableFEA, { width: "100%", height: 80 },
202
+ React.createElement(components_1.CardFEA, null,
203
+ React.createElement(components_1.TypographyFEA, { variant: "small" }, "Resizable Area")))),
204
+ React.createElement(SectionFEA, { title: "Overlay + Menu" },
205
+ React.createElement(components_1.PopoverFEA, { open: popoverOpen, onOpenChange: setPopoverOpen, trigger: React.createElement(components_1.ButtonFEA, { title: "Open Popover", onPress: function () { return setPopoverOpen(true); } }) },
206
+ React.createElement(components_1.TypographyFEA, { variant: "p" }, "Popover content")),
207
+ React.createElement(components_1.DropdownMenuFEA, { open: menuOpen, onOpenChange: setMenuOpen, trigger: React.createElement(components_1.ButtonFEA, { title: "Open Dropdown", onPress: function () { return setMenuOpen(true); } }), items: [
208
+ { label: "Profile", onSelect: function () { return null; } },
209
+ { label: "Settings", onSelect: function () { return null; } },
210
+ { label: "Delete", destructive: true, onSelect: function () { return null; } },
211
+ ] }),
212
+ React.createElement(components_1.CommandFEA, { open: commandOpen, onOpenChange: setCommandOpen, trigger: React.createElement(components_1.ButtonFEA, { title: "Open Command", onPress: function () { return setCommandOpen(true); } }), items: [
213
+ { label: "Go to dashboard", value: "dashboard" },
214
+ { label: "Open profile", value: "profile" },
215
+ { label: "Open settings", value: "settings" },
216
+ ] }),
217
+ React.createElement(react_native_1.View, { style: styles.rowWrap },
218
+ React.createElement(components_1.TooltipFEA, { text: "Tooltip example" },
219
+ React.createElement(components_1.ButtonFEA, { title: "Tooltip", variant: "outline", onPress: function () { return null; } })),
220
+ React.createElement(components_1.HoverCardFEA, { text: "Hover card style info" },
221
+ React.createElement(components_1.ButtonFEA, { title: "HoverCard", variant: "outline", onPress: function () { return null; } })),
222
+ React.createElement(components_1.ButtonFEA, { title: "Open Dialog", onPress: function () { return setDialogOpen(true); } }),
223
+ React.createElement(components_1.ButtonFEA, { title: "Open AlertDialog", variant: "outline", onPress: function () { return setAlertDialogOpen(true); } }),
224
+ React.createElement(components_1.ButtonFEA, { title: "Open Modal", variant: "outline", onPress: function () { return setModalOpen(true); } }),
225
+ React.createElement(components_1.ButtonFEA, { title: "Open Sheet", variant: "outline", onPress: function () { return setSheetOpen(true); } }),
226
+ React.createElement(components_1.ButtonFEA, { title: "Open Drawer", variant: "outline", onPress: function () { return setDrawerOpen(true); } }),
227
+ React.createElement(components_1.ButtonFEA, { title: "Open Sidebar", variant: "outline", onPress: function () { return setDrawerOpen(true); } }))),
228
+ React.createElement(SectionFEA, { title: "Legacy + Existing" },
229
+ React.createElement(components_1.TabsFEA, { defaultValue: "account" },
230
+ React.createElement(components_1.TabsListFEA, null,
231
+ React.createElement(components_1.TabsTriggerFEA, { value: "account" }, "Account"),
232
+ React.createElement(components_1.TabsTriggerFEA, { value: "password" }, "Password")),
233
+ React.createElement(components_1.TabsContentFEA, { value: "account" },
234
+ React.createElement(components_1.TypographyFEA, { variant: "p" }, "Account content.")),
235
+ React.createElement(components_1.TabsContentFEA, { value: "password" },
236
+ React.createElement(components_1.TypographyFEA, { variant: "p" }, "Password content."))),
237
+ React.createElement(components_1.ListItemFEA, { title: "List title", subtitle: "Supporting text." }),
238
+ React.createElement(components_1.LabelFEA, { required: true }, "Required label sample"),
239
+ React.createElement(components_1.TabBarFEA, null,
240
+ React.createElement(components_1.ButtonFEA, { title: "Home", variant: "ghost", onPress: function () { return null; } }),
241
+ React.createElement(components_1.ButtonFEA, { title: "Search", variant: "ghost", onPress: function () { return null; } }),
242
+ React.createElement(components_1.ButtonFEA, { title: "Profile", variant: "ghost", onPress: function () { return null; } })),
243
+ React.createElement(components_1.BottomSheetFEA, null,
244
+ React.createElement(components_1.TypographyFEA, { variant: "small" }, "BottomSheet preview"))),
239
245
  React.createElement(components_1.AspectRatioFEA, { ratio: 16 / 9 },
240
- React.createElement(components_1.CardFEA, { style: { flex: 1, justifyContent: "center" } },
241
- React.createElement(components_1.TypographyFEA, { variant: "small" }, "Aspect Ratio 16:9"))),
246
+ React.createElement(components_1.CardFEA, { style: styles.aspectCard },
247
+ React.createElement(components_1.TypographyFEA, { variant: "small" }, "Aspect ratio 16:9"))),
242
248
  React.createElement(components_1.SpinnerFEA, { size: "large" })),
243
249
  React.createElement(components_1.DialogFEA, { open: dialogOpen, onOpenChange: setDialogOpen },
244
250
  React.createElement(components_1.DialogHeaderFEA, null,
@@ -251,7 +257,7 @@ var ShowcaseContent = function () {
251
257
  React.createElement(components_1.ModalFEA, { visible: modalOpen },
252
258
  React.createElement(components_1.TypographyFEA, { variant: "h3" }, "Modal Content"),
253
259
  React.createElement(components_1.TypographyFEA, { variant: "muted" }, "This is modal preview."),
254
- React.createElement(react_native_1.View, { style: { marginTop: 12 } },
260
+ React.createElement(react_native_1.View, { style: styles.stackSm },
255
261
  React.createElement(components_1.ButtonFEA, { title: "Close", onPress: function () { return setModalOpen(false); } }))),
256
262
  React.createElement(components_1.SheetFEA, { open: sheetOpen, onOpenChange: setSheetOpen },
257
263
  React.createElement(components_1.TypographyFEA, { variant: "h3" }, "Sheet"),
@@ -264,7 +270,19 @@ var ShowcaseContent = function () {
264
270
  { label: "Settings", value: "settings" },
265
271
  ] })));
266
272
  };
267
- var Showcase = function () { return (React.createElement(ThemeFEAVUiProvider_1.ThemeFEAVUiProvider, null,
273
+ exports.ShowcaseScreenFEA = ShowcaseScreenFEA;
274
+ var ShowcaseWithProviderFEA = function (props) { return (React.createElement(ThemeFEAVUiProvider_1.ThemeFEAVUiProvider, null,
268
275
  React.createElement(components_1.SonnerFEA, null,
269
- React.createElement(ShowcaseContent, null)))); };
270
- exports.Showcase = Showcase;
276
+ React.createElement(exports.ShowcaseScreenFEA, __assign({}, props))))); };
277
+ exports.ShowcaseWithProviderFEA = ShowcaseWithProviderFEA;
278
+ exports.ShowcaseFEA = exports.ShowcaseWithProviderFEA;
279
+ exports.Showcase = exports.ShowcaseWithProviderFEA;
280
+ var styles = react_native_1.StyleSheet.create({
281
+ screen: { flex: 1 },
282
+ container: { padding: 16, gap: 14 },
283
+ sectionBody: { marginTop: 10, gap: 10 },
284
+ stackSm: { marginTop: 10, gap: 8 },
285
+ row: { flexDirection: "row" },
286
+ rowWrap: { flexDirection: "row", gap: 8, flexWrap: "wrap" },
287
+ aspectCard: { flex: 1, justifyContent: "center" },
288
+ });
@@ -1,9 +1,25 @@
1
1
  import * as React from "react";
2
- import { darkTheme, lightTheme } from './colors';
3
- export declare const ThemeFEAVUiProvider: ({ children }: {
2
+ import { type ThemeFEA } from "./colors";
3
+ type DeepPartial<T> = {
4
+ [K in keyof T]?: T[K] extends object ? DeepPartial<T[K]> : T[K];
5
+ };
6
+ export type ThemeOverridesFEA = {
7
+ light?: DeepPartial<ThemeFEA>;
8
+ dark?: DeepPartial<ThemeFEA>;
9
+ };
10
+ export type ThemeFEAVUiProviderProps = {
4
11
  children: React.ReactNode;
5
- }) => React.JSX.Element;
12
+ /** Default mode for first render (default: `light`). */
13
+ defaultMode?: "light" | "dark";
14
+ /**
15
+ * Override tokens from the app.
16
+ * Example: `{ dark: { colors: { background: "#000" } } }`
17
+ */
18
+ themeOverrides?: ThemeOverridesFEA;
19
+ };
20
+ export declare const ThemeFEAVUiProvider: ({ children, defaultMode, themeOverrides, }: ThemeFEAVUiProviderProps) => React.JSX.Element;
6
21
  export declare const useTheme: () => {
7
- theme: typeof lightTheme | typeof darkTheme;
22
+ theme: ThemeFEA;
8
23
  toggleTheme: () => void;
9
24
  } | null;
25
+ export {};
@@ -1,4 +1,15 @@
1
1
  "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
2
13
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
14
  if (k2 === undefined) k2 = k;
4
15
  var desc = Object.getOwnPropertyDescriptor(m, k);
@@ -37,14 +48,43 @@ exports.useTheme = exports.ThemeFEAVUiProvider = void 0;
37
48
  var React = __importStar(require("react"));
38
49
  var react_1 = require("react");
39
50
  var colors_1 = require("./colors");
51
+ function isPlainObject(value) {
52
+ return typeof value === "object" && value !== null && !Array.isArray(value);
53
+ }
54
+ function deepMergeFEA(base, override) {
55
+ if (!override)
56
+ return base;
57
+ var out = isPlainObject(base) ? __assign({}, base) : base;
58
+ for (var _i = 0, _a = Object.keys(override); _i < _a.length; _i++) {
59
+ var key = _a[_i];
60
+ var overrideValue = override[key];
61
+ if (overrideValue === undefined)
62
+ continue;
63
+ var baseValue = base[key];
64
+ if (isPlainObject(baseValue) && isPlainObject(overrideValue)) {
65
+ out[key] = deepMergeFEA(baseValue, overrideValue);
66
+ }
67
+ else {
68
+ out[key] = overrideValue;
69
+ }
70
+ }
71
+ return out;
72
+ }
40
73
  var ThemeContext = (0, react_1.createContext)(null);
41
74
  var ThemeFEAVUiProvider = function (_a) {
42
- var children = _a.children;
43
- var _b = (0, react_1.useState)(colors_1.lightTheme), theme = _b[0], setTheme = _b[1];
75
+ var children = _a.children, _b = _a.defaultMode, defaultMode = _b === void 0 ? "light" : _b, themeOverrides = _a.themeOverrides;
76
+ var _c = (0, react_1.useState)(defaultMode), mode = _c[0], setMode = _c[1];
77
+ var baseTheme = mode === "light" ? colors_1.lightTheme : colors_1.darkTheme;
78
+ var mergedTheme = (0, react_1.useMemo)(function () {
79
+ var sideOverride = mode === "light" ? themeOverrides === null || themeOverrides === void 0 ? void 0 : themeOverrides.light : themeOverrides === null || themeOverrides === void 0 ? void 0 : themeOverrides.dark;
80
+ var theme = deepMergeFEA(baseTheme, sideOverride);
81
+ // Ensure mode matches the current mode even if override tries to change it.
82
+ return __assign(__assign({}, theme), { mode: mode });
83
+ }, [baseTheme, mode, themeOverrides]);
44
84
  var toggleTheme = function () {
45
- setTheme(theme.mode === 'light' ? colors_1.darkTheme : colors_1.lightTheme);
85
+ setMode(function (prev) { return (prev === "light" ? "dark" : "light"); });
46
86
  };
47
- return (React.createElement(ThemeContext.Provider, { value: { theme: theme, toggleTheme: toggleTheme } }, children));
87
+ return React.createElement(ThemeContext.Provider, { value: { theme: mergedTheme, toggleTheme: toggleTheme } }, children);
48
88
  };
49
89
  exports.ThemeFEAVUiProvider = ThemeFEAVUiProvider;
50
90
  var useTheme = function () { return (0, react_1.useContext)(ThemeContext); };
@@ -1,5 +1,76 @@
1
1
  export declare const lightTheme: {
2
2
  mode: string;
3
+ fontSizes: {
4
+ xs: number;
5
+ sm: number;
6
+ md: number;
7
+ lg: number;
8
+ xl: number;
9
+ "2xl": number;
10
+ "3xl": number;
11
+ "4xl": number;
12
+ "5xl": number;
13
+ };
14
+ lineHeights: {
15
+ xs: number;
16
+ sm: number;
17
+ md: number;
18
+ lg: number;
19
+ xl: number;
20
+ "2xl": number;
21
+ "3xl": number;
22
+ "4xl": number;
23
+ "5xl": number;
24
+ };
25
+ spacing: {
26
+ xs: number;
27
+ sm: number;
28
+ md: number;
29
+ lg: number;
30
+ xl: number;
31
+ "2xl": number;
32
+ "3xl": number;
33
+ };
34
+ radii: {
35
+ sm: number;
36
+ md: number;
37
+ lg: number;
38
+ xl: number;
39
+ full: number;
40
+ };
41
+ fontWeights: {
42
+ normal: number;
43
+ medium: number;
44
+ semibold: number;
45
+ bold: number;
46
+ extrabold: number;
47
+ };
48
+ borderWidths: {
49
+ thin: number;
50
+ thick: number;
51
+ };
52
+ shadows: {
53
+ sm: {
54
+ shadowColor: string;
55
+ shadowOpacity: number;
56
+ shadowRadius: number;
57
+ shadowOffset: {
58
+ width: number;
59
+ height: number;
60
+ };
61
+ elevation: number;
62
+ };
63
+ md: {
64
+ shadowColor: string;
65
+ shadowOpacity: number;
66
+ shadowRadius: number;
67
+ shadowOffset: {
68
+ width: number;
69
+ height: number;
70
+ };
71
+ elevation: number;
72
+ };
73
+ };
3
74
  colors: {
4
75
  background: string;
5
76
  foreground: string;
@@ -21,10 +92,89 @@ export declare const lightTheme: {
21
92
  bg: string;
22
93
  text: string;
23
94
  glass: string;
95
+ accent: string;
96
+ accentForeground: string;
97
+ success: string;
98
+ successForeground: string;
99
+ warning: string;
100
+ warningForeground: string;
101
+ info: string;
102
+ infoForeground: string;
24
103
  };
25
104
  };
26
105
  export declare const darkTheme: {
27
106
  mode: string;
107
+ fontSizes: {
108
+ xs: number;
109
+ sm: number;
110
+ md: number;
111
+ lg: number;
112
+ xl: number;
113
+ "2xl": number;
114
+ "3xl": number;
115
+ "4xl": number;
116
+ "5xl": number;
117
+ };
118
+ lineHeights: {
119
+ xs: number;
120
+ sm: number;
121
+ md: number;
122
+ lg: number;
123
+ xl: number;
124
+ "2xl": number;
125
+ "3xl": number;
126
+ "4xl": number;
127
+ "5xl": number;
128
+ };
129
+ spacing: {
130
+ xs: number;
131
+ sm: number;
132
+ md: number;
133
+ lg: number;
134
+ xl: number;
135
+ "2xl": number;
136
+ "3xl": number;
137
+ };
138
+ radii: {
139
+ sm: number;
140
+ md: number;
141
+ lg: number;
142
+ xl: number;
143
+ full: number;
144
+ };
145
+ fontWeights: {
146
+ normal: number;
147
+ medium: number;
148
+ semibold: number;
149
+ bold: number;
150
+ extrabold: number;
151
+ };
152
+ borderWidths: {
153
+ thin: number;
154
+ thick: number;
155
+ };
156
+ shadows: {
157
+ sm: {
158
+ shadowColor: string;
159
+ shadowOpacity: number;
160
+ shadowRadius: number;
161
+ shadowOffset: {
162
+ width: number;
163
+ height: number;
164
+ };
165
+ elevation: number;
166
+ };
167
+ md: {
168
+ shadowColor: string;
169
+ shadowOpacity: number;
170
+ shadowRadius: number;
171
+ shadowOffset: {
172
+ width: number;
173
+ height: number;
174
+ };
175
+ elevation: number;
176
+ };
177
+ };
28
178
  colors: {
29
179
  background: string;
30
180
  foreground: string;
@@ -46,5 +196,14 @@ export declare const darkTheme: {
46
196
  bg: string;
47
197
  text: string;
48
198
  glass: string;
199
+ accent: string;
200
+ accentForeground: string;
201
+ success: string;
202
+ successForeground: string;
203
+ warning: string;
204
+ warningForeground: string;
205
+ info: string;
206
+ infoForeground: string;
49
207
  };
50
208
  };
209
+ export type ThemeFEA = typeof lightTheme;
@@ -6,6 +6,71 @@ exports.darkTheme = exports.lightTheme = void 0;
6
6
  // ========================================
7
7
  exports.lightTheme = {
8
8
  mode: 'light',
9
+ fontSizes: {
10
+ xs: 12,
11
+ sm: 14,
12
+ md: 16,
13
+ lg: 18,
14
+ xl: 20,
15
+ "2xl": 24,
16
+ "3xl": 30,
17
+ "4xl": 36,
18
+ "5xl": 48,
19
+ },
20
+ lineHeights: {
21
+ xs: 16,
22
+ sm: 20,
23
+ md: 24,
24
+ lg: 28,
25
+ xl: 30,
26
+ "2xl": 32,
27
+ "3xl": 36,
28
+ "4xl": 40,
29
+ "5xl": 52,
30
+ },
31
+ spacing: {
32
+ xs: 2,
33
+ sm: 4,
34
+ md: 8,
35
+ lg: 12,
36
+ xl: 16,
37
+ "2xl": 24,
38
+ "3xl": 32,
39
+ },
40
+ radii: {
41
+ sm: 8,
42
+ md: 12,
43
+ lg: 14,
44
+ xl: 16,
45
+ full: 999,
46
+ },
47
+ fontWeights: {
48
+ normal: 400,
49
+ medium: 500,
50
+ semibold: 600,
51
+ bold: 700,
52
+ extrabold: 800,
53
+ },
54
+ borderWidths: {
55
+ thin: 1,
56
+ thick: 2,
57
+ },
58
+ shadows: {
59
+ sm: {
60
+ shadowColor: "#0f172a",
61
+ shadowOpacity: 0.08,
62
+ shadowRadius: 6,
63
+ shadowOffset: { width: 0, height: 2 },
64
+ elevation: 2,
65
+ },
66
+ md: {
67
+ shadowColor: "#0f172a",
68
+ shadowOpacity: 0.12,
69
+ shadowRadius: 10,
70
+ shadowOffset: { width: 0, height: 6 },
71
+ elevation: 4,
72
+ },
73
+ },
9
74
  colors: {
10
75
  // shadcn-like semantic tokens (neutral base + clear primary)
11
76
  background: "#ffffff",
@@ -29,10 +94,84 @@ exports.lightTheme = {
29
94
  bg: "#ffffff",
30
95
  text: "#0f172a",
31
96
  glass: "rgba(255,255,255,0.55)",
97
+ // extra semantic colors (useful for alerts/status)
98
+ accent: "#7c3aed",
99
+ accentForeground: "#ffffff",
100
+ success: "#16a34a",
101
+ successForeground: "#ffffff",
102
+ warning: "#f59e0b",
103
+ warningForeground: "#1f2937",
104
+ info: "#0ea5e9",
105
+ infoForeground: "#ffffff",
32
106
  }
33
107
  };
34
108
  exports.darkTheme = {
35
109
  mode: 'dark',
110
+ fontSizes: {
111
+ xs: 12,
112
+ sm: 14,
113
+ md: 16,
114
+ lg: 18,
115
+ xl: 20,
116
+ "2xl": 24,
117
+ "3xl": 30,
118
+ "4xl": 36,
119
+ "5xl": 48,
120
+ },
121
+ lineHeights: {
122
+ xs: 16,
123
+ sm: 20,
124
+ md: 24,
125
+ lg: 28,
126
+ xl: 30,
127
+ "2xl": 32,
128
+ "3xl": 36,
129
+ "4xl": 40,
130
+ "5xl": 52,
131
+ },
132
+ spacing: {
133
+ xs: 2,
134
+ sm: 4,
135
+ md: 8,
136
+ lg: 12,
137
+ xl: 16,
138
+ "2xl": 24,
139
+ "3xl": 32,
140
+ },
141
+ radii: {
142
+ sm: 8,
143
+ md: 12,
144
+ lg: 14,
145
+ xl: 16,
146
+ full: 999,
147
+ },
148
+ fontWeights: {
149
+ normal: 400,
150
+ medium: 500,
151
+ semibold: 600,
152
+ bold: 700,
153
+ extrabold: 800,
154
+ },
155
+ borderWidths: {
156
+ thin: 1,
157
+ thick: 2,
158
+ },
159
+ shadows: {
160
+ sm: {
161
+ shadowColor: "#000000",
162
+ shadowOpacity: 0.35,
163
+ shadowRadius: 8,
164
+ shadowOffset: { width: 0, height: 3 },
165
+ elevation: 3,
166
+ },
167
+ md: {
168
+ shadowColor: "#000000",
169
+ shadowOpacity: 0.45,
170
+ shadowRadius: 14,
171
+ shadowOffset: { width: 0, height: 8 },
172
+ elevation: 6,
173
+ },
174
+ },
36
175
  colors: {
37
176
  background: "#020617",
38
177
  foreground: "#f8fafc",
@@ -55,5 +194,14 @@ exports.darkTheme = {
55
194
  bg: "#020617",
56
195
  text: "#f8fafc",
57
196
  glass: "rgba(2,6,23,0.6)",
197
+ // extra semantic colors (useful for alerts/status)
198
+ accent: "#a78bfa",
199
+ accentForeground: "#0b1220",
200
+ success: "#22c55e",
201
+ successForeground: "#04110b",
202
+ warning: "#fbbf24",
203
+ warningForeground: "#0b1220",
204
+ info: "#38bdf8",
205
+ infoForeground: "#041018",
58
206
  }
59
207
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rn-feav-ui",
3
- "version": "1.0.6",
3
+ "version": "1.0.8",
4
4
  "description": "Shadcn-style React Native UI kit with theme support.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
package/readme.md CHANGED
@@ -82,6 +82,41 @@ Full demo screen:
82
82
 
83
83
  - `src/examples/Showcase.tsx`
84
84
 
85
+ Imports from package root:
86
+
87
+ - `ShowcaseFEA` (recommended): full demo with internal `ThemeFEAVUiProvider` + `SonnerFEA`.
88
+ - `ShowcaseWithProviderFEA`: same as `ShowcaseFEA` (explicit naming).
89
+ - `ShowcaseScreenFEA`: screen only, for apps that already wrap provider + toast host. Props: `contentContainerStyle?: ViewStyle`.
90
+ - `Showcase`: backward-compatible alias of `ShowcaseFEA`.
91
+
92
+ Example (standalone):
93
+
94
+ ```tsx
95
+ import * as React from "react";
96
+ import { ShowcaseFEA } from "rn-feav-ui";
97
+
98
+ export default function Screen() {
99
+ return <ShowcaseFEA />;
100
+ }
101
+ ```
102
+
103
+ Example (already using your own provider tree):
104
+
105
+ ```tsx
106
+ import * as React from "react";
107
+ import { SonnerFEA, ShowcaseScreenFEA, ThemeFEAVUiProvider } from "rn-feav-ui";
108
+
109
+ export default function Screen() {
110
+ return (
111
+ <ThemeFEAVUiProvider>
112
+ <SonnerFEA>
113
+ <ShowcaseScreenFEA contentContainerStyle={{ padding: 24, gap: 20 }} />
114
+ </SonnerFEA>
115
+ </ThemeFEAVUiProvider>
116
+ );
117
+ }
118
+ ```
119
+
85
120
  ---
86
121
 
87
122
  ## API Reference
@@ -90,11 +125,31 @@ Full demo screen:
90
125
 
91
126
  | Export | Description |
92
127
  | --- | --- |
93
- | `ThemeFEAVUiProvider` | Wraps the app; provides `theme` and `toggleTheme`. Props: `children: React.ReactNode`. |
128
+ | `ThemeFEAVUiProvider` | Wraps the app; provides `theme` and `toggleTheme`. Props: `children`, `defaultMode?`, `themeOverrides?`. |
94
129
  | `useTheme()` | Returns `{ theme, toggleTheme } \| null`. `theme` is `lightTheme \| darkTheme`. |
95
130
  | `lightTheme` / `darkTheme` | Exported from the package root for typing or static access: `import { lightTheme, darkTheme } from "rn-feav-ui"`. Prefer `useTheme()` at runtime inside components. |
96
131
 
97
- **`theme.colors` (semantic tokens)** include: `background`, `foreground`, `card`, `cardForeground`, `muted`, `mutedForeground`, `border`, `input`, `ring`, `primary`, `primaryForeground`, `secondary`, `secondaryForeground`, `destructive`, `destructiveForeground`, plus aliases `bg`, `text`, `glass`. See `src/theme/colors.ts`.
132
+ **`theme.colors` (semantic tokens)** include: `background`, `foreground`, `card`, `cardForeground`, `muted`, `mutedForeground`, `border`, `input`, `ring`, `primary`, `primaryForeground`, `secondary`, `secondaryForeground`, `destructive`, `destructiveForeground`, plus aliases `bg`, `text`, `glass`, and extra status tokens `accent`, `success`, `warning`, `info` (with `*Foreground`). See `src/theme/colors.ts`.
133
+
134
+ **Other theme tokens**: `fontSizes`, `lineHeights`, `spacing`, `radii`, `fontWeights`, `borderWidths`, `shadows`.
135
+
136
+ You can override tokens from your app:
137
+
138
+ ```tsx
139
+ import { ThemeFEAVUiProvider } from "rn-feav-ui";
140
+
141
+ <ThemeFEAVUiProvider
142
+ defaultMode="dark"
143
+ themeOverrides={{
144
+ dark: {
145
+ colors: { background: "#000000", card: "#111827" },
146
+ fontSizes: { md: 17 },
147
+ },
148
+ }}
149
+ >
150
+ {/* app */}
151
+ </ThemeFEAVUiProvider>;
152
+ ```
98
153
 
99
154
  | Export | Description |
100
155
  | --- | --- |