@wireservers-ui/react-natives 2.0.0 → 2.0.2-rc.0
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/CHANGELOG.md +87 -58
- package/LICENSE +21 -21
- package/README.md +642 -598
- package/bin/cli.js +83 -5
- package/bin/init.js +470 -0
- package/package.json +1 -1
- package/src/accordion/accordion-content.tsx +30 -30
- package/src/accordion/accordion-icon.tsx +54 -54
- package/src/accordion/accordion-item.tsx +37 -37
- package/src/accordion/accordion-title-text.tsx +24 -24
- package/src/accordion/accordion-trigger.tsx +38 -38
- package/src/accordion/accordion.tsx +91 -91
- package/src/accordion/index.ts +24 -24
- package/src/accordion/styles.ts +74 -74
- package/src/accordion/types.ts +56 -56
- package/src/actionsheet/actionsheet-backdrop.tsx +23 -23
- package/src/actionsheet/actionsheet-content.tsx +19 -19
- package/src/actionsheet/actionsheet-drag-indicator-wrapper.tsx +19 -19
- package/src/actionsheet/actionsheet-drag-indicator.tsx +19 -19
- package/src/actionsheet/actionsheet-item-text.tsx +19 -19
- package/src/actionsheet/actionsheet-item.tsx +20 -20
- package/src/actionsheet/actionsheet-scroll-view.tsx +12 -12
- package/src/actionsheet/actionsheet.tsx +45 -45
- package/src/actionsheet/index.ts +20 -20
- package/src/actionsheet/styles.ts +25 -25
- package/src/actionsheet/types.ts +49 -49
- package/src/alert/alert-body.tsx +19 -19
- package/src/alert/alert-close-button.tsx +23 -23
- package/src/alert/alert-icon.tsx +40 -40
- package/src/alert/alert-text.tsx +22 -22
- package/src/alert/alert.tsx +33 -33
- package/src/alert/index.ts +15 -15
- package/src/alert/styles.ts +112 -112
- package/src/alert/types.ts +36 -36
- package/src/alert-dialog/alert-dialog.tsx +54 -54
- package/src/alert-dialog/index.ts +2 -2
- package/src/alert-dialog/styles.ts +40 -40
- package/src/alert-dialog/types.ts +40 -40
- package/src/aspect-ratio/aspect-ratio.tsx +20 -20
- package/src/aspect-ratio/index.ts +2 -2
- package/src/aspect-ratio/styles.ts +6 -6
- package/src/aspect-ratio/types.ts +7 -7
- package/src/avatar/avatar-badge.tsx +22 -22
- package/src/avatar/avatar-fallback-text.tsx +33 -33
- package/src/avatar/avatar-group.tsx +53 -53
- package/src/avatar/avatar-image.tsx +21 -21
- package/src/avatar/avatar.tsx +27 -27
- package/src/avatar/index.ts +14 -14
- package/src/avatar/styles.ts +94 -94
- package/src/avatar/types.ts +35 -35
- package/src/badge/badge-icon.tsx +20 -20
- package/src/badge/badge-text.tsx +24 -24
- package/src/badge/badge.tsx +39 -39
- package/src/badge/index.ts +11 -11
- package/src/badge/styles.ts +175 -175
- package/src/badge/types.ts +37 -37
- package/src/blockquote/blockquote.tsx +21 -21
- package/src/blockquote/index.ts +2 -2
- package/src/blockquote/styles.ts +11 -11
- package/src/blockquote/types.ts +6 -6
- package/src/box/box.tsx +19 -19
- package/src/box/index.ts +2 -2
- package/src/box/styles.ts +6 -6
- package/src/box/types.ts +6 -6
- package/src/breadcrumb/breadcrumb-item.tsx +20 -20
- package/src/breadcrumb/breadcrumb-link.tsx +20 -20
- package/src/breadcrumb/breadcrumb-text.tsx +19 -19
- package/src/breadcrumb/breadcrumb.tsx +43 -43
- package/src/breadcrumb/index.ts +12 -12
- package/src/breadcrumb/styles.ts +36 -36
- package/src/breadcrumb/types.ts +33 -33
- package/src/button/button-group.tsx +35 -35
- package/src/button/button-icon.tsx +37 -37
- package/src/button/button-spinner.tsx +12 -12
- package/src/button/button-text.tsx +27 -27
- package/src/button/button.tsx +42 -42
- package/src/button/index.ts +19 -19
- package/src/button/styles.ts +250 -250
- package/src/button/types.ts +67 -67
- package/src/calendar/calendar-day-cell.tsx +67 -67
- package/src/calendar/calendar-day-view.tsx +66 -66
- package/src/calendar/calendar-event.tsx +59 -59
- package/src/calendar/calendar-header.tsx +60 -60
- package/src/calendar/calendar-horizontal-view.tsx +372 -372
- package/src/calendar/calendar-legend.tsx +41 -41
- package/src/calendar/calendar-month-view.tsx +47 -47
- package/src/calendar/calendar-vertical-view.tsx +395 -395
- package/src/calendar/calendar-view-switcher.tsx +65 -65
- package/src/calendar/calendar-week-view.tsx +52 -52
- package/src/calendar/calendar.tsx +74 -74
- package/src/calendar/index.ts +27 -27
- package/src/calendar/styles.ts +367 -367
- package/src/calendar/types.ts +101 -101
- package/src/calendar/use-calendar.ts +170 -170
- package/src/calendar/utils.ts +278 -278
- package/src/card/card-body.tsx +22 -22
- package/src/card/card-footer.tsx +19 -19
- package/src/card/card-header.tsx +22 -22
- package/src/card/card.tsx +27 -27
- package/src/card/index.ts +13 -13
- package/src/card/styles.ts +54 -54
- package/src/card/types.ts +31 -31
- package/src/carousel/carousel.tsx +436 -436
- package/src/carousel/index.ts +2 -2
- package/src/carousel/styles.ts +21 -21
- package/src/carousel/types.ts +41 -41
- package/src/center/center.tsx +19 -19
- package/src/center/index.ts +2 -2
- package/src/center/styles.ts +6 -6
- package/src/center/types.ts +6 -6
- package/src/checkbox/checkbox-group.tsx +63 -63
- package/src/checkbox/checkbox-icon.tsx +35 -35
- package/src/checkbox/checkbox-indicator.tsx +30 -30
- package/src/checkbox/checkbox-label.tsx +24 -24
- package/src/checkbox/checkbox.tsx +86 -86
- package/src/checkbox/index.ts +14 -14
- package/src/checkbox/styles.ts +69 -69
- package/src/checkbox/types.ts +55 -55
- package/src/circular-progress/circular-progress.tsx +82 -82
- package/src/circular-progress/index.ts +2 -2
- package/src/circular-progress/styles.ts +31 -31
- package/src/circular-progress/types.ts +18 -18
- package/src/code/code.tsx +36 -36
- package/src/code/index.ts +2 -2
- package/src/code/styles.ts +25 -25
- package/src/code/types.ts +13 -13
- package/src/collapsible/collapsible.tsx +58 -58
- package/src/collapsible/index.ts +2 -2
- package/src/collapsible/styles.ts +5 -5
- package/src/collapsible/types.ts +21 -21
- package/src/color-picker/color-picker-box.tsx +115 -115
- package/src/color-picker/color-picker-slider.tsx +98 -98
- package/src/color-picker/color-picker.tsx +162 -162
- package/src/color-picker/color-utils.ts +215 -215
- package/src/color-picker/index.ts +34 -34
- package/src/color-picker/styles.ts +32 -32
- package/src/color-picker/types.ts +49 -49
- package/src/color-picker/use-pointer-drag.ts +80 -80
- package/src/container/container.tsx +19 -19
- package/src/container/index.ts +2 -2
- package/src/container/styles.ts +21 -21
- package/src/container/types.ts +10 -10
- package/src/date-picker/date-picker.tsx +136 -136
- package/src/date-picker/index.ts +15 -15
- package/src/date-picker/styles.ts +18 -18
- package/src/date-picker/types.ts +33 -33
- package/src/divider/divider.tsx +21 -21
- package/src/divider/index.ts +2 -2
- package/src/divider/styles.ts +14 -14
- package/src/divider/types.ts +7 -7
- package/src/drawer/drawer-backdrop.tsx +23 -23
- package/src/drawer/drawer-body.tsx +19 -19
- package/src/drawer/drawer-close-button.tsx +29 -29
- package/src/drawer/drawer-content.tsx +142 -142
- package/src/drawer/drawer-footer.tsx +19 -19
- package/src/drawer/drawer-header.tsx +19 -19
- package/src/drawer/drawer.tsx +54 -54
- package/src/drawer/index.ts +22 -22
- package/src/drawer/styles.ts +36 -36
- package/src/drawer/types.ts +62 -62
- package/src/empty/empty.tsx +53 -53
- package/src/empty/index.ts +2 -2
- package/src/empty/styles.ts +26 -26
- package/src/empty/types.ts +22 -22
- package/src/fab/fab-icon.tsx +20 -20
- package/src/fab/fab-label.tsx +22 -22
- package/src/fab/fab.tsx +45 -45
- package/src/fab/index.ts +11 -11
- package/src/fab/styles.ts +57 -57
- package/src/fab/types.ts +33 -33
- package/src/form-control/form-control-error-icon.tsx +25 -25
- package/src/form-control/form-control-error-message.tsx +40 -40
- package/src/form-control/form-control-helper-text.tsx +25 -25
- package/src/form-control/form-control-label-text.tsx +25 -25
- package/src/form-control/form-control-label.tsx +36 -36
- package/src/form-control/form-control.tsx +46 -46
- package/src/form-control/index.ts +20 -20
- package/src/form-control/styles.ts +105 -105
- package/src/form-control/types.ts +45 -45
- package/src/heading/heading.tsx +21 -21
- package/src/heading/index.ts +2 -2
- package/src/heading/styles.ts +24 -24
- package/src/heading/types.ts +19 -19
- package/src/icon/icon.tsx +21 -21
- package/src/icon/index.ts +2 -2
- package/src/icon/styles.ts +18 -18
- package/src/icon/types.ts +8 -8
- package/src/icon-button/icon-button.tsx +23 -23
- package/src/icon-button/index.ts +2 -2
- package/src/icon-button/styles.ts +78 -78
- package/src/icon-button/types.ts +15 -15
- package/src/image/image.tsx +20 -20
- package/src/image/index.ts +2 -2
- package/src/image/styles.ts +28 -28
- package/src/image/types.ts +11 -11
- package/src/index.ts +1039 -1039
- package/src/input/index.ts +13 -13
- package/src/input/input-field.tsx +35 -35
- package/src/input/input-icon.tsx +25 -25
- package/src/input/input-slot.tsx +24 -24
- package/src/input/input.tsx +73 -73
- package/src/input/styles.ts +90 -90
- package/src/input/types.ts +39 -39
- package/src/kbd/index.ts +2 -2
- package/src/kbd/kbd.tsx +21 -21
- package/src/kbd/styles.ts +11 -11
- package/src/kbd/types.ts +7 -7
- package/src/link/index.ts +4 -4
- package/src/link/link-text.tsx +19 -19
- package/src/link/link.tsx +31 -31
- package/src/link/styles.ts +19 -19
- package/src/link/types.ts +13 -13
- package/src/list/index.ts +2 -2
- package/src/list/list.tsx +55 -55
- package/src/list/styles.ts +8 -8
- package/src/list/types.ts +17 -17
- package/src/menu/index.ts +2 -2
- package/src/menu/menu.tsx +99 -99
- package/src/menu/styles.ts +14 -14
- package/src/menu/types.ts +30 -30
- package/src/modal/index.ts +18 -18
- package/src/modal/modal-backdrop.tsx +23 -23
- package/src/modal/modal-body.tsx +19 -19
- package/src/modal/modal-close-button.tsx +29 -29
- package/src/modal/modal-content.tsx +22 -22
- package/src/modal/modal-footer.tsx +19 -19
- package/src/modal/modal-header.tsx +19 -19
- package/src/modal/modal.tsx +50 -50
- package/src/modal/styles.ts +37 -37
- package/src/modal/types.ts +49 -49
- package/src/nativewind-env.d.ts +1 -1
- package/src/number-input/index.ts +18 -18
- package/src/number-input/number-input.tsx +161 -161
- package/src/number-input/styles.ts +35 -35
- package/src/number-input/types.ts +44 -44
- package/src/overlay/index.ts +2 -2
- package/src/overlay/overlay.tsx +21 -21
- package/src/overlay/styles.ts +6 -6
- package/src/overlay/types.ts +7 -7
- package/src/pagination/index.ts +2 -2
- package/src/pagination/pagination.tsx +58 -58
- package/src/pagination/styles.ts +27 -27
- package/src/pagination/types.ts +19 -19
- package/src/password-input/index.ts +14 -14
- package/src/password-input/password-input.tsx +79 -79
- package/src/password-input/styles.ts +25 -25
- package/src/password-input/types.ts +24 -24
- package/src/pin-input/index.ts +12 -12
- package/src/pin-input/pin-input.tsx +96 -96
- package/src/pin-input/styles.ts +16 -16
- package/src/pin-input/types.ts +26 -26
- package/src/popover/index.ts +2 -2
- package/src/popover/popover.tsx +98 -98
- package/src/popover/styles.ts +31 -31
- package/src/popover/types.ts +46 -46
- package/src/portal/index.ts +2 -2
- package/src/portal/portal.tsx +8 -8
- package/src/portal/styles.ts +2 -2
- package/src/portal/types.ts +3 -3
- package/src/pressable/index.ts +2 -2
- package/src/pressable/pressable.tsx +20 -20
- package/src/pressable/styles.ts +10 -10
- package/src/pressable/types.ts +6 -6
- package/src/progress/index.ts +9 -9
- package/src/progress/progress-filled-track.tsx +26 -26
- package/src/progress/progress.tsx +52 -52
- package/src/progress/styles.ts +34 -34
- package/src/progress/types.ts +28 -28
- package/src/radio/index.ts +14 -14
- package/src/radio/radio-group.tsx +61 -61
- package/src/radio/radio-icon.tsx +24 -24
- package/src/radio/radio-indicator.tsx +30 -30
- package/src/radio/radio-label.tsx +24 -24
- package/src/radio/radio.tsx +68 -68
- package/src/radio/styles.ts +69 -69
- package/src/radio/types.ts +51 -51
- package/src/rating/index.ts +7 -7
- package/src/rating/rating.tsx +93 -93
- package/src/rating/styles.ts +13 -13
- package/src/rating/types.ts +29 -29
- package/src/search-input/index.ts +16 -16
- package/src/search-input/search-input.tsx +119 -119
- package/src/search-input/styles.ts +28 -28
- package/src/search-input/types.ts +31 -31
- package/src/segmented-control/index.ts +2 -2
- package/src/segmented-control/segmented-control.tsx +34 -34
- package/src/segmented-control/styles.ts +22 -22
- package/src/segmented-control/types.ts +22 -22
- package/src/select/index.ts +28 -28
- package/src/select/select-backdrop.tsx +25 -25
- package/src/select/select-content.tsx +49 -49
- package/src/select/select-drag-indicator.tsx +19 -19
- package/src/select/select-icon.tsx +25 -25
- package/src/select/select-input.tsx +32 -32
- package/src/select/select-item-text.tsx +30 -30
- package/src/select/select-item.tsx +72 -72
- package/src/select/select-portal.tsx +22 -22
- package/src/select/select-scroll-view.tsx +22 -22
- package/src/select/select-trigger.tsx +64 -64
- package/src/select/select.tsx +101 -101
- package/src/select/styles.ts +114 -114
- package/src/select/types.ts +92 -92
- package/src/skeleton/index.ts +2 -2
- package/src/skeleton/skeleton.tsx +29 -29
- package/src/skeleton/styles.ts +14 -14
- package/src/skeleton/types.ts +12 -12
- package/src/slider/index.ts +12 -12
- package/src/slider/slider-filled-track.tsx +31 -31
- package/src/slider/slider-thumb.tsx +52 -52
- package/src/slider/slider-track.tsx +154 -154
- package/src/slider/slider.tsx +193 -193
- package/src/slider/styles.ts +71 -71
- package/src/slider/types.ts +47 -47
- package/src/snackbar/index.ts +2 -2
- package/src/snackbar/snackbar.tsx +39 -39
- package/src/snackbar/styles.ts +29 -29
- package/src/snackbar/types.ts +21 -21
- package/src/spinner/index.ts +2 -2
- package/src/spinner/spinner.tsx +29 -29
- package/src/spinner/styles.ts +15 -15
- package/src/spinner/types.ts +10 -10
- package/src/stack/index.ts +2 -2
- package/src/stack/stack.tsx +49 -49
- package/src/stack/styles.ts +25 -25
- package/src/stack/types.ts +15 -15
- package/src/stat/index.ts +2 -2
- package/src/stat/stat.tsx +48 -48
- package/src/stat/styles.ts +34 -34
- package/src/stat/types.ts +24 -24
- package/src/stepper/index.ts +2 -2
- package/src/stepper/stepper.tsx +95 -95
- package/src/stepper/styles.ts +49 -49
- package/src/stepper/types.ts +20 -20
- package/src/switch/index.ts +2 -2
- package/src/switch/styles.ts +24 -24
- package/src/switch/switch.tsx +67 -67
- package/src/switch/types.ts +23 -23
- package/src/table/index.ts +2 -2
- package/src/table/styles.ts +12 -12
- package/src/table/table.tsx +52 -52
- package/src/table/types.ts +10 -10
- package/src/tabs/index.ts +18 -18
- package/src/tabs/styles.ts +113 -113
- package/src/tabs/tab-list.tsx +29 -29
- package/src/tabs/tab-panel.tsx +29 -29
- package/src/tabs/tab-panels.tsx +21 -21
- package/src/tabs/tab-text.tsx +26 -26
- package/src/tabs/tab.tsx +56 -56
- package/src/tabs/tabs.tsx +71 -71
- package/src/tabs/types.ts +53 -53
- package/src/tag/index.ts +14 -14
- package/src/tag/styles.ts +115 -115
- package/src/tag/tag-close-button.tsx +26 -26
- package/src/tag/tag-icon.tsx +20 -20
- package/src/tag/tag-text.tsx +22 -22
- package/src/tag/tag.tsx +40 -40
- package/src/tag/types.ts +33 -33
- package/src/tags-input/index.ts +18 -18
- package/src/tags-input/styles.ts +29 -29
- package/src/tags-input/tags-input.tsx +149 -149
- package/src/tags-input/types.ts +37 -37
- package/src/text/index.ts +2 -2
- package/src/text/styles.ts +54 -54
- package/src/text/text.tsx +51 -51
- package/src/text/types.ts +36 -36
- package/src/textarea/index.ts +2 -2
- package/src/textarea/styles.ts +37 -37
- package/src/textarea/textarea.tsx +68 -68
- package/src/textarea/types.ts +14 -14
- package/src/timeline/index.ts +2 -2
- package/src/timeline/styles.ts +57 -57
- package/src/timeline/timeline.tsx +52 -52
- package/src/timeline/types.ts +30 -30
- package/src/toast/index.ts +17 -17
- package/src/toast/styles.ts +118 -118
- package/src/toast/toast-description.tsx +22 -22
- package/src/toast/toast-provider.tsx +136 -136
- package/src/toast/toast-title.tsx +22 -22
- package/src/toast/toast.tsx +43 -43
- package/src/toast/types.ts +50 -50
- package/src/toast/use-toast.ts +7 -7
- package/src/toggle/index.ts +2 -2
- package/src/toggle/styles.ts +30 -30
- package/src/toggle/toggle.tsx +25 -25
- package/src/toggle/types.ts +15 -15
- package/src/toggle-group/index.ts +2 -2
- package/src/toggle-group/styles.ts +35 -35
- package/src/toggle-group/toggle-group.tsx +60 -60
- package/src/toggle-group/types.ts +29 -29
- package/src/tooltip/index.ts +11 -11
- package/src/tooltip/styles.ts +9 -9
- package/src/tooltip/tooltip-content.tsx +19 -19
- package/src/tooltip/tooltip-text.tsx +19 -19
- package/src/tooltip/tooltip.tsx +116 -116
- package/src/tooltip/types.ts +35 -35
- package/src/utils/brand.ts +5 -5
- package/src/utils/create-context.ts +17 -17
- package/src/utils/index.ts +8 -8
- package/src/utils/types.ts +20 -20
- package/src/visually-hidden/index.ts +2 -2
- package/src/visually-hidden/styles.ts +6 -6
- package/src/visually-hidden/types.ts +6 -6
- package/src/visually-hidden/visually-hidden.tsx +22 -22
- package/tailwind-preset.js +212 -203
package/bin/cli.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
/* eslint-env node */
|
|
3
|
+
/* global require, process, console */
|
|
2
4
|
|
|
3
5
|
const { execSync } = require("child_process");
|
|
4
6
|
const fs = require("fs");
|
|
@@ -6,6 +8,7 @@ const path = require("path");
|
|
|
6
8
|
|
|
7
9
|
const args = process.argv.slice(2);
|
|
8
10
|
const command = args[0];
|
|
11
|
+
const force = args.includes("--force");
|
|
9
12
|
|
|
10
13
|
if (command !== "init") {
|
|
11
14
|
console.error(`Unknown command: ${command}`);
|
|
@@ -15,6 +18,36 @@ if (command !== "init") {
|
|
|
15
18
|
|
|
16
19
|
const cwd = process.cwd();
|
|
17
20
|
|
|
21
|
+
function isExpoProject(dir) {
|
|
22
|
+
const pkgPath = path.join(dir, "package.json");
|
|
23
|
+
if (!fs.existsSync(pkgPath)) return false;
|
|
24
|
+
|
|
25
|
+
try {
|
|
26
|
+
const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf8"));
|
|
27
|
+
const deps = {
|
|
28
|
+
...(pkg.dependencies || {}),
|
|
29
|
+
...(pkg.devDependencies || {}),
|
|
30
|
+
};
|
|
31
|
+
return Boolean(deps.expo || deps["expo-router"] || deps["react-native"]);
|
|
32
|
+
} catch {
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
if (!isExpoProject(cwd)) {
|
|
38
|
+
console.error(
|
|
39
|
+
"\n❌ @wireservers-ui/react-natives init must be run inside an Expo project folder.",
|
|
40
|
+
);
|
|
41
|
+
console.error(" Example:");
|
|
42
|
+
console.error(" mkdir -p demos/react-natives");
|
|
43
|
+
console.error(
|
|
44
|
+
" npx create-expo-app@latest demos/react-natives/project --template blank-typescript",
|
|
45
|
+
);
|
|
46
|
+
console.error(" cd demos/react-natives/project");
|
|
47
|
+
console.error(" npx @wireservers-ui/react-natives@2.0.1 init\n");
|
|
48
|
+
process.exit(1);
|
|
49
|
+
}
|
|
50
|
+
|
|
18
51
|
// ── Detect package manager ─────────────────────────────────────────────────
|
|
19
52
|
function detectPackageManager() {
|
|
20
53
|
if (fs.existsSync(path.join(cwd, "pnpm-lock.yaml"))) return "pnpm";
|
|
@@ -83,6 +116,7 @@ const reactDomPackage = reactVersion
|
|
|
83
116
|
|
|
84
117
|
const peers = [
|
|
85
118
|
"nativewind@^4",
|
|
119
|
+
"babel-preset-expo",
|
|
86
120
|
"tailwindcss@^3",
|
|
87
121
|
"tailwind-variants",
|
|
88
122
|
"tailwind-merge",
|
|
@@ -272,11 +306,25 @@ writeIfMissing(
|
|
|
272
306
|
);
|
|
273
307
|
|
|
274
308
|
// ── 6. Create/update metro.config.js ───────────────────────────────────────
|
|
275
|
-
const metroConfig =
|
|
309
|
+
const metroConfig = `/* eslint-env node */
|
|
310
|
+
const path = require("path");
|
|
311
|
+
const { getDefaultConfig } = require("expo/metro-config");
|
|
276
312
|
const { withNativeWind } = require("nativewind/metro");
|
|
277
313
|
|
|
278
314
|
const config = getDefaultConfig(__dirname);
|
|
279
315
|
|
|
316
|
+
config.resolver.unstable_enableSymlinks = true;
|
|
317
|
+
config.resolver.nodeModulesPaths = [path.resolve(__dirname, "node_modules")];
|
|
318
|
+
|
|
319
|
+
try {
|
|
320
|
+
const wsuiPackagePath = path.dirname(
|
|
321
|
+
require.resolve("@wireservers-ui/react-natives/package.json"),
|
|
322
|
+
);
|
|
323
|
+
config.watchFolders = [...new Set([...(config.watchFolders || []), wsuiPackagePath])];
|
|
324
|
+
} catch {
|
|
325
|
+
// No-op if package is not resolvable yet.
|
|
326
|
+
}
|
|
327
|
+
|
|
280
328
|
module.exports = withNativeWind(config, { input: "./global.css" });
|
|
281
329
|
`;
|
|
282
330
|
|
|
@@ -340,7 +388,7 @@ export default function App() {
|
|
|
340
388
|
}
|
|
341
389
|
`;
|
|
342
390
|
|
|
343
|
-
|
|
391
|
+
writeStarterFile("App.tsx", appTsx);
|
|
344
392
|
|
|
345
393
|
// ── Done ───────────────────────────────────────────────────────────────────
|
|
346
394
|
console.log("\n✅ Setup complete!\n");
|
|
@@ -357,12 +405,16 @@ console.log(" npx expo start --clear\n");
|
|
|
357
405
|
// ── Helpers ────────────────────────────────────────────────────────────────
|
|
358
406
|
function writeFile(name, content) {
|
|
359
407
|
const filePath = path.join(cwd, name);
|
|
360
|
-
if (fs.existsSync(filePath)) {
|
|
361
|
-
console.log(
|
|
408
|
+
if (fs.existsSync(filePath) && !force) {
|
|
409
|
+
console.log(
|
|
410
|
+
` ⏭️ ${name} already exists, skipping (use --force to overwrite)`,
|
|
411
|
+
);
|
|
362
412
|
return;
|
|
363
413
|
}
|
|
414
|
+
|
|
415
|
+
const action = fs.existsSync(filePath) ? "Updated" : "Created";
|
|
364
416
|
fs.writeFileSync(filePath, content, "utf8");
|
|
365
|
-
console.log(` ✏️
|
|
417
|
+
console.log(` ✏️ ${action} ${name}`);
|
|
366
418
|
}
|
|
367
419
|
|
|
368
420
|
function writeIfMissing(name, content) {
|
|
@@ -374,3 +426,29 @@ function writeIfMissing(name, content) {
|
|
|
374
426
|
fs.writeFileSync(filePath, content, "utf8");
|
|
375
427
|
console.log(` ✏️ Created ${name}`);
|
|
376
428
|
}
|
|
429
|
+
|
|
430
|
+
function writeStarterFile(name, content) {
|
|
431
|
+
const filePath = path.join(cwd, name);
|
|
432
|
+
if (!fs.existsSync(filePath)) {
|
|
433
|
+
fs.writeFileSync(filePath, content, "utf8");
|
|
434
|
+
console.log(` ✏️ Created ${name}`);
|
|
435
|
+
return;
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
const existing = fs.readFileSync(filePath, "utf8");
|
|
439
|
+
if (looksLikeDefaultExpoScreen(existing)) {
|
|
440
|
+
fs.writeFileSync(filePath, content, "utf8");
|
|
441
|
+
console.log(` ✏️ Updated ${name} with WireServers slider demo`);
|
|
442
|
+
return;
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
console.log(` ⏭️ ${name} has custom content, keeping existing file`);
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
function looksLikeDefaultExpoScreen(source) {
|
|
449
|
+
return (
|
|
450
|
+
source.includes("Open up App.tsx") ||
|
|
451
|
+
source.includes("Edit App.tsx") ||
|
|
452
|
+
source.includes("StatusBar")
|
|
453
|
+
);
|
|
454
|
+
}
|
package/bin/init.js
ADDED
|
@@ -0,0 +1,470 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/* eslint-env node */
|
|
3
|
+
/* global require, process, console */
|
|
4
|
+
|
|
5
|
+
"use strict";
|
|
6
|
+
|
|
7
|
+
const fs = require("fs");
|
|
8
|
+
const path = require("path");
|
|
9
|
+
const { execSync } = require("child_process");
|
|
10
|
+
|
|
11
|
+
const cwd = process.cwd();
|
|
12
|
+
const force = process.argv.includes("--force");
|
|
13
|
+
|
|
14
|
+
const green = (s) => `\x1b[32m${s}\x1b[0m`;
|
|
15
|
+
const yellow = (s) => `\x1b[33m${s}\x1b[0m`;
|
|
16
|
+
const cyan = (s) => `\x1b[36m${s}\x1b[0m`;
|
|
17
|
+
const bold = (s) => `\x1b[1m${s}\x1b[0m`;
|
|
18
|
+
const dim = (s) => `\x1b[2m${s}\x1b[0m`;
|
|
19
|
+
|
|
20
|
+
function write(filename, content) {
|
|
21
|
+
const filepath = path.join(cwd, filename);
|
|
22
|
+
if (fs.existsSync(filepath) && !force) {
|
|
23
|
+
console.log(
|
|
24
|
+
yellow(" skip ") +
|
|
25
|
+
filename +
|
|
26
|
+
dim(" (already exists — use --force to overwrite)"),
|
|
27
|
+
);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
fs.mkdirSync(path.dirname(filepath), { recursive: true });
|
|
31
|
+
fs.writeFileSync(filepath, content, "utf8");
|
|
32
|
+
console.log(green(" create") + " " + filename);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function writeStarter(filename, content) {
|
|
36
|
+
const filepath = path.join(cwd, filename);
|
|
37
|
+
if (!fs.existsSync(filepath) || force) {
|
|
38
|
+
fs.mkdirSync(path.dirname(filepath), { recursive: true });
|
|
39
|
+
fs.writeFileSync(filepath, content, "utf8");
|
|
40
|
+
console.log(green(" create") + " " + filename);
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const existing = fs.readFileSync(filepath, "utf8");
|
|
45
|
+
if (looksLikeDefaultExpoStarter(existing)) {
|
|
46
|
+
fs.writeFileSync(filepath, content, "utf8");
|
|
47
|
+
console.log(green(" update") + " " + filename);
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
console.log(
|
|
52
|
+
yellow(" skip ") +
|
|
53
|
+
filename +
|
|
54
|
+
dim(" (custom content detected — use --force to overwrite)"),
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function looksLikeDefaultExpoStarter(source) {
|
|
59
|
+
return (
|
|
60
|
+
source.includes("Open up App.tsx") ||
|
|
61
|
+
source.includes("Edit App.tsx") ||
|
|
62
|
+
source.includes("StatusBar") ||
|
|
63
|
+
source.includes("ParallaxScrollView") ||
|
|
64
|
+
source.includes("HelloWave")
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// ─── Detect project type ──────────────────────────────────────────────────────
|
|
69
|
+
|
|
70
|
+
const hasExpoRouter = fs.existsSync(path.join(cwd, "app"));
|
|
71
|
+
|
|
72
|
+
const tailwindContent = hasExpoRouter
|
|
73
|
+
? [' "./app/**/*.{ts,tsx}"', ' "./components/**/*.{ts,tsx}"']
|
|
74
|
+
: [' "./App.{ts,tsx}"', ' "./components/**/*.{ts,tsx}"'];
|
|
75
|
+
|
|
76
|
+
// ─── Generated file contents ──────────────────────────────────────────────────
|
|
77
|
+
|
|
78
|
+
const TAILWIND_CONFIG = `const wirePreset = require("@wireservers-ui/react-natives/tailwind-preset");
|
|
79
|
+
module.exports = {
|
|
80
|
+
content: [
|
|
81
|
+
${tailwindContent.join(",\n")},
|
|
82
|
+
"./node_modules/@wireservers-ui/react-natives/src/**/*.{ts,tsx}",
|
|
83
|
+
],
|
|
84
|
+
presets: [wirePreset],
|
|
85
|
+
};
|
|
86
|
+
`;
|
|
87
|
+
|
|
88
|
+
const GLOBAL_CSS = `@tailwind base;
|
|
89
|
+
@tailwind components;
|
|
90
|
+
@tailwind utilities;
|
|
91
|
+
|
|
92
|
+
:root {
|
|
93
|
+
--color-primary-0: 228 228 255;
|
|
94
|
+
--color-primary-50: 206 204 255;
|
|
95
|
+
--color-primary-100: 183 180 255;
|
|
96
|
+
--color-primary-200: 159 155 255;
|
|
97
|
+
--color-primary-300: 134 128 255;
|
|
98
|
+
--color-primary-400: 108 99 243;
|
|
99
|
+
--color-primary-500: 80 70 230;
|
|
100
|
+
--color-primary-600: 62 53 205;
|
|
101
|
+
--color-primary-700: 46 38 180;
|
|
102
|
+
--color-primary-800: 33 26 155;
|
|
103
|
+
--color-primary-900: 22 17 130;
|
|
104
|
+
--color-primary-950: 15 10 105;
|
|
105
|
+
|
|
106
|
+
--color-secondary-0: 253 253 253;
|
|
107
|
+
--color-secondary-50: 243 243 243;
|
|
108
|
+
--color-secondary-100: 233 233 233;
|
|
109
|
+
--color-secondary-200: 213 213 213;
|
|
110
|
+
--color-secondary-300: 193 193 193;
|
|
111
|
+
--color-secondary-400: 163 163 163;
|
|
112
|
+
--color-secondary-500: 115 115 115;
|
|
113
|
+
--color-secondary-600: 82 82 82;
|
|
114
|
+
--color-secondary-700: 64 64 64;
|
|
115
|
+
--color-secondary-800: 38 38 38;
|
|
116
|
+
--color-secondary-900: 23 23 23;
|
|
117
|
+
--color-secondary-950: 10 10 10;
|
|
118
|
+
|
|
119
|
+
--color-tertiary-50: 255 244 236;
|
|
120
|
+
--color-tertiary-100: 255 225 204;
|
|
121
|
+
--color-tertiary-200: 255 197 153;
|
|
122
|
+
--color-tertiary-300: 255 168 102;
|
|
123
|
+
--color-tertiary-400: 255 140 51;
|
|
124
|
+
--color-tertiary-500: 255 111 0;
|
|
125
|
+
--color-tertiary-600: 219 93 0;
|
|
126
|
+
--color-tertiary-700: 183 76 0;
|
|
127
|
+
--color-tertiary-800: 146 60 0;
|
|
128
|
+
--color-tertiary-900: 110 44 0;
|
|
129
|
+
--color-tertiary-950: 73 29 0;
|
|
130
|
+
|
|
131
|
+
--color-error-0: 255 242 242;
|
|
132
|
+
--color-error-50: 254 226 226;
|
|
133
|
+
--color-error-100: 254 202 202;
|
|
134
|
+
--color-error-200: 252 165 165;
|
|
135
|
+
--color-error-300: 248 113 113;
|
|
136
|
+
--color-error-400: 239 68 68;
|
|
137
|
+
--color-error-500: 220 38 38;
|
|
138
|
+
--color-error-600: 185 28 28;
|
|
139
|
+
--color-error-700: 153 27 27;
|
|
140
|
+
--color-error-800: 127 29 29;
|
|
141
|
+
--color-error-900: 100 20 20;
|
|
142
|
+
--color-error-950: 69 10 10;
|
|
143
|
+
|
|
144
|
+
--color-success-0: 240 253 244;
|
|
145
|
+
--color-success-50: 220 252 231;
|
|
146
|
+
--color-success-100: 187 247 208;
|
|
147
|
+
--color-success-200: 134 239 172;
|
|
148
|
+
--color-success-300: 74 222 128;
|
|
149
|
+
--color-success-400: 34 197 94;
|
|
150
|
+
--color-success-500: 22 163 74;
|
|
151
|
+
--color-success-600: 21 128 61;
|
|
152
|
+
--color-success-700: 22 101 52;
|
|
153
|
+
--color-success-800: 20 83 45;
|
|
154
|
+
--color-success-900: 17 68 37;
|
|
155
|
+
--color-success-950: 5 46 22;
|
|
156
|
+
|
|
157
|
+
--color-warning-0: 255 252 240;
|
|
158
|
+
--color-warning-50: 254 249 195;
|
|
159
|
+
--color-warning-100: 254 240 138;
|
|
160
|
+
--color-warning-200: 253 224 71;
|
|
161
|
+
--color-warning-300: 250 204 21;
|
|
162
|
+
--color-warning-400: 234 179 8;
|
|
163
|
+
--color-warning-500: 202 138 4;
|
|
164
|
+
--color-warning-600: 161 98 7;
|
|
165
|
+
--color-warning-700: 133 77 14;
|
|
166
|
+
--color-warning-800: 113 63 18;
|
|
167
|
+
--color-warning-900: 90 52 18;
|
|
168
|
+
--color-warning-950: 66 32 6;
|
|
169
|
+
|
|
170
|
+
--color-info-0: 240 249 255;
|
|
171
|
+
--color-info-50: 224 242 254;
|
|
172
|
+
--color-info-100: 186 230 253;
|
|
173
|
+
--color-info-200: 125 211 252;
|
|
174
|
+
--color-info-300: 56 189 248;
|
|
175
|
+
--color-info-400: 14 165 233;
|
|
176
|
+
--color-info-500: 2 132 199;
|
|
177
|
+
--color-info-600: 3 105 161;
|
|
178
|
+
--color-info-700: 7 89 133;
|
|
179
|
+
--color-info-800: 12 74 110;
|
|
180
|
+
--color-info-900: 12 64 93;
|
|
181
|
+
--color-info-950: 8 47 73;
|
|
182
|
+
|
|
183
|
+
--color-typography-0: 255 255 255;
|
|
184
|
+
--color-typography-50: 245 245 245;
|
|
185
|
+
--color-typography-100: 229 229 229;
|
|
186
|
+
--color-typography-200: 212 212 212;
|
|
187
|
+
--color-typography-300: 163 163 163;
|
|
188
|
+
--color-typography-400: 140 140 140;
|
|
189
|
+
--color-typography-500: 115 115 115;
|
|
190
|
+
--color-typography-600: 82 82 82;
|
|
191
|
+
--color-typography-700: 64 64 64;
|
|
192
|
+
--color-typography-800: 38 38 38;
|
|
193
|
+
--color-typography-900: 23 23 23;
|
|
194
|
+
--color-typography-950: 10 10 10;
|
|
195
|
+
|
|
196
|
+
--color-outline-0: 255 255 255;
|
|
197
|
+
--color-outline-50: 245 245 245;
|
|
198
|
+
--color-outline-100: 229 229 229;
|
|
199
|
+
--color-outline-200: 212 212 212;
|
|
200
|
+
--color-outline-300: 163 163 163;
|
|
201
|
+
--color-outline-400: 140 140 140;
|
|
202
|
+
--color-outline-500: 115 115 115;
|
|
203
|
+
--color-outline-600: 82 82 82;
|
|
204
|
+
--color-outline-700: 64 64 64;
|
|
205
|
+
--color-outline-800: 38 38 38;
|
|
206
|
+
--color-outline-900: 23 23 23;
|
|
207
|
+
--color-outline-950: 10 10 10;
|
|
208
|
+
|
|
209
|
+
--color-background-0: 255 255 255;
|
|
210
|
+
--color-background-50: 246 246 246;
|
|
211
|
+
--color-background-100: 237 237 237;
|
|
212
|
+
--color-background-200: 219 219 219;
|
|
213
|
+
--color-background-300: 185 185 185;
|
|
214
|
+
--color-background-400: 163 163 163;
|
|
215
|
+
--color-background-500: 140 140 140;
|
|
216
|
+
--color-background-600: 115 115 115;
|
|
217
|
+
--color-background-700: 82 82 82;
|
|
218
|
+
--color-background-800: 64 64 64;
|
|
219
|
+
--color-background-900: 38 38 38;
|
|
220
|
+
--color-background-950: 23 23 23;
|
|
221
|
+
--color-background-error: 254 226 226;
|
|
222
|
+
--color-background-warning: 254 249 195;
|
|
223
|
+
--color-background-muted: 245 245 245;
|
|
224
|
+
--color-background-success: 220 252 231;
|
|
225
|
+
--color-background-info: 224 242 254;
|
|
226
|
+
|
|
227
|
+
--color-indicator-primary: 80 70 230;
|
|
228
|
+
--color-indicator-info: 2 132 199;
|
|
229
|
+
--color-indicator-error: 220 38 38;
|
|
230
|
+
}
|
|
231
|
+
`;
|
|
232
|
+
|
|
233
|
+
const METRO_CONFIG = `/* eslint-env node */
|
|
234
|
+
const path = require("path");
|
|
235
|
+
const { getDefaultConfig } = require("expo/metro-config");
|
|
236
|
+
const { withNativeWind } = require("nativewind/metro");
|
|
237
|
+
const config = getDefaultConfig(__dirname);
|
|
238
|
+
|
|
239
|
+
config.resolver.unstable_enableSymlinks = true;
|
|
240
|
+
config.resolver.nodeModulesPaths = [path.resolve(__dirname, "node_modules")];
|
|
241
|
+
|
|
242
|
+
try {
|
|
243
|
+
const wsuiPackagePath = path.dirname(
|
|
244
|
+
require.resolve("@wireservers-ui/react-natives/package.json"),
|
|
245
|
+
);
|
|
246
|
+
config.watchFolders = [...new Set([...(config.watchFolders || []), wsuiPackagePath])];
|
|
247
|
+
} catch {
|
|
248
|
+
// No-op if package is not resolvable yet.
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
module.exports = withNativeWind(config, { input: "./global.css" });
|
|
252
|
+
`;
|
|
253
|
+
|
|
254
|
+
const BABEL_CONFIG = `module.exports = function (api) {
|
|
255
|
+
api.cache(true);
|
|
256
|
+
return {
|
|
257
|
+
presets: [
|
|
258
|
+
["babel-preset-expo", { jsxImportSource: "nativewind" }],
|
|
259
|
+
"nativewind/babel",
|
|
260
|
+
],
|
|
261
|
+
};
|
|
262
|
+
};
|
|
263
|
+
`;
|
|
264
|
+
|
|
265
|
+
const NATIVEWIND_ENV = `/// <reference types="nativewind/types" />\n`;
|
|
266
|
+
|
|
267
|
+
const APP_TSX = `import "./global.css";
|
|
268
|
+
import React, { useState } from "react";
|
|
269
|
+
import { View, Text } from "react-native";
|
|
270
|
+
import {
|
|
271
|
+
Slider,
|
|
272
|
+
SliderTrack,
|
|
273
|
+
SliderFilledTrack,
|
|
274
|
+
SliderThumb,
|
|
275
|
+
} from "@wireservers-ui/react-natives";
|
|
276
|
+
|
|
277
|
+
export default function App() {
|
|
278
|
+
const [value, setValue] = useState(50);
|
|
279
|
+
|
|
280
|
+
return (
|
|
281
|
+
<View className="flex-1 items-center justify-center bg-background-0 px-8">
|
|
282
|
+
<Text className="text-2xl font-bold text-typography-900 mb-2">
|
|
283
|
+
WireServers Slider
|
|
284
|
+
</Text>
|
|
285
|
+
<Text className="text-base text-typography-500 mb-8">{value}%</Text>
|
|
286
|
+
|
|
287
|
+
<View className="w-full max-w-xs">
|
|
288
|
+
<Slider value={value} onValueChange={setValue} min={0} max={100} size="lg">
|
|
289
|
+
<SliderTrack>
|
|
290
|
+
<SliderFilledTrack />
|
|
291
|
+
</SliderTrack>
|
|
292
|
+
<SliderThumb />
|
|
293
|
+
</Slider>
|
|
294
|
+
</View>
|
|
295
|
+
</View>
|
|
296
|
+
);
|
|
297
|
+
}
|
|
298
|
+
`;
|
|
299
|
+
|
|
300
|
+
const ROUTER_INDEX_TSX = `import "../global.css";
|
|
301
|
+
import React, { useState } from "react";
|
|
302
|
+
import { View, Text } from "react-native";
|
|
303
|
+
import {
|
|
304
|
+
Slider,
|
|
305
|
+
SliderTrack,
|
|
306
|
+
SliderFilledTrack,
|
|
307
|
+
SliderThumb,
|
|
308
|
+
} from "@wireservers-ui/react-natives";
|
|
309
|
+
|
|
310
|
+
export default function HomeScreen() {
|
|
311
|
+
const [value, setValue] = useState(50);
|
|
312
|
+
|
|
313
|
+
return (
|
|
314
|
+
<View className="flex-1 items-center justify-center bg-background-0 px-8">
|
|
315
|
+
<Text className="text-2xl font-bold text-typography-900 mb-2">
|
|
316
|
+
WireServers Slider
|
|
317
|
+
</Text>
|
|
318
|
+
<Text className="text-base text-typography-500 mb-8">{value}%</Text>
|
|
319
|
+
|
|
320
|
+
<View className="w-full max-w-xs">
|
|
321
|
+
<Slider value={value} onValueChange={setValue} min={0} max={100} size="lg">
|
|
322
|
+
<SliderTrack>
|
|
323
|
+
<SliderFilledTrack />
|
|
324
|
+
</SliderTrack>
|
|
325
|
+
<SliderThumb />
|
|
326
|
+
</Slider>
|
|
327
|
+
</View>
|
|
328
|
+
</View>
|
|
329
|
+
);
|
|
330
|
+
}
|
|
331
|
+
`;
|
|
332
|
+
|
|
333
|
+
// ─── Metro Windows ESM patch ──────────────────────────────────────────────────
|
|
334
|
+
//
|
|
335
|
+
// Metro calls `await import(absolutePath)` with a raw Windows path (D:\...).
|
|
336
|
+
// Node 22+'s ESM loader requires file:// URLs on Windows, so this throws
|
|
337
|
+
// ERR_UNSUPPORTED_ESM_URL_SCHEME. The patch converts the path via pathToFileURL.
|
|
338
|
+
// It lives in .metro-patch.js and runs as a postinstall script so it survives
|
|
339
|
+
// future `npm install` calls that would overwrite node_modules.
|
|
340
|
+
|
|
341
|
+
const METRO_PATCH_SCRIPT = `#!/usr/bin/env node
|
|
342
|
+
'use strict';
|
|
343
|
+
const fs = require('fs');
|
|
344
|
+
const path = require('path');
|
|
345
|
+
|
|
346
|
+
const target = path.join(__dirname, 'node_modules/metro-config/src/loadConfig.js');
|
|
347
|
+
if (!fs.existsSync(target)) process.exit(0);
|
|
348
|
+
|
|
349
|
+
const src = fs.readFileSync(target, 'utf8');
|
|
350
|
+
if (src.includes('pathToFileURL')) process.exit(0); // already patched
|
|
351
|
+
|
|
352
|
+
const patched = src.replace(
|
|
353
|
+
/await import\\(absolutePath\\)/g,
|
|
354
|
+
'await import(require("url").pathToFileURL(absolutePath).href)'
|
|
355
|
+
);
|
|
356
|
+
if (patched === src) process.exit(0); // pattern not found — nothing to do
|
|
357
|
+
|
|
358
|
+
fs.writeFileSync(target, patched, 'utf8');
|
|
359
|
+
console.log(' patched metro-config/src/loadConfig.js (Windows ESM URL fix)');
|
|
360
|
+
`;
|
|
361
|
+
|
|
362
|
+
// ─── babel.config.js ─────────────────────────────────────────────────────────
|
|
363
|
+
|
|
364
|
+
function handleBabelConfig() {
|
|
365
|
+
const filepath = path.join(cwd, "babel.config.js");
|
|
366
|
+
|
|
367
|
+
if (!fs.existsSync(filepath)) {
|
|
368
|
+
fs.writeFileSync(filepath, BABEL_CONFIG, "utf8");
|
|
369
|
+
console.log(green(" create") + " babel.config.js");
|
|
370
|
+
return;
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
const existing = fs.readFileSync(filepath, "utf8");
|
|
374
|
+
if (
|
|
375
|
+
existing.includes("jsxImportSource") &&
|
|
376
|
+
existing.includes("nativewind/babel")
|
|
377
|
+
) {
|
|
378
|
+
console.log(green(" ok ") + " babel.config.js");
|
|
379
|
+
return;
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
// create-expo-app ships a single-preset babel.config.js — overwrite it
|
|
383
|
+
if (/presets:\s*\[['"]babel-preset-expo['"]\]/.test(existing)) {
|
|
384
|
+
fs.writeFileSync(filepath, BABEL_CONFIG, "utf8");
|
|
385
|
+
console.log(green(" update") + " babel.config.js");
|
|
386
|
+
return;
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
// Complex existing config — show manual instructions
|
|
390
|
+
console.log(
|
|
391
|
+
yellow(" manual") + " babel.config.js — add NativeWind manually:",
|
|
392
|
+
);
|
|
393
|
+
console.log(
|
|
394
|
+
dim(
|
|
395
|
+
' presets: [["babel-preset-expo", { jsxImportSource: "nativewind" }], "nativewind/babel"]',
|
|
396
|
+
),
|
|
397
|
+
);
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
// ─── package.json — add postinstall ──────────────────────────────────────────
|
|
401
|
+
|
|
402
|
+
function addPostinstall() {
|
|
403
|
+
const pkgPath = path.join(cwd, "package.json");
|
|
404
|
+
if (!fs.existsSync(pkgPath)) return;
|
|
405
|
+
|
|
406
|
+
const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf8"));
|
|
407
|
+
pkg.scripts = pkg.scripts || {};
|
|
408
|
+
|
|
409
|
+
const existing = pkg.scripts.postinstall || "";
|
|
410
|
+
if (existing.includes(".metro-patch.js")) {
|
|
411
|
+
console.log(green(" ok ") + " package.json postinstall");
|
|
412
|
+
return;
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
pkg.scripts.postinstall = existing
|
|
416
|
+
? `${existing} && node .metro-patch.js`
|
|
417
|
+
: "node .metro-patch.js";
|
|
418
|
+
|
|
419
|
+
fs.writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + "\n", "utf8");
|
|
420
|
+
console.log(green(" update") + " package.json postinstall");
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
// ─── Install nativewind + tailwindcss ────────────────────────────────────────
|
|
424
|
+
//
|
|
425
|
+
// Runs npm install which also triggers postinstall, applying the Metro patch.
|
|
426
|
+
|
|
427
|
+
function installDeps() {
|
|
428
|
+
console.log(cyan("\n Installing required setup dependencies...\n"));
|
|
429
|
+
try {
|
|
430
|
+
execSync("npm install nativewind@4 tailwindcss@3 babel-preset-expo", {
|
|
431
|
+
cwd,
|
|
432
|
+
stdio: "inherit",
|
|
433
|
+
});
|
|
434
|
+
} catch {
|
|
435
|
+
console.log(
|
|
436
|
+
yellow("\n warn ") +
|
|
437
|
+
" npm install failed — run it manually to finish setup",
|
|
438
|
+
);
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
// ─── Run ─────────────────────────────────────────────────────────────────────
|
|
443
|
+
|
|
444
|
+
console.log(bold("\n@wireservers-ui/react-natives init\n"));
|
|
445
|
+
|
|
446
|
+
if (hasExpoRouter) {
|
|
447
|
+
console.log(cyan(" Detected Expo Router") + "\n");
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
write("tailwind.config.js", TAILWIND_CONFIG);
|
|
451
|
+
write("global.css", GLOBAL_CSS);
|
|
452
|
+
write("metro.config.js", METRO_CONFIG);
|
|
453
|
+
handleBabelConfig();
|
|
454
|
+
write("nativewind-env.d.ts", NATIVEWIND_ENV);
|
|
455
|
+
if (hasExpoRouter) {
|
|
456
|
+
writeStarter("app/index.tsx", ROUTER_INDEX_TSX);
|
|
457
|
+
} else {
|
|
458
|
+
writeStarter("App.tsx", APP_TSX);
|
|
459
|
+
}
|
|
460
|
+
write(".metro-patch.js", METRO_PATCH_SCRIPT);
|
|
461
|
+
addPostinstall();
|
|
462
|
+
installDeps();
|
|
463
|
+
|
|
464
|
+
console.log(
|
|
465
|
+
"\n" +
|
|
466
|
+
bold("Done.") +
|
|
467
|
+
" Run " +
|
|
468
|
+
cyan("npx expo start --clear") +
|
|
469
|
+
" to get started.\n",
|
|
470
|
+
);
|
package/package.json
CHANGED
|
@@ -1,30 +1,30 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { View } from 'react-native';
|
|
3
|
-
import { useAccordionContext } from './accordion';
|
|
4
|
-
import { useAccordionItemContext } from './accordion-item';
|
|
5
|
-
import type { AccordionContentProps } from './types';
|
|
6
|
-
import { accordionContentStyle } from './styles';
|
|
7
|
-
|
|
8
|
-
export const AccordionContent = React.forwardRef<
|
|
9
|
-
React.ElementRef<typeof View>,
|
|
10
|
-
AccordionContentProps
|
|
11
|
-
>(({ className, children, ...props }, ref) => {
|
|
12
|
-
const { size } = useAccordionContext();
|
|
13
|
-
const { isExpanded } = useAccordionItemContext();
|
|
14
|
-
|
|
15
|
-
if (!isExpanded) {
|
|
16
|
-
return null;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
return (
|
|
20
|
-
<View
|
|
21
|
-
ref={ref}
|
|
22
|
-
className={accordionContentStyle({ size, class: className })}
|
|
23
|
-
{...props}
|
|
24
|
-
>
|
|
25
|
-
{children}
|
|
26
|
-
</View>
|
|
27
|
-
);
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
AccordionContent.displayName = 'AccordionContent';
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { View } from 'react-native';
|
|
3
|
+
import { useAccordionContext } from './accordion';
|
|
4
|
+
import { useAccordionItemContext } from './accordion-item';
|
|
5
|
+
import type { AccordionContentProps } from './types';
|
|
6
|
+
import { accordionContentStyle } from './styles';
|
|
7
|
+
|
|
8
|
+
export const AccordionContent = React.forwardRef<
|
|
9
|
+
React.ElementRef<typeof View>,
|
|
10
|
+
AccordionContentProps
|
|
11
|
+
>(({ className, children, ...props }, ref) => {
|
|
12
|
+
const { size } = useAccordionContext();
|
|
13
|
+
const { isExpanded } = useAccordionItemContext();
|
|
14
|
+
|
|
15
|
+
if (!isExpanded) {
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
return (
|
|
20
|
+
<View
|
|
21
|
+
ref={ref}
|
|
22
|
+
className={accordionContentStyle({ size, class: className })}
|
|
23
|
+
{...props}
|
|
24
|
+
>
|
|
25
|
+
{children}
|
|
26
|
+
</View>
|
|
27
|
+
);
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
AccordionContent.displayName = 'AccordionContent';
|