@squadbase/vantage 0.7.0-stg.18ca87d → 0.7.1-dev1.01a6413
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 +1 -1
- package/dist/add-AU3EDPNW.js +6 -0
- package/dist/add-AU3EDPNW.js.map +1 -0
- package/dist/{chunk-AABMKHEU.js → chunk-35B3YIBF.js} +16 -7
- package/dist/chunk-35B3YIBF.js.map +1 -0
- package/dist/{chunk-TRMHNMMZ.js → chunk-LYUGDHSF.js} +3 -3
- package/dist/{chunk-TRMHNMMZ.js.map → chunk-LYUGDHSF.js.map} +1 -1
- package/dist/{chunk-QNOX7WLZ.js → chunk-MQUIAP66.js} +69 -4
- package/dist/chunk-MQUIAP66.js.map +1 -0
- package/dist/{chunk-2IAPIOPS.js → chunk-P2KIHF65.js} +2 -2
- package/dist/chunk-P2KIHF65.js.map +1 -0
- package/dist/{chunk-3RJEOP3J.js → chunk-XRKSIC5Z.js} +5 -3
- package/dist/chunk-XRKSIC5Z.js.map +1 -0
- package/dist/{chunk-77CISBMG.js → chunk-YJQCB3UP.js} +3387 -204
- package/dist/chunk-YJQCB3UP.js.map +1 -0
- package/dist/cli.js +2 -2
- package/dist/components/index.d.ts +627 -7
- package/dist/components/index.js +4 -4
- package/dist/{delta-text-CbrOaW83.d.ts → delta-text-tav2Lh5d.d.ts} +1 -1
- package/dist/doc/index.d.ts +2 -2
- package/dist/doc/index.js +4 -4
- package/dist/{format-DihQkL1N.d.ts → format-D34piCei.d.ts} +2 -1
- package/dist/geo-japan-7BMSOJRX.js +8 -0
- package/dist/geo-japan-7BMSOJRX.js.map +1 -0
- package/dist/geo-us-GVOG7VXH.js +8 -0
- package/dist/geo-us-GVOG7VXH.js.map +1 -0
- package/dist/geo-world-35HL56UU.js +8 -0
- package/dist/geo-world-35HL56UU.js.map +1 -0
- package/dist/slide/index.d.ts +2 -2
- package/dist/slide/index.js +3 -3
- package/dist/table/index.js +4 -5
- package/dist/table/index.js.map +1 -1
- package/dist/ui/index.js +2 -3
- package/dist/ui/index.js.map +1 -1
- package/dist/{upgrade-6DT7ADRP.js → upgrade-MCHMELWC.js} +3 -3
- package/dist/{upgrade-6DT7ADRP.js.map → upgrade-MCHMELWC.js.map} +1 -1
- package/docs/en/agent-skills.md +13 -14
- package/docs/en/changelog.md +8 -0
- package/docs/en/parts/draft-chart.md +42 -0
- package/docs/en/parts/page-shell.md +1 -1
- package/docs/index.json +70 -50
- package/docs/ja/agent-skills.md +14 -14
- package/docs/ja/changelog.md +8 -0
- package/docs/ja/parts/draft-chart.md +40 -0
- package/docs/ja/parts/page-shell.md +1 -1
- package/package.json +2 -2
- package/registry/parts.json +5221 -0
- package/registry/ui/chart-frame.tsx +8 -0
- package/registry/ui/combo-chart.tsx +1852 -0
- package/registry/ui/dashboard-card.tsx +3 -1
- package/registry/ui/data-table.tsx +3 -1
- package/registry/ui/delta.tsx +3 -1
- package/registry/ui/filter-bar.tsx +3 -1
- package/registry/ui/forecast-chart.tsx +4734 -0
- package/registry/ui/funnel-steps.tsx +1 -1
- package/registry/ui/kpi-card.tsx +3 -1
- package/registry/ui/metric-value.tsx +2 -2
- package/registry/ui/page-shell.tsx +25 -4
- package/registry/ui/paired-chart.tsx +1 -1
- package/registry/ui/pivot-table.tsx +1260 -0
- package/registry/ui/progress-circle.tsx +2 -2
- package/registry/ui/sparkline.tsx +1 -1
- package/registry/ui/treemap.tsx +1917 -0
- package/templates/AGENTS.md +3 -3
- package/templates/agents/page.md +5 -4
- package/dist/add-4GHF2TX2.js +0 -6
- package/dist/add-4GHF2TX2.js.map +0 -1
- package/dist/chunk-2IAPIOPS.js.map +0 -1
- package/dist/chunk-3RJEOP3J.js.map +0 -1
- package/dist/chunk-77CISBMG.js.map +0 -1
- package/dist/chunk-AABMKHEU.js.map +0 -1
- package/dist/chunk-NZ5QIIG4.js +0 -74
- package/dist/chunk-NZ5QIIG4.js.map +0 -1
- package/dist/chunk-QNOX7WLZ.js.map +0 -1
package/README.md
CHANGED
|
@@ -101,7 +101,7 @@ npx vantage docs button --json # one page, machine-readable
|
|
|
101
101
|
npx vantage search "date range" # find the right component by meaning
|
|
102
102
|
npx vantage add agents # drop AGENTS.md + agents/*.md (per-artifact-type reference) into your project
|
|
103
103
|
npx vantage add skill # list the bundled skills and where they sit
|
|
104
|
-
npx vantage add skill --all
|
|
104
|
+
npx vantage add skill --all # install the skills (into .squadbase/skills if present; --dir <path> to choose, e.g. .claude/skills for Claude Code)
|
|
105
105
|
```
|
|
106
106
|
|
|
107
107
|
`add skill` scans the project first, so skills that are already placed — wherever they live — are
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"add-AU3EDPNW.js"}
|
|
@@ -75,8 +75,7 @@ function displayPath(root, target) {
|
|
|
75
75
|
const rel = path.relative(root, target);
|
|
76
76
|
return !rel ? "." : rel.startsWith("..") ? target : rel;
|
|
77
77
|
}
|
|
78
|
-
function findPlacedSkills(root,
|
|
79
|
-
const wanted = new Set(names);
|
|
78
|
+
function findPlacedSkills(root, skillsDir) {
|
|
80
79
|
const found = /* @__PURE__ */ new Map();
|
|
81
80
|
const isSource = (p) => !path.relative(skillsDir, p).startsWith("..");
|
|
82
81
|
const walk = (dir, depth) => {
|
|
@@ -89,7 +88,7 @@ function findPlacedSkills(root, names, skillsDir) {
|
|
|
89
88
|
for (const entry of entries) {
|
|
90
89
|
if (!entry.isDirectory() || SKILL_SCAN_SKIP.has(entry.name)) continue;
|
|
91
90
|
const abs = path.join(dir, entry.name);
|
|
92
|
-
if (
|
|
91
|
+
if (fs.existsSync(path.join(abs, SKILL_FILE))) {
|
|
93
92
|
if (!isSource(abs)) found.set(entry.name, [...found.get(entry.name) ?? [], abs]);
|
|
94
93
|
continue;
|
|
95
94
|
}
|
|
@@ -100,6 +99,14 @@ function findPlacedSkills(root, names, skillsDir) {
|
|
|
100
99
|
for (const list of found.values()) list.sort();
|
|
101
100
|
return found;
|
|
102
101
|
}
|
|
102
|
+
var SQUADBASE_SKILLS_DIR = ".squadbase/skills";
|
|
103
|
+
function placedSkillsDir(placed) {
|
|
104
|
+
const count = /* @__PURE__ */ new Map();
|
|
105
|
+
for (const list of placed.values())
|
|
106
|
+
for (const p of list) count.set(path.dirname(p), (count.get(path.dirname(p)) ?? 0) + 1);
|
|
107
|
+
const dirs = [...count.keys()].sort((a, b) => count.get(b) - count.get(a) || a.localeCompare(b));
|
|
108
|
+
return dirs[0] ?? null;
|
|
109
|
+
}
|
|
103
110
|
function writeSkill(root, skillsDir, name, dest, verb) {
|
|
104
111
|
fs.mkdirSync(path.dirname(dest), { recursive: true });
|
|
105
112
|
fs.cpSync(path.join(skillsDir, name), dest, { recursive: true, force: true });
|
|
@@ -131,9 +138,11 @@ function addSkill(root, name, all, force, dir) {
|
|
|
131
138
|
log.error("No skills are bundled with this version of Vantage.");
|
|
132
139
|
return 1;
|
|
133
140
|
}
|
|
134
|
-
const placed = findPlacedSkills(root,
|
|
141
|
+
const placed = findPlacedSkills(root, skillsDir);
|
|
135
142
|
if (!all && !name) return printSkillList(root, available, placed);
|
|
136
|
-
const
|
|
143
|
+
const hasSquadbase = fs.statSync(path.join(root, ".squadbase"), { throwIfNoEntry: false })?.isDirectory();
|
|
144
|
+
const squadbaseDir = hasSquadbase ? SQUADBASE_SKILLS_DIR : null;
|
|
145
|
+
const destDir = path.resolve(root, dir ?? squadbaseDir ?? placedSkillsDir(placed) ?? ".");
|
|
137
146
|
const targets = all ? available : [name];
|
|
138
147
|
let failed = 0;
|
|
139
148
|
for (const target of targets) {
|
|
@@ -315,5 +324,5 @@ async function add(root, args) {
|
|
|
315
324
|
}
|
|
316
325
|
|
|
317
326
|
export { add, syncAgentsFile };
|
|
318
|
-
//# sourceMappingURL=chunk-
|
|
319
|
-
//# sourceMappingURL=chunk-
|
|
327
|
+
//# sourceMappingURL=chunk-35B3YIBF.js.map
|
|
328
|
+
//# sourceMappingURL=chunk-35B3YIBF.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/add.ts"],"names":["require"],"mappings":"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","file":"chunk-35B3YIBF.js","sourcesContent":["import fs from \"node:fs\"\nimport path from \"node:path\"\nimport { createRequire } from \"node:module\"\nimport { resolvePageRoot } from \"../core/scan\"\nimport { log, type ParsedArgs } from \"./util\"\n\nconst PKG = \"@squadbase/vantage\"\n\nfunction toPascalCase(segment: string): string {\n const cleaned = segment.replace(/\\[|\\]|\\./g, \"\").replace(/\\.\\.\\./g, \"\")\n const words = cleaned.split(/[^a-zA-Z0-9]+/).filter(Boolean)\n const pascal = words.map((w) => w.charAt(0).toUpperCase() + w.slice(1)).join(\"\")\n return /^[A-Za-z]/.test(pascal) ? pascal : \"Page\"\n}\n\nfunction pageTemplate(name: string): string {\n const last = name.split(\"/\").pop() ?? name\n const component = last === \"index\" ? toPascalCase(name.split(\"/\").slice(-2)[0] ?? \"Home\") : toPascalCase(last)\n const title = last.replace(/-/g, \" \").replace(/\\b\\w/g, (c) => c.toUpperCase())\n return `import { definePage } from \"${PKG}\"\n\nexport const page = definePage({ title: ${JSON.stringify(title)} })\n\nexport default function ${component}() {\n return (\n <main className=\"p-6\">\n <h1 className=\"text-2xl font-semibold\">${title}</h1>\n </main>\n )\n}\n`\n}\n\nfunction apiTemplate(): string {\n return `import type { ApiContext } from \"${PKG}/server\"\n\nexport async function GET({ request, params }: ApiContext) {\n return Response.json({ ok: true, params })\n}\n`\n}\n\nfunction resolvePackageDir(root: string, sub: string): string | null {\n try {\n const require = createRequire(path.join(root, \"noop.js\"))\n const pkgJson = require.resolve(`${PKG}/package.json`)\n return path.join(path.dirname(pkgJson), sub)\n } catch {\n return null\n }\n}\n\nfunction resolveRegistryDir(root: string): string | null {\n return resolvePackageDir(root, \"registry\")\n}\n\nconst SKILL_FILE = \"SKILL.md\"\n\n/** Directories a placed skill never lives in — skipped while scanning. */\nconst SKILL_SCAN_SKIP = new Set([\n \"node_modules\",\n \".git\",\n \".vantage\",\n \"dist\",\n \"build\",\n \"out\",\n \"coverage\",\n \".next\",\n \".turbo\",\n \".cache\",\n \".vercel\",\n])\n\n/** How deep below the root the scan goes (`.claude/skills/<name>` is depth 3). */\nconst SKILL_SCAN_DEPTH = 4\n\n/** List the skill directories bundled with the installed framework. */\nfunction listBundledSkills(skillsDir: string): string[] {\n try {\n return fs\n .readdirSync(skillsDir, { withFileTypes: true })\n .filter((e) => e.isDirectory() && fs.existsSync(path.join(skillsDir, e.name, SKILL_FILE)))\n .map((e) => e.name)\n .sort()\n } catch {\n return []\n }\n}\n\n/** Paths outside the project read better absolute than as a pile of `../`. */\nfunction displayPath(root: string, target: string): string {\n const rel = path.relative(root, target)\n return !rel ? \".\" : rel.startsWith(\"..\") ? target : rel\n}\n\n/**\n * Find where skills already live in this project — any `<name>/SKILL.md`, not\n * only the bundled names, so a project holding just its own skills still has a home.\n *\n * Placement is a convention, not a fixed path: apps keep them under the root,\n * under `.claude/skills/`, under `.squadbase/skills/`, … so `add skill` looks\n * for the skill *directories* rather than guessing one destination and adding a\n * second copy next to the one that is already there.\n */\nfunction findPlacedSkills(root: string, skillsDir: string): Map<string, string[]> {\n const found = new Map<string, string[]>()\n // A workspace that links the framework by path (not through node_modules)\n // would otherwise report the framework's own `skills/` as a placement.\n const isSource = (p: string) => !path.relative(skillsDir, p).startsWith(\"..\")\n const walk = (dir: string, depth: number): void => {\n let entries: fs.Dirent[]\n try {\n entries = fs.readdirSync(dir, { withFileTypes: true })\n } catch {\n return\n }\n for (const entry of entries) {\n if (!entry.isDirectory() || SKILL_SCAN_SKIP.has(entry.name)) continue\n const abs = path.join(dir, entry.name)\n if (fs.existsSync(path.join(abs, SKILL_FILE))) {\n if (!isSource(abs)) found.set(entry.name, [...(found.get(entry.name) ?? []), abs])\n continue // skills never nest inside one another\n }\n if (depth < SKILL_SCAN_DEPTH) walk(abs, depth + 1)\n }\n }\n walk(root, 1)\n for (const list of found.values()) list.sort()\n return found\n}\n\n/** The one location the Squadbase agent's `readSkill` reads (plus plugin roots). */\nconst SQUADBASE_SKILLS_DIR = \".squadbase/skills\"\n\n/**\n * Where a new skill goes when `--dir` is absent: the directory that already\n * holds the most placed skills (ties: the alphabetically first path), so it\n * lands next to the rest. Null when none is placed. (`readSkill` only reads\n * `.squadbase/skills`, so `addSkill` prefers that one — see `SQUADBASE_SKILLS_DIR`.)\n */\nfunction placedSkillsDir(placed: Map<string, string[]>): string | null {\n const count = new Map<string, number>()\n for (const list of placed.values())\n for (const p of list) count.set(path.dirname(p), (count.get(path.dirname(p)) ?? 0) + 1)\n const dirs = [...count.keys()].sort((a, b) => count.get(b)! - count.get(a)! || a.localeCompare(b))\n return dirs[0] ?? null\n}\n\n/** Copy one bundled skill directory to `dest`, creating parents as needed. */\nfunction writeSkill(root: string, skillsDir: string, name: string, dest: string, verb: string): void {\n fs.mkdirSync(path.dirname(dest), { recursive: true })\n fs.cpSync(path.join(skillsDir, name), dest, { recursive: true, force: true })\n log.ok(`${verb} skill ${displayPath(root, dest)}/`)\n}\n\n/** `vantage add skill` with no name — the bundled list plus where each one sits. */\nfunction printSkillList(root: string, available: string[], placed: Map<string, string[]>): number {\n const width = Math.max(...available.map((n) => n.length))\n log.info(\"Bundled skills:\")\n for (const name of available) {\n const where = placed.get(name)\n const status = where?.length\n ? where.map((p) => displayPath(root, p) + \"/\").join(\", \")\n : \"not placed\"\n log.info(` ${name.padEnd(width)} ${status}`)\n }\n const missing = available.filter((n) => !placed.get(n)?.length)\n if (missing.length) {\n log.info(\"\")\n log.info(\"Place the missing ones with: vantage add skill --all [--dir <path>]\")\n }\n return 0\n}\n\n/**\n * `vantage add skill [<name>|--all] [--dir <path>]` — copy Claude Code skills\n * out of the package.\n *\n * The command scans the project first: a skill that is already placed anywhere\n * (root, `.claude/skills/`, `.squadbase/skills/`, …) is a no-op and its location\n * is reported, so re-running never produces a second copy. `--force` refreshes\n * the placements that were found, in place. A skill not yet placed goes to\n * `--dir` when given (it also wins over refreshing somewhere else), else\n * `.squadbase/skills` when the project has a `.squadbase/` directory (the one\n * location `readSkill` reads), else next to the skills already placed (the\n * directory with the most), else the project root.\n */\nfunction addSkill(\n root: string,\n name: string | undefined,\n all: boolean,\n force: boolean,\n dir: string | undefined,\n): number {\n const skillsDir = resolvePackageDir(root, \"skills\")\n if (!skillsDir) {\n log.error(\"Could not resolve the Vantage skills directory.\")\n return 1\n }\n const available = listBundledSkills(skillsDir)\n if (available.length === 0) {\n log.error(\"No skills are bundled with this version of Vantage.\")\n return 1\n }\n const placed = findPlacedSkills(root, skillsDir)\n if (!all && !name) return printSkillList(root, available, placed)\n\n const hasSquadbase = fs.statSync(path.join(root, \".squadbase\"), { throwIfNoEntry: false })?.isDirectory()\n const squadbaseDir = hasSquadbase ? SQUADBASE_SKILLS_DIR : null\n const destDir = path.resolve(root, dir ?? squadbaseDir ?? placedSkillsDir(placed) ?? \".\")\n const targets = all ? available : [name as string]\n let failed = 0\n for (const target of targets) {\n if (!available.includes(target)) {\n log.error(`Unknown skill \"${target}\". Available: ${available.join(\", \")}`)\n failed++\n continue\n }\n const existing = placed.get(target) ?? []\n if (existing.length > 0 && !force) {\n const where = existing.map((p) => displayPath(root, p) + \"/\").join(\", \")\n log.info(`Skill ${target} is already placed at ${where} — skipped (--force to refresh).`)\n continue\n }\n // `--dir` names a destination explicitly, so it wins over refreshing copies\n // that live somewhere else; without it, `--force` updates them where they are.\n const inDestDir = existing.filter((p) => path.dirname(p) === destDir)\n const refresh = dir === undefined ? existing : inDestDir\n if (refresh.length > 0) {\n for (const dest of refresh) writeSkill(root, skillsDir, target, dest, \"Updated\")\n continue\n }\n if (existing.length > 0) {\n const where = existing.map((p) => displayPath(root, p) + \"/\").join(\", \")\n log.warn(`Skill ${target} is also placed at ${where} — left untouched.`)\n }\n writeSkill(root, skillsDir, target, path.join(destDir, target), \"Added\")\n }\n return failed === 0 ? 0 : 1\n}\n\nconst AGENTS_FILE = \"AGENTS.md\"\nconst AGENTS_KNOWLEDGE_DIR = \"agents\"\n\n/** Path to the framework's canonical AGENTS.md, or null if unresolved/absent. */\nfunction bundledAgentsPath(root: string): string | null {\n const dir = resolvePackageDir(root, \"templates\")\n if (!dir) return null\n const src = path.join(dir, AGENTS_FILE)\n return fs.existsSync(src) ? src : null\n}\n\n/** Directory bundling the per-artifact-type knowledge files (`agents/*.md`). */\nfunction bundledAgentsDir(root: string): string | null {\n const dir = resolvePackageDir(root, \"templates\")\n if (!dir) return null\n const sub = path.join(dir, AGENTS_KNOWLEDGE_DIR)\n return fs.existsSync(sub) ? sub : null\n}\n\n/** List the bundled `agents/*.md` knowledge file names. */\nfunction listBundledAgentsFiles(agentsDir: string): string[] {\n try {\n return fs\n .readdirSync(agentsDir, { withFileTypes: true })\n .filter((e) => e.isFile() && e.name.endsWith(\".md\"))\n .map((e) => e.name)\n .sort()\n } catch {\n return []\n }\n}\n\n/**\n * `vantage add agents` — copy the app-author AGENTS.md map, plus the\n * per-artifact-type knowledge files under `agents/`, into the app root.\n */\nfunction addAgents(root: string, force: boolean): number {\n const src = bundledAgentsPath(root)\n if (!src) {\n log.error(\"AGENTS.md is not bundled with this version of Vantage.\")\n return 1\n }\n const dest = path.join(root, AGENTS_FILE)\n if (fs.existsSync(dest) && !force) {\n log.error(`${AGENTS_FILE} already exists. Use --force to overwrite.`)\n return 1\n }\n fs.copyFileSync(src, dest)\n log.ok(`Added ${path.relative(root, dest) || AGENTS_FILE}`)\n\n const agentsDir = bundledAgentsDir(root)\n const destAgentsDir = path.join(root, AGENTS_KNOWLEDGE_DIR)\n if (agentsDir) {\n fs.mkdirSync(destAgentsDir, { recursive: true })\n const skipped: string[] = []\n for (const name of listBundledAgentsFiles(agentsDir)) {\n const destFile = path.join(destAgentsDir, name)\n if (fs.existsSync(destFile) && !force) {\n skipped.push(name)\n continue\n }\n fs.copyFileSync(path.join(agentsDir, name), destFile)\n log.ok(`Added ${path.relative(root, destFile)}`)\n }\n if (skipped.length > 0) {\n log.warn(\n `Skipped existing ${skipped.join(\", \")} in ${AGENTS_KNOWLEDGE_DIR}/. Use --force to overwrite.`,\n )\n }\n }\n return 0\n}\n\n/**\n * Re-sync a managed AGENTS.md (and its `agents/*.md` knowledge files) from the\n * framework's canonical copies. Only touches the app when AGENTS.md is already\n * present (opt-in via `vantage add agents`), and only rewrites files whose\n * content actually changed; bundled files missing locally are created, but\n * local files outside the bundle are never deleted. Used by `vantage upgrade`\n * so a single source-of-truth update reflects into apps that adopted the guide.\n */\nexport function syncAgentsFile(root: string): \"updated\" | \"unchanged\" | \"absent\" {\n const dest = path.join(root, AGENTS_FILE)\n if (!fs.existsSync(dest)) return \"absent\"\n\n let changed = false\n\n const src = bundledAgentsPath(root)\n if (src) {\n const next = fs.readFileSync(src, \"utf8\")\n if (fs.readFileSync(dest, \"utf8\") !== next) {\n fs.writeFileSync(dest, next)\n changed = true\n }\n }\n\n const agentsDir = bundledAgentsDir(root)\n if (agentsDir) {\n const destAgentsDir = path.join(root, AGENTS_KNOWLEDGE_DIR)\n fs.mkdirSync(destAgentsDir, { recursive: true })\n for (const name of listBundledAgentsFiles(agentsDir)) {\n const srcFile = path.join(agentsDir, name)\n const destFile = path.join(destAgentsDir, name)\n const next = fs.readFileSync(srcFile, \"utf8\")\n if (!fs.existsSync(destFile) || fs.readFileSync(destFile, \"utf8\") !== next) {\n fs.writeFileSync(destFile, next)\n changed = true\n }\n }\n }\n\n return changed ? \"updated\" : \"unchanged\"\n}\n\nfunction copyFromRegistry(root: string, kind: \"ui\" | \"block\", name: string, force: boolean): number {\n const registry = resolveRegistryDir(root)\n if (!registry) {\n log.error(\"Could not resolve the Vantage registry.\")\n return 1\n }\n const sub = kind === \"ui\" ? \"ui\" : \"blocks\"\n const src = path.join(registry, sub, `${name}.tsx`)\n if (!fs.existsSync(src)) {\n const available = fs.existsSync(path.join(registry, sub))\n ? fs.readdirSync(path.join(registry, sub)).map((f) => f.replace(/\\.tsx$/, \"\"))\n : []\n log.error(`Unknown ${kind} \"${name}\". Available: ${available.join(\", \") || \"(none)\"}`)\n return 1\n }\n // Copies land next to the pages that import them (src/components/… when the\n // project has a src/ layout).\n const destDir = path.join(resolvePageRoot(root).abs, \"components\", kind === \"ui\" ? \"ui\" : \"blocks\")\n const dest = path.join(destDir, `${name}.tsx`)\n if (fs.existsSync(dest) && !force) {\n log.error(`${path.relative(root, dest)} already exists. Use --force to overwrite.`)\n return 1\n }\n fs.mkdirSync(destDir, { recursive: true })\n fs.copyFileSync(src, dest)\n log.ok(`Added ${path.relative(root, dest)}`)\n return 0\n}\n\n/** `vantage add <page|api|ui|block|skill> <name>` */\nexport async function add(root: string, args: ParsedArgs): Promise<number> {\n const kind = args.positionals[1]\n const name = args.positionals[2]\n const force = Boolean(args.flags.force)\n const all = Boolean(args.flags.all)\n\n // `skill` accepts `--all` in place of a name, and `agents` takes no name at\n // all; handle both before the name guard.\n if (kind === \"skill\") {\n const dir = typeof args.flags.dir === \"string\" ? args.flags.dir : undefined\n return addSkill(root, name, all, force, dir)\n }\n if (kind === \"agents\") return addAgents(root, force)\n\n if (!kind || !name) {\n log.error(\"Usage: vantage add <page|api|ui|block|skill|agents> <name>\")\n return 1\n }\n\n if (kind === \"page\") {\n // Pages are named by their route, so they go under the page root — src/\n // when the project has one, the project root otherwise.\n const pageRoot = resolvePageRoot(root).abs\n const file = path.join(pageRoot, name.endsWith(\".tsx\") ? name : `${name}.tsx`)\n if (fs.existsSync(file) && !force) {\n log.error(`${path.relative(root, file)} already exists. Use --force to overwrite.`)\n return 1\n }\n fs.mkdirSync(path.dirname(file), { recursive: true })\n fs.writeFileSync(file, pageTemplate(name))\n log.ok(`Added page ${path.relative(root, file)}`)\n return 0\n }\n\n if (kind === \"api\") {\n const rel = name.startsWith(\"server/api/\") ? name : path.join(\"server\", \"api\", name)\n const file = path.join(root, rel.endsWith(\".ts\") ? rel : `${rel}.ts`)\n if (fs.existsSync(file) && !force) {\n log.error(`${path.relative(root, file)} already exists. Use --force to overwrite.`)\n return 1\n }\n fs.mkdirSync(path.dirname(file), { recursive: true })\n fs.writeFileSync(file, apiTemplate())\n log.ok(`Added API ${path.relative(root, file)}`)\n return 0\n }\n\n if (kind === \"ui\") return copyFromRegistry(root, \"ui\", name, force)\n if (kind === \"block\") return copyFromRegistry(root, \"block\", name, force)\n\n log.error(`Unknown add target \"${kind}\". Use one of: page, api, ui, block, skill, agents.`)\n return 1\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { formatDelta } from './chunk-
|
|
1
|
+
import { formatDelta } from './chunk-XRKSIC5Z.js';
|
|
2
2
|
import { useLocale, uiLanguage } from './chunk-ROHNXP7J.js';
|
|
3
3
|
import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
4
4
|
|
|
@@ -57,5 +57,5 @@ function DeltaText({ value, format, betterWhen = "up", comparisonLabel, locale:
|
|
|
57
57
|
}
|
|
58
58
|
|
|
59
59
|
export { DeltaText };
|
|
60
|
-
//# sourceMappingURL=chunk-
|
|
61
|
-
//# sourceMappingURL=chunk-
|
|
60
|
+
//# sourceMappingURL=chunk-LYUGDHSF.js.map
|
|
61
|
+
//# sourceMappingURL=chunk-LYUGDHSF.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../squadkit/registry/blocks/delta-text/delta-text.tsx"],"names":[],"mappings":";;;;;AAgCA,IAAM,KAAA,GAAQ,EAAE,KAAA,EAAO,kBAAA,EAAmB;AAE1C,IAAM,IAAA,GAAO;AAAA,EACX,EAAA,EAAI;AAAA,IACF,EAAA,EAAI,QAAA;AAAA,IACJ,IAAA,EAAM,QAAA;AAAA,IACN,IAAA,EAAM,oBAAA;AAAA,IACN,KAAA,EAAO,CAAC,IAAA,EAAc,IAAA,EAAc,SAClC,CAAA,EAAG,IAAI,CAAA,MAAA,EAAI,IAAI,GAAG,IAAA,KAAS,MAAA,GAAY,EAAA,GAAK,IAAA,GAAO,uBAAQ,oBAAK,CAAA;AAAA,GACpE;AAAA,EACA,EAAA,EAAI;AAAA,IACF,EAAA,EAAI,IAAA;AAAA,IACJ,IAAA,EAAM,MAAA;AAAA,IACN,IAAA,EAAM,MAAA;AAAA,IACN,KAAA,EAAO,CAAC,IAAA,EAAc,IAAA,EAAc,SAClC,CAAA,EAAG,IAAI,CAAA,EAAA,EAAK,IAAI,GAAG,IAAA,KAAS,MAAA,GAAY,EAAA,GAAK,IAAA,GAAO,eAAe,YAAY,CAAA;AAAA;AAErF,CAAA;AAEO,SAAS,SAAA,CAAU,EAAE,KAAA,EAAO,MAAA,EAAQ,aAAa,IAAA,EAAM,eAAA,EAAiB,MAAA,EAAQ,UAAA,EAAW,EAAmB;AACnH,EAAA,MAAM,MAAA,GAAS,UAAU,UAAU,CAAA;AACnC,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,UAAA,CAAW,MAAM,CAAC,CAAA;AACjC,EAAA,MAAM,KAAA,GAAQ,eAAA,mBAAkB,IAAA,CAAC,MAAA,EAAA,EAAK,OAAO,KAAA,EAAQ,QAAA,EAAA;AAAA,IAAA,eAAA;AAAA,IAAgB;AAAA,GAAA,EAAC,CAAA,GAAU,IAAA;AAChF,EAAA,IAAI,UAAU,IAAA,EAAM;AAClB,IAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,MAAA,KAAA;AAAA,0BACA,MAAA,EAAA,EAAK,WAAA,EAAU,YAAA,EAAa,KAAA,EAAO,OAAO,QAAA,EAAA,QAAA,EAE3C;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AACA,EAAA,MAAM,MAAM,KAAA,GAAQ,CAAA,GAAI,IAAA,GAAO,KAAA,GAAQ,IAAI,MAAA,GAAS,MAAA;AACpD,EAAA,MAAM,OAAO,GAAA,KAAQ,IAAA,GAAO,QAAA,GAAM,GAAA,KAAQ,SAAS,QAAA,GAAM,QAAA;AACzD,EAAA,MAAM,IAAA,GAAO,EAAE,GAAG,CAAA;AAClB,EAAA,MAAM,OAAO,GAAA,KAAQ,MAAA,GAAS,MAAA,GAAa,GAAA,KAAQ,UAAW,UAAA,KAAe,IAAA,CAAA;AAC7E,EAAA,MAAM,IAAA,GAAO,IAAA,KAAS,MAAA,GAAY,MAAA,GAAY,OAAO,eAAA,GAAkB,eAAA;AACvE,EAAA,MAAM,IAAA,GAAO,WAAA,CAAY,KAAA,EAAO,MAAA,EAAQ,MAAM,CAAA;AAC9C,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,IAAA,KAAA;AAAA,oBACD,IAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,WAAA,EAAU,YAAA;AAAA,QACV,SAAA,EAAW,IAAA;AAAA,QACX,KAAA,EAAO,OAAO,MAAA,GAAY,KAAA;AAAA,QAC1B,YAAA,EAAY,CAAA,CAAE,KAAA,CAAM,IAAA,EAAM,MAAM,IAAI,CAAA;AAAA,QAEnC,QAAA,EAAA;AAAA,UAAA,IAAA;AAAA,UAAK,GAAA;AAAA,UAAE;AAAA;AAAA;AAAA;AACV,GAAA,EACF,CAAA;AAEJ","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../../squadkit/registry/blocks/delta-text/delta-text.tsx"],"names":[],"mappings":";;;;;AAgCA,IAAM,KAAA,GAAQ,EAAE,KAAA,EAAO,kBAAA,EAAmB;AAE1C,IAAM,IAAA,GAAO;AAAA,EACX,EAAA,EAAI;AAAA,IACF,EAAA,EAAI,QAAA;AAAA,IACJ,IAAA,EAAM,QAAA;AAAA,IACN,IAAA,EAAM,oBAAA;AAAA,IACN,KAAA,EAAO,CAAC,IAAA,EAAc,IAAA,EAAc,SAClC,CAAA,EAAG,IAAI,CAAA,MAAA,EAAI,IAAI,GAAG,IAAA,KAAS,MAAA,GAAY,EAAA,GAAK,IAAA,GAAO,uBAAQ,oBAAK,CAAA;AAAA,GACpE;AAAA,EACA,EAAA,EAAI;AAAA,IACF,EAAA,EAAI,IAAA;AAAA,IACJ,IAAA,EAAM,MAAA;AAAA,IACN,IAAA,EAAM,MAAA;AAAA,IACN,KAAA,EAAO,CAAC,IAAA,EAAc,IAAA,EAAc,SAClC,CAAA,EAAG,IAAI,CAAA,EAAA,EAAK,IAAI,GAAG,IAAA,KAAS,MAAA,GAAY,EAAA,GAAK,IAAA,GAAO,eAAe,YAAY,CAAA;AAAA;AAErF,CAAA;AAEO,SAAS,SAAA,CAAU,EAAE,KAAA,EAAO,MAAA,EAAQ,aAAa,IAAA,EAAM,eAAA,EAAiB,MAAA,EAAQ,UAAA,EAAW,EAAmB;AACnH,EAAA,MAAM,MAAA,GAAS,UAAU,UAAU,CAAA;AACnC,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,UAAA,CAAW,MAAM,CAAC,CAAA;AACjC,EAAA,MAAM,KAAA,GAAQ,eAAA,mBAAkB,IAAA,CAAC,MAAA,EAAA,EAAK,OAAO,KAAA,EAAQ,QAAA,EAAA;AAAA,IAAA,eAAA;AAAA,IAAgB;AAAA,GAAA,EAAC,CAAA,GAAU,IAAA;AAChF,EAAA,IAAI,UAAU,IAAA,EAAM;AAClB,IAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,MAAA,KAAA;AAAA,0BACA,MAAA,EAAA,EAAK,WAAA,EAAU,YAAA,EAAa,KAAA,EAAO,OAAO,QAAA,EAAA,QAAA,EAE3C;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AACA,EAAA,MAAM,MAAM,KAAA,GAAQ,CAAA,GAAI,IAAA,GAAO,KAAA,GAAQ,IAAI,MAAA,GAAS,MAAA;AACpD,EAAA,MAAM,OAAO,GAAA,KAAQ,IAAA,GAAO,QAAA,GAAM,GAAA,KAAQ,SAAS,QAAA,GAAM,QAAA;AACzD,EAAA,MAAM,IAAA,GAAO,EAAE,GAAG,CAAA;AAClB,EAAA,MAAM,OAAO,GAAA,KAAQ,MAAA,GAAS,MAAA,GAAa,GAAA,KAAQ,UAAW,UAAA,KAAe,IAAA,CAAA;AAC7E,EAAA,MAAM,IAAA,GAAO,IAAA,KAAS,MAAA,GAAY,MAAA,GAAY,OAAO,eAAA,GAAkB,eAAA;AACvE,EAAA,MAAM,IAAA,GAAO,WAAA,CAAY,KAAA,EAAO,MAAA,EAAQ,MAAM,CAAA;AAC9C,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,IAAA,KAAA;AAAA,oBACD,IAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,WAAA,EAAU,YAAA;AAAA,QACV,SAAA,EAAW,IAAA;AAAA,QACX,KAAA,EAAO,OAAO,MAAA,GAAY,KAAA;AAAA,QAC1B,YAAA,EAAY,CAAA,CAAE,KAAA,CAAM,IAAA,EAAM,MAAM,IAAI,CAAA;AAAA,QAEnC,QAAA,EAAA;AAAA,UAAA,IAAA;AAAA,UAAK,GAAA;AAAA,UAAE;AAAA;AAAA;AAAA;AACV,GAAA,EACF,CAAA;AAEJ","file":"chunk-LYUGDHSF.js","sourcesContent":["\"use client\"\n\n/**\n * delta-text — a change as a bare inline `span`: mark + signed value (\"▲ +3.2%\"), so print and\n * colour-blind readers get the direction; colour only adds good / bad. It sets no text size, so it\n * takes the size of the line it sits in (doc blocks, slide text).\n *\n * - The direction comes from the sign of `value`; `betterWhen` (\"up\" by default; `\"down\"` for churn,\n * cost) decides good / bad. Zero is \"→\" in the muted colour; `null` is \"—\".\n * - `value` is the change itself, formatted by `format` with an explicit sign.\n * - `comparisonLabel` (\"前月比\") is printed in front, muted.\n *\n * @example\n * import { DeltaText } from \"@/blocks/delta-text/delta-text\"\n * <DeltaText value={0.032} format=\"percent\" comparisonLabel=\"前月比\" />\n */\nimport { useLocale } from \"../../hooks/use-locale\"\nimport { formatDelta, type ValueFormat } from \"../../lib/format\"\nimport { uiLanguage } from \"../../lib/locale\"\n\nexport interface DeltaTextProps {\n /** The change itself; its direction comes from the sign. `null` shows \"—\". */\n value: number | null\n format?: ValueFormat\n /** Which way is good. Default `\"up\"`. */\n betterWhen?: \"up\" | \"down\"\n /** Name of the comparison, e.g. \"前月比\". Printed before the change; omit to print only the change. */\n comparisonLabel?: string\n /** Locale of the value and the screen-reader text. Default the page's (`<html lang>`). */\n locale?: string\n}\n\nconst MUTED = { color: \"var(--doc-muted)\" } as const\n\nconst TEXT = {\n ja: {\n up: \"増\",\n down: \"減\",\n flat: \"横ばい\",\n label: (word: string, text: string, good: boolean | undefined) =>\n `${word}、${text}${good === undefined ? \"\" : good ? \"、改善\" : \"、悪化\"}`,\n },\n en: {\n up: \"Up\",\n down: \"Down\",\n flat: \"Flat\",\n label: (word: string, text: string, good: boolean | undefined) =>\n `${word}, ${text}${good === undefined ? \"\" : good ? \", improved\" : \", worsened\"}`,\n },\n}\n\nexport function DeltaText({ value, format, betterWhen = \"up\", comparisonLabel, locale: localeProp }: DeltaTextProps) {\n const locale = useLocale(localeProp)\n const t = TEXT[uiLanguage(locale)]\n const label = comparisonLabel ? <span style={MUTED}>{comparisonLabel} </span> : null\n if (value === null) {\n return (\n <>\n {label}\n <span data-slot=\"delta-text\" style={MUTED}>\n —\n </span>\n </>\n )\n }\n const dir = value > 0 ? \"up\" : value < 0 ? \"down\" : \"flat\"\n const mark = dir === \"up\" ? \"▲\" : dir === \"down\" ? \"▼\" : \"→\"\n const word = t[dir]\n const good = dir === \"flat\" ? undefined : (dir === \"up\") === (betterWhen === \"up\")\n const tone = good === undefined ? undefined : good ? \"text-positive\" : \"text-negative\"\n const text = formatDelta(value, format, locale)\n return (\n <>\n {label}\n <span\n data-slot=\"delta-text\"\n className={tone}\n style={tone ? undefined : MUTED}\n aria-label={t.label(word, text, good)}\n >\n {mark} {text}\n </span>\n </>\n )\n}\n\nexport default DeltaText\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { buttonVariants, Button } from './chunk-ROHNXP7J.js';
|
|
1
|
+
import { buttonVariants, Button, uiLanguage, useLocale } from './chunk-ROHNXP7J.js';
|
|
2
2
|
import { cn } from './chunk-U736PVHY.js';
|
|
3
3
|
import { mergeProps } from '@base-ui/react/merge-props';
|
|
4
4
|
import { useRender } from '@base-ui/react/use-render';
|
|
@@ -2313,7 +2313,72 @@ function ToggleGroupItem({
|
|
|
2313
2313
|
}
|
|
2314
2314
|
);
|
|
2315
2315
|
}
|
|
2316
|
+
var TEXT = {
|
|
2317
|
+
ja: {
|
|
2318
|
+
loading: "\u8AAD\u307F\u8FBC\u3093\u3067\u3044\u307E\u3059\u2026",
|
|
2319
|
+
empty: "\u8868\u793A\u3067\u304D\u308B\u30C7\u30FC\u30BF\u304C\u3042\u308A\u307E\u305B\u3093",
|
|
2320
|
+
errorTitle: "\u30C7\u30FC\u30BF\u3092\u8AAD\u307F\u8FBC\u3081\u307E\u305B\u3093\u3067\u3057\u305F",
|
|
2321
|
+
errorMessage: "\u6642\u9593\u3092\u304A\u3044\u3066\u518D\u8A66\u884C\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u89E3\u6C7A\u3057\u306A\u3044\u5834\u5408\u306F\u7BA1\u7406\u8005\u306B\u304A\u554F\u3044\u5408\u308F\u305B\u304F\u3060\u3055\u3044\u3002",
|
|
2322
|
+
details: "\u8A73\u7D30\u3092\u8868\u793A"
|
|
2323
|
+
},
|
|
2324
|
+
en: {
|
|
2325
|
+
loading: "Loading\u2026",
|
|
2326
|
+
empty: "No data to display",
|
|
2327
|
+
errorTitle: "Couldn't load the data",
|
|
2328
|
+
errorMessage: "Try again in a moment. If the problem continues, contact your administrator.",
|
|
2329
|
+
details: "Show details"
|
|
2330
|
+
}
|
|
2331
|
+
};
|
|
2332
|
+
var useText = () => TEXT[uiLanguage(useLocale())];
|
|
2333
|
+
function Loading({ label, className }) {
|
|
2334
|
+
const t = useText();
|
|
2335
|
+
return /* @__PURE__ */ jsx("div", { className: cn("flex min-h-[30vh] items-center justify-center", className), role: "status", "aria-live": "polite", children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 text-sm text-muted-foreground", children: [
|
|
2336
|
+
/* @__PURE__ */ jsx("span", { className: "h-4 w-4 animate-spin rounded-full border-2 border-current border-t-transparent" }),
|
|
2337
|
+
label ?? t.loading
|
|
2338
|
+
] }) });
|
|
2339
|
+
}
|
|
2340
|
+
function Empty({
|
|
2341
|
+
title,
|
|
2342
|
+
description,
|
|
2343
|
+
icon,
|
|
2344
|
+
action,
|
|
2345
|
+
className
|
|
2346
|
+
}) {
|
|
2347
|
+
const t = useText();
|
|
2348
|
+
return /* @__PURE__ */ jsxs("div", { className: cn("flex flex-col items-center justify-center gap-2 p-10 text-center", className), children: [
|
|
2349
|
+
icon ? /* @__PURE__ */ jsx("div", { className: "text-3xl text-muted-foreground", children: icon }) : null,
|
|
2350
|
+
/* @__PURE__ */ jsx("p", { className: "font-medium", children: title ?? t.empty }),
|
|
2351
|
+
description ? /* @__PURE__ */ jsx("p", { className: "max-w-sm text-sm text-muted-foreground", children: description }) : null,
|
|
2352
|
+
action ? /* @__PURE__ */ jsx("div", { className: "mt-2", children: action }) : null
|
|
2353
|
+
] });
|
|
2354
|
+
}
|
|
2355
|
+
function ErrorState({
|
|
2356
|
+
title,
|
|
2357
|
+
message,
|
|
2358
|
+
details,
|
|
2359
|
+
action,
|
|
2360
|
+
className
|
|
2361
|
+
}) {
|
|
2362
|
+
const t = useText();
|
|
2363
|
+
const shownMessage = message === void 0 ? t.errorMessage : message;
|
|
2364
|
+
return /* @__PURE__ */ jsxs(
|
|
2365
|
+
"div",
|
|
2366
|
+
{
|
|
2367
|
+
className: cn("rounded-xl border border-destructive/30 bg-destructive/5 p-6", className),
|
|
2368
|
+
role: "alert",
|
|
2369
|
+
children: [
|
|
2370
|
+
/* @__PURE__ */ jsx("p", { className: "font-semibold text-destructive", children: title ?? t.errorTitle }),
|
|
2371
|
+
shownMessage ? /* @__PURE__ */ jsx("p", { className: "mt-1 text-sm text-muted-foreground", children: shownMessage }) : null,
|
|
2372
|
+
details ? /* @__PURE__ */ jsxs("details", { className: "mt-2 text-xs text-muted-foreground", children: [
|
|
2373
|
+
/* @__PURE__ */ jsx("summary", { className: "cursor-pointer select-none", children: t.details }),
|
|
2374
|
+
/* @__PURE__ */ jsx("div", { className: "mt-1 font-mono break-all", children: details })
|
|
2375
|
+
] }) : null,
|
|
2376
|
+
action ? /* @__PURE__ */ jsx("div", { className: "mt-3", children: action }) : null
|
|
2377
|
+
]
|
|
2378
|
+
}
|
|
2379
|
+
);
|
|
2380
|
+
}
|
|
2316
2381
|
|
|
2317
|
-
export { Badge, Calendar, CalendarDayButton, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Checkbox, Collapsible, CollapsibleContent, CollapsibleTrigger, Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, Input, InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput, InputGroupText, InputGroupTextarea, Popover, PopoverContent, PopoverDescription, PopoverHeader, PopoverTitle, PopoverTrigger, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger, Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, Skeleton, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Textarea, Toggle, ToggleGroup, ToggleGroupItem, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, badgeVariants, toggleVariants, useIsMobile, useSidebar };
|
|
2318
|
-
//# sourceMappingURL=chunk-
|
|
2319
|
-
//# sourceMappingURL=chunk-
|
|
2382
|
+
export { Badge, Calendar, CalendarDayButton, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Checkbox, Collapsible, CollapsibleContent, CollapsibleTrigger, Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, Empty, ErrorState, Input, InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput, InputGroupText, InputGroupTextarea, Loading, Popover, PopoverContent, PopoverDescription, PopoverHeader, PopoverTitle, PopoverTrigger, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger, Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, Skeleton, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Textarea, Toggle, ToggleGroup, ToggleGroupItem, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, badgeVariants, toggleVariants, useIsMobile, useSidebar };
|
|
2383
|
+
//# sourceMappingURL=chunk-MQUIAP66.js.map
|
|
2384
|
+
//# sourceMappingURL=chunk-MQUIAP66.js.map
|