@squadbase/vantage 0.6.2-dev1.42c4e48 → 0.6.2-dev1.54bde93

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 (290) hide show
  1. package/dist/{build-MFWRPYKW.js → build-A23M4GCH.js} +7 -7
  2. package/dist/{build-MFWRPYKW.js.map → build-A23M4GCH.js.map} +1 -1
  3. package/dist/{check-ZBIH422T.js → check-FBHT6W6J.js} +5 -5
  4. package/dist/{check-ZBIH422T.js.map → check-FBHT6W6J.js.map} +1 -1
  5. package/dist/chunk-2IAPIOPS.js +152 -0
  6. package/dist/chunk-2IAPIOPS.js.map +1 -0
  7. package/dist/{chunk-5ZOP4SQR.js → chunk-2N72FKLB.js} +12 -7
  8. package/dist/chunk-2N72FKLB.js.map +1 -0
  9. package/dist/chunk-57GHR5LN.js +163 -0
  10. package/dist/chunk-57GHR5LN.js.map +1 -0
  11. package/dist/{chunk-7DZGJQ3P.js → chunk-5C2SEDPH.js} +21 -4
  12. package/dist/chunk-5C2SEDPH.js.map +1 -0
  13. package/dist/chunk-6OTTGAPO.js +44 -0
  14. package/dist/chunk-6OTTGAPO.js.map +1 -0
  15. package/dist/{chunk-OB6UBJXF.js → chunk-7S52M2SL.js} +127 -36
  16. package/dist/chunk-7S52M2SL.js.map +1 -0
  17. package/dist/{chunk-V3LF7BE7.js → chunk-ANZLVSEP.js} +4 -5
  18. package/dist/chunk-ANZLVSEP.js.map +1 -0
  19. package/dist/{chunk-XQUSGIDG.js → chunk-CKWPK4RO.js} +10 -3
  20. package/dist/chunk-CKWPK4RO.js.map +1 -0
  21. package/dist/chunk-JXFCSF3K.js +673 -0
  22. package/dist/chunk-JXFCSF3K.js.map +1 -0
  23. package/dist/{chunk-PXRX5PEC.js → chunk-PDOBHMUQ.js} +3 -3
  24. package/dist/chunk-PDOBHMUQ.js.map +1 -0
  25. package/dist/chunk-QOXXOFGL.js +7051 -0
  26. package/dist/chunk-QOXXOFGL.js.map +1 -0
  27. package/dist/{chunk-CEXAQQ5W.js → chunk-S5MDTHH7.js} +180 -18
  28. package/dist/chunk-S5MDTHH7.js.map +1 -0
  29. package/dist/{chunk-IBGOCWJB.js → chunk-SDJTTMLK.js} +247 -86
  30. package/dist/chunk-SDJTTMLK.js.map +1 -0
  31. package/dist/{chunk-QEWCYW3I.js → chunk-SHZM3EXB.js} +29 -8
  32. package/dist/chunk-SHZM3EXB.js.map +1 -0
  33. package/dist/{chunk-A2UUGASH.js → chunk-U736PVHY.js} +2 -2
  34. package/dist/chunk-U736PVHY.js.map +1 -0
  35. package/dist/{chunk-JKLLFVEU.js → chunk-UWSQUHX6.js} +4 -99
  36. package/dist/chunk-UWSQUHX6.js.map +1 -0
  37. package/dist/cli.js +6 -6
  38. package/dist/client/index.d.ts +2 -0
  39. package/dist/client/index.js +8 -2
  40. package/dist/client/index.js.map +1 -1
  41. package/dist/components/index.d.ts +1596 -100
  42. package/dist/components/index.js +7 -4
  43. package/dist/delta-text-CvwBGJ95.d.ts +15 -0
  44. package/dist/{dev-DCTOHQ6W.js → dev-H4I2JL63.js} +7 -7
  45. package/dist/{dev-DCTOHQ6W.js.map → dev-H4I2JL63.js.map} +1 -1
  46. package/dist/doc/index.d.ts +215 -2
  47. package/dist/doc/index.js +309 -5
  48. package/dist/doc/index.js.map +1 -1
  49. package/dist/{doctor-5E2VEZPK.js → doctor-B2O3GJDU.js} +5 -5
  50. package/dist/{doctor-5E2VEZPK.js.map → doctor-B2O3GJDU.js.map} +1 -1
  51. package/dist/format-U0cQl069.d.ts +243 -0
  52. package/dist/markdown/index.js +1 -1
  53. package/dist/markdown/index.js.map +1 -1
  54. package/dist/query/index.js +2 -2
  55. package/dist/{routes-3SGAFDMC.js → routes-PVKNT777.js} +4 -4
  56. package/dist/{routes-3SGAFDMC.js.map → routes-PVKNT777.js.map} +1 -1
  57. package/dist/slide/index.d.ts +272 -1
  58. package/dist/slide/index.js +974 -4
  59. package/dist/slide/index.js.map +1 -1
  60. package/dist/table/index.js +11 -8
  61. package/dist/table/index.js.map +1 -1
  62. package/dist/ui/index.d.ts +8 -2
  63. package/dist/ui/index.js +22 -112
  64. package/dist/ui/index.js.map +1 -1
  65. package/dist/{upgrade-DBBE6GIR.js → upgrade-6DT7ADRP.js} +4 -4
  66. package/dist/{upgrade-DBBE6GIR.js.map → upgrade-6DT7ADRP.js.map} +1 -1
  67. package/dist/vite/index.js +3 -3
  68. package/docs/en/changelog.md +2 -0
  69. package/docs/en/components.md +42 -17
  70. package/docs/en/doc/delta-text.md +40 -0
  71. package/docs/en/doc/doc-action-items.md +49 -0
  72. package/docs/en/doc/doc-callout.md +38 -0
  73. package/docs/en/doc/doc-data-table.md +60 -0
  74. package/docs/en/doc/doc-executive-summary.md +64 -0
  75. package/docs/en/doc/doc-figure.md +56 -0
  76. package/docs/en/doc/doc-key-findings.md +61 -0
  77. package/docs/en/doc/doc-kpi-scorecard.md +80 -0
  78. package/docs/en/doc/doc-notes-and-sources.md +43 -0
  79. package/docs/en/doc/doc-report-header.md +46 -0
  80. package/docs/en/pages-and-metadata.md +15 -0
  81. package/docs/en/parts/area-chart.md +99 -0
  82. package/docs/en/parts/bar-chart.md +91 -0
  83. package/docs/en/parts/bar-list.md +50 -0
  84. package/docs/en/parts/category-bar.md +37 -0
  85. package/docs/en/parts/chart-frame.md +39 -0
  86. package/docs/en/parts/data-table.md +22 -0
  87. package/docs/en/parts/delta.md +51 -0
  88. package/docs/en/parts/donut-chart.md +72 -0
  89. package/docs/en/parts/format.md +43 -0
  90. package/docs/en/parts/funnel-steps.md +2 -1
  91. package/docs/en/parts/heatmap.md +53 -0
  92. package/docs/en/parts/kpi-card.md +58 -0
  93. package/docs/en/parts/legend.md +35 -0
  94. package/docs/en/parts/line-chart.md +94 -0
  95. package/docs/en/parts/metric-value.md +3 -2
  96. package/docs/en/parts/progress-circle.md +33 -0
  97. package/docs/en/parts/sample-data.md +39 -0
  98. package/docs/en/parts/scatter-chart.md +56 -0
  99. package/docs/en/parts/sparkline.md +1 -1
  100. package/docs/en/parts/tracker.md +36 -0
  101. package/docs/en/parts/trend-indicator.md +17 -1
  102. package/docs/en/parts/updated-at.md +30 -0
  103. package/docs/en/parts/waterfall-chart.md +56 -0
  104. package/docs/en/slide/slide-chart-full.md +48 -0
  105. package/docs/en/slide/slide-chart-insight.md +52 -0
  106. package/docs/en/slide/slide-columns.md +46 -0
  107. package/docs/en/slide/slide-comparison.md +68 -0
  108. package/docs/en/slide/slide-cover.md +39 -0
  109. package/docs/en/slide/slide-exec-summary.md +47 -0
  110. package/docs/en/slide/slide-heading.md +38 -0
  111. package/docs/en/slide/slide-kpi-grid.md +55 -0
  112. package/docs/en/slide/slide-kpi-hero.md +58 -0
  113. package/docs/en/slide/slide-next-actions.md +49 -0
  114. package/docs/en/slide/slide-scorecard-table.md +54 -0
  115. package/docs/en/slide/slide-section.md +44 -0
  116. package/docs/en/slide/slide-source-line.md +34 -0
  117. package/docs/en/ui/alert-dialog.md +42 -0
  118. package/docs/en/ui/avatar.md +31 -0
  119. package/docs/en/ui/combobox.md +74 -0
  120. package/docs/en/ui/drawer.md +41 -0
  121. package/docs/en/ui/empty.md +1 -1
  122. package/docs/en/ui/error-state.md +4 -3
  123. package/docs/en/ui/field.md +42 -0
  124. package/docs/en/ui/hover-card.md +21 -0
  125. package/docs/en/ui/kbd.md +17 -0
  126. package/docs/en/ui/loading.md +1 -1
  127. package/docs/en/ui/pagination.md +36 -0
  128. package/docs/en/ui/radio-group.md +21 -0
  129. package/docs/en/ui/toast.md +44 -0
  130. package/docs/en/ui/toggle-group.md +4 -3
  131. package/docs/en/ui-and-theming.md +1 -1
  132. package/docs/index.json +917 -77
  133. package/docs/ja/changelog.md +2 -0
  134. package/docs/ja/components.md +39 -16
  135. package/docs/ja/doc/delta-text.md +40 -0
  136. package/docs/ja/doc/doc-action-items.md +49 -0
  137. package/docs/ja/doc/doc-callout.md +38 -0
  138. package/docs/ja/doc/doc-data-table.md +60 -0
  139. package/docs/ja/doc/doc-executive-summary.md +64 -0
  140. package/docs/ja/doc/doc-figure.md +56 -0
  141. package/docs/ja/doc/doc-key-findings.md +61 -0
  142. package/docs/ja/doc/doc-kpi-scorecard.md +80 -0
  143. package/docs/ja/doc/doc-notes-and-sources.md +43 -0
  144. package/docs/ja/doc/doc-report-header.md +46 -0
  145. package/docs/ja/page-types/slide.md +1 -0
  146. package/docs/ja/pages-and-metadata.md +15 -0
  147. package/docs/ja/parts/area-chart.md +49 -25
  148. package/docs/ja/parts/bar-chart.md +50 -24
  149. package/docs/ja/parts/bar-list.md +31 -8
  150. package/docs/ja/parts/chart-frame.md +36 -0
  151. package/docs/ja/parts/data-table.md +22 -0
  152. package/docs/ja/parts/delta.md +51 -0
  153. package/docs/ja/parts/donut-chart.md +45 -26
  154. package/docs/ja/parts/format.md +44 -0
  155. package/docs/ja/parts/funnel-steps.md +27 -8
  156. package/docs/ja/parts/heatmap.md +45 -0
  157. package/docs/ja/parts/kpi-card.md +56 -0
  158. package/docs/ja/parts/legend.md +36 -0
  159. package/docs/ja/parts/line-chart.md +48 -22
  160. package/docs/ja/parts/metric-value.md +3 -2
  161. package/docs/ja/parts/sample-data.md +61 -0
  162. package/docs/ja/parts/scatter-chart.md +69 -0
  163. package/docs/ja/parts/sparkline.md +1 -1
  164. package/docs/ja/parts/trend-indicator.md +17 -1
  165. package/docs/ja/parts/updated-at.md +27 -0
  166. package/docs/ja/parts/waterfall-chart.md +61 -0
  167. package/docs/ja/slide/slide-chart-full.md +48 -0
  168. package/docs/ja/slide/slide-chart-insight.md +52 -0
  169. package/docs/ja/slide/slide-columns.md +46 -0
  170. package/docs/ja/slide/slide-comparison.md +68 -0
  171. package/docs/ja/slide/slide-cover.md +39 -0
  172. package/docs/ja/slide/slide-exec-summary.md +47 -0
  173. package/docs/ja/slide/slide-heading.md +38 -0
  174. package/docs/ja/slide/slide-kpi-grid.md +55 -0
  175. package/docs/ja/slide/slide-kpi-hero.md +58 -0
  176. package/docs/ja/slide/slide-next-actions.md +49 -0
  177. package/docs/ja/slide/slide-scorecard-table.md +54 -0
  178. package/docs/ja/slide/slide-section.md +44 -0
  179. package/docs/ja/slide/slide-source-line.md +34 -0
  180. package/docs/ja/ui/empty.md +1 -1
  181. package/docs/ja/ui/error-state.md +4 -3
  182. package/docs/ja/ui/loading.md +1 -1
  183. package/docs/ja/ui/toggle-group.md +4 -3
  184. package/docs/ja/ui-and-theming.md +2 -2
  185. package/package.json +26 -24
  186. package/registry/ui/accordion.tsx +4 -2
  187. package/registry/ui/alert-dialog.tsx +3 -3
  188. package/registry/ui/alert.tsx +3 -1
  189. package/registry/ui/app-shell.tsx +7 -1
  190. package/registry/ui/area-chart.tsx +2852 -166
  191. package/registry/ui/attention-list.tsx +303 -0
  192. package/registry/ui/avatar.tsx +1 -1
  193. package/registry/ui/badge.tsx +3 -1
  194. package/registry/ui/bar-chart.tsx +2851 -166
  195. package/registry/ui/bar-list.tsx +3531 -90
  196. package/registry/ui/box-plot-chart.tsx +3906 -0
  197. package/registry/ui/breadcrumb.tsx +3 -1
  198. package/registry/ui/button.tsx +3 -1
  199. package/registry/ui/calendar.tsx +3 -1
  200. package/registry/ui/card.tsx +4 -2
  201. package/registry/ui/category-bar.tsx +1025 -16
  202. package/registry/ui/chart-frame.tsx +1393 -0
  203. package/registry/ui/checkbox.tsx +3 -1
  204. package/registry/ui/collapsible.tsx +3 -1
  205. package/registry/ui/combobox.tsx +2 -2
  206. package/registry/ui/command.tsx +3 -1
  207. package/registry/ui/dashboard-card.tsx +71 -28
  208. package/registry/ui/data-table.tsx +678 -56
  209. package/registry/ui/date-range-picker.tsx +245 -64
  210. package/registry/ui/delta.tsx +191 -0
  211. package/registry/ui/dialog.tsx +5 -3
  212. package/registry/ui/donut-chart.tsx +2929 -182
  213. package/registry/ui/drawer.tsx +1 -1
  214. package/registry/ui/dropdown-menu.tsx +5 -3
  215. package/registry/ui/echart.tsx +621 -67
  216. package/registry/ui/field.tsx +1 -1
  217. package/registry/ui/filter-bar.tsx +33 -6
  218. package/registry/ui/funnel-steps.tsx +3344 -49
  219. package/registry/ui/heatmap.tsx +1786 -0
  220. package/registry/ui/histogram-chart.tsx +3986 -0
  221. package/registry/ui/hover-card.tsx +2 -2
  222. package/registry/ui/input-group.tsx +3 -1
  223. package/registry/ui/input.tsx +3 -1
  224. package/registry/ui/kbd.tsx +3 -1
  225. package/registry/ui/kpi-card.tsx +704 -0
  226. package/registry/ui/label.tsx +3 -1
  227. package/registry/ui/legend.tsx +3563 -0
  228. package/registry/ui/line-chart.tsx +2852 -160
  229. package/registry/ui/metric-value.tsx +9 -1
  230. package/registry/ui/multi-select.tsx +11 -5
  231. package/registry/ui/page-shell.tsx +106 -51
  232. package/registry/ui/pagination.tsx +3 -1
  233. package/registry/ui/paired-chart.tsx +3827 -0
  234. package/registry/ui/placeholder.tsx +8 -2
  235. package/registry/ui/popover.tsx +4 -2
  236. package/registry/ui/progress-circle.tsx +607 -12
  237. package/registry/ui/progress.tsx +3 -1
  238. package/registry/ui/radio-group.tsx +1 -1
  239. package/registry/ui/sample-data.tsx +86 -0
  240. package/registry/ui/scatter-chart.tsx +4212 -0
  241. package/registry/ui/scroll-area.tsx +3 -2
  242. package/registry/ui/searchable-select.tsx +8 -3
  243. package/registry/ui/section-header.tsx +5 -3
  244. package/registry/ui/segmented-control.tsx +7 -2
  245. package/registry/ui/select.tsx +4 -2
  246. package/registry/ui/separator.tsx +3 -1
  247. package/registry/ui/sheet.tsx +4 -2
  248. package/registry/ui/sidebar.tsx +4 -2
  249. package/registry/ui/skeleton.tsx +4 -2
  250. package/registry/ui/slider.tsx +4 -2
  251. package/registry/ui/sparkline.tsx +84 -9
  252. package/registry/ui/spinner.tsx +3 -1
  253. package/registry/ui/states.tsx +34 -5
  254. package/registry/ui/status-badge.tsx +83 -41
  255. package/registry/ui/switch.tsx +3 -1
  256. package/registry/ui/table.tsx +4 -2
  257. package/registry/ui/tabs.tsx +5 -3
  258. package/registry/ui/textarea.tsx +3 -1
  259. package/registry/ui/toast.tsx +2 -2
  260. package/registry/ui/toggle-group.tsx +3 -1
  261. package/registry/ui/toggle.tsx +3 -1
  262. package/registry/ui/tooltip.tsx +10 -4
  263. package/registry/ui/tracker.tsx +632 -19
  264. package/registry/ui/trend-indicator.tsx +15 -3
  265. package/registry/ui/updated-at.tsx +122 -0
  266. package/registry/ui/waterfall-chart.tsx +4248 -0
  267. package/skills/vantage-design/SKILL.md +34 -24
  268. package/skills/vantage-design/references/extract.md +16 -14
  269. package/skills/vantage-design/references/format.md +6 -5
  270. package/skills/vantage-design/references/presets.md +60 -110
  271. package/skills/vantage-pitfalls/SKILL.md +5 -0
  272. package/skills/vantage-slide/SKILL.md +54 -36
  273. package/templates/AGENTS.md +17 -3
  274. package/templates/agents/doc.md +48 -0
  275. package/templates/agents/page.md +32 -1
  276. package/templates/agents/slide.md +70 -2
  277. package/theme.css +247 -149
  278. package/dist/chunk-5ZOP4SQR.js.map +0 -1
  279. package/dist/chunk-7DZGJQ3P.js.map +0 -1
  280. package/dist/chunk-A2UUGASH.js.map +0 -1
  281. package/dist/chunk-AG6RZ2RR.js +0 -3208
  282. package/dist/chunk-AG6RZ2RR.js.map +0 -1
  283. package/dist/chunk-CEXAQQ5W.js.map +0 -1
  284. package/dist/chunk-IBGOCWJB.js.map +0 -1
  285. package/dist/chunk-JKLLFVEU.js.map +0 -1
  286. package/dist/chunk-OB6UBJXF.js.map +0 -1
  287. package/dist/chunk-PXRX5PEC.js.map +0 -1
  288. package/dist/chunk-QEWCYW3I.js.map +0 -1
  289. package/dist/chunk-V3LF7BE7.js.map +0 -1
  290. package/dist/chunk-XQUSGIDG.js.map +0 -1
