inai-react-components 1.4.1 → 1.5.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.
@@ -1 +1 @@
1
- {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAKA,OAAO,EAGL,KAAK,iBAAiB,EAEtB,KAAK,kBAAkB,EAExB,MAAM,aAAa,CAAC;AAoBrB,MAAM,WAAW,UAAU;IACzB,kDAAkD;IAClD,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,2CAA2C;IAC3C,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,kDAAkD;IAClD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,oDAAoD;IACpD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,kDAAkD;IAClD,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,2DAA2D;IAC3D,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,4DAA4D;IAC5D,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,kEAAkE;IAClE,WAAW,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACjD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG;IAChD,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;CACd,CAsCA;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE;IAAE,UAAU,EAAE,iBAAiB,EAAE,CAAC;IAAC,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAAC,SAAS,EAAE,iBAAiB,EAAE,CAAA;CAAE,EAC1G,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,GAAG,IAAI,GACpB,iBAAiB,GAAG,IAAI,CAc1B;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,SAAS,EAAE,iBAAiB,EAC5B,cAAc,EAAE,kBAAkB,GACjC,MAAM,CAiBR;AA4JD,wBAAsB,MAAM,CAC1B,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,UAAe,GACvB,OAAO,CAAC,SAAS,CAAC,CAmMpB;AAqCD,MAAM,WAAW,iBAAkB,SAAQ,UAAU;IACnD,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,wBAAsB,UAAU,CAC9B,aAAa,CAAC,EAAE,MAAM,EACtB,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAqIf"}
1
+ {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAKA,OAAO,EAGL,KAAK,iBAAiB,EAEtB,KAAK,kBAAkB,EAExB,MAAM,aAAa,CAAC;AAoBrB,MAAM,WAAW,UAAU;IACzB,kDAAkD;IAClD,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,2CAA2C;IAC3C,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,kDAAkD;IAClD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,oDAAoD;IACpD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,kDAAkD;IAClD,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,2DAA2D;IAC3D,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,4DAA4D;IAC5D,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,kEAAkE;IAClE,WAAW,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACjD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG;IAChD,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;CACd,CAsCA;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE;IAAE,UAAU,EAAE,iBAAiB,EAAE,CAAC;IAAC,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAAC,SAAS,EAAE,iBAAiB,EAAE,CAAA;CAAE,EAC1G,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,GAAG,IAAI,GACpB,iBAAiB,GAAG,IAAI,CAc1B;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,SAAS,EAAE,iBAAiB,EAC5B,cAAc,EAAE,kBAAkB,GACjC,MAAM,CAiBR;AA2OD,wBAAsB,MAAM,CAC1B,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,UAAe,GACvB,OAAO,CAAC,SAAS,CAAC,CAmMpB;AAqCD,MAAM,WAAW,iBAAkB,SAAQ,UAAU;IACnD,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,wBAAsB,UAAU,CAC9B,aAAa,CAAC,EAAE,MAAM,EACtB,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAqIf"}
@@ -107,6 +107,10 @@ async function installOne(component, registry, componentsJson, registryDir, root
107
107
  const baseTargetDir = getTargetDir(component, componentsJson);
108
108
  const isMultiFile = component.type === "block" || component.type === "template";
109
109
  const targetDir = isMultiFile ? path.join(baseTargetDir, name) : baseTargetDir;
110
+ // Prefix used by component source files. Stripping it preserves the
111
+ // component's internal subdirectory structure (e.g. `data-table/context.tsx`
112
+ // stays inside a `data-table/` subfolder in the user's project).
113
+ const UI_PREFIX = "packages/ui/src/";
110
114
  const copiedFiles = [];
111
115
  const skippedFiles = [];
112
116
  // Track captured content for the snapshot (only for files that were
@@ -114,15 +118,30 @@ async function installOne(component, registry, componentsJson, registryDir, root
114
118
  const capturedFiles = {};
115
119
  for (const filePath of component.files) {
116
120
  const registryFilePath = path.join(registryDir, filePath);
117
- const fileName = path.basename(filePath);
118
- const localFilePath = path.join(rootDir, targetDir, fileName);
121
+ // Destination path relative to `targetDir`:
122
+ // - Blocks/templates (multi-file) already nest under `<targetDir>/<name>/`,
123
+ // so we take the basename of each file (flat within the block dir).
124
+ // - Components strip the `packages/ui/src/` prefix so compound components
125
+ // like `data-table` keep their internal `data-table/` subfolder.
126
+ let destRel;
127
+ if (isMultiFile) {
128
+ destRel = path.basename(filePath);
129
+ }
130
+ else if (filePath.startsWith(UI_PREFIX)) {
131
+ destRel = filePath.slice(UI_PREFIX.length);
132
+ }
133
+ else {
134
+ destRel = path.basename(filePath);
135
+ }
136
+ const localFilePath = path.join(rootDir, targetDir, destRel);
137
+ const displayName = isMultiFile ? `${name}/${destRel}` : destRel;
119
138
  if (!fs.existsSync(registryFilePath)) {
120
139
  continue;
121
140
  }
122
141
  const exists = fs.existsSync(localFilePath);
123
142
  if (exists && !options.force) {
124
143
  if (options.skipExisting) {
125
- skippedFiles.push(isMultiFile ? `${name}/${fileName}` : fileName);
144
+ skippedFiles.push(displayName);
126
145
  continue;
127
146
  }
128
147
  if (options.dryRun) {
@@ -136,7 +155,7 @@ async function installOne(component, registry, componentsJson, registryDir, root
136
155
  initial: false,
137
156
  });
138
157
  if (!res.overwrite) {
139
- skippedFiles.push(isMultiFile ? `${name}/${fileName}` : fileName);
158
+ skippedFiles.push(displayName);
140
159
  continue;
141
160
  }
142
161
  }
@@ -158,19 +177,38 @@ async function installOne(component, registry, componentsJson, registryDir, root
158
177
  content,
159
178
  };
160
179
  }
161
- copiedFiles.push(isMultiFile ? `${name}/${fileName}` : fileName);
162
- }
163
- // Internal deps (lib/cn, lib/animations, ...) — installed under the
164
- // project's detected sourceRoot so they match where `init` placed cn.ts.
165
- const sourceRoot = getSourceRoot(componentsJson);
180
+ copiedFiles.push(displayName);
181
+ }
182
+ // Internal deps (lib/cn, lib/animations, lib/i18n-context, ...).
183
+ //
184
+ // Placement matters: source components import via `./lib/<name>.js`
185
+ // (sibling), so lib files MUST land in `<componentDir>/lib/` — NOT in
186
+ // `<sourceRoot>/lib/`. Otherwise the relative imports break at runtime.
187
+ //
188
+ // Extensions: most lib files are `.ts` but `i18n-context.tsx` contains
189
+ // JSX and must be copied as `.tsx`. We probe both in order.
190
+ const componentsDir = resolveLocalDir(componentsJson.aliases.components, componentsJson);
166
191
  const copiedInternalDeps = [];
167
192
  for (const dep of component.internalDeps) {
168
- const depFileName = dep.split("/").pop() + ".ts";
169
- const depSourcePath = path.join(registryDir, "packages", "ui", "src", dep + ".ts");
170
- const depTargetPath = path.join(rootDir, sourceRoot, "lib", depFileName);
171
- if (!fs.existsSync(depSourcePath)) {
193
+ const depBase = dep.split("/").pop();
194
+ const tsSource = path.join(registryDir, "packages", "ui", "src", dep + ".ts");
195
+ const tsxSource = path.join(registryDir, "packages", "ui", "src", dep + ".tsx");
196
+ let depSourcePath;
197
+ let depFileName;
198
+ if (fs.existsSync(tsSource)) {
199
+ depSourcePath = tsSource;
200
+ depFileName = `${depBase}.ts`;
201
+ }
202
+ else if (fs.existsSync(tsxSource)) {
203
+ depSourcePath = tsxSource;
204
+ depFileName = `${depBase}.tsx`;
205
+ }
206
+ else {
172
207
  continue;
173
208
  }
209
+ // e.g. componentsDir = "app/components/ui" → target:
210
+ // "app/components/ui/lib/i18n-context.tsx"
211
+ const depTargetPath = path.join(rootDir, componentsDir, "lib", depFileName);
174
212
  const content = fs.readFileSync(depSourcePath, "utf-8");
175
213
  if (options.dryRun) {
176
214
  console.log(chalk.dim(` [dry-run] would write ${path.relative(rootDir, depTargetPath)}`));
@@ -181,6 +219,29 @@ async function installOne(component, registry, componentsJson, registryDir, root
181
219
  }
182
220
  copiedInternalDeps.push(dep);
183
221
  }
222
+ // Block/template lib: blocks import via `../../lib/animations` and
223
+ // `../../lib/styles` relative to `<blocksDir>/<blockName>/page.tsx`,
224
+ // which resolves two levels up to `path.dirname(blocksDir)/lib/`.
225
+ // Copy the global block lib from `apps/docs/src/registry/lib/` there.
226
+ if (isMultiFile) {
227
+ const blocksDir = resolveLocalDir(componentsJson.aliases.blocks, componentsJson);
228
+ const blockLibDest = path.join(rootDir, path.dirname(blocksDir), "lib");
229
+ for (const libFile of ["animations.ts", "styles.ts"]) {
230
+ const src = path.join(registryDir, "apps", "docs", "src", "registry", "lib", libFile);
231
+ if (!fs.existsSync(src))
232
+ continue;
233
+ const dest = path.join(blockLibDest, libFile);
234
+ if (fs.existsSync(dest) && !options.force)
235
+ continue;
236
+ if (options.dryRun) {
237
+ console.log(chalk.dim(` [dry-run] would write ${path.relative(rootDir, dest)}`));
238
+ }
239
+ else {
240
+ fs.mkdirSync(blockLibDest, { recursive: true });
241
+ fs.copyFileSync(src, dest);
242
+ }
243
+ }
244
+ }
184
245
  // Update components.json (skipped in dry-run).
185
246
  if (!options.dryRun) {
186
247
  const registryVersion = registry.version;
@@ -273,11 +273,12 @@ export declare function getLegacyTailwindCssTemplate(theme: Theme, fontBody: Fon
273
273
  export declare function normalizeThemeCss(css: string, theme: string): string;
274
274
  /**
275
275
  * Copies the i18n base files (context, types, defaults) from the registry
276
- * to the project's <sourceRoot>/lib/. Required because ~75 components import
277
- * `useUIMessages` from `./lib/i18n-context.js` — without these files, every
278
- * subsequent `add` of an i18n-aware component would produce a broken import.
276
+ * to `<componentPath>/lib/`. Required because ~75 components import
277
+ * `useUIMessages` from `./lib/i18n-context.js` — the lib directory must
278
+ * live as a SIBLING of the component `.tsx` files so relative imports
279
+ * resolve correctly.
279
280
  */
280
- export declare function copyI18nFiles(registryDir: string | undefined, targetDir: string, sourceRoot: string): string[];
281
+ export declare function copyI18nFiles(registryDir: string | undefined, targetDir: string, componentPath: string): string[];
281
282
  export declare function runInit(config: InitConfig, targetDir: string, repoUrl?: string): Promise<{
282
283
  success: boolean;
283
284
  filesCreated: string[];
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAOA,OAAO,EAIL,KAAK,SAAS,EACf,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,6BAA6B,CAAC;AAGrC,KAAK,KAAK,GAAG,MAAM,CAAC;AAEpB,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4DR,CAAC;AACX,KAAK,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC;AAUxD,MAAM,WAAW,UAAU;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,KAAK,CAAC;IACb,QAAQ,EAAE,UAAU,CAAC;IACrB,WAAW,EAAE,UAAU,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,OAAO,CAAC;IACxB,aAAa,EAAE,OAAO,CAAC;IACvB,YAAY,EAAE,OAAO,CAAC;IACtB,aAAa,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,uEAAuE;IACvE,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,QAAQ,EAAE;QACR,MAAM,EAAE,MAAM,CAAC;QACf,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;IACF,OAAO,EAAE;QACP,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,KAAK,EAAE,KAAK,CAAC;IACb,IAAI,EAAE;QACJ,IAAI,EAAE,UAAU,CAAC;QACjB,OAAO,EAAE,UAAU,CAAC;KACrB,CAAC;IACF,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE;QACR,MAAM,EAAE,OAAO,CAAC;QAChB,KAAK,EAAE,OAAO,CAAC;QACf,IAAI,EAAE,OAAO,CAAC;QACd,KAAK,EAAE,OAAO,CAAC;KAChB,CAAC;CACH;AAgBD,wBAAsB,gBAAgB,CACpC,WAAW,CAAC,EAAE,MAAM,EACpB,SAAS,CAAC,EAAE,SAAS,EACrB,MAAM,CAAC,EAAE,aAAa,GACrB,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CA0F5B;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,UAAU,EAClB,OAAO,CAAC,EAAE,MAAM,GACf,cAAc,CAwChB;AAED,wBAAgB,aAAa,IAAI,MAAM,CAQtC;AAOD,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAc/H;AAED,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAahI;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAoBpE;AA0FD;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB,MAAM,EAAE,CAeV;AAED,wBAAsB,OAAO,CAC3B,MAAM,EAAE,UAAU,EAClB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAqEvD;AAED,wBAAsB,WAAW,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA0EjE"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -347,16 +347,17 @@ function copyTokensToProject(registryDir, targetDir, theme, sourceRoot) {
347
347
  }
348
348
  /**
349
349
  * Copies the i18n base files (context, types, defaults) from the registry
350
- * to the project's <sourceRoot>/lib/. Required because ~75 components import
351
- * `useUIMessages` from `./lib/i18n-context.js` — without these files, every
352
- * subsequent `add` of an i18n-aware component would produce a broken import.
350
+ * to `<componentPath>/lib/`. Required because ~75 components import
351
+ * `useUIMessages` from `./lib/i18n-context.js` — the lib directory must
352
+ * live as a SIBLING of the component `.tsx` files so relative imports
353
+ * resolve correctly.
353
354
  */
354
- export function copyI18nFiles(registryDir, targetDir, sourceRoot) {
355
+ export function copyI18nFiles(registryDir, targetDir, componentPath) {
355
356
  if (!registryDir)
356
357
  return [];
357
358
  const files = ["i18n-context.tsx", "i18n-types.ts", "i18n-defaults.ts"];
358
359
  const srcBase = path.join(registryDir, "packages", "ui", "src", "lib");
359
- const destBase = path.join(targetDir, sourceRoot, "lib");
360
+ const destBase = path.join(targetDir, componentPath, "lib");
360
361
  fs.mkdirSync(destBase, { recursive: true });
361
362
  const copied = [];
362
363
  for (const file of files) {
@@ -364,7 +365,7 @@ export function copyI18nFiles(registryDir, targetDir, sourceRoot) {
364
365
  if (!fs.existsSync(src))
365
366
  continue;
366
367
  fs.copyFileSync(src, path.join(destBase, file));
367
- copied.push(`${sourceRoot}/lib/${file}`);
368
+ copied.push(`${componentPath}/lib/${file}`);
368
369
  }
369
370
  return copied;
370
371
  }
@@ -381,12 +382,15 @@ export async function runInit(config, targetDir, repoUrl) {
381
382
  fs.mkdirSync(componentDir, { recursive: true });
382
383
  const blockDir = path.join(targetDir, config.blockPath);
383
384
  fs.mkdirSync(blockDir, { recursive: true });
384
- // 3. Create cn.ts utility under the detected source root
385
- const utilsDir = path.join(targetDir, sourceRoot, "lib");
386
- fs.mkdirSync(utilsDir, { recursive: true });
387
- const cnPath = path.join(utilsDir, "cn.ts");
385
+ // 3. Create cn.ts utility as a sibling of the components directory.
386
+ // Components import via `./lib/cn.js`, so lib/ MUST live directly
387
+ // next to the installed component files — `<componentPath>/lib/`,
388
+ // not `<sourceRoot>/lib/`.
389
+ const libDir = path.join(targetDir, config.componentPath, "lib");
390
+ fs.mkdirSync(libDir, { recursive: true });
391
+ const cnPath = path.join(libDir, "cn.ts");
388
392
  fs.writeFileSync(cnPath, getCnTemplate());
389
- filesCreated.push(`${sourceRoot}/lib/cn.ts`);
393
+ filesCreated.push(`${config.componentPath}/lib/cn.ts`);
390
394
  // 4. Copy tokens and create CSS
391
395
  const cssRelPath = config.cssEntryPoint ?? `${sourceRoot}/index.css`;
392
396
  const cssPath = path.join(targetDir, cssRelPath);
@@ -396,8 +400,9 @@ export async function runInit(config, targetDir, repoUrl) {
396
400
  const registryDir = getCacheDir();
397
401
  const tokenFiles = copyTokensToProject(registryDir, targetDir, config.theme, sourceRoot);
398
402
  filesCreated.push(...tokenFiles);
399
- // Copy i18n base files so components importing useUIMessages resolve
400
- const i18nFiles = copyI18nFiles(registryDir, targetDir, sourceRoot);
403
+ // Copy i18n base files next to the components so their
404
+ // `./lib/i18n-context.js` imports resolve.
405
+ const i18nFiles = copyI18nFiles(registryDir, targetDir, config.componentPath);
401
406
  filesCreated.push(...i18nFiles);
402
407
  fs.writeFileSync(cssPath, getLocalTailwindCssTemplate(config.theme, config.fontBody, config.fontHeading, config.radius));
403
408
  }
package/dist/index.js CHANGED
@@ -17,7 +17,7 @@ const program = new Command();
17
17
  program
18
18
  .name("inai-ui")
19
19
  .description("CLI for InAI UI component library")
20
- .version("1.4.1");
20
+ .version("1.5.0");
21
21
  program
22
22
  .command("init [repo-url]")
23
23
  .description("Initialize InAI UI in your project. Optionally pass a Git repo URL to fetch components remotely.")
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "inai-react-components",
3
- "version": "1.4.1",
3
+ "version": "1.5.0",
4
4
  "description": "CLI for InAI UI component library — install components from a private registry into your React project",
5
5
  "private": false,
6
6
  "type": "module",