strand-ui 0.1.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.
@@ -0,0 +1,2 @@
1
+ export declare function add(componentName: string): Promise<void>;
2
+ //# sourceMappingURL=add.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAgCA,wBAAsB,GAAG,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAyE9D"}
@@ -0,0 +1,70 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ import { components } from "../registry.js";
4
+ const CONFIG_FILE = "strand.config.json";
5
+ const FILE_HEADER = "/* Strand UI | MIT License | dillingerstaffing.com */\n";
6
+ function loadConfig() {
7
+ const configPath = path.join(process.cwd(), CONFIG_FILE);
8
+ if (!fs.existsSync(configPath)) {
9
+ return null;
10
+ }
11
+ return JSON.parse(fs.readFileSync(configPath, "utf-8"));
12
+ }
13
+ function resolveStrandUiPath() {
14
+ let dir = process.cwd();
15
+ while (dir !== path.dirname(dir)) {
16
+ const candidate = path.join(dir, "node_modules", "@dillingerstaffing", "strand-ui");
17
+ if (fs.existsSync(candidate)) {
18
+ return candidate;
19
+ }
20
+ dir = path.dirname(dir);
21
+ }
22
+ return null;
23
+ }
24
+ export async function add(componentName) {
25
+ if (!componentName) {
26
+ console.error("Usage: strand-ui add <component>");
27
+ console.error("Run `strand-ui list` to see available components.");
28
+ process.exit(1);
29
+ }
30
+ const key = componentName.toLowerCase();
31
+ const entry = components.get(key);
32
+ if (!entry) {
33
+ console.error(`Unknown component: "${componentName}"`);
34
+ console.error("Run `strand-ui list` to see available components.");
35
+ process.exit(1);
36
+ }
37
+ const config = loadConfig();
38
+ if (!config) {
39
+ console.error("No strand.config.json found. Run `strand-ui init` first.");
40
+ process.exit(1);
41
+ }
42
+ const strandUiPath = resolveStrandUiPath();
43
+ if (!strandUiPath) {
44
+ console.error("@dillingerstaffing/strand-ui is not installed.");
45
+ console.error("Install it first:\n");
46
+ console.error(" npm install @dillingerstaffing/strand-ui");
47
+ process.exit(1);
48
+ }
49
+ const sourceDir = path.join(strandUiPath, "src", "components", entry.name);
50
+ const targetDir = path.resolve(process.cwd(), config.componentDir, entry.name);
51
+ if (!fs.existsSync(sourceDir)) {
52
+ console.error(`Component source not found at ${sourceDir}`);
53
+ console.error("Make sure @dillingerstaffing/strand-ui includes source files.");
54
+ process.exit(1);
55
+ }
56
+ fs.mkdirSync(targetDir, { recursive: true });
57
+ for (const file of entry.files) {
58
+ const src = path.join(sourceDir, file);
59
+ const dest = path.join(targetDir, file);
60
+ if (!fs.existsSync(src)) {
61
+ console.log(` Warning: ${file} not found in source, skipping`);
62
+ continue;
63
+ }
64
+ const content = fs.readFileSync(src, "utf-8");
65
+ fs.writeFileSync(dest, FILE_HEADER + content);
66
+ console.log(` ${file} -> ${dest}`);
67
+ }
68
+ console.log(`\n${entry.name} added to ${targetDir}`);
69
+ }
70
+ //# sourceMappingURL=add.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function init(): Promise<void>;
2
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AA6EA,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAyB1C"}
@@ -0,0 +1,85 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ const CONFIG_FILE = "strand.config.json";
4
+ const DEFAULT_CONFIG = {
5
+ cssDir: "./src/styles",
6
+ componentDir: "./src/components",
7
+ };
8
+ function resolvePackagePath(packageName) {
9
+ try {
10
+ const resolved = import.meta.resolve?.(packageName);
11
+ if (resolved) {
12
+ const filePath = resolved.startsWith("file://")
13
+ ? new URL(resolved).pathname
14
+ : resolved;
15
+ // Walk up from the resolved entry point to find the package root
16
+ let dir = path.dirname(filePath);
17
+ while (dir !== path.dirname(dir)) {
18
+ if (fs.existsSync(path.join(dir, "package.json"))) {
19
+ return dir;
20
+ }
21
+ dir = path.dirname(dir);
22
+ }
23
+ }
24
+ }
25
+ catch {
26
+ // Fall through to manual resolution
27
+ }
28
+ // Manual resolution: walk up from cwd looking for node_modules
29
+ let dir = process.cwd();
30
+ while (dir !== path.dirname(dir)) {
31
+ const candidate = path.join(dir, "node_modules", packageName);
32
+ if (fs.existsSync(candidate)) {
33
+ return candidate;
34
+ }
35
+ dir = path.dirname(dir);
36
+ }
37
+ return null;
38
+ }
39
+ function copyCssFiles(cssDir) {
40
+ const packagePath = resolvePackagePath("@dillingerstaffing/strand");
41
+ if (!packagePath) {
42
+ console.log("\n@dillingerstaffing/strand is not installed. Install it first:\n");
43
+ console.log(" npm install @dillingerstaffing/strand\n");
44
+ console.log("Then run `strand-ui init` again to copy the CSS files.");
45
+ return false;
46
+ }
47
+ const cssSourceDir = path.join(packagePath, "css");
48
+ const files = ["tokens.css", "reset.css", "base.css"];
49
+ fs.mkdirSync(cssDir, { recursive: true });
50
+ for (const file of files) {
51
+ const src = path.join(cssSourceDir, file);
52
+ const dest = path.join(cssDir, file);
53
+ if (!fs.existsSync(src)) {
54
+ console.log(` Warning: ${file} not found in @dillingerstaffing/strand`);
55
+ continue;
56
+ }
57
+ const content = fs.readFileSync(src, "utf-8");
58
+ const header = `/* Strand UI | MIT License | dillingerstaffing.com */\n`;
59
+ fs.writeFileSync(dest, header + content);
60
+ console.log(` Copied ${file} -> ${dest}`);
61
+ }
62
+ return true;
63
+ }
64
+ export async function init() {
65
+ console.log("Strand by Dillinger Staffing -- dillingerstaffing.com\n");
66
+ const configPath = path.join(process.cwd(), CONFIG_FILE);
67
+ if (fs.existsSync(configPath)) {
68
+ console.log(`${CONFIG_FILE} already exists. Skipping config creation.`);
69
+ }
70
+ else {
71
+ fs.writeFileSync(configPath, JSON.stringify(DEFAULT_CONFIG, null, 2) + "\n");
72
+ console.log(`Created ${CONFIG_FILE}`);
73
+ }
74
+ const config = JSON.parse(fs.readFileSync(configPath, "utf-8"));
75
+ const cssDir = path.resolve(process.cwd(), config.cssDir);
76
+ const copied = copyCssFiles(cssDir);
77
+ if (copied) {
78
+ console.log("\nAdd these imports to your main CSS or entry file:\n");
79
+ console.log(` @import "${config.cssDir}/tokens.css";`);
80
+ console.log(` @import "${config.cssDir}/reset.css";`);
81
+ console.log(` @import "${config.cssDir}/base.css";`);
82
+ }
83
+ console.log("\nDone. Run `strand-ui add <component>` to add components.");
84
+ }
85
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function list(): Promise<void>;
2
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAMA,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CA6B1C"}
@@ -0,0 +1,27 @@
1
+ import { components, VALID_CATEGORIES, } from "../registry.js";
2
+ export async function list() {
3
+ console.log("Strand UI Components\n");
4
+ const grouped = new Map();
5
+ for (const category of VALID_CATEGORIES) {
6
+ grouped.set(category, []);
7
+ }
8
+ for (const [, entry] of components) {
9
+ const list = grouped.get(entry.category);
10
+ if (list) {
11
+ list.push(entry.name);
12
+ }
13
+ }
14
+ for (const category of VALID_CATEGORIES) {
15
+ const names = grouped.get(category);
16
+ if (names.length === 0)
17
+ continue;
18
+ console.log(`${category}:`);
19
+ for (const name of names) {
20
+ console.log(` ${name.toLowerCase()}`);
21
+ }
22
+ console.log();
23
+ }
24
+ console.log(`${components.size} components available.`);
25
+ console.log('Run `strand-ui add <name>` to add a component.');
26
+ }
27
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,gBAAgB,GAEjB,MAAM,gBAAgB,CAAC;AAExB,MAAM,CAAC,KAAK,UAAU,IAAI;IACxB,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IAEtC,MAAM,OAAO,GAAG,IAAI,GAAG,EAA+B,CAAC;IAEvD,KAAK,MAAM,QAAQ,IAAI,gBAAgB,EAAE,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAC5B,CAAC;IAED,KAAK,MAAM,CAAC,EAAE,KAAK,CAAC,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACzC,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAED,KAAK,MAAM,QAAQ,IAAI,gBAAgB,EAAE,CAAC;QACxC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC;QACrC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAEjC,OAAO,CAAC,GAAG,CAAC,GAAG,QAAQ,GAAG,CAAC,CAAC;QAC5B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QACzC,CAAC;QACD,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,IAAI,wBAAwB,CAAC,CAAC;IACxD,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;AAChE,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,52 @@
1
+ #!/usr/bin/env node
2
+ import { init } from "./commands/init.js";
3
+ import { add } from "./commands/add.js";
4
+ import { list } from "./commands/list.js";
5
+ const HELP = `strand-ui - CLI for adding Strand UI components to your project
6
+
7
+ Usage:
8
+ strand-ui <command> [options]
9
+
10
+ Commands:
11
+ init Set up tokens and base styles
12
+ add <component> Copy a component into your project
13
+ list List all available components
14
+ help Show this help message
15
+
16
+ Examples:
17
+ strand-ui init
18
+ strand-ui add button
19
+ strand-ui list
20
+
21
+ https://dillingerstaffing.com/labs/strand
22
+ `;
23
+ async function main() {
24
+ const args = process.argv.slice(2);
25
+ const command = args[0];
26
+ switch (command) {
27
+ case "init":
28
+ await init();
29
+ break;
30
+ case "add":
31
+ await add(args[1]);
32
+ break;
33
+ case "list":
34
+ await list();
35
+ break;
36
+ case "help":
37
+ case "--help":
38
+ case "-h":
39
+ case undefined:
40
+ console.log(HELP);
41
+ break;
42
+ default:
43
+ console.error(`Unknown command: "${command}"`);
44
+ console.log(HELP);
45
+ process.exit(1);
46
+ }
47
+ }
48
+ main().catch((err) => {
49
+ console.error(err);
50
+ process.exit(1);
51
+ });
52
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAE1C,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;;CAiBZ,CAAC;AAEF,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAExB,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,MAAM;YACT,MAAM,IAAI,EAAE,CAAC;YACb,MAAM;QACR,KAAK,KAAK;YACR,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YACnB,MAAM;QACR,KAAK,MAAM;YACT,MAAM,IAAI,EAAE,CAAC;YACb,MAAM;QACR,KAAK,MAAM,CAAC;QACZ,KAAK,QAAQ,CAAC;QACd,KAAK,IAAI,CAAC;QACV,KAAK,SAAS;YACZ,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAClB,MAAM;QACR;YACE,OAAO,CAAC,KAAK,CAAC,qBAAqB,OAAO,GAAG,CAAC,CAAC;YAC/C,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,9 @@
1
+ export type ComponentCategory = "Input" | "Display" | "Layout" | "Navigation" | "Feedback";
2
+ export interface ComponentEntry {
3
+ name: string;
4
+ category: ComponentCategory;
5
+ files: string[];
6
+ }
7
+ export declare const components: Map<string, ComponentEntry>;
8
+ export declare const VALID_CATEGORIES: ComponentCategory[];
9
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GACzB,OAAO,GACP,SAAS,GACT,QAAQ,GACR,YAAY,GACZ,UAAU,CAAC;AAEf,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,eAAO,MAAM,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAkQjD,CAAC;AAEH,eAAO,MAAM,gBAAgB,EAAE,iBAAiB,EAM/C,CAAC"}
@@ -0,0 +1,263 @@
1
+ export const components = new Map([
2
+ // Input
3
+ [
4
+ "button",
5
+ {
6
+ name: "Button",
7
+ category: "Input",
8
+ files: ["Button.tsx", "Button.css", "index.ts"],
9
+ },
10
+ ],
11
+ [
12
+ "input",
13
+ {
14
+ name: "Input",
15
+ category: "Input",
16
+ files: ["Input.tsx", "Input.css", "index.ts"],
17
+ },
18
+ ],
19
+ [
20
+ "textarea",
21
+ {
22
+ name: "Textarea",
23
+ category: "Input",
24
+ files: ["Textarea.tsx", "Textarea.css", "index.ts"],
25
+ },
26
+ ],
27
+ [
28
+ "select",
29
+ {
30
+ name: "Select",
31
+ category: "Input",
32
+ files: ["Select.tsx", "Select.css", "index.ts"],
33
+ },
34
+ ],
35
+ [
36
+ "checkbox",
37
+ {
38
+ name: "Checkbox",
39
+ category: "Input",
40
+ files: ["Checkbox.tsx", "Checkbox.css", "index.ts"],
41
+ },
42
+ ],
43
+ [
44
+ "radio",
45
+ {
46
+ name: "Radio",
47
+ category: "Input",
48
+ files: ["Radio.tsx", "Radio.css", "index.ts"],
49
+ },
50
+ ],
51
+ [
52
+ "switch",
53
+ {
54
+ name: "Switch",
55
+ category: "Input",
56
+ files: ["Switch.tsx", "Switch.css", "index.ts"],
57
+ },
58
+ ],
59
+ [
60
+ "slider",
61
+ {
62
+ name: "Slider",
63
+ category: "Input",
64
+ files: ["Slider.tsx", "Slider.css", "index.ts"],
65
+ },
66
+ ],
67
+ [
68
+ "formfield",
69
+ {
70
+ name: "FormField",
71
+ category: "Input",
72
+ files: ["FormField.tsx", "FormField.css", "index.ts"],
73
+ },
74
+ ],
75
+ // Display
76
+ [
77
+ "card",
78
+ {
79
+ name: "Card",
80
+ category: "Display",
81
+ files: ["Card.tsx", "Card.css", "index.ts"],
82
+ },
83
+ ],
84
+ [
85
+ "badge",
86
+ {
87
+ name: "Badge",
88
+ category: "Display",
89
+ files: ["Badge.tsx", "Badge.css", "index.ts"],
90
+ },
91
+ ],
92
+ [
93
+ "avatar",
94
+ {
95
+ name: "Avatar",
96
+ category: "Display",
97
+ files: ["Avatar.tsx", "Avatar.css", "index.ts"],
98
+ },
99
+ ],
100
+ [
101
+ "tag",
102
+ {
103
+ name: "Tag",
104
+ category: "Display",
105
+ files: ["Tag.tsx", "Tag.css", "index.ts"],
106
+ },
107
+ ],
108
+ [
109
+ "table",
110
+ {
111
+ name: "Table",
112
+ category: "Display",
113
+ files: ["Table.tsx", "Table.css", "index.ts"],
114
+ },
115
+ ],
116
+ [
117
+ "datareadout",
118
+ {
119
+ name: "DataReadout",
120
+ category: "Display",
121
+ files: ["DataReadout.tsx", "DataReadout.css", "index.ts"],
122
+ },
123
+ ],
124
+ // Layout
125
+ [
126
+ "stack",
127
+ {
128
+ name: "Stack",
129
+ category: "Layout",
130
+ files: ["Stack.tsx", "Stack.css", "index.ts"],
131
+ },
132
+ ],
133
+ [
134
+ "grid",
135
+ {
136
+ name: "Grid",
137
+ category: "Layout",
138
+ files: ["Grid.tsx", "Grid.css", "index.ts"],
139
+ },
140
+ ],
141
+ [
142
+ "container",
143
+ {
144
+ name: "Container",
145
+ category: "Layout",
146
+ files: ["Container.tsx", "Container.css", "index.ts"],
147
+ },
148
+ ],
149
+ [
150
+ "divider",
151
+ {
152
+ name: "Divider",
153
+ category: "Layout",
154
+ files: ["Divider.tsx", "Divider.css", "index.ts"],
155
+ },
156
+ ],
157
+ [
158
+ "section",
159
+ {
160
+ name: "Section",
161
+ category: "Layout",
162
+ files: ["Section.tsx", "Section.css", "index.ts"],
163
+ },
164
+ ],
165
+ // Navigation
166
+ [
167
+ "link",
168
+ {
169
+ name: "Link",
170
+ category: "Navigation",
171
+ files: ["Link.tsx", "Link.css", "index.ts"],
172
+ },
173
+ ],
174
+ [
175
+ "tabs",
176
+ {
177
+ name: "Tabs",
178
+ category: "Navigation",
179
+ files: ["Tabs.tsx", "Tabs.css", "index.ts"],
180
+ },
181
+ ],
182
+ [
183
+ "breadcrumb",
184
+ {
185
+ name: "Breadcrumb",
186
+ category: "Navigation",
187
+ files: ["Breadcrumb.tsx", "Breadcrumb.css", "index.ts"],
188
+ },
189
+ ],
190
+ [
191
+ "nav",
192
+ {
193
+ name: "Nav",
194
+ category: "Navigation",
195
+ files: ["Nav.tsx", "Nav.css", "index.ts"],
196
+ },
197
+ ],
198
+ // Feedback
199
+ [
200
+ "toast",
201
+ {
202
+ name: "Toast",
203
+ category: "Feedback",
204
+ files: ["Toast.tsx", "Toast.css", "index.ts"],
205
+ },
206
+ ],
207
+ [
208
+ "alert",
209
+ {
210
+ name: "Alert",
211
+ category: "Feedback",
212
+ files: ["Alert.tsx", "Alert.css", "index.ts"],
213
+ },
214
+ ],
215
+ [
216
+ "dialog",
217
+ {
218
+ name: "Dialog",
219
+ category: "Feedback",
220
+ files: ["Dialog.tsx", "Dialog.css", "index.ts"],
221
+ },
222
+ ],
223
+ [
224
+ "tooltip",
225
+ {
226
+ name: "Tooltip",
227
+ category: "Feedback",
228
+ files: ["Tooltip.tsx", "Tooltip.css", "index.ts"],
229
+ },
230
+ ],
231
+ [
232
+ "progress",
233
+ {
234
+ name: "Progress",
235
+ category: "Feedback",
236
+ files: ["Progress.tsx", "Progress.css", "index.ts"],
237
+ },
238
+ ],
239
+ [
240
+ "spinner",
241
+ {
242
+ name: "Spinner",
243
+ category: "Feedback",
244
+ files: ["Spinner.tsx", "Spinner.css", "index.ts"],
245
+ },
246
+ ],
247
+ [
248
+ "skeleton",
249
+ {
250
+ name: "Skeleton",
251
+ category: "Feedback",
252
+ files: ["Skeleton.tsx", "Skeleton.css", "index.ts"],
253
+ },
254
+ ],
255
+ ]);
256
+ export const VALID_CATEGORIES = [
257
+ "Input",
258
+ "Display",
259
+ "Layout",
260
+ "Navigation",
261
+ "Feedback",
262
+ ];
263
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,29 @@
1
+ {
2
+ "name": "strand-ui",
3
+ "version": "0.1.0",
4
+ "description": "CLI for adding Strand UI components to your project",
5
+ "author": "Dillinger Staffing <engineering@dillingerstaffing.com> (https://dillingerstaffing.com)",
6
+ "license": "MIT",
7
+ "homepage": "https://dillingerstaffing.com/labs/strand",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "https://github.com/dillingerstaffing/strand",
11
+ "directory": "packages/cli"
12
+ },
13
+ "bugs": {
14
+ "url": "https://github.com/dillingerstaffing/strand/issues"
15
+ },
16
+ "type": "module",
17
+ "bin": {
18
+ "strand-ui": "./dist/index.js"
19
+ },
20
+ "files": ["dist/"],
21
+ "scripts": {
22
+ "build": "tsc",
23
+ "test": "vitest run"
24
+ },
25
+ "devDependencies": {
26
+ "@types/node": "^22.0.0",
27
+ "vitest": "^3.0.0"
28
+ }
29
+ }