@@ -1,5 +1,5 @@
1
- import { detectApiMethods, maskSource, stripComments } from './chunk-JKLLFVEU.js';
2
- import { isHomePagePath, isPlaceholderHomePage } from './chunk-CEXAQQ5W.js';
1
+ import { detectApiMethods } from './chunk-UWSQUHX6.js';
2
+ import { isHomePagePath, isPlaceholderHomePage, readLayoutLang, isValidLang, DEFAULT_APP_LANG, maskSource, stripComments } from './chunk-S5MDTHH7.js';
3
3
  import { timed } from './chunk-RNTDBX6S.js';
4
4
  import { PUBLIC_ENV_PREFIX, FORBIDDEN_FILES, ROUTED_EXTENSIONS, SRC_DIR, SUSPICIOUS_ROUTE_DIRS, FILE_PAGE_EXTENSIONS, FILE_PAGE_MAX_BYTES, API_METHODS } from './chunk-C2CX6GLX.js';
5
5
  import fs from 'fs';
@@ -275,6 +275,22 @@ function checkPageExports(ctx) {
275
275
  }
276
276
  return diags;
277
277
  }
278
+ function checkAppLang(ctx) {
279
+ const { root, model } = ctx;
280
+ const layout = model.layouts.find((l) => l.dir === "");
281
+ if (!layout) return [];
282
+ const lang = readLayoutLang(layout.absFile);
283
+ if (lang === void 0 || isValidLang(lang)) return [];
284
+ return [
285
+ {
286
+ code: "INVALID_APP_LANG",
287
+ severity: "warning",
288
+ message: `Root layout exports lang ${JSON.stringify(lang)}, which is not a valid language tag; <html lang> falls back to "${DEFAULT_APP_LANG}".`,
289
+ files: [rel(root, layout.absFile)],
290
+ fix: 'Use a BCP 47 tag as a string literal, e.g. `export const lang = "ja"`.'
291
+ }
292
+ ];
293
+ }
278
294
  function checkApiExports(ctx) {
279
295
  const diags = [];
280
296
  for (const api of ctx.model.apis) {
@@ -516,6 +532,7 @@ function runDiagnostics(root, model) {
516
532
  ...checkFilePageSize(ctx),
517
533
  ...checkPageExports(ctx),
518
534
  ...checkApiExports(ctx),
535
+ ...checkAppLang(ctx),
519
536
  ...client.boundary,
520
537
  ...client.env,
521
538
  ...checkHardcodedColors(ctx),
@@ -525,5 +542,5 @@ function runDiagnostics(root, model) {
525
542
  }
526
543
 
527
544
  export { runDiagnostics };
528
- //# sourceMappingURL=chunk-7DZGJQ3P.js.map
529
- //# sourceMappingURL=chunk-7DZGJQ3P.js.map
545
+ //# sourceMappingURL=chunk-5C2SEDPH.js.map
546
+ //# sourceMappingURL=chunk-5C2SEDPH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/diagnostics.ts"],"names":[],"mappings":"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","file":"chunk-5C2SEDPH.js","sourcesContent":["import fs from \"node:fs\"\nimport path from \"node:path\"\nimport {\n API_METHODS,\n FILE_PAGE_EXTENSIONS,\n FILE_PAGE_MAX_BYTES,\n FORBIDDEN_FILES,\n PUBLIC_ENV_PREFIX,\n ROUTED_EXTENSIONS,\n SRC_DIR,\n SUSPICIOUS_ROUTE_DIRS,\n} from \"./constants\"\nimport { isHomePagePath, isPlaceholderHomePage } from \"./placeholder\"\nimport { timed } from \"./profile\"\nimport { detectApiMethods } from \"./route-spec\"\nimport { DEFAULT_APP_LANG, isValidLang, readLayoutLang } from \"./route-tree\"\nimport { maskSource, stripComments } from \"./source\"\nimport type { Diagnostic, RouteModel } from \"./types\"\n\n/** Vite/env identifiers that are always allowed on `import.meta.env`. */\nconst ALLOWED_ENV_KEYS = new Set([\"MODE\", \"DEV\", \"PROD\", \"SSR\", \"BASE_URL\", \"PUBLIC_\"])\n\n/** Whether a module has a default export (direct, aliased, or re-exported). */\nfunction hasDefaultExport(src: string): boolean {\n return (\n /\\bexport\\s+default\\b/.test(src) ||\n /\\bexport\\s*\\{[^}]*\\bas\\s+default\\b[^}]*\\}/.test(src) ||\n /\\bexport\\s*\\{[^}]*\\bdefault\\b[^}]*\\}\\s*from\\b/.test(src)\n )\n}\n\n/** Collect client-side source files (everything outside server/ and generated dirs). */\nfunction collectClientFiles(root: string): string[] {\n const out: string[] = []\n const skipDirs = new Set([\"node_modules\", \".vantage\", \"dist\", \"server\", \"public\"])\n const walk = (dir: string) => {\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.name.startsWith(\".\")) continue\n const abs = path.join(dir, entry.name)\n if (entry.isDirectory()) {\n if (skipDirs.has(entry.name)) continue\n walk(abs)\n } else if (/\\.(tsx?|jsx?)$/.test(entry.name)) {\n out.push(abs)\n }\n }\n }\n walk(root)\n return out\n}\n\n/**\n * Per-run scratch space. Every checker reads the filesystem through this, so a\n * `check` walks the project once and reads (and `stripComments`) each source\n * file at most once — page modules used to be read three times over, and the\n * client tree used to be walked twice.\n */\ninterface Ctx {\n root: string\n model: RouteModel\n /** Raw file text for an absolute path; null when unreadable. */\n raw(abs: string): string | null\n /** Comment-stripped source for an absolute path; null when unreadable. */\n source(abs: string): string | null\n /**\n * Byte size of a file; null when unreadable. Separate from `source` because\n * `source` decodes as UTF-8 and strips comments — fine for a page module,\n * ruinous for a few MB of spreadsheet.\n */\n size(abs: string): number | null\n /** Client-side source files, walked lazily and only once. */\n clientFiles(): string[]\n /** `readdir` of the project root, read lazily and only once. */\n rootEntries(): string[]\n}\n\nfunction createCtx(root: string, model: RouteModel): Ctx {\n const raws = new Map<string, string | null>()\n const sources = new Map<string, string | null>()\n const sizes = new Map<string, number | null>()\n let clientFiles: string[] | null = null\n let rootEntries: string[] | null = null\n\n const raw = (abs: string): string | null => {\n const hit = raws.get(abs)\n if (hit !== undefined) return hit\n let text: string | null\n try {\n text = fs.readFileSync(abs, \"utf8\")\n } catch {\n text = null\n }\n raws.set(abs, text)\n return text\n }\n\n return {\n root,\n model,\n raw,\n source(abs) {\n const hit = sources.get(abs)\n if (hit !== undefined) return hit\n const text = raw(abs)\n const src = text === null ? null : stripComments(text)\n sources.set(abs, src)\n return src\n },\n size(abs) {\n const hit = sizes.get(abs)\n if (hit !== undefined) return hit\n let bytes: number | null\n try {\n bytes = fs.statSync(abs).size\n } catch {\n bytes = null\n }\n sizes.set(abs, bytes)\n return bytes\n },\n clientFiles() {\n return (clientFiles ??= collectClientFiles(root))\n },\n rootEntries() {\n if (rootEntries) return rootEntries\n try {\n rootEntries = fs.readdirSync(root)\n } catch {\n rootEntries = []\n }\n return rootEntries\n },\n }\n}\n\nfunction rel(root: string, abs: string): string {\n return path.relative(root, abs).split(path.sep).join(\"/\")\n}\n\n/** Detect forbidden config files at the project root. */\nfunction checkForbiddenFiles(ctx: Ctx): Diagnostic[] {\n const diags: Diagnostic[] = []\n for (const name of ctx.rootEntries()) {\n for (const rule of FORBIDDEN_FILES) {\n if (rule.pattern.test(name)) {\n diags.push({\n code: \"FORBIDDEN_FILE\",\n severity: \"error\",\n message: `${rule.label} file \"${name}\" is not allowed in a Vantage project.`,\n files: [name],\n fix: rule.remedy,\n })\n }\n }\n }\n return diags\n}\n\n/**\n * Detect a project split between `src/` and the project root. Once `src/`\n * exists it is the only page-scan root, so anything left behind at the root is\n * silently dead — and `server/` moved *into* `src/` is silently unserved.\n */\nfunction checkSrcLayout(ctx: Ctx): Diagnostic[] {\n const { root, model } = ctx\n if (model.pageDir === \"\") return []\n const diags: Diagnostic[] = []\n\n const entries = ctx.rootEntries()\n // Lowercased before matching, as scan does: `Sales.CSV` at the root is a\n // stray page too, and saying so is the whole point of this check.\n const strayPages = entries.filter((name) =>\n ROUTED_EXTENSIONS.some((ext) => name.toLowerCase().endsWith(ext)),\n )\n if (strayPages.length > 0) {\n diags.push({\n code: \"SRC_DIR_SPLIT\",\n severity: \"error\",\n message: `${strayPages.length} page module(s) sit at the project root, but ${SRC_DIR}/ exists so pages are only scanned from ${SRC_DIR}/.`,\n files: strayPages.sort(),\n fix: `Move them into ${SRC_DIR}/, or delete ${SRC_DIR}/ to keep a root-level layout.`,\n })\n }\n\n if (entries.includes(\"styles.css\")) {\n diags.push({\n code: \"SRC_DIR_SPLIT\",\n severity: \"error\",\n message: `styles.css sits at the project root, but ${SRC_DIR}/ exists so the global stylesheet is read from ${SRC_DIR}/styles.css.`,\n files: [\"styles.css\"],\n fix: `Move it to ${SRC_DIR}/styles.css.`,\n })\n }\n\n if (fs.existsSync(path.join(root, SRC_DIR, \"server\"))) {\n diags.push({\n code: \"SRC_DIR_SPLIT\",\n severity: \"error\",\n message: `${SRC_DIR}/server/ is never scanned: server code lives at the project root, outside the client source tree.`,\n files: [`${SRC_DIR}/server`],\n fix: `Move it to server/ at the project root.`,\n })\n }\n\n return diags\n}\n\n/** Flag routes generated from directories that are almost certainly scaffolding. */\nfunction checkSuspiciousRouteDirs(model: RouteModel): Diagnostic[] {\n const byDir = new Map<string, { files: string[]; routes: string[] }>()\n for (const page of model.pages) {\n const top = page.dir.split(\"/\")[0] ?? \"\"\n if (top === \"\" || !SUSPICIOUS_ROUTE_DIRS.has(top)) continue\n const hit = byDir.get(top) ?? { files: [], routes: [] }\n hit.files.push(page.file)\n hit.routes.push(page.routePath)\n byDir.set(top, hit)\n }\n\n const diags: Diagnostic[] = []\n for (const [dir, hit] of byDir) {\n diags.push({\n code: \"SUSPICIOUS_ROUTE_DIR\",\n severity: \"warning\",\n message: `${dir}/ is part of the URL: ${hit.routes.slice(0, 3).join(\", \")}${\n hit.routes.length > 3 ? \", …\" : \"\"\n }`,\n files: hit.files,\n fix: `Directory names become route segments. Non-page modules belong in components/, hooks/ or lib/ (never scanned); if ${dir}/ really is meant to be a URL segment, ignore this warning.`,\n })\n }\n return diags\n}\n\n/** Detect two page files resolving to the same route path. */\nfunction checkRouteConflicts(ctx: Ctx): Diagnostic[] {\n const byPath = new Map<string, string[]>()\n for (const page of ctx.model.pages) {\n const list = byPath.get(page.routePath) ?? []\n list.push(page.file)\n byPath.set(page.routePath, list)\n }\n const diags: Diagnostic[] = []\n for (const [routePath, files] of byPath) {\n if (files.length <= 1) continue\n\n // Special case: if route is \"/\" and one of the files is the untouched\n // template placeholder home page, exclude it from the conflict.\n // This allows new artifacts (e.g. index.slide.tsx) to claim \"/\" when\n // the placeholder has not been edited.\n if (routePath === \"/\") {\n const nonPlaceholders = files.filter((file) => {\n if (!isHomePagePath(file)) return true\n const abs = path.join(ctx.root, file)\n const content = ctx.raw(abs)\n return content === null || !isPlaceholderHomePage(content)\n })\n\n // If only one non-placeholder file remains, no conflict.\n if (nonPlaceholders.length <= 1) continue\n\n // If multiple non-placeholder files, report conflict with only those.\n if (nonPlaceholders.length < files.length) {\n diags.push({\n code: \"ROUTE_CONFLICT\",\n severity: \"error\",\n message: `${nonPlaceholders.length} files resolve to ${routePath}`,\n files: nonPlaceholders,\n fix: \"Rename or remove one route file so each route is unique. A page-kind suffix and a data-file extension both drop out of the URL, so `june.slide.tsx`, `june.csv` and `june.tsx` all resolve to /june.\",\n })\n continue\n }\n }\n\n diags.push({\n code: \"ROUTE_CONFLICT\",\n severity: \"error\",\n message: `${files.length} files resolve to ${routePath}`,\n files,\n fix: \"Rename or remove one route file so each route is unique. A page-kind suffix and a data-file extension both drop out of the URL, so `june.slide.tsx`, `june.csv` and `june.tsx` all resolve to /june.\",\n })\n }\n return diags\n}\n\n/**\n * Speak up about files the scan walked past. Neither case reaches the router,\n * so nothing else in the toolchain has an opportunity to mention them: the\n * page simply never appears in `routes`, in the nav, or at a URL. Without this\n * the only symptom is absence.\n */\nfunction checkUnroutedFiles(ctx: Ctx): Diagnostic[] {\n const diags: Diagnostic[] = []\n for (const entry of ctx.model.unrouted) {\n if (entry.reason === \"extension\") {\n diags.push({\n code: \"UNSUPPORTED_PAGE_FILE\",\n severity: \"warning\",\n message: `\"${entry.file}\" is not a page: Vantage has no viewer for \"${path.posix.extname(\n entry.file,\n )}\".`,\n files: [entry.file],\n fix: `Only ${FILE_PAGE_EXTENSIONS.join(\" and \")} files become pages. Convert it, or render it from a .tsx page with <TableViewer> from @squadbase/vantage/table.`,\n })\n continue\n }\n diags.push({\n code: \"INVALID_PAGE_VARIANT\",\n severity: \"error\",\n message: `\"${entry.file}\" carries the \"${entry.variant}\" page kind but is not a page module, so it is not routed.`,\n files: [entry.file],\n fix: `A page kind only applies to a page module that becomes a route: name it <name>.${entry.variant}.tsx. Layouts, _404/_error and underscore-prefixed modules cannot carry one.`,\n })\n }\n return diags\n}\n\n/**\n * Data-file pages are parsed in the browser, so an oversized file does not\n * fail the build — it renders an error on its own page. A warning, not an\n * error, keeps one large export from blocking a deploy of everything else.\n */\nfunction checkFilePageSize(ctx: Ctx): Diagnostic[] {\n const diags: Diagnostic[] = []\n for (const page of ctx.model.pages) {\n if (page.kind !== \"file\") continue\n const size = ctx.size(page.absFile)\n if (size === null || size <= FILE_PAGE_MAX_BYTES) continue\n diags.push({\n code: \"FILE_PAGE_TOO_LARGE\",\n severity: \"warning\",\n message: `${page.file} is ${(size / 1024 / 1024).toFixed(1)} MB, so ${page.routePath} will show an error instead of a table.`,\n files: [page.file],\n fix: `Data-file pages are parsed in the browser and capped at ${\n FILE_PAGE_MAX_BYTES / 1024 / 1024\n } MB. Serve larger data from server/api/ and render it with DataTable.`,\n })\n }\n return diags\n}\n\n/** Ensure every page module has a default export. */\nfunction checkPageExports(ctx: Ctx): Diagnostic[] {\n const { root, model } = ctx\n const diags: Diagnostic[] = []\n const pageFiles = [\n // Data-file pages have no default export to look for — their component is\n // the generated wrapper, not the `.csv` itself.\n ...model.pages.filter((p) => p.kind === \"module\").map((p) => p.absFile),\n ...model.layouts.map((l) => l.absFile),\n model.notFound && path.join(root, model.notFound),\n model.error && path.join(root, model.error),\n ].filter((x): x is string => Boolean(x))\n\n for (const abs of pageFiles) {\n const src = ctx.source(abs)\n if (src === null) continue\n if (!hasDefaultExport(src)) {\n diags.push({\n code: \"MISSING_DEFAULT_EXPORT\",\n severity: \"error\",\n message: `Page module has no default export.`,\n files: [rel(root, abs)],\n fix: \"A page/layout must `export default` a React component.\",\n })\n }\n }\n return diags\n}\n\n/** Warn when the root layout's `lang` is not a valid language tag (the shell falls back to \"en\"). */\nfunction checkAppLang(ctx: Ctx): Diagnostic[] {\n const { root, model } = ctx\n const layout = model.layouts.find((l) => l.dir === \"\")\n if (!layout) return []\n const lang = readLayoutLang(layout.absFile)\n if (lang === undefined || isValidLang(lang)) return []\n return [\n {\n code: \"INVALID_APP_LANG\",\n severity: \"warning\",\n message: `Root layout exports lang ${JSON.stringify(lang)}, which is not a valid language tag; <html lang> falls back to \"${DEFAULT_APP_LANG}\".`,\n files: [rel(root, layout.absFile)],\n fix: 'Use a BCP 47 tag as a string literal, e.g. `export const lang = \"ja\"`.',\n },\n ]\n}\n\n/** Ensure every API module exports at least one valid HTTP method handler. */\nfunction checkApiExports(ctx: Ctx): Diagnostic[] {\n const diags: Diagnostic[] = []\n for (const api of ctx.model.apis) {\n const src = ctx.source(api.absFile)\n if (src === null) continue\n const exported = detectApiMethods(src)\n if (exported.length === 0) {\n // Common mistake: lowercase method names.\n const lower = [\"get\", \"post\", \"put\", \"patch\", \"delete\", \"options\"].filter((m) =>\n new RegExp(`export\\\\s+(async\\\\s+)?function\\\\s+${m}\\\\b`).test(src),\n )\n diags.push({\n code: \"INVALID_API_EXPORT\",\n severity: \"error\",\n message: `API module exports no HTTP method handler${\n lower.length ? ` (found lowercase \"${lower.join(\", \")}\")` : \"\"\n }.`,\n files: [api.file],\n fix: `Export one of: ${API_METHODS.join(\", \")} (uppercase).`,\n })\n }\n }\n return diags\n}\n\n/**\n * The two source-level client checks — the server-import boundary and non-public\n * env reads — in a single pass over the client tree. They used to walk and read\n * the whole tree once each; the diagnostics are still emitted grouped by code so\n * the reported order is unchanged.\n */\nfunction checkClientSources(ctx: Ctx): { boundary: Diagnostic[]; env: Diagnostic[] } {\n const { root } = ctx\n const boundary: Diagnostic[] = []\n const env: Diagnostic[] = []\n const importRe = /(?:import|export)[^'\"]*?from\\s+[\"']([^\"']+)[\"']|import\\s*\\(\\s*[\"']([^\"']+)[\"']\\s*\\)/g\n const envRe = /import\\.meta\\.env\\.([A-Za-z_][A-Za-z0-9_]*)/g\n\n for (const abs of ctx.clientFiles()) {\n const src = ctx.source(abs)\n if (src === null) continue\n\n let m: RegExpExecArray | null\n importRe.lastIndex = 0\n while ((m = importRe.exec(src))) {\n const spec = m[1] ?? m[2]\n if (!spec) continue\n const isServer =\n spec === \"server\" ||\n spec.startsWith(\"server/\") ||\n /(^|\\/)\\.\\.?\\/server(\\/|$)/.test(spec) ||\n /\\/server\\//.test(spec)\n if (isServer) {\n boundary.push({\n code: \"CLIENT_IMPORTS_SERVER\",\n severity: \"error\",\n message: `Client module imports from server/ (\"${spec}\").`,\n files: [rel(root, abs)],\n fix: \"server/ code must never be imported by the client. Move shared code to lib/.\",\n })\n }\n }\n\n envRe.lastIndex = 0\n const bad = new Set<string>()\n while ((m = envRe.exec(src))) {\n const key = m[1]!\n if (ALLOWED_ENV_KEYS.has(key)) continue\n if (key.startsWith(PUBLIC_ENV_PREFIX)) continue\n bad.add(key)\n }\n for (const key of bad) {\n env.push({\n code: \"PUBLIC_ENV_MISUSE\",\n severity: \"warning\",\n message: `Client reads non-public env \"import.meta.env.${key}\".`,\n files: [rel(root, abs)],\n fix: `Only ${PUBLIC_ENV_PREFIX}* vars reach the client. Read secrets via ApiContext.env in server/.`,\n })\n }\n }\n return { boundary, env }\n}\n\n// ── hard-coded colors ────────────────────────────────────────────────────────\n\n/** Tailwind utilities that take a color. */\nconst COLOR_PREFIXES =\n \"text|bg|border|ring|fill|stroke|from|via|to|outline|decoration|divide|accent|caret|shadow|placeholder\"\nconst PALETTES =\n \"slate|gray|zinc|neutral|stone|red|orange|amber|yellow|lime|green|emerald|teal|cyan|sky|blue|indigo|violet|purple|fuchsia|pink|rose\"\nconst COLOR_FNS = \"rgba?|hsla?|oklch|oklab|lab|lch|color\"\n\n/** `dark:hover:bg-blue-500/50` — variants, prefix, palette, opacity. */\nconst PALETTE_CLASS_RE = new RegExp(\n `(?<![\\\\w-])((?:[\\\\w-]+:)*)(${COLOR_PREFIXES})-(${PALETTES})-(50|[1-9]00|950)(\\\\/(?:\\\\d+|\\\\[[^\\\\]\\\\s]+\\\\]))?(?![\\\\w-])`,\n \"g\",\n)\n/** `bg-[#0f172a]`, `text-[rgb(1,2,3)]`, `shadow-[0_0_4px_rgba(…)]`. */\nconst ARBITRARY_CLASS_RE = new RegExp(\n `(?<![\\\\w-])((?:[\\\\w-]+:)*)(${COLOR_PREFIXES})-\\\\[([^\\\\]\\\\s\"'\\`]+)\\\\]`,\n \"g\",\n)\nconst COLOR_FN_RE = new RegExp(\n `(?<![\\\\w-])(?:${COLOR_FNS})\\\\((?:[^()]|\\\\([^()]*\\\\))*\\\\)`,\n \"g\",\n)\nconst HEX_RE = /(?<![\\w&#/-])#([0-9a-fA-F]{3,8})(?![\\w-])/g\nconst HEX_LITERAL_RE = /(?<![\\w&])#(?:[0-9a-fA-F]{8}|[0-9a-fA-F]{6}|[0-9a-fA-F]{3,4})(?![\\w-])/\n/** `href=\"#abc\"`, `to=\"#add\"` — an anchor, not a color. */\nconst ANCHOR_BEFORE_RE = /\\b(?:href|to|id|hash)\\s*[=:]\\s*\\{?\\s*[\"'`]$/\n\nconst NEUTRAL_PALETTES = new Set([\"slate\", \"gray\", \"zinc\", \"neutral\", \"stone\"])\nconst DANGER_PALETTES = new Set([\"red\", \"rose\"])\n/** Nearest chart token per hue family — the `--chart-1..5` order in theme.css. */\nconst CHART_BY_PALETTE: Record<string, string> = {\n blue: \"chart-1\",\n indigo: \"chart-1\",\n sky: \"chart-1\",\n cyan: \"chart-1\",\n green: \"chart-2\",\n emerald: \"chart-2\",\n teal: \"chart-2\",\n lime: \"chart-2\",\n orange: \"chart-3\",\n amber: \"chart-3\",\n yellow: \"chart-3\",\n violet: \"chart-4\",\n purple: \"chart-4\",\n fuchsia: \"chart-4\",\n pink: \"chart-5\",\n}\nconst MAX_COLOR_HITS = 20\n\n/** Semantic-token candidates for a Tailwind palette class. */\nfunction suggestPaletteClass(variants: string, prefix: string, palette: string, opacity: string): string[] {\n const t = (token: string) => `${variants}${prefix}-${token}${opacity}`\n if (DANGER_PALETTES.has(palette)) return [t(\"destructive\")]\n if (NEUTRAL_PALETTES.has(palette)) {\n if (prefix === \"text\") return [t(\"foreground\"), t(\"muted-foreground\")]\n if (prefix === \"bg\") return [t(\"muted\"), t(\"card\")]\n if (prefix === \"border\" || prefix === \"divide\" || prefix === \"outline\") return [t(\"border\")]\n if (prefix === \"ring\") return [t(\"ring\")]\n return [t(\"muted-foreground\")]\n }\n const chart = CHART_BY_PALETTE[palette] ?? \"chart-1\"\n return chart === \"chart-1\" ? [t(\"primary\"), t(chart)] : [t(chart), t(\"primary\")]\n}\n\n/** Whether a Tailwind arbitrary value carries a literal color. */\nfunction isColorValue(value: string): boolean {\n if (value.includes(\"var(\")) return false\n return HEX_LITERAL_RE.test(value) || new RegExp(`(?<![\\\\w-])(?:${COLOR_FNS})\\\\(`).test(value)\n}\n\ninterface ColorHit {\n line: number\n text: string\n suggest: string[]\n}\n\n/** Every hard-coded color in one module, with raw-file line numbers. */\nfunction findColorHits(raw: string): ColorHit[] {\n const rawLines = raw.split(\"\\n\")\n if (rawLines.slice(0, 5).some((l) => l.includes(\"vantage-ignore-color-file\"))) return []\n // A marker exempts its own line (trailing comment) and the next (comment above).\n const ignored = new Set<number>()\n rawLines.forEach((l, i) => {\n if (l.includes(\"vantage-ignore-color\")) ignored.add(i + 1).add(i + 2)\n })\n\n const { code, inString } = maskSource(raw)\n const lineStarts = [0]\n for (let i = 0; i < raw.length; i++) if (raw[i] === \"\\n\") lineStarts.push(i + 1)\n const lineAt = (offset: number) => {\n let lo = 0\n let hi = lineStarts.length - 1\n while (lo < hi) {\n const mid = (lo + hi + 1) >> 1\n if (lineStarts[mid]! <= offset) lo = mid\n else hi = mid - 1\n }\n return lo + 1\n }\n\n const hits: ColorHit[] = []\n const covered: [number, number][] = []\n const isCovered = (at: number) => covered.some(([s, e]) => at >= s && at < e)\n const push = (at: number, end: number, text: string, suggest: string[]) => {\n if (!inString[at] || isCovered(at)) return\n covered.push([at, end])\n const line = lineAt(at)\n if (ignored.has(line)) return\n hits.push({ line, text: text.length > 48 ? `${text.slice(0, 47)}…` : text, suggest })\n }\n\n let m: RegExpExecArray | null\n ARBITRARY_CLASS_RE.lastIndex = 0\n while ((m = ARBITRARY_CLASS_RE.exec(code))) {\n if (!isColorValue(m[3]!)) continue\n const token = (m[2] === \"shadow\" ? \"\" : m[2]!) || \"bg\"\n push(m.index, m.index + m[0].length, m[0], [\n `${m[1]}${token}-primary`,\n `${m[1]}${token}-chart-1`,\n ])\n }\n PALETTE_CLASS_RE.lastIndex = 0\n while ((m = PALETTE_CLASS_RE.exec(code))) {\n push(\n m.index,\n m.index + m[0].length,\n m[0],\n suggestPaletteClass(m[1]!, m[2]!, m[3]!, m[5] ?? \"\"),\n )\n }\n const literalSuggest = [\"var(--primary)\", \"var(--chart-1..5)\", \"var(--muted-foreground)\"]\n COLOR_FN_RE.lastIndex = 0\n while ((m = COLOR_FN_RE.exec(code))) {\n if (m[0].includes(\"var(\")) continue\n push(m.index, m.index + m[0].length, m[0], literalSuggest)\n }\n HEX_RE.lastIndex = 0\n while ((m = HEX_RE.exec(code))) {\n const hex = m[1]!\n if (![3, 4, 6, 8].includes(hex.length)) continue\n const before = code.slice(Math.max(0, m.index - 24), m.index)\n if (ANCHOR_BEFORE_RE.test(before)) continue\n // `\"Order #123\"` is a number, not a color, unless it opens a literal.\n if (hex.length <= 4 && /^\\d+$/.test(hex) && !/[\"'`[]$/.test(before)) continue\n push(m.index, m.index + m[0].length, m[0], literalSuggest)\n }\n return hits.sort((a, b) => a.line - b.line)\n}\n\n/**\n * Colors belong to the theme: `theme.css` / `styles.css` define the tokens and\n * DESIGN.md names them, so a literal in a component silently opts out of light/\n * dark, `styles.css` overrides and chart presets. Only `.ts`/`.tsx` is scanned —\n * `.css` is where the values are supposed to live. Warning, never error: a map\n * fill or a status color can legitimately carry data meaning.\n */\nfunction checkHardcodedColors(ctx: Ctx): Diagnostic[] {\n const diags: Diagnostic[] = []\n for (const abs of ctx.clientFiles()) {\n if (!/\\.tsx?$/.test(abs) || abs.endsWith(\".d.ts\")) continue\n const raw = ctx.raw(abs)\n if (raw === null) continue\n const hits = findColorHits(raw)\n if (hits.length === 0) continue\n const file = rel(ctx.root, abs)\n const shown = hits.slice(0, MAX_COLOR_HITS)\n const more = hits.length - shown.length\n const lines = shown.map((h) => `L${h.line}: ${h.text} → suggest: ${h.suggest.join(\" / \")}`)\n if (more > 0) lines.push(`+${more} more`)\n diags.push({\n code: \"HARDCODED_COLOR\",\n severity: \"warning\",\n message: `${file} hard-codes ${hits.length} color(s):\\n ${lines.join(\"\\n \")}`,\n files: [...new Set(shown.map((h) => `${file}:${h.line}`))].concat(more > 0 ? [`+${more} more`] : []),\n fix: \"Use theme tokens instead (bg-primary, text-muted-foreground, var(--chart-N), … as defined in styles.css and named in DESIGN.md). If a color carries data meaning (e.g. map fills), put `// vantage-ignore-color` (`{/* vantage-ignore-color */}` inside JSX) on that line or the line above; `vantage-ignore-color-file` within the first 5 lines exempts the whole file.\",\n })\n }\n return diags\n}\n\nconst DESIGN_MD_MAX_LINES = 150\n\n/** DESIGN.md is a map of token names, not a second copy of styles.css. */\nfunction checkDesignDoc(ctx: Ctx): Diagnostic[] {\n if (!ctx.rootEntries().includes(\"DESIGN.md\")) return []\n const raw = ctx.raw(path.join(ctx.root, \"DESIGN.md\"))\n if (raw === null) return []\n const lines = raw.replace(/\\n$/, \"\").split(\"\\n\").length\n if (lines <= DESIGN_MD_MAX_LINES) return []\n return [\n {\n code: \"DESIGN_MD_TOO_LONG\",\n severity: \"warning\",\n message: `DESIGN.md is ${lines} lines long (aim for ${DESIGN_MD_MAX_LINES} or fewer).`,\n files: [\"DESIGN.md\"],\n fix: \"Keep concrete values (colors, spacing, …) in styles.css and refer to them by token name (--primary, --chart-1, …) in DESIGN.md to keep it short.\",\n },\n ]\n}\n\n/** Run all static diagnostics for a project. */\nexport function runDiagnostics(root: string, model: RouteModel): Diagnostic[] {\n return timed(\"diagnostics\", () => {\n const ctx = createCtx(root, model)\n const client = checkClientSources(ctx)\n return [\n ...checkForbiddenFiles(ctx),\n ...checkSrcLayout(ctx),\n ...checkSuspiciousRouteDirs(model),\n ...checkRouteConflicts(ctx),\n ...checkUnroutedFiles(ctx),\n ...checkFilePageSize(ctx),\n ...checkPageExports(ctx),\n ...checkApiExports(ctx),\n ...checkAppLang(ctx),\n ...client.boundary,\n ...client.env,\n ...checkHardcodedColors(ctx),\n ...checkDesignDoc(ctx),\n ]\n })\n}\n"]}
@@ -0,0 +1,44 @@
1
+ import { formatDelta } from './chunk-57GHR5LN.js';
2
+ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
3
+
4
+ // @squadbase/vantage — generated build. Do not edit.
5
+ var MUTED = { color: "var(--doc-muted)" };
6
+ function DeltaText({ value, format, betterWhen = "up", comparisonLabel }) {
7
+ const label = comparisonLabel ? /* @__PURE__ */ jsxs("span", { style: MUTED, children: [
8
+ comparisonLabel,
9
+ " "
10
+ ] }) : null;
11
+ if (value === null) {
12
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
13
+ label,
14
+ /* @__PURE__ */ jsx("span", { "data-slot": "delta-text", style: MUTED, children: "\u2014" })
15
+ ] });
16
+ }
17
+ const dir = value > 0 ? "up" : value < 0 ? "down" : "flat";
18
+ const mark = dir === "up" ? "\u25B2" : dir === "down" ? "\u25BC" : "\u2192";
19
+ const word = dir === "up" ? "\u5897" : dir === "down" ? "\u6E1B" : "\u6A2A\u3070\u3044";
20
+ const good = dir === "flat" ? void 0 : dir === "up" === (betterWhen === "up");
21
+ const tone = good === void 0 ? void 0 : good ? "text-positive" : "text-negative";
22
+ const text = formatDelta(value, format);
23
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
24
+ label,
25
+ /* @__PURE__ */ jsxs(
26
+ "span",
27
+ {
28
+ "data-slot": "delta-text",
29
+ className: tone,
30
+ style: tone ? void 0 : MUTED,
31
+ "aria-label": `${word}\u3001${text}${good === void 0 ? "" : good ? "\u3001\u6539\u5584" : "\u3001\u60AA\u5316"}`,
32
+ children: [
33
+ mark,
34
+ " ",
35
+ text
36
+ ]
37
+ }
38
+ )
39
+ ] });
40
+ }
41
+
42
+ export { DeltaText };
43
+ //# sourceMappingURL=chunk-6OTTGAPO.js.map
44
+ //# sourceMappingURL=chunk-6OTTGAPO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../squadkit/registry/blocks/delta-text/delta-text.tsx"],"names":[],"mappings":";;;;AA4BA,IAAM,KAAA,GAAQ,EAAE,KAAA,EAAO,kBAAA,EAAmB;AAEnC,SAAS,UAAU,EAAE,KAAA,EAAO,QAAQ,UAAA,GAAa,IAAA,EAAM,iBAAgB,EAAmB;AAC/F,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,OAAO,GAAA,KAAQ,IAAA,GAAO,QAAA,GAAM,GAAA,KAAQ,SAAS,QAAA,GAAM,oBAAA;AACzD,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,MAAM,CAAA;AACtC,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,EAAG,IAAI,CAAA,MAAA,EAAI,IAAI,CAAA,EAAG,IAAA,KAAS,MAAA,GAAY,EAAA,GAAK,IAAA,GAAO,oBAAA,GAAQ,oBAAK,CAAA,CAAA;AAAA,QAE3E,QAAA,EAAA;AAAA,UAAA,IAAA;AAAA,UAAK,GAAA;AAAA,UAAE;AAAA;AAAA;AAAA;AACV,GAAA,EACF,CAAA;AAEJ","file":"chunk-6OTTGAPO.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 { formatDelta, type ValueFormat } from \"../../lib/format\"\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}\n\nconst MUTED = { color: \"var(--doc-muted)\" } as const\n\nexport function DeltaText({ value, format, betterWhen = \"up\", comparisonLabel }: DeltaTextProps) {\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 = dir === \"up\" ? \"増\" : dir === \"down\" ? \"減\" : \"横ばい\"\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)\n return (\n <>\n {label}\n <span\n data-slot=\"delta-text\"\n className={tone}\n style={tone ? undefined : MUTED}\n aria-label={`${word}、${text}${good === undefined ? \"\" : good ? \"、改善\" : \"、悪化\"}`}\n >\n {mark} {text}\n </span>\n </>\n )\n}\n\nexport default DeltaText\n"]}
@@ -1,9 +1,9 @@
1
- import { buttonVariants, Button } from './chunk-PXRX5PEC.js';
2
- import { cn } from './chunk-A2UUGASH.js';
1
+ import { buttonVariants, Button } from './chunk-PDOBHMUQ.js';
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';
5
5
  import { cva } from 'class-variance-authority';
