aplance-ui 1.5.2 → 1.6.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.
Files changed (29) hide show
  1. package/README.md +1 -1
  2. package/dist/api.d.ts +2 -1
  3. package/dist/api.js +103 -68
  4. package/dist/api.js.map +1 -1
  5. package/dist/frameworks/vite-react/vite.config.ts.template +1 -1
  6. package/dist/index.js +103 -68
  7. package/dist/index.js.map +1 -1
  8. package/package.json +12 -6
  9. package/registry/components/primitives/modal/modal.module.css +9 -3
  10. package/registry/components/primitives/popover/popover-context.ts +2 -0
  11. package/registry/components/primitives/popover/popover.tsx +47 -2
  12. package/registry/components/ui/chart/chart.tsx +51 -30
  13. package/registry/components/ui/chart/types.ts +5 -1
  14. package/registry/components/ui/data-table/checkbox-column.tsx +12 -8
  15. package/registry/components/ui/data-table/data-table.module.css +41 -19
  16. package/registry/components/ui/data-table/data-table.tsx +1285 -1238
  17. package/registry/components/ui/data-table/filter-bar.tsx +56 -13
  18. package/registry/components/ui/data-table/filter-modal.tsx +16 -82
  19. package/registry/components/ui/data-table/filter-sheet.tsx +97 -0
  20. package/registry/components/ui/data-table/filters.tsx +21 -21
  21. package/registry/components/ui/data-table/pagination-bar.tsx +4 -6
  22. package/registry/components/ui/data-table/types.ts +149 -80
  23. package/registry/components/ui/data-table/useDataTable.tsx +35 -16
  24. package/registry/components/ui/data-table/utils.ts +691 -471
  25. package/registry/components/ui/input-fields/date-picker/calendar.tsx +7 -15
  26. package/registry/components/ui/input-fields/date-picker/date-picker.tsx +1 -1
  27. package/registry/components/ui/input-fields/date-picker/types.ts +3 -3
  28. package/registry/components/ui/input-fields/emoji-picker/emoji-palette.tsx +1 -1
  29. package/registry/registry.json +16 -11
