pejay-ui 1.3.5 → 1.4.1
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/README.md +20 -0
- package/bin/cli.js +125 -35
- package/package.json +2 -2
- package/registry/buttons.json +9 -0
- package/registry/dropdowns.json +28 -0
- package/registry/forms.json +322 -0
- package/registry/layouts.json +18 -0
- package/registry/overlays.json +8 -0
- package/registry/scaffolds.json +83 -0
- package/registry/toast.json +10 -0
- package/templates/overlays/index.ts +1 -0
- package/templates/overlays/portal.tsx +26 -0
- package/templates/toast/README.md +183 -0
- package/templates/toast/container.tsx +320 -0
- package/templates/toast/index.ts +4 -0
- package/templates/toast/store.ts +35 -0
- package/templates/toast/toast.ts +54 -0
- package/templates/toast/types.ts +15 -0
- package/registry.json +0 -256
package/README.md
CHANGED
|
@@ -43,6 +43,9 @@ This allows you to easily import multiple components:
|
|
|
43
43
|
import { Input, Checkbox, AmountInput } from "@/pejay-ui/components";
|
|
44
44
|
```
|
|
45
45
|
|
|
46
|
+
**Component-Specific Documentation (READMEs):**
|
|
47
|
+
Certain components (like `toast`) ship with localized `README.md` guides. When you install them, the CLI automatically copies their detailed usage documentation directly into the component's folder (e.g., `src/pejay-ui/components/toast/README.md`) so you have helper docs right next to the code.
|
|
48
|
+
|
|
46
49
|
### 3. Remove Component
|
|
47
50
|
```bash
|
|
48
51
|
npx pejay-ui remove <component-name>
|
|
@@ -84,6 +87,7 @@ npx pejay-ui add form/switch
|
|
|
84
87
|
npx pejay-ui add form/textarea
|
|
85
88
|
npx pejay-ui add form/url-input
|
|
86
89
|
```
|
|
90
|
+
*(Supports category-wide commands: `npx pejay-ui add form --all` or `npx pejay-ui add form --select`)*
|
|
87
91
|
|
|
88
92
|
### Date & Time Pickers
|
|
89
93
|
```bash
|
|
@@ -92,17 +96,32 @@ npx pejay-ui add form/date-range-picker
|
|
|
92
96
|
npx pejay-ui add form/time-picker
|
|
93
97
|
npx pejay-ui add form/time-range-picker
|
|
94
98
|
```
|
|
99
|
+
*(Supports category-wide commands: `npx pejay-ui add form --all` or `npx pejay-ui add form --select`)*
|
|
95
100
|
|
|
96
101
|
### Dropdowns & Selects
|
|
97
102
|
```bash
|
|
98
103
|
npx pejay-ui add dropdown/select-input
|
|
99
104
|
npx pejay-ui add dropdown/multiselect-input
|
|
100
105
|
```
|
|
106
|
+
*(Supports category-wide commands: `npx pejay-ui add dropdown --all` or `npx pejay-ui add dropdown --select`)*
|
|
101
107
|
|
|
102
108
|
### Layouts
|
|
103
109
|
```bash
|
|
104
110
|
npx pejay-ui add layouts/lv1
|
|
105
111
|
```
|
|
112
|
+
*(Supports category-wide commands: `npx pejay-ui add layouts --all` or `npx pejay-ui add layouts --select`)*
|
|
113
|
+
|
|
114
|
+
### Toast
|
|
115
|
+
```bash
|
|
116
|
+
npx pejay-ui add toast
|
|
117
|
+
```
|
|
118
|
+
*(Includes a localized `README.md` guide copied directly into your components folder).*
|
|
119
|
+
|
|
120
|
+
### Overlays
|
|
121
|
+
```bash
|
|
122
|
+
npx pejay-ui add overlays/portal
|
|
123
|
+
```
|
|
124
|
+
*(Supports category-wide commands: `npx pejay-ui add overlays --all` or `npx pejay-ui add overlays --select`)*
|
|
106
125
|
|
|
107
126
|
### Scaffolds & Templates
|
|
108
127
|
```bash
|
|
@@ -113,3 +132,4 @@ npx pejay-ui add axios-client
|
|
|
113
132
|
npx pejay-ui add redux-store-client
|
|
114
133
|
npx pejay-ui add rtk-query-client
|
|
115
134
|
```
|
|
135
|
+
*(Supports category-wide commands: `npx pejay-ui add scaffold --all` or `npx pejay-ui add scaffold --select`)*
|
package/bin/cli.js
CHANGED
|
@@ -38,14 +38,37 @@ const getFilesRecursively = async (dir) => {
|
|
|
38
38
|
return results;
|
|
39
39
|
};
|
|
40
40
|
|
|
41
|
+
const loadRegistry = async () => {
|
|
42
|
+
const registryDir = path.join(packageRoot, "registry");
|
|
43
|
+
if (!await fs.pathExists(registryDir)) {
|
|
44
|
+
console.error(`Error: Registry directory not found at ${registryDir}`);
|
|
45
|
+
process.exit(1);
|
|
46
|
+
}
|
|
47
|
+
const files = await fs.readdir(registryDir);
|
|
48
|
+
const registry = {};
|
|
49
|
+
for (const file of files) {
|
|
50
|
+
if (file.endsWith(".json")) {
|
|
51
|
+
const filePath = path.join(registryDir, file);
|
|
52
|
+
try {
|
|
53
|
+
const data = await fs.readJSON(filePath);
|
|
54
|
+
Object.assign(registry, data);
|
|
55
|
+
} catch (e) {
|
|
56
|
+
console.error(`Error reading registry file: ${file}`, e);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return registry;
|
|
61
|
+
};
|
|
62
|
+
const pkg = await fs.readJSON(path.join(packageRoot, "package.json"));
|
|
63
|
+
|
|
41
64
|
program
|
|
42
65
|
.name("pejay-ui")
|
|
43
66
|
.description("CLI to initialize, add, and remove React UI components")
|
|
44
|
-
.version(
|
|
67
|
+
.version(pkg.version);
|
|
45
68
|
|
|
46
69
|
/* =============================
|
|
47
70
|
INIT COMMAND
|
|
48
|
-
============================= */
|
|
71
|
+
============================= */
|
|
49
72
|
program
|
|
50
73
|
.command("init")
|
|
51
74
|
.description("Initialize pejay-ui configuration in your project")
|
|
@@ -70,7 +93,7 @@ program
|
|
|
70
93
|
|
|
71
94
|
/* =============================
|
|
72
95
|
ADD COMMAND
|
|
73
|
-
============================= */
|
|
96
|
+
============================= */
|
|
74
97
|
program
|
|
75
98
|
.command("add <component>")
|
|
76
99
|
.description("Add a component to your project")
|
|
@@ -87,25 +110,45 @@ program
|
|
|
87
110
|
}
|
|
88
111
|
|
|
89
112
|
const config = await fs.readJSON(configPath);
|
|
90
|
-
const
|
|
91
|
-
|
|
92
|
-
if (!await fs.pathExists(registryPath)) {
|
|
93
|
-
console.error("Error: Registry configuration not found in the package.");
|
|
94
|
-
process.exit(1);
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
const registry = await fs.readJSON(registryPath);
|
|
113
|
+
const registry = await loadRegistry();
|
|
98
114
|
const isTsProject = await fs.pathExists(path.join(cwd, "tsconfig.json"));
|
|
99
115
|
|
|
100
116
|
// Determine which components to install
|
|
101
117
|
let selectedComponents = [];
|
|
102
118
|
|
|
103
|
-
//
|
|
104
|
-
const
|
|
105
|
-
|
|
106
|
-
|
|
119
|
+
// Determine if the input refers to a category that supports category-wide operations
|
|
120
|
+
const categorySupportMap = {};
|
|
121
|
+
for (const [key, compData] of Object.entries(registry)) {
|
|
122
|
+
if (compData.category && compData.supportsCategory) {
|
|
123
|
+
categorySupportMap[compData.category.toLowerCase()] = compData.category;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
const getCategoryFromInput = (input, supportMap) => {
|
|
128
|
+
const normInput = input.toLowerCase().trim().replace(/s$/, "");
|
|
129
|
+
for (const [normCat, originalCat] of Object.entries(supportMap)) {
|
|
130
|
+
const normCatSingular = normCat.replace(/s$/, "");
|
|
131
|
+
if (normInput === normCatSingular || (normInput === "dropdown" && normCatSingular === "select-dropdown")) {
|
|
132
|
+
return originalCat;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return null;
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
const targetCategory = getCategoryFromInput(component, categorySupportMap);
|
|
139
|
+
const isExactComponent = !!registry[component];
|
|
140
|
+
|
|
141
|
+
if (targetCategory && (!isExactComponent || options.all || options.select)) {
|
|
142
|
+
// Treat as category installation
|
|
143
|
+
const categoryComponents = Object.keys(registry).filter(
|
|
144
|
+
(key) => registry[key].category === targetCategory
|
|
145
|
+
);
|
|
146
|
+
|
|
147
|
+
if (categoryComponents.length === 0) {
|
|
148
|
+
console.error(`Error: Category '${component}' has no components in the registry.`);
|
|
149
|
+
process.exit(1);
|
|
150
|
+
}
|
|
107
151
|
|
|
108
|
-
if (categoryComponents.length > 0) {
|
|
109
152
|
if (options.all) {
|
|
110
153
|
selectedComponents = categoryComponents;
|
|
111
154
|
} else {
|
|
@@ -114,7 +157,7 @@ program
|
|
|
114
157
|
{
|
|
115
158
|
type: "checkbox",
|
|
116
159
|
name: "components",
|
|
117
|
-
message: `Select components from category "${
|
|
160
|
+
message: `Select components from category "${targetCategory}" to add:`,
|
|
118
161
|
choices: categoryComponents.map((key) => ({
|
|
119
162
|
name: `${registry[key].name} (${key})`,
|
|
120
163
|
value: key,
|
|
@@ -128,8 +171,8 @@ program
|
|
|
128
171
|
}
|
|
129
172
|
}
|
|
130
173
|
} else {
|
|
131
|
-
// Not a category, treat as a single component key
|
|
132
|
-
if (!
|
|
174
|
+
// Not a category (or exact component targeted without category flags), treat as a single component key
|
|
175
|
+
if (!isExactComponent) {
|
|
133
176
|
console.error(`Error: Component or Category '${component}' not found in registry.`);
|
|
134
177
|
console.log(`Available categories/components: ${Array.from(new Set(Object.values(registry).map(c => c.category).filter(Boolean))).join(", ")} or ${Object.keys(registry).join(", ")}`);
|
|
135
178
|
process.exit(1);
|
|
@@ -175,6 +218,67 @@ program
|
|
|
175
218
|
}
|
|
176
219
|
|
|
177
220
|
const componentData = registry[compToInstall];
|
|
221
|
+
|
|
222
|
+
// Check if the component is already installed or if any target files already exist
|
|
223
|
+
const outputExt = isTsProject ? "tsx" : "jsx";
|
|
224
|
+
let isAlreadyPresent = !!config.installed?.[compToInstall];
|
|
225
|
+
|
|
226
|
+
if (!isAlreadyPresent) {
|
|
227
|
+
let targetDir;
|
|
228
|
+
if (componentData.category === "scaffold") {
|
|
229
|
+
targetDir = path.join(cwd, "src", componentData.targetDirName || compToInstall);
|
|
230
|
+
} else {
|
|
231
|
+
targetDir = path.join(cwd, config.baseDir, "components", componentData.category);
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
const sourceFiles = componentData.files || (componentData.path ? [componentData.path] : []);
|
|
235
|
+
for (const srcFilePath of sourceFiles) {
|
|
236
|
+
const templateSrc = path.join(packageRoot, srcFilePath);
|
|
237
|
+
if (await fs.pathExists(templateSrc)) {
|
|
238
|
+
const isDir = (await fs.stat(templateSrc)).isDirectory();
|
|
239
|
+
if (isDir) {
|
|
240
|
+
const allFiles = await getFilesRecursively(templateSrc);
|
|
241
|
+
for (const file of allFiles) {
|
|
242
|
+
const relativePath = path.relative(templateSrc, file);
|
|
243
|
+
const filename = relativePath.replace(/\.(tsx|ts)$/, (match) => {
|
|
244
|
+
return match === ".tsx" ? `.${outputExt}` : `.${isTsProject ? "ts" : "js"}`;
|
|
245
|
+
});
|
|
246
|
+
const targetFile = path.join(targetDir, filename);
|
|
247
|
+
if (await fs.pathExists(targetFile)) {
|
|
248
|
+
isAlreadyPresent = true;
|
|
249
|
+
break;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
} else {
|
|
253
|
+
const filename = path.basename(srcFilePath).replace(/\.(tsx|ts)$/, (match) => {
|
|
254
|
+
return match === ".tsx" ? `.${outputExt}` : `.${isTsProject ? "ts" : "js"}`;
|
|
255
|
+
});
|
|
256
|
+
const targetFile = path.join(targetDir, filename);
|
|
257
|
+
if (await fs.pathExists(targetFile)) {
|
|
258
|
+
isAlreadyPresent = true;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
if (isAlreadyPresent) break;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
if (isAlreadyPresent) {
|
|
267
|
+
const { overwrite } = await prompt([
|
|
268
|
+
{
|
|
269
|
+
type: "confirm",
|
|
270
|
+
name: "overwrite",
|
|
271
|
+
message: `Component '${compToInstall}' is already present in your project. Overwriting it will discard any local changes you have made. Do you want to proceed and overwrite it?`,
|
|
272
|
+
default: false,
|
|
273
|
+
},
|
|
274
|
+
]);
|
|
275
|
+
|
|
276
|
+
if (!overwrite) {
|
|
277
|
+
console.log(`Skipping component: ${componentData.name}.\n`);
|
|
278
|
+
continue;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
|
|
178
282
|
console.log(`Installing component: ${componentData.name}...`);
|
|
179
283
|
|
|
180
284
|
// 1. Check target project package.json for peerDependencies
|
|
@@ -257,7 +361,6 @@ program
|
|
|
257
361
|
} else {
|
|
258
362
|
targetDir = path.join(cwd, config.baseDir, "components", componentData.category);
|
|
259
363
|
}
|
|
260
|
-
const outputExt = isTsProject ? "tsx" : "jsx";
|
|
261
364
|
|
|
262
365
|
// Determine list of files to copy
|
|
263
366
|
const sourceFiles = componentData.files || (componentData.path ? [componentData.path] : []);
|
|
@@ -419,14 +522,7 @@ program
|
|
|
419
522
|
}
|
|
420
523
|
|
|
421
524
|
const config = await fs.readJSON(configPath);
|
|
422
|
-
const
|
|
423
|
-
|
|
424
|
-
if (!await fs.pathExists(registryPath)) {
|
|
425
|
-
console.error("Error: Registry configuration not found.");
|
|
426
|
-
process.exit(1);
|
|
427
|
-
}
|
|
428
|
-
|
|
429
|
-
const registry = await fs.readJSON(registryPath);
|
|
525
|
+
const registry = await loadRegistry();
|
|
430
526
|
const componentData = registry[component];
|
|
431
527
|
|
|
432
528
|
if (!componentData) {
|
|
@@ -636,13 +732,7 @@ program
|
|
|
636
732
|
}
|
|
637
733
|
}
|
|
638
734
|
|
|
639
|
-
const
|
|
640
|
-
if (!await fs.pathExists(registryPath)) {
|
|
641
|
-
console.error("Error: Registry configuration not found.");
|
|
642
|
-
process.exit(1);
|
|
643
|
-
}
|
|
644
|
-
|
|
645
|
-
const registry = await fs.readJSON(registryPath);
|
|
735
|
+
const registry = await loadRegistry();
|
|
646
736
|
|
|
647
737
|
// Terminal styling colors
|
|
648
738
|
const GREEN = "\x1b[32m";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pejay-ui",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "react ui components",
|
|
6
6
|
"bin": {
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
"bin/",
|
|
11
11
|
"templates/",
|
|
12
12
|
"utils/",
|
|
13
|
-
"registry
|
|
13
|
+
"registry/"
|
|
14
14
|
],
|
|
15
15
|
"keywords": [
|
|
16
16
|
"react",
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"dropdown/select-input": {
|
|
3
|
+
"name": "SelectInput",
|
|
4
|
+
"category": "select-dropdown",
|
|
5
|
+
"files": ["templates/select-dropdown/select-input.tsx"],
|
|
6
|
+
"utils": ["cn.ts"],
|
|
7
|
+
"peerDependencies": [
|
|
8
|
+
"clsx",
|
|
9
|
+
"tailwind-merge",
|
|
10
|
+
"lucide-react",
|
|
11
|
+
"@floating-ui/react"
|
|
12
|
+
],
|
|
13
|
+
"supportsCategory": true
|
|
14
|
+
},
|
|
15
|
+
"dropdown/multiselect-input": {
|
|
16
|
+
"name": "MultiselectInput",
|
|
17
|
+
"category": "select-dropdown",
|
|
18
|
+
"files": ["templates/select-dropdown/multiselect-input.tsx"],
|
|
19
|
+
"utils": ["cn.ts"],
|
|
20
|
+
"peerDependencies": [
|
|
21
|
+
"clsx",
|
|
22
|
+
"tailwind-merge",
|
|
23
|
+
"lucide-react",
|
|
24
|
+
"@floating-ui/react"
|
|
25
|
+
],
|
|
26
|
+
"supportsCategory": true
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
{
|
|
2
|
+
"form/input": {
|
|
3
|
+
"name": "Input",
|
|
4
|
+
"category": "form",
|
|
5
|
+
"files": [
|
|
6
|
+
"templates/form/input.tsx"
|
|
7
|
+
],
|
|
8
|
+
"utils": [
|
|
9
|
+
"cn.ts"
|
|
10
|
+
],
|
|
11
|
+
"peerDependencies": [
|
|
12
|
+
"clsx",
|
|
13
|
+
"tailwind-merge",
|
|
14
|
+
"lucide-react"
|
|
15
|
+
],
|
|
16
|
+
"supportsCategory": true
|
|
17
|
+
},
|
|
18
|
+
"form/amount-input": {
|
|
19
|
+
"name": "AmountInput",
|
|
20
|
+
"category": "form",
|
|
21
|
+
"files": [
|
|
22
|
+
"templates/form/amount-input.tsx"
|
|
23
|
+
],
|
|
24
|
+
"utils": [
|
|
25
|
+
"cn.ts"
|
|
26
|
+
],
|
|
27
|
+
"peerDependencies": [
|
|
28
|
+
"clsx",
|
|
29
|
+
"tailwind-merge",
|
|
30
|
+
"lucide-react"
|
|
31
|
+
],
|
|
32
|
+
"supportsCategory": true
|
|
33
|
+
},
|
|
34
|
+
"form/checkbox": {
|
|
35
|
+
"name": "Checkbox",
|
|
36
|
+
"category": "form",
|
|
37
|
+
"files": [
|
|
38
|
+
"templates/form/checkbox.tsx"
|
|
39
|
+
],
|
|
40
|
+
"utils": [
|
|
41
|
+
"cn.ts"
|
|
42
|
+
],
|
|
43
|
+
"peerDependencies": [
|
|
44
|
+
"clsx",
|
|
45
|
+
"tailwind-merge",
|
|
46
|
+
"lucide-react"
|
|
47
|
+
],
|
|
48
|
+
"supportsCategory": true
|
|
49
|
+
},
|
|
50
|
+
"form/checkbox-group": {
|
|
51
|
+
"name": "CheckboxGroup",
|
|
52
|
+
"category": "form",
|
|
53
|
+
"files": [
|
|
54
|
+
"templates/form/checkbox-group.tsx"
|
|
55
|
+
],
|
|
56
|
+
"utils": [
|
|
57
|
+
"cn.ts"
|
|
58
|
+
],
|
|
59
|
+
"peerDependencies": [
|
|
60
|
+
"clsx",
|
|
61
|
+
"tailwind-merge"
|
|
62
|
+
],
|
|
63
|
+
"dependencies": [
|
|
64
|
+
"form/checkbox"
|
|
65
|
+
],
|
|
66
|
+
"supportsCategory": true
|
|
67
|
+
},
|
|
68
|
+
"form/date-picker": {
|
|
69
|
+
"name": "DatePicker",
|
|
70
|
+
"category": "form",
|
|
71
|
+
"files": [
|
|
72
|
+
"templates/form/date-picker.tsx"
|
|
73
|
+
],
|
|
74
|
+
"utils": [
|
|
75
|
+
"cn.ts"
|
|
76
|
+
],
|
|
77
|
+
"peerDependencies": [
|
|
78
|
+
"clsx",
|
|
79
|
+
"tailwind-merge",
|
|
80
|
+
"lucide-react",
|
|
81
|
+
"@floating-ui/react"
|
|
82
|
+
],
|
|
83
|
+
"dependencies": [
|
|
84
|
+
"dropdown/select-input"
|
|
85
|
+
],
|
|
86
|
+
"supportsCategory": true
|
|
87
|
+
},
|
|
88
|
+
"form/date-range-picker": {
|
|
89
|
+
"name": "DateRangePicker",
|
|
90
|
+
"category": "form",
|
|
91
|
+
"files": [
|
|
92
|
+
"templates/form/date-range-picker.tsx"
|
|
93
|
+
],
|
|
94
|
+
"utils": [
|
|
95
|
+
"cn.ts"
|
|
96
|
+
],
|
|
97
|
+
"peerDependencies": [
|
|
98
|
+
"clsx",
|
|
99
|
+
"tailwind-merge",
|
|
100
|
+
"lucide-react",
|
|
101
|
+
"@floating-ui/react"
|
|
102
|
+
],
|
|
103
|
+
"dependencies": [
|
|
104
|
+
"dropdown/select-input"
|
|
105
|
+
],
|
|
106
|
+
"supportsCategory": true
|
|
107
|
+
},
|
|
108
|
+
"form/email-input": {
|
|
109
|
+
"name": "EmailInput",
|
|
110
|
+
"category": "form",
|
|
111
|
+
"files": [
|
|
112
|
+
"templates/form/email-input.tsx"
|
|
113
|
+
],
|
|
114
|
+
"utils": [
|
|
115
|
+
"cn.ts"
|
|
116
|
+
],
|
|
117
|
+
"peerDependencies": [
|
|
118
|
+
"clsx",
|
|
119
|
+
"tailwind-merge",
|
|
120
|
+
"lucide-react"
|
|
121
|
+
],
|
|
122
|
+
"supportsCategory": true
|
|
123
|
+
},
|
|
124
|
+
"form/file-input": {
|
|
125
|
+
"name": "FileInput",
|
|
126
|
+
"category": "form",
|
|
127
|
+
"files": [
|
|
128
|
+
"templates/form/file-input.tsx"
|
|
129
|
+
],
|
|
130
|
+
"utils": [
|
|
131
|
+
"cn.ts"
|
|
132
|
+
],
|
|
133
|
+
"peerDependencies": [
|
|
134
|
+
"clsx",
|
|
135
|
+
"tailwind-merge",
|
|
136
|
+
"lucide-react"
|
|
137
|
+
],
|
|
138
|
+
"supportsCategory": true
|
|
139
|
+
},
|
|
140
|
+
"form/number-input": {
|
|
141
|
+
"name": "NumberInput",
|
|
142
|
+
"category": "form",
|
|
143
|
+
"files": [
|
|
144
|
+
"templates/form/number-input.tsx"
|
|
145
|
+
],
|
|
146
|
+
"utils": [
|
|
147
|
+
"cn.ts"
|
|
148
|
+
],
|
|
149
|
+
"peerDependencies": [
|
|
150
|
+
"clsx",
|
|
151
|
+
"tailwind-merge",
|
|
152
|
+
"lucide-react"
|
|
153
|
+
],
|
|
154
|
+
"supportsCategory": true
|
|
155
|
+
},
|
|
156
|
+
"form/password-input": {
|
|
157
|
+
"name": "PasswordInput",
|
|
158
|
+
"category": "form",
|
|
159
|
+
"files": [
|
|
160
|
+
"templates/form/password-input.tsx"
|
|
161
|
+
],
|
|
162
|
+
"utils": [
|
|
163
|
+
"cn.ts"
|
|
164
|
+
],
|
|
165
|
+
"peerDependencies": [
|
|
166
|
+
"clsx",
|
|
167
|
+
"tailwind-merge",
|
|
168
|
+
"lucide-react"
|
|
169
|
+
],
|
|
170
|
+
"supportsCategory": true
|
|
171
|
+
},
|
|
172
|
+
"form/phone-input": {
|
|
173
|
+
"name": "PhoneInput",
|
|
174
|
+
"category": "form",
|
|
175
|
+
"files": [
|
|
176
|
+
"templates/form/phone-input.tsx"
|
|
177
|
+
],
|
|
178
|
+
"utils": [
|
|
179
|
+
"cn.ts"
|
|
180
|
+
],
|
|
181
|
+
"peerDependencies": [
|
|
182
|
+
"clsx",
|
|
183
|
+
"tailwind-merge",
|
|
184
|
+
"lucide-react"
|
|
185
|
+
],
|
|
186
|
+
"supportsCategory": true
|
|
187
|
+
},
|
|
188
|
+
"form/radio": {
|
|
189
|
+
"name": "Radio",
|
|
190
|
+
"category": "form",
|
|
191
|
+
"files": [
|
|
192
|
+
"templates/form/radio.tsx"
|
|
193
|
+
],
|
|
194
|
+
"utils": [
|
|
195
|
+
"cn.ts"
|
|
196
|
+
],
|
|
197
|
+
"peerDependencies": [
|
|
198
|
+
"clsx",
|
|
199
|
+
"tailwind-merge"
|
|
200
|
+
],
|
|
201
|
+
"supportsCategory": true
|
|
202
|
+
},
|
|
203
|
+
"form/radio-group": {
|
|
204
|
+
"name": "RadioGroup",
|
|
205
|
+
"category": "form",
|
|
206
|
+
"files": [
|
|
207
|
+
"templates/form/radio-group.tsx"
|
|
208
|
+
],
|
|
209
|
+
"utils": [
|
|
210
|
+
"cn.ts"
|
|
211
|
+
],
|
|
212
|
+
"peerDependencies": [
|
|
213
|
+
"clsx",
|
|
214
|
+
"tailwind-merge"
|
|
215
|
+
],
|
|
216
|
+
"dependencies": [
|
|
217
|
+
"form/radio"
|
|
218
|
+
],
|
|
219
|
+
"supportsCategory": true
|
|
220
|
+
},
|
|
221
|
+
"form/range-slider": {
|
|
222
|
+
"name": "RangeSlider",
|
|
223
|
+
"category": "form",
|
|
224
|
+
"files": [
|
|
225
|
+
"templates/form/range-slider.tsx"
|
|
226
|
+
],
|
|
227
|
+
"utils": [
|
|
228
|
+
"cn.ts"
|
|
229
|
+
],
|
|
230
|
+
"peerDependencies": [
|
|
231
|
+
"clsx",
|
|
232
|
+
"tailwind-merge"
|
|
233
|
+
],
|
|
234
|
+
"supportsCategory": true
|
|
235
|
+
},
|
|
236
|
+
"form/switch": {
|
|
237
|
+
"name": "Switch",
|
|
238
|
+
"category": "form",
|
|
239
|
+
"files": [
|
|
240
|
+
"templates/form/switch.tsx"
|
|
241
|
+
],
|
|
242
|
+
"utils": [
|
|
243
|
+
"cn.ts"
|
|
244
|
+
],
|
|
245
|
+
"peerDependencies": [
|
|
246
|
+
"clsx",
|
|
247
|
+
"tailwind-merge"
|
|
248
|
+
],
|
|
249
|
+
"supportsCategory": true
|
|
250
|
+
},
|
|
251
|
+
"form/textarea": {
|
|
252
|
+
"name": "Textarea",
|
|
253
|
+
"category": "form",
|
|
254
|
+
"files": [
|
|
255
|
+
"templates/form/textarea.tsx"
|
|
256
|
+
],
|
|
257
|
+
"utils": [
|
|
258
|
+
"cn.ts"
|
|
259
|
+
],
|
|
260
|
+
"peerDependencies": [
|
|
261
|
+
"clsx",
|
|
262
|
+
"tailwind-merge"
|
|
263
|
+
],
|
|
264
|
+
"supportsCategory": true
|
|
265
|
+
},
|
|
266
|
+
"form/time-picker": {
|
|
267
|
+
"name": "TimePicker",
|
|
268
|
+
"category": "form",
|
|
269
|
+
"files": [
|
|
270
|
+
"templates/form/time-picker.tsx"
|
|
271
|
+
],
|
|
272
|
+
"utils": [
|
|
273
|
+
"cn.ts"
|
|
274
|
+
],
|
|
275
|
+
"peerDependencies": [
|
|
276
|
+
"clsx",
|
|
277
|
+
"tailwind-merge",
|
|
278
|
+
"lucide-react",
|
|
279
|
+
"@floating-ui/react"
|
|
280
|
+
],
|
|
281
|
+
"dependencies": [
|
|
282
|
+
"dropdown/select-input"
|
|
283
|
+
],
|
|
284
|
+
"supportsCategory": true
|
|
285
|
+
},
|
|
286
|
+
"form/time-range-picker": {
|
|
287
|
+
"name": "TimeRangePicker",
|
|
288
|
+
"category": "form",
|
|
289
|
+
"files": [
|
|
290
|
+
"templates/form/time-range-picker.tsx"
|
|
291
|
+
],
|
|
292
|
+
"utils": [
|
|
293
|
+
"cn.ts"
|
|
294
|
+
],
|
|
295
|
+
"peerDependencies": [
|
|
296
|
+
"clsx",
|
|
297
|
+
"tailwind-merge",
|
|
298
|
+
"lucide-react",
|
|
299
|
+
"@floating-ui/react"
|
|
300
|
+
],
|
|
301
|
+
"dependencies": [
|
|
302
|
+
"dropdown/select-input"
|
|
303
|
+
],
|
|
304
|
+
"supportsCategory": true
|
|
305
|
+
},
|
|
306
|
+
"form/url-input": {
|
|
307
|
+
"name": "UrlInput",
|
|
308
|
+
"category": "form",
|
|
309
|
+
"files": [
|
|
310
|
+
"templates/form/url-input.tsx"
|
|
311
|
+
],
|
|
312
|
+
"utils": [
|
|
313
|
+
"cn.ts"
|
|
314
|
+
],
|
|
315
|
+
"peerDependencies": [
|
|
316
|
+
"clsx",
|
|
317
|
+
"tailwind-merge",
|
|
318
|
+
"lucide-react"
|
|
319
|
+
],
|
|
320
|
+
"supportsCategory": true
|
|
321
|
+
}
|
|
322
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"layouts/lv1": {
|
|
3
|
+
"name": "AppLayout",
|
|
4
|
+
"category": "layouts",
|
|
5
|
+
"files": [
|
|
6
|
+
"templates/layouts/lv1/app-layout.tsx",
|
|
7
|
+
"templates/layouts/lv1/sidebar-menu.tsx",
|
|
8
|
+
"templates/layouts/lv1/index.ts"
|
|
9
|
+
],
|
|
10
|
+
"utils": ["cn.ts"],
|
|
11
|
+
"peerDependencies": [
|
|
12
|
+
"clsx",
|
|
13
|
+
"tailwind-merge",
|
|
14
|
+
"lucide-react"
|
|
15
|
+
],
|
|
16
|
+
"supportsCategory": true
|
|
17
|
+
}
|
|
18
|
+
}
|