@squadbase/vantage 0.6.1 → 0.6.2-dev1.0010f67

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 (346) hide show
  1. package/dist/add-4GHF2TX2.js +6 -0
  2. package/dist/add-4GHF2TX2.js.map +1 -0
  3. package/dist/{build-O5TVNH4E.js → build-U7GO26HR.js} +9 -9
  4. package/dist/{build-O5TVNH4E.js.map → build-U7GO26HR.js.map} +1 -1
  5. package/dist/{check-WFBEDHDR.js → check-MRVAIHG5.js} +7 -7
  6. package/dist/{check-WFBEDHDR.js.map → check-MRVAIHG5.js.map} +1 -1
  7. package/dist/chunk-2IAPIOPS.js +152 -0
  8. package/dist/chunk-2IAPIOPS.js.map +1 -0
  9. package/dist/chunk-3RJEOP3J.js +174 -0
  10. package/dist/chunk-3RJEOP3J.js.map +1 -0
  11. package/dist/chunk-77CISBMG.js +7581 -0
  12. package/dist/chunk-77CISBMG.js.map +1 -0
  13. package/dist/{chunk-QDZA5JSL.js → chunk-AABMKHEU.js} +4 -4
  14. package/dist/{chunk-QDZA5JSL.js.map → chunk-AABMKHEU.js.map} +1 -1
  15. package/dist/{chunk-PVTHHV7X.js → chunk-ANZLVSEP.js} +28 -7
  16. package/dist/chunk-ANZLVSEP.js.map +1 -0
  17. package/dist/chunk-CKWPK4RO.js +50 -0
  18. package/dist/chunk-CKWPK4RO.js.map +1 -0
  19. package/dist/chunk-EG4PX726.js +678 -0
  20. package/dist/chunk-EG4PX726.js.map +1 -0
  21. package/dist/{chunk-3G43C6OL.js → chunk-GNXCX4WE.js} +46 -3
  22. package/dist/chunk-GNXCX4WE.js.map +1 -0
  23. package/dist/chunk-NZ5QIIG4.js +74 -0
  24. package/dist/chunk-NZ5QIIG4.js.map +1 -0
  25. package/dist/{chunk-BCE22JSM.js → chunk-PJ4SPXHS.js} +52 -16
  26. package/dist/chunk-PJ4SPXHS.js.map +1 -0
  27. package/dist/{chunk-MXI3PZFT.js → chunk-QNOX7WLZ.js} +257 -210
  28. package/dist/chunk-QNOX7WLZ.js.map +1 -0
  29. package/dist/{chunk-ZVANIULZ.js → chunk-RNTDBX6S.js} +4 -4
  30. package/dist/{chunk-ZVANIULZ.js.map → chunk-RNTDBX6S.js.map} +1 -1
  31. package/dist/chunk-ROHNXP7J.js +123 -0
  32. package/dist/chunk-ROHNXP7J.js.map +1 -0
  33. package/dist/chunk-S5MDTHH7.js +466 -0
  34. package/dist/chunk-S5MDTHH7.js.map +1 -0
  35. package/dist/chunk-SDJTTMLK.js +1877 -0
  36. package/dist/chunk-SDJTTMLK.js.map +1 -0
  37. package/dist/{chunk-EP6JHXSR.js → chunk-SHZM3EXB.js} +68 -12
  38. package/dist/chunk-SHZM3EXB.js.map +1 -0
  39. package/dist/chunk-TRMHNMMZ.js +61 -0
  40. package/dist/chunk-TRMHNMMZ.js.map +1 -0
  41. package/dist/{chunk-A2UUGASH.js → chunk-U736PVHY.js} +2 -2
  42. package/dist/chunk-U736PVHY.js.map +1 -0
  43. package/dist/{chunk-JGRMRXXZ.js → chunk-UWSQUHX6.js} +4 -99
  44. package/dist/chunk-UWSQUHX6.js.map +1 -0
  45. package/dist/cli.js +15 -11
  46. package/dist/cli.js.map +1 -1
  47. package/dist/client/index.d.ts +34 -3
  48. package/dist/client/index.js +211 -12
  49. package/dist/client/index.js.map +1 -1
  50. package/dist/components/index.d.ts +1768 -30
  51. package/dist/components/index.js +7 -3
  52. package/dist/delta-text-CbrOaW83.d.ts +17 -0
  53. package/dist/{dev-NZRLOQCL.js → dev-O42JFQ64.js} +24 -13
  54. package/dist/dev-O42JFQ64.js.map +1 -0
  55. package/dist/doc/index.d.ts +219 -2
  56. package/dist/doc/index.js +525 -11
  57. package/dist/doc/index.js.map +1 -1
  58. package/dist/{docs-ZGDJUHJI.js → docs-JVP4RPKT.js} +3 -3
  59. package/dist/{docs-ZGDJUHJI.js.map → docs-JVP4RPKT.js.map} +1 -1
  60. package/dist/{doctor-VFKEMR54.js → doctor-YD3XAAOT.js} +8 -8
  61. package/dist/doctor-YD3XAAOT.js.map +1 -0
  62. package/dist/format-DihQkL1N.d.ts +249 -0
  63. package/dist/markdown/index.js +1 -1
  64. package/dist/markdown/index.js.map +1 -1
  65. package/dist/{preview-QDCIVVSR.js → preview-T6CLSQVX.js} +12 -4
  66. package/dist/preview-T6CLSQVX.js.map +1 -0
  67. package/dist/query/index.d.ts +0 -11
  68. package/dist/query/index.js +2 -2
  69. package/dist/{routes-RHP5FVGD.js → routes-PVKNT777.js} +6 -6
  70. package/dist/{routes-RHP5FVGD.js.map → routes-PVKNT777.js.map} +1 -1
  71. package/dist/{search-RFBELGY7.js → search-5LC4XPB5.js} +3 -3
  72. package/dist/{search-RFBELGY7.js.map → search-5LC4XPB5.js.map} +1 -1
  73. package/dist/slide/index.d.ts +272 -1
  74. package/dist/slide/index.js +1086 -19
  75. package/dist/slide/index.js.map +1 -1
  76. package/dist/table/index.js +14 -9
  77. package/dist/table/index.js.map +1 -1
  78. package/dist/ui/index.d.ts +148 -12
  79. package/dist/ui/index.js +1340 -87
  80. package/dist/ui/index.js.map +1 -1
  81. package/dist/{upgrade-GF2P67M6.js → upgrade-6DT7ADRP.js} +7 -7
  82. package/dist/{upgrade-GF2P67M6.js.map → upgrade-6DT7ADRP.js.map} +1 -1
  83. package/dist/vite/index.d.ts +10 -0
  84. package/dist/vite/index.js +4 -4
  85. package/docs/en/agent-skills.md +1 -1
  86. package/docs/en/changelog.md +26 -0
  87. package/docs/en/cli-reference.md +30 -0
  88. package/docs/en/components.md +42 -17
  89. package/docs/en/doc/delta-text.md +40 -0
  90. package/docs/en/doc/doc-action-items.md +49 -0
  91. package/docs/en/doc/doc-callout.md +38 -0
  92. package/docs/en/doc/doc-data-table.md +60 -0
  93. package/docs/en/doc/doc-executive-summary.md +64 -0
  94. package/docs/en/doc/doc-figure.md +56 -0
  95. package/docs/en/doc/doc-key-findings.md +61 -0
  96. package/docs/en/doc/doc-kpi-scorecard.md +80 -0
  97. package/docs/en/doc/doc-notes-and-sources.md +43 -0
  98. package/docs/en/doc/doc-report-header.md +46 -0
  99. package/docs/en/pages-and-metadata.md +15 -0
  100. package/docs/en/parts/area-chart.md +99 -0
  101. package/docs/en/parts/bar-chart.md +91 -0
  102. package/docs/en/parts/bar-list.md +50 -0
  103. package/docs/en/parts/category-bar.md +37 -0
  104. package/docs/en/parts/chart-frame.md +39 -0
  105. package/docs/en/parts/data-table.md +22 -0
  106. package/docs/en/parts/delta.md +51 -0
  107. package/docs/en/parts/donut-chart.md +72 -0
  108. package/docs/en/parts/format.md +43 -0
  109. package/docs/en/parts/funnel-steps.md +2 -1
  110. package/docs/en/parts/heatmap.md +53 -0
  111. package/docs/en/parts/kpi-card.md +58 -0
  112. package/docs/en/parts/legend.md +35 -0
  113. package/docs/en/parts/line-chart.md +94 -0
  114. package/docs/en/parts/metric-value.md +3 -2
  115. package/docs/en/parts/page-shell.md +1 -1
  116. package/docs/en/parts/progress-circle.md +33 -0
  117. package/docs/en/parts/sample-data.md +39 -0
  118. package/docs/en/parts/scatter-chart.md +56 -0
  119. package/docs/en/parts/sparkline.md +1 -1
  120. package/docs/en/parts/tracker.md +36 -0
  121. package/docs/en/parts/trend-indicator.md +17 -1
  122. package/docs/en/parts/updated-at.md +30 -0
  123. package/docs/en/parts/waterfall-chart.md +56 -0
  124. package/docs/en/routing.md +4 -2
  125. package/docs/en/slide/slide-chart-full.md +48 -0
  126. package/docs/en/slide/slide-chart-insight.md +52 -0
  127. package/docs/en/slide/slide-columns.md +46 -0
  128. package/docs/en/slide/slide-comparison.md +68 -0
  129. package/docs/en/slide/slide-cover.md +39 -0
  130. package/docs/en/slide/slide-exec-summary.md +47 -0
  131. package/docs/en/slide/slide-heading.md +38 -0
  132. package/docs/en/slide/slide-kpi-grid.md +55 -0
  133. package/docs/en/slide/slide-kpi-hero.md +58 -0
  134. package/docs/en/slide/slide-next-actions.md +49 -0
  135. package/docs/en/slide/slide-scorecard-table.md +54 -0
  136. package/docs/en/slide/slide-section.md +44 -0
  137. package/docs/en/slide/slide-source-line.md +34 -0
  138. package/docs/en/ui/alert-dialog.md +42 -0
  139. package/docs/en/ui/avatar.md +31 -0
  140. package/docs/en/ui/combobox.md +74 -0
  141. package/docs/en/ui/drawer.md +41 -0
  142. package/docs/en/ui/empty.md +1 -1
  143. package/docs/en/ui/error-state.md +4 -3
  144. package/docs/en/ui/field.md +42 -0
  145. package/docs/en/ui/hover-card.md +21 -0
  146. package/docs/en/ui/kbd.md +17 -0
  147. package/docs/en/ui/loading.md +1 -1
  148. package/docs/en/ui/pagination.md +36 -0
  149. package/docs/en/ui/radio-group.md +21 -0
  150. package/docs/en/ui/toast.md +44 -0
  151. package/docs/en/ui/toggle-group.md +4 -3
  152. package/docs/en/ui-and-theming.md +1 -1
  153. package/docs/index.json +1184 -114
  154. package/docs/ja/agent-skills.md +1 -1
  155. package/docs/ja/changelog.md +57 -0
  156. package/docs/ja/cli-reference.md +29 -0
  157. package/docs/ja/components.md +68 -101
  158. package/docs/ja/doc/delta-text.md +40 -0
  159. package/docs/ja/doc/doc-action-items.md +49 -0
  160. package/docs/ja/doc/doc-callout.md +38 -0
  161. package/docs/ja/doc/doc-data-table.md +60 -0
  162. package/docs/ja/doc/doc-executive-summary.md +64 -0
  163. package/docs/ja/doc/doc-figure.md +56 -0
  164. package/docs/ja/doc/doc-key-findings.md +61 -0
  165. package/docs/ja/doc/doc-kpi-scorecard.md +80 -0
  166. package/docs/ja/doc/doc-notes-and-sources.md +43 -0
  167. package/docs/ja/doc/doc-report-header.md +46 -0
  168. package/docs/ja/page-types/csv.md +83 -0
  169. package/docs/ja/page-types/doc.md +83 -0
  170. package/docs/ja/page-types/excel.md +82 -0
  171. package/docs/ja/page-types/slide.md +133 -0
  172. package/docs/ja/page-types.md +47 -0
  173. package/docs/ja/pages-and-metadata.md +15 -0
  174. package/docs/ja/parts/area-chart.md +85 -0
  175. package/docs/ja/parts/bar-chart.md +95 -0
  176. package/docs/ja/parts/bar-list.md +58 -0
  177. package/docs/ja/parts/category-bar.md +36 -0
  178. package/docs/ja/parts/chart-frame.md +36 -0
  179. package/docs/ja/parts/data-table.md +22 -0
  180. package/docs/ja/parts/delta.md +51 -0
  181. package/docs/ja/parts/donut-chart.md +66 -0
  182. package/docs/ja/parts/echart.md +3 -0
  183. package/docs/ja/parts/format.md +44 -0
  184. package/docs/ja/parts/funnel-steps.md +27 -8
  185. package/docs/ja/parts/heatmap.md +45 -0
  186. package/docs/ja/parts/kpi-card.md +56 -0
  187. package/docs/ja/parts/legend.md +36 -0
  188. package/docs/ja/parts/line-chart.md +84 -0
  189. package/docs/ja/parts/metric-value.md +3 -2
  190. package/docs/ja/parts/page-shell.md +1 -1
  191. package/docs/ja/parts/progress-circle.md +34 -0
  192. package/docs/ja/parts/sample-data.md +61 -0
  193. package/docs/ja/parts/scatter-chart.md +69 -0
  194. package/docs/ja/parts/sparkline.md +2 -2
  195. package/docs/ja/parts/tracker.md +32 -0
  196. package/docs/ja/parts/trend-indicator.md +17 -1
  197. package/docs/ja/parts/updated-at.md +27 -0
  198. package/docs/ja/parts/waterfall-chart.md +61 -0
  199. package/docs/ja/routing.md +8 -84
  200. package/docs/ja/slide/slide-chart-full.md +48 -0
  201. package/docs/ja/slide/slide-chart-insight.md +52 -0
  202. package/docs/ja/slide/slide-columns.md +46 -0
  203. package/docs/ja/slide/slide-comparison.md +68 -0
  204. package/docs/ja/slide/slide-cover.md +39 -0
  205. package/docs/ja/slide/slide-exec-summary.md +47 -0
  206. package/docs/ja/slide/slide-heading.md +38 -0
  207. package/docs/ja/slide/slide-kpi-grid.md +55 -0
  208. package/docs/ja/slide/slide-kpi-hero.md +58 -0
  209. package/docs/ja/slide/slide-next-actions.md +49 -0
  210. package/docs/ja/slide/slide-scorecard-table.md +54 -0
  211. package/docs/ja/slide/slide-section.md +44 -0
  212. package/docs/ja/slide/slide-source-line.md +34 -0
  213. package/docs/ja/ui/alert-dialog.md +41 -0
  214. package/docs/ja/ui/avatar.md +31 -0
  215. package/docs/ja/ui/combobox.md +74 -0
  216. package/docs/ja/ui/drawer.md +41 -0
  217. package/docs/ja/ui/empty.md +1 -1
  218. package/docs/ja/ui/error-state.md +4 -3
  219. package/docs/ja/ui/field.md +42 -0
  220. package/docs/ja/ui/hover-card.md +21 -0
  221. package/docs/ja/ui/kbd.md +16 -0
  222. package/docs/ja/ui/loading.md +1 -1
  223. package/docs/ja/ui/pagination.md +36 -0
  224. package/docs/ja/ui/radio-group.md +21 -0
  225. package/docs/ja/ui/toast.md +46 -0
  226. package/docs/ja/ui/toggle-group.md +4 -3
  227. package/docs/ja/ui-and-theming.md +14 -7
  228. package/package.json +43 -29
  229. package/registry/ui/accordion.tsx +76 -0
  230. package/registry/ui/alert-dialog.tsx +189 -0
  231. package/registry/ui/alert.tsx +80 -0
  232. package/registry/ui/app-shell.tsx +424 -0
  233. package/registry/ui/area-chart.tsx +3960 -0
  234. package/registry/ui/attention-list.tsx +465 -0
  235. package/registry/ui/avatar.tsx +110 -0
  236. package/registry/ui/badge.tsx +56 -0
  237. package/registry/ui/bar-chart.tsx +3954 -0
  238. package/registry/ui/bar-list.tsx +3998 -0
  239. package/registry/ui/box-plot-chart.tsx +4214 -0
  240. package/registry/ui/breadcrumb.tsx +128 -0
  241. package/registry/ui/button.tsx +62 -0
  242. package/registry/ui/calendar.tsx +223 -0
  243. package/registry/ui/card.tsx +107 -0
  244. package/registry/ui/category-bar.tsx +1498 -0
  245. package/registry/ui/chart-frame.tsx +1604 -0
  246. package/registry/ui/checkbox.tsx +30 -0
  247. package/registry/ui/collapsible.tsx +23 -0
  248. package/registry/ui/combobox.tsx +310 -0
  249. package/registry/ui/command.tsx +198 -0
  250. package/registry/ui/dashboard-card.tsx +217 -0
  251. package/registry/ui/data-table.tsx +896 -157
  252. package/registry/ui/date-range-picker.tsx +544 -0
  253. package/registry/ui/delta.tsx +350 -0
  254. package/registry/ui/dialog.tsx +161 -0
  255. package/registry/ui/donut-chart.tsx +4006 -0
  256. package/registry/ui/drawer.tsx +229 -0
  257. package/registry/ui/dropdown-menu.tsx +274 -0
  258. package/registry/ui/echart.tsx +1178 -0
  259. package/registry/ui/field.tsx +240 -0
  260. package/registry/ui/filter-bar.tsx +551 -0
  261. package/registry/ui/funnel-steps.tsx +3843 -0
  262. package/registry/ui/heatmap.tsx +2027 -0
  263. package/registry/ui/histogram-chart.tsx +4284 -0
  264. package/registry/ui/hover-card.tsx +52 -0
  265. package/registry/ui/input-group.tsx +160 -0
  266. package/registry/ui/input.tsx +24 -0
  267. package/registry/ui/kbd.tsx +30 -0
  268. package/registry/ui/kpi-card.tsx +905 -0
  269. package/registry/ui/label.tsx +22 -0
  270. package/registry/ui/legend.tsx +3817 -0
  271. package/registry/ui/line-chart.tsx +3958 -0
  272. package/registry/ui/metric-value.tsx +62 -0
  273. package/registry/ui/multi-select.tsx +382 -0
  274. package/registry/ui/page-shell.tsx +420 -0
  275. package/registry/ui/pagination.tsx +140 -0
  276. package/registry/ui/paired-chart.tsx +4086 -0
  277. package/registry/ui/placeholder.tsx +36 -0
  278. package/registry/ui/popover.tsx +92 -0
  279. package/registry/ui/progress-circle.tsx +1033 -0
  280. package/registry/ui/progress.tsx +85 -0
  281. package/registry/ui/radio-group.tsx +39 -0
  282. package/registry/ui/sample-data.tsx +230 -0
  283. package/registry/ui/scatter-chart.tsx +4503 -0
  284. package/registry/ui/scroll-area.tsx +56 -0
  285. package/registry/ui/searchable-select.tsx +352 -0
  286. package/registry/ui/section-header.tsx +43 -0
  287. package/registry/ui/segmented-control.tsx +76 -0
  288. package/registry/ui/select.tsx +255 -0
  289. package/registry/ui/separator.tsx +27 -0
  290. package/registry/ui/sheet.tsx +139 -0
  291. package/registry/ui/sidebar.tsx +725 -0
  292. package/registry/ui/skeleton.tsx +17 -0
  293. package/registry/ui/slider.tsx +56 -0
  294. package/registry/ui/sparkline.tsx +230 -0
  295. package/registry/ui/spinner.tsx +14 -0
  296. package/registry/ui/states.tsx +247 -0
  297. package/registry/ui/status-badge.tsx +286 -0
  298. package/registry/ui/switch.tsx +34 -0
  299. package/registry/ui/table.tsx +118 -0
  300. package/registry/ui/tabs.tsx +84 -0
  301. package/registry/ui/textarea.tsx +22 -0
  302. package/registry/ui/toast.tsx +250 -0
  303. package/registry/ui/toggle-group.tsx +91 -0
  304. package/registry/ui/toggle.tsx +47 -0
  305. package/registry/ui/tooltip.tsx +72 -0
  306. package/registry/ui/tracker.tsx +1015 -0
  307. package/registry/ui/trend-indicator.tsx +217 -0
  308. package/registry/ui/updated-at.tsx +276 -0
  309. package/registry/ui/waterfall-chart.tsx +4561 -0
  310. package/skills/vantage-add-feature/SKILL.md +9 -7
  311. package/skills/vantage-design/SKILL.md +62 -52
  312. package/skills/vantage-design/references/extract.md +26 -27
  313. package/skills/vantage-design/references/format.md +12 -172
  314. package/skills/vantage-design/references/presets.md +50 -110
  315. package/skills/vantage-pitfalls/SKILL.md +10 -1
  316. package/skills/vantage-slide/SKILL.md +71 -36
  317. package/templates/AGENTS.md +53 -16
  318. package/templates/agents/api.md +29 -0
  319. package/templates/agents/csv.md +2 -1
  320. package/templates/agents/doc.md +54 -3
  321. package/templates/agents/page.md +55 -10
  322. package/templates/agents/slide.md +90 -4
  323. package/templates/agents/xlsx.md +2 -1
  324. package/theme.css +287 -128
  325. package/dist/add-EISGSZAH.js +0 -6
  326. package/dist/add-EISGSZAH.js.map +0 -1
  327. package/dist/chunk-3G43C6OL.js.map +0 -1
  328. package/dist/chunk-5ZOP4SQR.js +0 -47
  329. package/dist/chunk-5ZOP4SQR.js.map +0 -1
  330. package/dist/chunk-A2UUGASH.js.map +0 -1
  331. package/dist/chunk-BCE22JSM.js.map +0 -1
  332. package/dist/chunk-DTDVSFRY.js +0 -29
  333. package/dist/chunk-DTDVSFRY.js.map +0 -1
  334. package/dist/chunk-EP6JHXSR.js.map +0 -1
  335. package/dist/chunk-JGRMRXXZ.js.map +0 -1
  336. package/dist/chunk-KLEIVDUV.js +0 -165
  337. package/dist/chunk-KLEIVDUV.js.map +0 -1
  338. package/dist/chunk-MXI3PZFT.js.map +0 -1
  339. package/dist/chunk-PLST5Q7T.js +0 -2221
  340. package/dist/chunk-PLST5Q7T.js.map +0 -1
  341. package/dist/chunk-PVTHHV7X.js.map +0 -1
  342. package/dist/chunk-T3FLAGI6.js +0 -316
  343. package/dist/chunk-T3FLAGI6.js.map +0 -1
  344. package/dist/dev-NZRLOQCL.js.map +0 -1
  345. package/dist/doctor-VFKEMR54.js.map +0 -1
  346. package/dist/preview-QDCIVVSR.js.map +0 -1