6
- import * as React12 from 'react';
6
+ import * as React13 from 'react';
7
7
  import { getDefaultClassNames, DayPicker } from 'react-day-picker';
8
8
  import { ChevronLeftIcon, ChevronRightIcon, ChevronDownIcon, CheckIcon, XIcon, SearchIcon, ChevronUpIcon, PanelLeftIcon } from 'lucide-react';
9
9
  import { jsx, jsxs } from 'react/jsx-runtime';
@@ -213,8 +213,8 @@ function CalendarDayButton({
213
213
  ...props
214
214
  }) {
215
215
  const defaultClassNames = getDefaultClassNames();
216
- const ref = React12.useRef(null);
217
- React12.useEffect(() => {
216
+ const ref = React13.useRef(null);
217
+ React13.useEffect(() => {
218
218
  if (modifiers.focused) ref.current?.focus();
219
219
  }, [modifiers.focused]);
220
220
  return /* @__PURE__ */ jsx(
@@ -236,6 +236,96 @@ function CalendarDayButton({
236
236
  }
237
237
  );
238
238
  }
239
+ function Card({
240
+ className,
241
+ size = "default",
242
+ ...props
243
+ }) {
244
+ return /* @__PURE__ */ jsx(
245
+ "div",
246
+ {
247
+ "data-slot": "card",
248
+ "data-size": size,
249
+ className: cn(
250
+ "group/card flex flex-col gap-(--card-spacing) overflow-hidden rounded-xl border bg-card shadow-[var(--shadow-card)] py-(--card-spacing) text-sm text-card-foreground [--card-spacing:--spacing(4)] has-data-[slot=card-footer]:pb-0 has-[>img:first-child]:pt-0 data-[size=sm]:[--card-spacing:--spacing(3)] data-[size=sm]:has-data-[slot=card-footer]:pb-0 *:[img:first-child]:rounded-t-xl *:[img:last-child]:rounded-b-xl",
251
+ className
252
+ ),
253
+ ...props
254
+ }
255
+ );
256
+ }
257
+ function CardHeader({ className, ...props }) {
258
+ return /* @__PURE__ */ jsx(
259
+ "div",
260
+ {
261
+ "data-slot": "card-header",
262
+ className: cn(
263
+ "group/card-header @container/card-header grid auto-rows-min items-start gap-1 rounded-t-xl px-(--card-spacing) has-data-[slot=card-action]:grid-cols-[1fr_auto] has-data-[slot=card-description]:grid-rows-[auto_auto] [.border-b]:pb-(--card-spacing)",
264
+ className
265
+ ),
266
+ ...props
267
+ }
268
+ );
269
+ }
270
+ function CardTitle({ className, ...props }) {
271
+ return /* @__PURE__ */ jsx(
272
+ "div",
273
+ {
274
+ "data-slot": "card-title",
275
+ className: cn(
276
+ "cn-font-heading text-base leading-snug font-medium group-data-[size=sm]/card:text-sm",
277
+ className
278
+ ),
279
+ ...props
280
+ }
281
+ );
282
+ }
283
+ function CardDescription({ className, ...props }) {
284
+ return /* @__PURE__ */ jsx(
285
+ "div",
286
+ {
287
+ "data-slot": "card-description",
288
+ className: cn("text-sm text-muted-foreground", className),
289
+ ...props
290
+ }
291
+ );
292
+ }
293
+ function CardAction({ className, ...props }) {
294
+ return /* @__PURE__ */ jsx(
295
+ "div",
296
+ {
297
+ "data-slot": "card-action",
298
+ className: cn(
299
+ "col-start-2 row-span-2 row-start-1 self-start justify-self-end",
300
+ className
301
+ ),
302
+ ...props
303
+ }
304
+ );
305
+ }
306
+ function CardContent({ className, ...props }) {
307
+ return /* @__PURE__ */ jsx(
308
+ "div",
309
+ {
310
+ "data-slot": "card-content",
311
+ className: cn("px-(--card-spacing)", className),
312
+ ...props
313
+ }
314
+ );
315
+ }
316
+ function CardFooter({ className, ...props }) {
317
+ return /* @__PURE__ */ jsx(
318
+ "div",
319
+ {
320
+ "data-slot": "card-footer",
321
+ className: cn(
322
+ "flex items-center rounded-b-xl border-t bg-muted/50 p-(--card-spacing)",
323
+ className
324
+ ),
325
+ ...props
326
+ }
327
+ );
328
+ }
239
329
  function Checkbox({ className, ...props }) {
240
330
  return /* @__PURE__ */ jsx(
241
331
  Checkbox$1.Root,
@@ -444,7 +534,7 @@ function DialogOverlay({
444
534
  {
445
535
  "data-slot": "dialog-overlay",
446
536
  className: cn(
447
- "fixed inset-0 isolate z-50 bg-black/10 duration-100 supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0",
537
+ "fixed inset-0 isolate z-50 bg-black/10 duration-100 supports-backdrop-filter:backdrop-blur-xs data-open:animate-in motion-reduce:animate-none! data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0",
448
538
  className
449
539
  ),
450
540
  ...props
@@ -464,7 +554,7 @@ function DialogContent({
464
554
  {
465
555
  "data-slot": "dialog-content",
466
556
  className: cn(
467
- "fixed top-1/2 left-1/2 z-50 grid w-full max-w-[calc(100%-2rem)] -translate-x-1/2 -translate-y-1/2 gap-4 rounded-xl bg-popover p-4 text-sm text-popover-foreground ring-1 ring-foreground/10 duration-100 outline-none sm:max-w-sm data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
557
+ "fixed top-1/2 left-1/2 z-50 grid w-full max-w-[calc(100%-2rem)] -translate-x-1/2 -translate-y-1/2 gap-4 rounded-xl bg-popover p-4 text-sm text-popover-foreground ring-1 ring-foreground/10 duration-100 outline-none sm:max-w-sm data-open:animate-in motion-reduce:animate-none! data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
468
558
  className
469
559
  ),
470
560
  ...props,
@@ -740,7 +830,7 @@ function DropdownMenuContent({
740
830
  {
741
831
  "data-slot": "dropdown-menu-content",
742
832
  className: cn(
743
- "cn-menu-target cn-menu-translucent z-50 max-h-(--available-height) w-(--anchor-width) min-w-32 origin-(--transform-origin) overflow-x-hidden overflow-y-auto rounded-lg bg-popover p-1 text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 outline-none data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:overflow-hidden data-closed:fade-out-0 data-closed:zoom-out-95",
833
+ "cn-menu-target cn-menu-translucent z-50 max-h-(--available-height) w-(--anchor-width) min-w-32 origin-(--transform-origin) overflow-x-hidden overflow-y-auto rounded-lg bg-popover p-1 text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 outline-none data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in motion-reduce:animate-none! data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:overflow-hidden data-closed:fade-out-0 data-closed:zoom-out-95",
744
834
  className
745
835
  ),
746
836
  ...props
@@ -829,7 +919,7 @@ function DropdownMenuSubContent({
829
919
  {
830
920
  "data-slot": "dropdown-menu-sub-content",
831
921
  className: cn(
832
- "cn-menu-target cn-menu-translucent w-auto min-w-[96px] rounded-lg bg-popover p-1 text-popover-foreground shadow-lg ring-1 ring-foreground/10 duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
922
+ "cn-menu-target cn-menu-translucent w-auto min-w-[96px] rounded-lg bg-popover p-1 text-popover-foreground shadow-lg ring-1 ring-foreground/10 duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in motion-reduce:animate-none! data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
833
923
  className
834
924
  ),
835
925
  align,
@@ -985,7 +1075,7 @@ function PopoverContent({
985
1075
  {
986
1076
  "data-slot": "popover-content",
987
1077
  className: cn(
988
- "z-50 flex w-72 origin-(--transform-origin) flex-col gap-2.5 rounded-lg bg-popover p-2.5 text-sm text-popover-foreground shadow-md ring-1 ring-foreground/10 outline-hidden duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
1078
+ "z-50 flex w-72 origin-(--transform-origin) flex-col gap-2.5 rounded-lg bg-popover p-2.5 text-sm text-popover-foreground shadow-md ring-1 ring-foreground/10 outline-hidden duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in motion-reduce:animate-none! data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
989
1079
  className
990
1080
  ),
991
1081
  ...props
@@ -1028,8 +1118,8 @@ function PopoverDescription({
1028
1118
  );
1029
1119
  }
1030
1120
  function collectSelectItems(node, into = []) {
1031
- React12.Children.forEach(node, (child) => {
1032
- if (!React12.isValidElement(child)) return;
1121
+ React13.Children.forEach(node, (child) => {
1122
+ if (!React13.isValidElement(child)) return;
1033
1123
  const props = child.props;
1034
1124
  if (child.type === SelectItem) {
1035
1125
  if (props.value !== void 0) into.push({ label: props.children, value: props.value });
@@ -1044,7 +1134,7 @@ function Select({
1044
1134
  children,
1045
1135
  ...props
1046
1136
  }) {
1047
- const derivedItems = React12.useMemo(() => {
1137
+ const derivedItems = React13.useMemo(() => {
1048
1138
  if (items) return items;
1049
1139
  const collected = collectSelectItems(children);
1050
1140
  return collected.length > 0 ? collected : void 0;
@@ -1124,7 +1214,7 @@ function SelectContent({
1124
1214
  "data-slot": "select-content",
1125
1215
  "data-align-trigger": alignItemWithTrigger,
1126
1216
  className: cn(
1127
- "cn-menu-target cn-menu-translucent relative isolate z-50 max-h-(--available-height) w-(--anchor-width) min-w-36 origin-(--transform-origin) overflow-x-hidden overflow-y-auto rounded-lg bg-popover text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[align-trigger=true]:animate-none data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
1217
+ "cn-menu-target cn-menu-translucent relative isolate z-50 max-h-(--available-height) w-(--anchor-width) min-w-36 origin-(--transform-origin) overflow-x-hidden overflow-y-auto rounded-lg bg-popover text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[align-trigger=true]:animate-none data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in motion-reduce:animate-none! data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
1128
1218
  className
1129
1219
  ),
1130
1220
  ...props,
@@ -1265,7 +1355,7 @@ function SheetContent({
1265
1355
  "data-slot": "sheet-content",
1266
1356
  "data-side": side,
1267
1357
  className: cn(
1268
- "fixed z-50 flex flex-col gap-4 bg-popover bg-clip-padding text-sm text-popover-foreground shadow-lg transition duration-200 ease-in-out data-ending-style:opacity-0 data-starting-style:opacity-0 data-[side=bottom]:inset-x-0 data-[side=bottom]:bottom-0 data-[side=bottom]:h-auto data-[side=bottom]:border-t data-[side=bottom]:data-ending-style:translate-y-[2.5rem] data-[side=bottom]:data-starting-style:translate-y-[2.5rem] data-[side=left]:inset-y-0 data-[side=left]:left-0 data-[side=left]:h-full data-[side=left]:w-3/4 data-[side=left]:border-r data-[side=left]:data-ending-style:translate-x-[-2.5rem] data-[side=left]:data-starting-style:translate-x-[-2.5rem] data-[side=right]:inset-y-0 data-[side=right]:right-0 data-[side=right]:h-full data-[side=right]:w-3/4 data-[side=right]:border-l data-[side=right]:data-ending-style:translate-x-[2.5rem] data-[side=right]:data-starting-style:translate-x-[2.5rem] data-[side=top]:inset-x-0 data-[side=top]:top-0 data-[side=top]:h-auto data-[side=top]:border-b data-[side=top]:data-ending-style:translate-y-[-2.5rem] data-[side=top]:data-starting-style:translate-y-[-2.5rem] data-[side=left]:sm:max-w-sm data-[side=right]:sm:max-w-sm",
1358
+ "fixed z-50 flex flex-col gap-4 bg-popover bg-clip-padding text-sm text-popover-foreground shadow-lg transition duration-200 ease-out data-ending-style:opacity-0 data-starting-style:opacity-0 motion-reduce:data-ending-style:translate-none! motion-reduce:data-starting-style:translate-none! data-[side=bottom]:inset-x-0 data-[side=bottom]:bottom-0 data-[side=bottom]:h-auto data-[side=bottom]:border-t data-[side=bottom]:data-ending-style:translate-y-[2.5rem] data-[side=bottom]:data-starting-style:translate-y-[2.5rem] data-[side=left]:inset-y-0 data-[side=left]:left-0 data-[side=left]:h-full data-[side=left]:w-3/4 data-[side=left]:border-r data-[side=left]:data-ending-style:translate-x-[-2.5rem] data-[side=left]:data-starting-style:translate-x-[-2.5rem] data-[side=right]:inset-y-0 data-[side=right]:right-0 data-[side=right]:h-full data-[side=right]:w-3/4 data-[side=right]:border-l data-[side=right]:data-ending-style:translate-x-[2.5rem] data-[side=right]:data-starting-style:translate-x-[2.5rem] data-[side=top]:inset-x-0 data-[side=top]:top-0 data-[side=top]:h-auto data-[side=top]:border-b data-[side=top]:data-ending-style:translate-y-[-2.5rem] data-[side=top]:data-starting-style:translate-y-[-2.5rem] data-[side=left]:sm:max-w-sm data-[side=right]:sm:max-w-sm",
1269
1359
  className
1270
1360
  ),
1271
1361
  ...props,
@@ -1342,8 +1432,8 @@ function SheetDescription({
1342
1432
  }
1343
1433
  var MOBILE_BREAKPOINT = 768;
1344
1434
  function useIsMobile() {
1345
- const [isMobile, setIsMobile] = React12.useState(void 0);
1346
- React12.useEffect(() => {
1435
+ const [isMobile, setIsMobile] = React13.useState(void 0);
1436
+ React13.useEffect(() => {
1347
1437
  const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`);
1348
1438
  const onChange = () => {
1349
1439
  setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);
@@ -1359,7 +1449,7 @@ function Skeleton({ className, ...props }) {
1359
1449
  "div",
1360
1450
  {
1361
1451
  "data-slot": "skeleton",
1362
- className: cn("animate-pulse rounded-md bg-muted", className),
1452
+ className: cn("animate-pulse motion-reduce:animate-none rounded-md bg-muted", className),
1363
1453
  ...props
1364
1454
  }
1365
1455
  );
@@ -1390,9 +1480,10 @@ function TooltipContent({
1390
1480
  align = "center",
1391
1481
  alignOffset = 0,
1392
1482
  children,
1483
+ container,
1393
1484
  ...props
1394
1485
  }) {
1395
- return /* @__PURE__ */ jsx(Tooltip$1.Portal, { children: /* @__PURE__ */ jsx(
1486
+ return /* @__PURE__ */ jsx(Tooltip$1.Portal, { container, className: container ? "contents" : void 0, children: /* @__PURE__ */ jsx(
1396
1487
  Tooltip$1.Positioner,
1397
1488
  {
1398
1489
  align,
@@ -1405,7 +1496,7 @@ function TooltipContent({
1405
1496
  {
1406
1497
  "data-slot": "tooltip-content",
1407
1498
  className: cn(
1408
- "z-50 inline-flex w-fit max-w-xs origin-(--transform-origin) items-center gap-1.5 rounded-md bg-foreground px-3 py-1.5 text-xs text-background has-data-[slot=kbd]:pr-1.5 data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 **:data-[slot=kbd]:relative **:data-[slot=kbd]:isolate **:data-[slot=kbd]:z-50 **:data-[slot=kbd]:rounded-sm data-[state=delayed-open]:animate-in data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-95 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
1499
+ "z-50 inline-flex w-fit data-instant:animate-none max-w-xs origin-(--transform-origin) items-center gap-1.5 rounded-md bg-foreground px-3 py-1.5 text-xs text-background has-data-[slot=kbd]:pr-1.5 data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 **:data-[slot=kbd]:relative **:data-[slot=kbd]:isolate **:data-[slot=kbd]:z-50 **:data-[slot=kbd]:rounded-sm data-[state=delayed-open]:animate-in data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-95 data-open:animate-in motion-reduce:animate-none! data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
1409
1500
  className
1410
1501
  ),
1411
1502
  ...props,
@@ -1424,9 +1515,9 @@ var SIDEBAR_WIDTH = "16rem";
1424
1515
  var SIDEBAR_WIDTH_MOBILE = "18rem";
1425
1516
  var SIDEBAR_WIDTH_ICON = "3rem";
1426
1517
  var SIDEBAR_KEYBOARD_SHORTCUT = "b";
1427
- var SidebarContext = React12.createContext(null);
1518
+ var SidebarContext = React13.createContext(null);
1428
1519
  function useSidebar() {
1429
- const context = React12.useContext(SidebarContext);
1520
+ const context = React13.useContext(SidebarContext);
1430
1521
  if (!context) {
1431
1522
  throw new Error("useSidebar must be used within a SidebarProvider.");
1432
1523
  }
@@ -1442,10 +1533,10 @@ function SidebarProvider({
1442
1533
  ...props
1443
1534
  }) {
1444
1535
  const isMobile = useIsMobile();
1445
- const [openMobile, setOpenMobile] = React12.useState(false);
1446
- const [_open, _setOpen] = React12.useState(defaultOpen);
1536
+ const [openMobile, setOpenMobile] = React13.useState(false);
1537
+ const [_open, _setOpen] = React13.useState(defaultOpen);
1447
1538
  const open = openProp ?? _open;
1448
- const setOpen = React12.useCallback(
1539
+ const setOpen = React13.useCallback(
1449
1540
  (value) => {
1450
1541
  const openState = typeof value === "function" ? value(open) : value;
1451
1542
  if (setOpenProp) {
@@ -1457,10 +1548,10 @@ function SidebarProvider({
1457
1548
  },
1458
1549
  [setOpenProp, open]
1459
1550
  );
1460
- const toggleSidebar = React12.useCallback(() => {
1551
+ const toggleSidebar = React13.useCallback(() => {
1461
1552
  return isMobile ? setOpenMobile((open2) => !open2) : setOpen((open2) => !open2);
1462
1553
  }, [isMobile, setOpen, setOpenMobile]);
1463
- React12.useEffect(() => {
1554
+ React13.useEffect(() => {
1464
1555
  const handleKeyDown = (event) => {
1465
1556
  if (event.key === SIDEBAR_KEYBOARD_SHORTCUT && (event.metaKey || event.ctrlKey)) {
1466
1557
  event.preventDefault();
@@ -1471,7 +1562,7 @@ function SidebarProvider({
1471
1562
  return () => window.removeEventListener("keydown", handleKeyDown);
1472
1563
  }, [toggleSidebar]);
1473
1564
  const state = open ? "expanded" : "collapsed";
1474
- const contextValue = React12.useMemo(
1565
+ const contextValue = React13.useMemo(
1475
1566
  () => ({
1476
1567
  state,
1477
1568
  open,
@@ -1635,7 +1726,7 @@ function SidebarRail({ className, ...props }) {
1635
1726
  onClick: toggleSidebar,
1636
1727
  title: "Toggle Sidebar",
1637
1728
  className: cn(
1638
- "absolute inset-y-0 z-20 hidden w-4 transition-all ease-linear group-data-[side=left]:-right-4 group-data-[side=right]:left-0 after:absolute after:inset-y-0 after:start-1/2 after:w-[2px] hover:after:bg-sidebar-border sm:flex ltr:-translate-x-1/2 rtl:-translate-x-1/2",
1729
+ "absolute inset-y-0 z-20 hidden w-4 transition-[background-color,translate,left,right] ease-linear group-data-[side=left]:-right-4 group-data-[side=right]:left-0 after:absolute after:inset-y-0 after:start-1/2 after:w-[2px] hover:after:bg-sidebar-border sm:flex ltr:-translate-x-1/2 rtl:-translate-x-1/2",
1639
1730
  "in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize",
1640
1731
  "[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize",
1641
1732
  "group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full hover:group-data-[collapsible=offcanvas]:bg-sidebar",
@@ -1931,7 +2022,7 @@ function SidebarMenuSkeleton({
1931
2022
  showIcon = false,
1932
2023
  ...props
1933
2024
  }) {
1934
- const [width] = React12.useState(() => {
2025
+ const [width] = React13.useState(() => {
1935
2026
  return `${Math.floor(Math.random() * 40) + 50}%`;
1936
2027
  });
1937
2028
  return /* @__PURE__ */ jsxs(
@@ -2087,7 +2178,7 @@ function TableHead({ className, ...props }) {
2087
2178
  {
2088
2179
  "data-slot": "table-head",
2089
2180
  className: cn(
2090
- "h-10 px-2 text-left align-middle font-medium whitespace-nowrap text-foreground [&:has([role=checkbox])]:pr-0",
2181
+ "h-10 px-2 text-left align-middle text-xs font-medium whitespace-nowrap text-muted-foreground [&:has([role=checkbox])]:pr-0",
2091
2182
  className
2092
2183
  ),
2093
2184
  ...props
@@ -2155,7 +2246,7 @@ function Toggle({
2155
2246
  }
2156
2247
  );
2157
2248
  }
2158
- var ToggleGroupContext = React12.createContext({
2249
+ var ToggleGroupContext = React13.createContext({
2159
2250
  size: "default",
2160
2251
  variant: "default",
2161
2252
  spacing: 2,
@@ -2201,7 +2292,7 @@ function ToggleGroupItem({
2201
2292
  size = "default",
2202
2293
  ...props
2203
2294
  }) {
2204
- const context = React12.useContext(ToggleGroupContext);
2295
+ const context = React13.useContext(ToggleGroupContext);
2205
2296
  return /* @__PURE__ */ jsx(
2206
2297
  Toggle$1,
2207
2298
  {
@@ -2223,6 +2314,6 @@ function ToggleGroupItem({
2223
2314
  );
2224
2315
  }
2225
2316
 
2226
- export { Badge, Calendar, CalendarDayButton, 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 };
2227
- //# sourceMappingURL=chunk-OB6UBJXF.js.map
2228
- //# sourceMappingURL=chunk-OB6UBJXF.js.map
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-7S52M2SL.js.map
2319
+ //# sourceMappingURL=chunk-7S52M2SL.js.map