@@ -19,7 +19,7 @@ export default defineConfig({
19
19
  plugins: [react()],
20
20
  resolve: {
21
21
  alias: {
22
- "{{alias}}": resolve(__dirname, "./{{srcDir}}"),
22
+ "{{alias}}": resolve(import.meta.dirname, "./{{srcDir}}"),
23
23
  },
24
24
  },
25
25
  css: {
package/dist/index.js CHANGED
@@ -188,10 +188,11 @@ var applyFileOps = async (ops, opts) => {
188
188
  ensureDir(op.target);
189
189
  writeFileSync(op.target, op.content);
190
190
  } catch (err) {
191
- const cause = err instanceof Error ? err.message : String(err);
191
+ const reason = err instanceof Error ? err.message : String(err);
192
192
  throw new Error(
193
- `Failed to write ${rel}: ${cause}
194
- ${written} file(s) were already written before this failure. Fix the underlying issue (permissions? disk space?) and re-run - identical files will be detected as unchanged and skipped.`
193
+ `Failed to write ${rel}: ${reason}
194
+ ${written} file(s) were already written before this failure. Fix the underlying issue (permissions? disk space?) and re-run - identical files will be detected as unchanged and skipped.`,
195
+ { cause: err }
195
196
  );
196
197
  }
197
198
  logger.ok(`wrote ${rel}`);
@@ -1118,18 +1119,18 @@ var firstExisting = (cwd, names) => {
1118
1119
  var readDeclaredDeps = (packageJsonPath) => {
1119
1120
  try {
1120
1121
  const pkg2 = JSON.parse(readFileSync7(packageJsonPath, "utf8"));
1121
- return /* @__PURE__ */ new Set([
1122
- ...Object.keys(pkg2.dependencies ?? {}),
1123
- ...Object.keys(pkg2.devDependencies ?? {}),
1124
- ...Object.keys(pkg2.peerDependencies ?? {})
1122
+ return new Map([
1123
+ ...Object.entries(pkg2.peerDependencies ?? {}),
1124
+ ...Object.entries(pkg2.devDependencies ?? {}),
1125
+ ...Object.entries(pkg2.dependencies ?? {})
1125
1126
  ]);
1126
1127
  } catch {
1127
- return /* @__PURE__ */ new Set();
1128
+ return /* @__PURE__ */ new Map();
1128
1129
  }
1129
1130
  };
1130
1131
  var detectProject = (cwd) => {
1131
1132
  const packageJsonPath = existsSync6(join6(cwd, "package.json")) ? join6(cwd, "package.json") : null;
1132
- const declaredDeps = packageJsonPath ? readDeclaredDeps(packageJsonPath) : /* @__PURE__ */ new Set();
1133
+ const declaredDeps = packageJsonPath ? readDeclaredDeps(packageJsonPath) : /* @__PURE__ */ new Map();
1133
1134
  const viteConfigPath = firstExisting(cwd, VITE_CONFIG_NAMES);
1134
1135
  const nextConfigPath = firstExisting(cwd, NEXT_CONFIG_NAMES);
1135
1136
  const astroConfigPath = firstExisting(cwd, ASTRO_CONFIG_NAMES);
@@ -1400,35 +1401,84 @@ var detectPackageManager = (cwd) => {
1400
1401
  if (existsSync8(join8(cwd, "package-lock.json"))) return "npm";
1401
1402
  return "npm";
1402
1403
  };
1403
- var computeDependencyPlan = (input) => {
1404
- const { registry, units, cfg, project } = input;
1405
- const meta = registry.installMeta;
1406
- const dependencies = { ...meta.baseDependencies };
1407
- const devDependencies = { ...meta.baseDevDependencies };
1408
- if (cfg.utilities.enabled) {
1409
- Object.assign(devDependencies, meta.utilitiesDevDependencies);
1404
+ var leadingMajor = (spec) => {
1405
+ const value = spec.trim();
1406
+ if (value.includes("||") || value.includes(":") || /\s-\s/.test(value)) {
1407
+ return null;
1410
1408
  }
1409
+ const match = /^(?:\^|~|>=|=|v)?\s*(\d+)(?:[.\s]|$)/.exec(value);
1410
+ return match ? Number(match[1]) : null;
1411
+ };
1412
+ var isOlderMajor = (declared, required) => {
1413
+ const have = leadingMajor(declared);
1414
+ const need = leadingMajor(required);
1415
+ return have !== null && need !== null && have < need;
1416
+ };
1417
+ var unitDependencies = (meta, units) => {
1418
+ const deps = {};
1411
1419
  for (const unit of units) {
1412
1420
  for (const pkg2 of unit.externalDeps) {
1413
- if (pkg2 in dependencies) continue;
1414
1421
  const version = meta.packageVersions[pkg2];
1415
- if (!version) continue;
1416
- dependencies[pkg2] = version;
1422
+ if (version) deps[pkg2] = version;
1417
1423
  }
1418
1424
  }
1419
- const skipped = [];
1420
- const filter = (bag) => {
1421
- for (const name of Object.keys(bag)) {
1422
- if (project.declaredDeps.has(name)) {
1423
- skipped.push({ name, reason: "already-declared" });
1424
- delete bag[name];
1425
+ return deps;
1426
+ };
1427
+ var settleDeclared = (bags, meta, project) => {
1428
+ const toolchain = /* @__PURE__ */ new Set([
1429
+ ...Object.keys(meta.baseDependencies),
1430
+ ...Object.keys(meta.baseDevDependencies),
1431
+ ...Object.keys(meta.utilitiesDevDependencies)
1432
+ ]);
1433
+ const settled = {
1434
+ skipped: [],
1435
+ upgraded: [],
1436
+ outdated: []
1437
+ };
1438
+ for (const bag of bags) {
1439
+ for (const [name, required] of Object.entries(bag)) {
1440
+ const declared = project.declaredDeps.get(name);
1441
+ if (declared === void 0) continue;
1442
+ if (!isOlderMajor(declared, required)) {
1443
+ settled.skipped.push({ name, reason: "already-declared" });
1444
+ } else if (toolchain.has(name)) {
1445
+ settled.outdated.push({ name, declared, required });
1446
+ } else {
1447
+ settled.upgraded.push({ name, from: declared, to: required });
1448
+ continue;
1425
1449
  }
1450
+ delete bag[name];
1426
1451
  }
1452
+ }
1453
+ return settled;
1454
+ };
1455
+ var computeDependencyPlan = (input) => {
1456
+ const { registry, units, cfg, project } = input;
1457
+ const meta = registry.installMeta;
1458
+ const dependencies = { ...meta.baseDependencies };
1459
+ for (const [name, range] of Object.entries(unitDependencies(meta, units))) {
1460
+ if (!(name in dependencies)) dependencies[name] = range;
1461
+ }
1462
+ const devDependencies = {
1463
+ ...meta.baseDevDependencies,
1464
+ ...cfg.utilities.enabled ? meta.utilitiesDevDependencies : {}
1465
+ };
1466
+ return {
1467
+ dependencies,
1468
+ devDependencies,
1469
+ ...settleDeclared([dependencies, devDependencies], meta, project)
1470
+ };
1471
+ };
1472
+ var computeUnitDependencyPlan = (input) => {
1473
+ const meta = input.registry.installMeta;
1474
+ const dependencies = unitDependencies(meta, input.units);
1475
+ return {
1476
+ dependencies,
1477
+ devDependencies: {},
1478
+ ...settleDeclared([dependencies], meta, input.project)
1427
1479
  };
1428
- filter(dependencies);
1429
- filter(devDependencies);
1430
- return { dependencies, devDependencies, skipped };
1431
1480
  };
1481
+ var quoteArg = (arg) => /^[\w@./:=+-]+$/.test(arg) ? arg : `"${arg}"`;
1432
1482
  var buildInstallCommands = (pm, plan) => {
1433
1483
  const commands = [];
1434
1484
  const runtimeSpecs = Object.entries(plan.dependencies).map(
@@ -1439,20 +1489,13 @@ var buildInstallCommands = (pm, plan) => {
1439
1489
  );
1440
1490
  const runtimeArgs = installArgs(pm, runtimeSpecs, false);
1441
1491
  const devArgs = installArgs(pm, devSpecs, true);
1442
- if (runtimeSpecs.length > 0) {
1443
- commands.push({
1444
- bin: pm,
1445
- args: runtimeArgs,
1446
- label: `${pm} ${runtimeArgs.join(" ")}`
1447
- });
1448
- }
1449
- if (devSpecs.length > 0) {
1450
- commands.push({
1451
- bin: pm,
1452
- args: devArgs,
1453
- label: `${pm} ${devArgs.join(" ")}`
1454
- });
1455
- }
1492
+ const command = (args) => ({
1493
+ bin: pm,
1494
+ args,
1495
+ label: [pm, ...args].map(quoteArg).join(" ")
1496
+ });
1497
+ if (runtimeSpecs.length > 0) commands.push(command(runtimeArgs));
1498
+ if (devSpecs.length > 0) commands.push(command(devArgs));
1456
1499
  return commands;
1457
1500
  };
1458
1501
  var installArgs = (pm, specs, dev) => {
@@ -1477,12 +1520,12 @@ var runInstall = async (commands, opts) => {
1477
1520
  for (const cmd of commands) {
1478
1521
  opts.onCommand?.(cmd);
1479
1522
  await new Promise((resolve, reject) => {
1480
- const child = spawn(cmd.bin, cmd.args, {
1523
+ const spawnOptions = {
1481
1524
  cwd: opts.cwd,
1482
1525
  stdio: "inherit",
1483
- env: { ...process.env, ...opts.env },
1484
- shell: process.platform === "win32"
1485
- });
1526
+ env: { ...process.env, ...opts.env }
1527
+ };
1528
+ const child = process.platform === "win32" ? spawn(cmd.label, { ...spawnOptions, shell: true }) : spawn(cmd.bin, cmd.args, spawnOptions);
1486
1529
  child.on("error", reject);
1487
1530
  child.on("close", (code) => {
1488
1531
  if (code === 0) resolve();
@@ -1498,7 +1541,11 @@ var runInstall = async (commands, opts) => {
1498
1541
  };
1499
1542
  var describePlan = (plan) => {
1500
1543
  const lines = [];
1501
- const rows = (bag) => Object.entries(bag).sort(([a], [b]) => a.localeCompare(b)).map(([name, v]) => ` ${name} ${v}`);
1544
+ const upgradedFrom = new Map(plan.upgraded.map((u) => [u.name, u.from]));
1545
+ const rows = (bag) => Object.entries(bag).sort(([a], [b]) => a.localeCompare(b)).map(([name, v]) => {
1546
+ const from = upgradedFrom.get(name);
1547
+ return ` ${name} ${v}${from ? ` (upgrades ${from})` : ""}`;
1548
+ });
1502
1549
  if (Object.keys(plan.dependencies).length) {
1503
1550
  lines.push("dependencies:");
1504
1551
  lines.push(...rows(plan.dependencies));
@@ -1513,6 +1560,13 @@ var describePlan = (plan) => {
1513
1560
  lines.push("already declared (kept as-is):");
1514
1561
  lines.push(...plan.skipped.map((s) => ` ${s.name}`));
1515
1562
  }
1563
+ if (plan.outdated.length) {
1564
+ if (lines.length) lines.push("");
1565
+ lines.push("older major kept as-is (upgrade when you can):");
1566
+ lines.push(
1567
+ ...plan.outdated.map((o) => ` ${o.name} ${o.declared} (scaffold expects ${o.required})`)
1568
+ );
1569
+ }
1516
1570
  if (!lines.length) lines.push("nothing to install - all deps already declared.");
1517
1571
  return lines.join("\n");
1518
1572
  };
@@ -1832,7 +1886,7 @@ var runInit = async (opts) => {
1832
1886
  ${snippet.content.split("\n").map((l) => " " + l).join("\n")}`);
1833
1887
  }
1834
1888
  steps.push(
1835
- `${pc4.cyan(String(stepIdx++))} ${pc4.bold("Add more components anytime")}
1889
+ `${pc4.cyan(String(stepIdx))} ${pc4.bold("Add more components anytime")}
1836
1890
  npx aplance-ui add <name> ${pc4.dim("# e.g. button modal tooltip")}
1837
1891
  npx aplance-ui add ${pc4.dim("# interactive multi-select")}
1838
1892
  npx aplance-ui list ${pc4.dim("# see everything available")}`
@@ -1892,7 +1946,7 @@ var runAdd = async (opts) => {
1892
1946
  });
1893
1947
  const summary = `${result.written} written \xB7 ${result.skipped} skipped \xB7 ${result.unchanged} unchanged`;
1894
1948
  const project = detectProject(opts.cwd);
1895
- const plan = computeRuntimePlan(registry, units, project);
1949
+ const plan = computeUnitDependencyPlan({ registry, units, project });
1896
1950
  const pm = opts.packageManager ?? detectPackageManager(opts.cwd);
1897
1951
  const installCommands = buildInstallCommands(pm, plan);
1898
1952
  const hasWork = installCommands.length > 0;
@@ -1950,25 +2004,6 @@ var runAdd = async (opts) => {
1950
2004
  logger.info(summary);
1951
2005
  goodbye(`Added ${units.length} unit${units.length === 1 ? "" : "s"}.`);
1952
2006
  };
1953
- var computeRuntimePlan = (registry, units, project) => {
1954
- const dependencies = {};
1955
- const skipped = [];
1956
- const meta = registry.installMeta;
1957
- for (const unit of units) {
1958
- for (const pkg2 of unit.externalDeps) {
1959
- const version = meta.packageVersions[pkg2];
1960
- if (!version) continue;
1961
- if (project.declaredDeps.has(pkg2)) {
1962
- if (!skipped.some((entry) => entry.name === pkg2)) {
1963
- skipped.push({ name: pkg2, reason: "already-declared" });
1964
- }
1965
- continue;
1966
- }
1967
- dependencies[pkg2] = version;
1968
- }
1969
- }
1970
- return { dependencies, devDependencies: {}, skipped };
1971
- };
1972
2007
  var pickUnits = async (all) => multiselect2({
1973
2008
  message: `Select units to add ${pc5.dim("(space to toggle, enter to confirm)")}`,
1974
2009
  options: groupedUnitOptions(all),