@@ -0,0 +1,123 @@
1
+ import { cn } from './chunk-U736PVHY.js';
2
+ import { Button as Button$1 } from '@base-ui/react/button';
3
+ import { cva } from 'class-variance-authority';
4
+ import { jsx } from 'react/jsx-runtime';
5
+ import { useSyncExternalStore } from 'react';
6
+
7
+ // @squadbase/vantage — generated build. Do not edit.
8
+ var buttonVariants = cva(
9
+ "group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
10
+ {
11
+ variants: {
12
+ variant: {
13
+ default: "bg-primary text-primary-foreground hover:bg-primary/80",
14
+ outline: "border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50",
15
+ secondary: "bg-secondary text-secondary-foreground hover:bg-[color-mix(in_oklch,var(--secondary),var(--foreground)_5%)] aria-expanded:bg-secondary aria-expanded:text-secondary-foreground",
16
+ ghost: "hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50",
17
+ destructive: "bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40",
18
+ link: "text-primary underline-offset-4 hover:underline"
19
+ },
20
+ size: {
21
+ default: "h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",
22
+ xs: "h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3",
23
+ sm: "h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5",
24
+ lg: "h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",
25
+ icon: "size-8",
26
+ "icon-xs": "size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3",
27
+ "icon-sm": "size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg",
28
+ "icon-lg": "size-9"
29
+ }
30
+ },
31
+ defaultVariants: {
32
+ variant: "default",
33
+ size: "default"
34
+ }
35
+ }
36
+ );
37
+ function Button({
38
+ className,
39
+ variant = "default",
40
+ size = "default",
41
+ ...props
42
+ }) {
43
+ return /* @__PURE__ */ jsx(
44
+ Button$1,
45
+ {
46
+ "data-slot": "button",
47
+ className: cn(buttonVariants({ variant, size, className })),
48
+ ...props
49
+ }
50
+ );
51
+ }
52
+
53
+ // ../squadkit/registry/lib/locale.ts
54
+ var FALLBACK_LOCALE = "en-US";
55
+ function uiLanguage(locale) {
56
+ return typeof locale === "string" && locale.trim().toLowerCase().startsWith("ja") ? "ja" : "en";
57
+ }
58
+ function normalizeLocale(tag) {
59
+ const value = tag?.trim();
60
+ if (!value) return FALLBACK_LOCALE;
61
+ try {
62
+ return Intl.getCanonicalLocales(value)[0] ?? FALLBACK_LOCALE;
63
+ } catch {
64
+ return FALLBACK_LOCALE;
65
+ }
66
+ }
67
+ function documentLocale() {
68
+ if (typeof document === "undefined") return FALLBACK_LOCALE;
69
+ return normalizeLocale(document.documentElement?.getAttribute("lang"));
70
+ }
71
+ function resolveLocale(locale) {
72
+ return locale || documentLocale();
73
+ }
74
+ function defaultCurrency(locale) {
75
+ return uiLanguage(resolveLocale(locale)) === "ja" ? "JPY" : "USD";
76
+ }
77
+ function defaultFiscalYearStartMonth(locale) {
78
+ return uiLanguage(resolveLocale(locale)) === "ja" ? 4 : 1;
79
+ }
80
+ var SUNDAY_FIRST = /* @__PURE__ */ new Set(["en", "en-US", "en-CA"]);
81
+ function weekStartsOn(locale) {
82
+ const tag = normalizeLocale(resolveLocale(locale));
83
+ if (uiLanguage(tag) === "ja") return 1;
84
+ try {
85
+ const info = new Intl.Locale(tag);
86
+ const firstDay = info.getWeekInfo?.().firstDay ?? info.weekInfo?.firstDay;
87
+ if (typeof firstDay === "number" && firstDay >= 1 && firstDay <= 7) return firstDay % 7;
88
+ } catch {
89
+ }
90
+ return SUNDAY_FIRST.has(tag) ? 0 : 1;
91
+ }
92
+ var listeners = /* @__PURE__ */ new Set();
93
+ var observer = null;
94
+ function subscribe(onChange) {
95
+ if (typeof document === "undefined" || typeof MutationObserver === "undefined") return () => {
96
+ };
97
+ listeners.add(onChange);
98
+ if (!observer) {
99
+ observer = new MutationObserver(() => {
100
+ for (const listener of [...listeners]) listener();
101
+ });
102
+ observer.observe(document.documentElement, { attributes: true, attributeFilter: ["lang"] });
103
+ }
104
+ return () => {
105
+ listeners.delete(onChange);
106
+ if (listeners.size === 0 && observer) {
107
+ observer.disconnect();
108
+ observer = null;
109
+ }
110
+ };
111
+ }
112
+ var serverLocale = () => FALLBACK_LOCALE;
113
+ function useDocumentLocale() {
114
+ return useSyncExternalStore(subscribe, documentLocale, serverLocale);
115
+ }
116
+ function useLocale(locale) {
117
+ const page = useDocumentLocale();
118
+ return locale || page;
119
+ }
120
+
121
+ export { Button, FALLBACK_LOCALE, buttonVariants, defaultCurrency, defaultFiscalYearStartMonth, resolveLocale, uiLanguage, useLocale, weekStartsOn };
122
+ //# sourceMappingURL=chunk-ROHNXP7J.js.map
123
+ //# sourceMappingURL=chunk-ROHNXP7J.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../squadkit/registry/ui/button.tsx","../../squadkit/registry/lib/locale.ts","../../squadkit/registry/hooks/use-locale.ts"],"names":["ButtonPrimitive"],"mappings":";;;;;;;AAOA,IAAM,cAAA,GAAiB,GAAA;AAAA,EACrB,4lBAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,OAAA,EAAS;AAAA,QACP,OAAA,EAAS,wDAAA;AAAA,QACT,OAAA,EACE,iLAAA;AAAA,QACF,SAAA,EACE,gLAAA;AAAA,QACF,KAAA,EACE,kHAAA;AAAA,QACF,WAAA,EACE,6NAAA;AAAA,QACF,IAAA,EAAM;AAAA,OACR;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,OAAA,EACE,sFAAA;AAAA,QACF,EAAA,EAAI,+MAAA;AAAA,QACJ,EAAA,EAAI,yNAAA;AAAA,QACJ,EAAA,EAAI,sFAAA;AAAA,QACJ,IAAA,EAAM,QAAA;AAAA,QACN,SAAA,EACE,yHAAA;AAAA,QACF,SAAA,EACE,oFAAA;AAAA,QACF,SAAA,EAAW;AAAA;AACb,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,OAAA,EAAS,SAAA;AAAA,MACT,IAAA,EAAM;AAAA;AACR;AAEJ;AAEA,SAAS,MAAA,CAAO;AAAA,EACd,SAAA;AAAA,EACA,OAAA,GAAU,SAAA;AAAA,EACV,IAAA,GAAO,SAAA;AAAA,EACP,GAAG;AACL,CAAA,EAAgE;AAC9D,EAAA,uBACE,GAAA;AAAA,IAACA,QAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,QAAA;AAAA,MACV,SAAA,EAAW,GAAG,cAAA,CAAe,EAAE,SAAS,IAAA,EAAM,SAAA,EAAW,CAAC,CAAA;AAAA,MACzD,GAAG;AAAA;AAAA,GACN;AAEJ;;;AC1CO,IAAM,eAAA,GAAkB;AAGxB,SAAS,WAAW,MAAA,EAA+C;AACxE,EAAA,OAAO,OAAO,MAAA,KAAW,QAAA,IAAY,MAAA,CAAO,IAAA,EAAK,CAAE,WAAA,EAAY,CAAE,UAAA,CAAW,IAAI,CAAA,GAAI,IAAA,GAAO,IAAA;AAC7F;AAGO,SAAS,gBAAgB,GAAA,EAAwC;AACtE,EAAA,MAAM,KAAA,GAAQ,KAAK,IAAA,EAAK;AACxB,EAAA,IAAI,CAAC,OAAO,OAAO,eAAA;AACnB,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,mBAAA,CAAoB,KAAK,CAAA,CAAE,CAAC,CAAA,IAAK,eAAA;AAAA,EAC/C,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,eAAA;AAAA,EACT;AACF;AAMO,SAAS,cAAA,GAAyB;AACvC,EAAA,IAAI,OAAO,QAAA,KAAa,WAAA,EAAa,OAAO,eAAA;AAC5C,EAAA,OAAO,eAAA,CAAgB,QAAA,CAAS,eAAA,EAAiB,YAAA,CAAa,MAAM,CAAC,CAAA;AACvE;AAGO,SAAS,cAAc,MAAA,EAAgC;AAC5D,EAAA,OAAO,UAAU,cAAA,EAAe;AAClC;AAQO,SAAS,gBAAgB,MAAA,EAAgC;AAC9D,EAAA,OAAO,WAAW,aAAA,CAAc,MAAM,CAAC,CAAA,KAAM,OAAO,KAAA,GAAQ,KAAA;AAC9D;AAGO,SAAS,4BAA4B,MAAA,EAAgC;AAC1E,EAAA,OAAO,WAAW,aAAA,CAAc,MAAM,CAAC,CAAA,KAAM,OAAO,CAAA,GAAI,CAAA;AAC1D;AAMA,IAAM,+BAAe,IAAI,GAAA,CAAI,CAAC,IAAA,EAAM,OAAA,EAAS,OAAO,CAAC,CAAA;AAO9C,SAAS,aAAa,MAAA,EAAiC;AAC5D,EAAA,MAAM,GAAA,GAAM,eAAA,CAAgB,aAAA,CAAc,MAAM,CAAC,CAAA;AACjD,EAAA,IAAI,UAAA,CAAW,GAAG,CAAA,KAAM,IAAA,EAAM,OAAO,CAAA;AACrC,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,MAAA,CAAO,GAAG,CAAA;AAIhC,IAAA,MAAM,WAAW,IAAA,CAAK,WAAA,IAAc,CAAE,QAAA,IAAY,KAAK,QAAA,EAAU,QAAA;AACjE,IAAA,IAAI,OAAO,aAAa,QAAA,IAAY,QAAA,IAAY,KAAK,QAAA,IAAY,CAAA,SAAW,QAAA,GAAW,CAAA;AAAA,EACzF,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,OAAO,YAAA,CAAa,GAAA,CAAI,GAAG,CAAA,GAAI,CAAA,GAAI,CAAA;AACrC;ACnFA,IAAM,SAAA,uBAAgB,GAAA,EAAgB;AACtC,IAAI,QAAA,GAAoC,IAAA;AAGxC,SAAS,UAAU,QAAA,EAAkC;AACnD,EAAA,IAAI,OAAO,QAAA,KAAa,WAAA,IAAe,OAAO,gBAAA,KAAqB,WAAA,SAAoB,MAAM;AAAA,EAAC,CAAA;AAC9F,EAAA,SAAA,CAAU,IAAI,QAAQ,CAAA;AACtB,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,QAAA,GAAW,IAAI,iBAAiB,MAAM;AACpC,MAAA,KAAA,MAAW,QAAA,IAAY,CAAC,GAAG,SAAS,GAAG,QAAA,EAAS;AAAA,IAClD,CAAC,CAAA;AACD,IAAA,QAAA,CAAS,OAAA,CAAQ,QAAA,CAAS,eAAA,EAAiB,EAAE,UAAA,EAAY,MAAM,eAAA,EAAiB,CAAC,MAAM,CAAA,EAAG,CAAA;AAAA,EAC5F;AACA,EAAA,OAAO,MAAM;AACX,IAAA,SAAA,CAAU,OAAO,QAAQ,CAAA;AACzB,IAAA,IAAI,SAAA,CAAU,IAAA,KAAS,CAAA,IAAK,QAAA,EAAU;AACpC,MAAA,QAAA,CAAS,UAAA,EAAW;AACpB,MAAA,QAAA,GAAW,IAAA;AAAA,IACb;AAAA,EACF,CAAA;AACF;AAEA,IAAM,eAAe,MAAM,eAAA;AAMpB,SAAS,iBAAA,GAA4B;AAC1C,EAAA,OAAO,oBAAA,CAAqB,SAAA,EAAW,cAAA,EAAgB,YAAY,CAAA;AACrE;AAGO,SAAS,UAAU,MAAA,EAAgC;AACxD,EAAA,MAAM,OAAO,iBAAA,EAAkB;AAC/B,EAAA,OAAO,MAAA,IAAU,IAAA;AACnB","file":"chunk-ROHNXP7J.js","sourcesContent":["\"use client\"\n\nimport { Button as ButtonPrimitive } from \"@base-ui/react/button\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../lib/utils\"\n\nconst buttonVariants = cva(\n \"group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/80\",\n outline:\n \"border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-[color-mix(in_oklch,var(--secondary),var(--foreground)_5%)] aria-expanded:bg-secondary aria-expanded:text-secondary-foreground\",\n ghost:\n \"hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50\",\n destructive:\n \"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default:\n \"h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2\",\n xs: \"h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3\",\n sm: \"h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5\",\n lg: \"h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2\",\n icon: \"size-8\",\n \"icon-xs\":\n \"size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3\",\n \"icon-sm\":\n \"size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg\",\n \"icon-lg\": \"size-9\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction Button({\n className,\n variant = \"default\",\n size = \"default\",\n ...props\n}: ButtonPrimitive.Props & VariantProps<typeof buttonVariants>) {\n return (\n <ButtonPrimitive\n data-slot=\"button\"\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n )\n}\n\nexport { Button, buttonVariants }\n","/**\n * The display language of the parts and the defaults that follow it.\n *\n * The language comes from `<html lang>`: a tag starting with `ja` reads Japanese, anything else English.\n * Without a usable `lang` (missing, invalid, or no `document` — SSR, Node) the locale is `FALLBACK_LOCALE`\n * (`en-US`). A `locale` passed explicitly (a prop, an argument) always wins.\n *\n * Parts read the locale through `useLocale` (`hooks/use-locale`) and pass it down; the pure helpers here\n * and in `format` / `comparison` / `chart-*` take it as an argument and fall back to `documentLocale()`.\n */\n\n/** The language of the built-in wording: Japanese or English. */\nexport type UiLanguage = \"ja\" | \"en\"\n\n/** The locale used when `<html lang>` gives none (and on the server). */\nexport const FALLBACK_LOCALE = \"en-US\"\n\n/** `\"ja\"` when `locale` starts with `ja` (`ja`, `ja-JP`), else `\"en\"`. A missing locale is `\"en\"`. */\nexport function uiLanguage(locale: string | null | undefined): UiLanguage {\n return typeof locale === \"string\" && locale.trim().toLowerCase().startsWith(\"ja\") ? \"ja\" : \"en\"\n}\n\n/** A BCP 47 tag in its canonical form (`en-gb` → `en-GB`), or `FALLBACK_LOCALE` when it is empty or invalid. */\nexport function normalizeLocale(tag: string | null | undefined): string {\n const value = tag?.trim()\n if (!value) return FALLBACK_LOCALE\n try {\n return Intl.getCanonicalLocales(value)[0] ?? FALLBACK_LOCALE\n } catch {\n return FALLBACK_LOCALE\n }\n}\n\n/**\n * The locale of the page: `document.documentElement.lang`, canonicalized. `FALLBACK_LOCALE` when it is empty or\n * invalid, or there is no `document`. Parts read it through `useLocale`, never while rendering.\n */\nexport function documentLocale(): string {\n if (typeof document === \"undefined\") return FALLBACK_LOCALE\n return normalizeLocale(document.documentElement?.getAttribute(\"lang\"))\n}\n\n/** `locale` when given, else the page's locale (`documentLocale()`). */\nexport function resolveLocale(locale?: string | null): string {\n return locale || documentLocale()\n}\n\n/** Picks the wording table of the locale's language. */\nexport function pickLocale<T>(table: { ja: T; en: T }, locale?: string | null): T {\n return table[uiLanguage(resolveLocale(locale))]\n}\n\n/** The currency `format=\"currency\"` uses without a `currency`: JPY for Japanese, USD otherwise. */\nexport function defaultCurrency(locale?: string | null): string {\n return uiLanguage(resolveLocale(locale)) === \"ja\" ? \"JPY\" : \"USD\"\n}\n\n/** The month a fiscal year starts in (1–12) when none is given: April for Japanese, January otherwise. */\nexport function defaultFiscalYearStartMonth(locale?: string | null): number {\n return uiLanguage(resolveLocale(locale)) === \"ja\" ? 4 : 1\n}\n\n/** A day of the week, 0 = Sunday … 6 = Saturday (the `Date#getDay` / date-fns numbering). */\nexport type WeekDay = 0 | 1 | 2 | 3 | 4 | 5 | 6\n\n/** Locales whose week starts on Sunday when the runtime has no week data. */\nconst SUNDAY_FIRST = new Set([\"en\", \"en-US\", \"en-CA\"])\n\n/**\n * The first day of the week: Monday for Japanese; otherwise the locale's convention from `Intl.Locale`\n * (`en-US` Sunday, `en-GB` Monday). Without week data in the runtime: Sunday for `en` / `en-US` / `en-CA`,\n * Monday for the rest.\n */\nexport function weekStartsOn(locale?: string | null): WeekDay {\n const tag = normalizeLocale(resolveLocale(locale))\n if (uiLanguage(tag) === \"ja\") return 1\n try {\n const info = new Intl.Locale(tag) as Intl.Locale & {\n getWeekInfo?: () => { firstDay: number }\n weekInfo?: { firstDay: number }\n }\n const firstDay = info.getWeekInfo?.().firstDay ?? info.weekInfo?.firstDay\n if (typeof firstDay === \"number\" && firstDay >= 1 && firstDay <= 7) return (firstDay % 7) as WeekDay\n } catch {\n // Fall through to the table below.\n }\n return SUNDAY_FIRST.has(tag) ? 0 : 1\n}\n","import { useSyncExternalStore } from \"react\"\n\nimport { documentLocale, FALLBACK_LOCALE } from \"../lib/locale\"\n\nconst listeners = new Set<() => void>()\nlet observer: MutationObserver | null = null\n\n/** One observer on `<html lang>` for every subscribed part. */\nfunction subscribe(onChange: () => void): () => void {\n if (typeof document === \"undefined\" || typeof MutationObserver === \"undefined\") return () => {}\n listeners.add(onChange)\n if (!observer) {\n observer = new MutationObserver(() => {\n for (const listener of [...listeners]) listener()\n })\n observer.observe(document.documentElement, { attributes: true, attributeFilter: [\"lang\"] })\n }\n return () => {\n listeners.delete(onChange)\n if (listeners.size === 0 && observer) {\n observer.disconnect()\n observer = null\n }\n }\n}\n\nconst serverLocale = () => FALLBACK_LOCALE\n\n/**\n * The page's locale (`<html lang>`), following changes made while the page runs. On the server and during\n * hydration it is `FALLBACK_LOCALE` (`en-US`), so the markup matches; it switches right after.\n */\nexport function useDocumentLocale(): string {\n return useSyncExternalStore(subscribe, documentLocale, serverLocale)\n}\n\n/** The locale a part renders in: its `locale` prop when given, else the page's (`useDocumentLocale`). */\nexport function useLocale(locale?: string | null): string {\n const page = useDocumentLocale()\n return locale || page\n}\n"]}
@@ -0,0 +1,466 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import { createHash } from 'crypto';
4
+
5
+ // @squadbase/vantage — generated build. Do not edit.
6
+
7
+ function humanize(stem) {
8
+ return stem.replace(/([a-z0-9])([A-Z])/g, "$1 $2").split(/[-_\s]+/).filter(Boolean).map((word) => word === word.toUpperCase() ? word : word[0].toUpperCase() + word.slice(1)).join(" ");
9
+ }
10
+ function filePageMeta(page) {
11
+ const base = path.posix.basename(page.file);
12
+ let stem = page.fileExt ? base.slice(0, -page.fileExt.length) : base;
13
+ if (stem.toLowerCase() === "index") stem = page.dir.split("/").filter(Boolean).pop() ?? "";
14
+ if (stem === "") return {};
15
+ return { title: humanize(stem) };
16
+ }
17
+ function filePageKind(page) {
18
+ return (page.fileExt ?? "").slice(1);
19
+ }
20
+ function filePageModuleName(page) {
21
+ const slug = page.file.replace(/[^A-Za-z0-9]+/g, "-").replace(/^-|-$/g, "").toLowerCase();
22
+ const hash = createHash("sha256").update(page.file).digest("hex").slice(0, 8);
23
+ return `${slug}-${hash}.tsx`;
24
+ }
25
+
26
+ // src/core/placeholder.ts
27
+ var PLACEHOLDER_HOME_PAGE = `import { definePage } from "@squadbase/vantage"
28
+ import {
29
+ DashboardCardPreset,
30
+ EChart,
31
+ PageShell,
32
+ PageShellContent,
33
+ PageShellDescription,
34
+ PageShellHeader,
35
+ PageShellHeading,
36
+ PageShellTitle,
37
+ Placeholder,
38
+ Sparkline,
39
+ type EChartsOption,
40
+ } from "@squadbase/vantage/components"
41
+
42
+ export const page = definePage({
43
+ title: "Dashboard",
44
+ description: "Sample data \u2014 replace with your own to get started.",
45
+ navLabel: "Home",
46
+ })
47
+
48
+ const METRICS = [
49
+ { label: "Metric 1", value: "1,234", trend: [3, 4, 3, 5, 6, 5, 7] },
50
+ { label: "Metric 2", value: "5,678", trend: [6, 5, 6, 4, 5, 6, 6] },
51
+ { label: "Metric 3", value: "90.1%", trend: [2, 3, 5, 4, 6, 7, 8] },
52
+ { label: "Metric 4", value: "$12.3k", trend: [5, 6, 4, 6, 5, 7, 6] },
53
+ ]
54
+
55
+ // Sample charts. \`EChart\` paints series with \`--chart-1..5\` and the sparklines
56
+ // use \`--primary\` (both from \`styles.css\`), so a theme change shows up here.
57
+ const BAR_OPTION: EChartsOption = {
58
+ legend: { top: 0 },
59
+ grid: { top: 36, right: 8, bottom: 24, left: 36 },
60
+ xAxis: { type: "category", data: ["Jan", "Feb", "Mar", "Apr", "May", "Jun"] },
61
+ yAxis: { type: "value" },
62
+ series: [
63
+ { name: "Series A", type: "bar", data: [12, 18, 15, 22, 26, 24] },
64
+ { name: "Series B", type: "bar", data: [8, 11, 13, 12, 16, 19] },
65
+ { name: "Series C", type: "bar", data: [5, 7, 6, 9, 8, 11] },
66
+ ],
67
+ }
68
+
69
+ const PIE_OPTION: EChartsOption = {
70
+ legend: { bottom: 0 },
71
+ series: [
72
+ {
73
+ type: "pie",
74
+ radius: ["45%", "70%"],
75
+ center: ["50%", "45%"],
76
+ label: { show: false },
77
+ data: [
78
+ { name: "Category A", value: 35 },
79
+ { name: "Category B", value: 25 },
80
+ { name: "Category C", value: 18 },
81
+ { name: "Category D", value: 12 },
82
+ { name: "Category E", value: 10 },
83
+ ],
84
+ },
85
+ ],
86
+ }
87
+
88
+ const CHARTS = [
89
+ { title: "Chart 1", option: BAR_OPTION },
90
+ { title: "Chart 2", option: PIE_OPTION },
91
+ ]
92
+
93
+ export default function HomePage() {
94
+ return (
95
+ <PageShell>
96
+ <PageShellHeader>
97
+ <PageShellHeading>
98
+ <PageShellTitle>Dashboard</PageShellTitle>
99
+ <PageShellDescription>
100
+ Sample data \u2014 replace with your own to get started.
101
+ </PageShellDescription>
102
+ </PageShellHeading>
103
+ </PageShellHeader>
104
+
105
+ <PageShellContent>
106
+ <section className="grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-4">
107
+ {METRICS.map((metric) => (
108
+ <DashboardCardPreset key={metric.label} title={metric.label}>
109
+ <Placeholder className="text-2xl font-bold">{metric.value}</Placeholder>
110
+ <Sparkline
111
+ className="mt-2"
112
+ data={metric.trend.map((value) => ({ value }))}
113
+ color="text-primary"
114
+ area
115
+ />
116
+ </DashboardCardPreset>
117
+ ))}
118
+ </section>
119
+
120
+ <section className="grid grid-cols-1 gap-4 lg:grid-cols-2">
121
+ {CHARTS.map((chart) => (
122
+ <DashboardCardPreset key={chart.title} title={chart.title}>
123
+ <EChart option={chart.option} height={256} ariaLabel={chart.title} />
124
+ </DashboardCardPreset>
125
+ ))}
126
+ </section>
127
+ </PageShellContent>
128
+ </PageShell>
129
+ )
130
+ }
131
+ `;
132
+ function isPlaceholderHomePage(content) {
133
+ if (/\bplaceholder\s*:\s*true\b/.test(content)) return true;
134
+ return content.trim() === PLACEHOLDER_HOME_PAGE.trim();
135
+ }
136
+ function isHomePagePath(file) {
137
+ return file === "index.tsx" || file === "src/index.tsx";
138
+ }
139
+
140
+ // src/core/source.ts
141
+ function stripComments(src) {
142
+ return src.replace(/\/\*[\s\S]*?\*\//g, "").replace(/(^|[^:"'`\\])\/\/[^\n]*/g, "$1");
143
+ }
144
+ var OPENERS = { "(": ")", "[": "]", "{": "}" };
145
+ function readBracketBody(src, openIndex) {
146
+ const open = src[openIndex];
147
+ if (!open || !OPENERS[open]) return null;
148
+ let depth2 = 0;
149
+ let quote = null;
150
+ for (let i = openIndex; i < src.length; i++) {
151
+ const c = src[i];
152
+ if (quote) {
153
+ if (c === "\\") i++;
154
+ else if (c === quote) quote = null;
155
+ continue;
156
+ }
157
+ if (c === '"' || c === "'" || c === "`") {
158
+ quote = c;
159
+ continue;
160
+ }
161
+ if (OPENERS[c]) depth2++;
162
+ else if (c === ")" || c === "]" || c === "}") {
163
+ if (--depth2 === 0) return src.slice(openIndex + 1, i);
164
+ }
165
+ }
166
+ return null;
167
+ }
168
+ function splitTopLevel(body) {
169
+ const parts = [];
170
+ let depth2 = 0;
171
+ let quote = null;
172
+ let start = 0;
173
+ for (let i = 0; i < body.length; i++) {
174
+ const c = body[i];
175
+ if (quote) {
176
+ if (c === "\\") i++;
177
+ else if (c === quote) quote = null;
178
+ continue;
179
+ }
180
+ if (c === '"' || c === "'" || c === "`") {
181
+ quote = c;
182
+ continue;
183
+ }
184
+ if (OPENERS[c]) depth2++;
185
+ else if (c === ")" || c === "]" || c === "}") depth2--;
186
+ else if (c === "," && depth2 === 0) {
187
+ parts.push(body.slice(start, i));
188
+ start = i + 1;
189
+ }
190
+ }
191
+ parts.push(body.slice(start));
192
+ return parts.map((p) => p.trim()).filter(Boolean);
193
+ }
194
+ function maskSource(src) {
195
+ const out = src.split("");
196
+ const inString = new Uint8Array(src.length);
197
+ let i = 0;
198
+ while (i < src.length) {
199
+ const c = src[i];
200
+ const next = src[i + 1];
201
+ if (c === "/" && next === "/" && src[i - 1] !== ":") {
202
+ while (i < src.length && src[i] !== "\n") out[i++] = " ";
203
+ continue;
204
+ }
205
+ if (c === "/" && next === "*") {
206
+ const end = src.indexOf("*/", i + 2);
207
+ const stop = end === -1 ? src.length : end + 2;
208
+ for (; i < stop; i++) if (src[i] !== "\n") out[i] = " ";
209
+ continue;
210
+ }
211
+ if (c === '"' || c === "'" || c === "`") {
212
+ i++;
213
+ while (i < src.length) {
214
+ const d = src[i];
215
+ if (d === "\\") {
216
+ inString[i] = 1;
217
+ inString[i + 1] = 1;
218
+ i += 2;
219
+ continue;
220
+ }
221
+ if (d === c) break;
222
+ if (d === "\n" && c !== "`") break;
223
+ inString[i++] = 1;
224
+ }
225
+ i++;
226
+ continue;
227
+ }
228
+ i++;
229
+ }
230
+ return { code: out.join(""), inString };
231
+ }
232
+
233
+ // src/core/route-tree.ts
234
+ function segToRouter(s) {
235
+ if (s.kind === "static") return s.value;
236
+ if (s.kind === "param") return `$${s.name}`;
237
+ return "$";
238
+ }
239
+ function dirToRouterPath(relDir) {
240
+ return relDir.split("/").filter(Boolean).map((token) => {
241
+ const catchall = token.match(/^\[\.\.\.(.+)\]$/);
242
+ if (catchall) return "$";
243
+ const param = token.match(/^\[(.+)\]$/);
244
+ if (param) return `$${param[1]}`;
245
+ return token;
246
+ }).join("/");
247
+ }
248
+ function isAncestorDir(ancestor, dir) {
249
+ if (ancestor === "") return true;
250
+ return dir === ancestor || dir.startsWith(ancestor + "/");
251
+ }
252
+ function isStrictAncestorDir(ancestor, dir) {
253
+ return dir.startsWith(ancestor + "/");
254
+ }
255
+ function depth(dir) {
256
+ return dir === "" ? 0 : dir.split("/").length;
257
+ }
258
+ function extractDefinePageArgs(src) {
259
+ const call = src.match(/\bdefinePage\s*\(/);
260
+ if (!call) return null;
261
+ let i = (call.index ?? 0) + call[0].length;
262
+ while (i < src.length && /\s/.test(src[i])) i++;
263
+ if (src[i] !== "{") return null;
264
+ const start = i;
265
+ let depth2 = 0;
266
+ for (; i < src.length; i++) {
267
+ const c = src[i];
268
+ if (c === "{") depth2++;
269
+ else if (c === "}" && --depth2 === 0) return src.slice(start + 1, i);
270
+ }
271
+ return null;
272
+ }
273
+ function matchStringField(scope, key) {
274
+ const re = new RegExp(
275
+ `\\b${key}\\s*:\\s*(?:"((?:\\\\.|[^"\\\\])*)"|'((?:\\\\.|[^'\\\\])*)'|\`((?:\\\\.|[^\`\\\\])*)\`)`
276
+ );
277
+ const m = scope.match(re);
278
+ if (!m) return void 0;
279
+ return (m[1] ?? m[2] ?? m[3] ?? "").replace(/\\(.)/g, "$1");
280
+ }
281
+ var metaCache = /* @__PURE__ */ new Map();
282
+ function parsePageMeta(src) {
283
+ const args = extractDefinePageArgs(src);
284
+ if (args == null) return {};
285
+ const meta = {};
286
+ const title = matchStringField(args, "title");
287
+ const description = matchStringField(args, "description");
288
+ const navLabel = matchStringField(args, "navLabel");
289
+ if (title) meta.title = title;
290
+ if (description) meta.description = description;
291
+ if (navLabel) meta.navLabel = navLabel;
292
+ if (/\bplaceholder\s*:\s*true\b/.test(args)) meta.placeholder = true;
293
+ return meta;
294
+ }
295
+ function extractPageMeta(absFile) {
296
+ let stat;
297
+ try {
298
+ stat = fs.statSync(absFile);
299
+ } catch {
300
+ return {};
301
+ }
302
+ const hit = metaCache.get(absFile);
303
+ if (hit && hit.mtimeMs === stat.mtimeMs && hit.size === stat.size) return hit.meta;
304
+ let src;
305
+ try {
306
+ src = fs.readFileSync(absFile, "utf8");
307
+ } catch {
308
+ return {};
309
+ }
310
+ const meta = parsePageMeta(src);
311
+ const fileName = absFile.split(/[/\\]/).pop() ?? "";
312
+ const relPath = absFile.includes("/src/") ? `src/${fileName}` : fileName;
313
+ if (isHomePagePath(relPath) && isPlaceholderHomePage(src)) {
314
+ meta.placeholder = true;
315
+ }
316
+ metaCache.set(absFile, { mtimeMs: stat.mtimeMs, size: stat.size, meta });
317
+ return meta;
318
+ }
319
+ var DEFAULT_APP_LANG = "en";
320
+ var LANG_TAG = /^[A-Za-z]{2,3}(-[A-Za-z0-9]{2,8})*$/;
321
+ function isValidLang(lang) {
322
+ return LANG_TAG.test(lang);
323
+ }
324
+ var LANG_DECL = /\bexport\s+const\s+lang\b/g;
325
+ var LANG_LITERAL = /^(?:"((?:\\.|[^"\\\n])*)"|'((?:\\.|[^'\\\n])*)'|`((?:\\.|[^`\\$])*)`)/;
326
+ function parseLangExport(src) {
327
+ const { code, inString } = maskSource(src);
328
+ const depthAt = new Int32Array(src.length + 1);
329
+ let depth2 = 0;
330
+ for (let i = 0; i < src.length; i++) {
331
+ depthAt[i] = depth2;
332
+ if (inString[i]) continue;
333
+ const c = code[i];
334
+ if (c === "{" || c === "(" || c === "[") depth2++;
335
+ else if (c === "}" || c === ")" || c === "]") depth2--;
336
+ }
337
+ LANG_DECL.lastIndex = 0;
338
+ for (let m = LANG_DECL.exec(code); m; m = LANG_DECL.exec(code)) {
339
+ if (inString[m.index] || depthAt[m.index] !== 0) continue;
340
+ let i = m.index + m[0].length;
341
+ const annotation = /^\s*:\s*string\s*/.exec(code.slice(i));
342
+ if (annotation) i += annotation[0].length;
343
+ const eq = /^\s*=\s*/.exec(code.slice(i));
344
+ if (!eq) continue;
345
+ i += eq[0].length;
346
+ const lit = LANG_LITERAL.exec(src.slice(i));
347
+ if (!lit) continue;
348
+ const tail = code.slice(i + lit[0].length);
349
+ const end = /^[ \t]*(?:as\s+const|satisfies\s+string)?[ \t]*(;|\r?\n|$)/.exec(tail);
350
+ if (!end) continue;
351
+ const term = end[1] ?? "";
352
+ if (term !== ";") {
353
+ const next = /^\s*(\S)/.exec(tail.slice(end[0].length - term.length));
354
+ if (next && /[-+*/%&|^<>=?.,([`!~:]/.test(next[1])) continue;
355
+ }
356
+ return (lit[1] ?? lit[2] ?? lit[3] ?? "").replace(/\\(.)/g, "$1");
357
+ }
358
+ return void 0;
359
+ }
360
+ var langCache = /* @__PURE__ */ new Map();
361
+ function readLayoutLang(absFile) {
362
+ let stat;
363
+ try {
364
+ stat = fs.statSync(absFile);
365
+ } catch {
366
+ return void 0;
367
+ }
368
+ const hit = langCache.get(absFile);
369
+ if (hit && hit.mtimeMs === stat.mtimeMs && hit.size === stat.size) return hit.lang;
370
+ let lang;
371
+ try {
372
+ lang = parseLangExport(fs.readFileSync(absFile, "utf8"));
373
+ } catch {
374
+ return void 0;
375
+ }
376
+ langCache.set(absFile, { mtimeMs: stat.mtimeMs, size: stat.size, lang });
377
+ return lang;
378
+ }
379
+ function extractAppLang(model) {
380
+ const root = model.layouts.find((l) => l.dir === "");
381
+ if (!root) return DEFAULT_APP_LANG;
382
+ const lang = readLayoutLang(root.absFile);
383
+ return lang !== void 0 && isValidLang(lang) ? lang : DEFAULT_APP_LANG;
384
+ }
385
+ function buildRouteTree(model) {
386
+ const rootLayoutRoute = model.layouts.find((l) => l.dir === "") ?? null;
387
+ const nestedLayouts = model.layouts.filter((l) => l.dir !== "").sort((a, b) => depth(a.dir) - depth(b.dir));
388
+ const built = [];
389
+ const dirToId = /* @__PURE__ */ new Map();
390
+ nestedLayouts.forEach((layout, i) => {
391
+ const id = `L${i}`;
392
+ let parent = null;
393
+ for (const cand of built) {
394
+ if (isStrictAncestorDir(cand.dir, layout.dir)) {
395
+ if (!parent || depth(cand.dir) > depth(parent.dir)) parent = { id: cand.id, dir: cand.dir };
396
+ }
397
+ }
398
+ const parentDir = parent ? parent.dir : "";
399
+ const relDir = parentDir === "" ? layout.dir : layout.dir.slice(parentDir.length + 1);
400
+ built.push({
401
+ id,
402
+ dir: layout.dir,
403
+ parentId: parent ? parent.id : null,
404
+ path: dirToRouterPath(relDir),
405
+ file: layout.file
406
+ });
407
+ dirToId.set(layout.dir, id);
408
+ });
409
+ const pages = model.pages.map((page) => {
410
+ let owner = null;
411
+ for (const l of built) {
412
+ if (isAncestorDir(l.dir, page.dir)) {
413
+ if (!owner || depth(l.dir) > depth(owner.dir)) owner = l;
414
+ }
415
+ }
416
+ const ownerSegCount = owner ? depth(owner.dir) : 0;
417
+ const remaining = page.segments.slice(ownerSegCount);
418
+ const index = remaining.length === 0;
419
+ const path2 = index ? "/" : remaining.map(segToRouter).join("/");
420
+ const meta = page.kind === "file" ? filePageMeta(page) : extractPageMeta(page.absFile);
421
+ const builtPage = {
422
+ file: page.file,
423
+ routePath: page.routePath,
424
+ parentLayoutId: owner ? owner.id : null,
425
+ path: path2,
426
+ index,
427
+ kind: page.kind
428
+ };
429
+ if (meta.title) builtPage.title = meta.title;
430
+ if (meta.description) builtPage.description = meta.description;
431
+ if (meta.navLabel) builtPage.navLabel = meta.navLabel;
432
+ if (page.fileExt) builtPage.fileExt = page.fileExt;
433
+ if (page.variant) builtPage.variant = page.variant;
434
+ if (meta.placeholder) builtPage.placeholder = meta.placeholder;
435
+ return builtPage;
436
+ });
437
+ const byRoutePath = /* @__PURE__ */ new Map();
438
+ for (const page of pages) {
439
+ const group = byRoutePath.get(page.routePath) ?? { placeholder: [], nonPlaceholder: [] };
440
+ if (page.placeholder) {
441
+ group.placeholder.push(page);
442
+ } else {
443
+ group.nonPlaceholder.push(page);
444
+ }
445
+ byRoutePath.set(page.routePath, group);
446
+ }
447
+ const filteredPages = [];
448
+ for (const group of byRoutePath.values()) {
449
+ if (group.nonPlaceholder.length > 0) {
450
+ filteredPages.push(...group.nonPlaceholder);
451
+ } else {
452
+ filteredPages.push(...group.placeholder);
453
+ }
454
+ }
455
+ return {
456
+ rootLayout: rootLayoutRoute ? rootLayoutRoute.file : null,
457
+ notFound: model.notFound,
458
+ error: model.error,
459
+ layouts: built,
460
+ pages: filteredPages
461
+ };
462
+ }
463
+
464
+ export { DEFAULT_APP_LANG, buildRouteTree, extractAppLang, extractPageMeta, filePageKind, filePageMeta, filePageModuleName, isHomePagePath, isPlaceholderHomePage, isValidLang, maskSource, readBracketBody, readLayoutLang, splitTopLevel, stripComments };
465
+ //# sourceMappingURL=chunk-S5MDTHH7.js.map
466
+ //# sourceMappingURL=chunk-S5MDTHH7.js.map