@squadbase/vantage 0.6.2-dev1.b332e5a → 0.6.2-dev1.d7c0911

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 (212) hide show
  1. package/dist/add-4GHF2TX2.js +6 -0
  2. package/dist/add-4GHF2TX2.js.map +1 -0
  3. package/dist/{build-TVKFIVFQ.js → build-X5NVCQKT.js} +7 -7
  4. package/dist/{build-TVKFIVFQ.js.map → build-X5NVCQKT.js.map} +1 -1
  5. package/dist/{check-3KHZXZMQ.js → check-ZBIH422T.js} +5 -5
  6. package/dist/{check-3KHZXZMQ.js.map → check-ZBIH422T.js.map} +1 -1
  7. package/dist/chunk-2ICNHUG6.js +1820 -0
  8. package/dist/chunk-2ICNHUG6.js.map +1 -0
  9. package/dist/{chunk-5ZOP4SQR.js → chunk-2N72FKLB.js} +12 -7
  10. package/dist/chunk-2N72FKLB.js.map +1 -0
  11. package/dist/{chunk-P7W4LR3Z.js → chunk-7DZGJQ3P.js} +3 -3
  12. package/dist/{chunk-P7W4LR3Z.js.map → chunk-7DZGJQ3P.js.map} +1 -1
  13. package/dist/{chunk-U2M6HGKQ.js → chunk-AABMKHEU.js} +4 -4
  14. package/dist/{chunk-U2M6HGKQ.js.map → chunk-AABMKHEU.js.map} +1 -1
  15. package/dist/{chunk-QI3XQKHS.js → chunk-GNXCX4WE.js} +10 -3
  16. package/dist/chunk-GNXCX4WE.js.map +1 -0
  17. package/dist/{chunk-PXRX5PEC.js → chunk-PDOBHMUQ.js} +3 -3
  18. package/dist/chunk-PDOBHMUQ.js.map +1 -0
  19. package/dist/{chunk-ZVANIULZ.js → chunk-RNTDBX6S.js} +4 -4
  20. package/dist/{chunk-ZVANIULZ.js.map → chunk-RNTDBX6S.js.map} +1 -1
  21. package/dist/{chunk-A2UUGASH.js → chunk-U736PVHY.js} +2 -2
  22. package/dist/chunk-U736PVHY.js.map +1 -0
  23. package/dist/{chunk-PVTHHV7X.js → chunk-V3LF7BE7.js} +27 -5
  24. package/dist/chunk-V3LF7BE7.js.map +1 -0
  25. package/dist/{chunk-LMUACBMA.js → chunk-WAMZWZJB.js} +53 -8
  26. package/dist/chunk-WAMZWZJB.js.map +1 -0
  27. package/dist/chunk-WRSX2MDK.js +7866 -0
  28. package/dist/chunk-WRSX2MDK.js.map +1 -0
  29. package/dist/{chunk-RPZAALCX.js → chunk-XPQSTZUU.js} +254 -164
  30. package/dist/chunk-XPQSTZUU.js.map +1 -0
  31. package/dist/{chunk-DTDVSFRY.js → chunk-XQUSGIDG.js} +17 -3
  32. package/dist/chunk-XQUSGIDG.js.map +1 -0
  33. package/dist/cli.js +12 -11
  34. package/dist/cli.js.map +1 -1
  35. package/dist/client/index.d.ts +32 -3
  36. package/dist/client/index.js +205 -12
  37. package/dist/client/index.js.map +1 -1
  38. package/dist/components/index.d.ts +1975 -28
  39. package/dist/components/index.js +4 -4
  40. package/dist/{dev-GDKATCC7.js → dev-4XEDTELV.js} +8 -8
  41. package/dist/dev-4XEDTELV.js.map +1 -0
  42. package/dist/doc/index.js +2 -2
  43. package/dist/doc/index.js.map +1 -1
  44. package/dist/{docs-EJJ3BECT.js → docs-JVP4RPKT.js} +3 -3
  45. package/dist/{docs-EJJ3BECT.js.map → docs-JVP4RPKT.js.map} +1 -1
  46. package/dist/{doctor-WQXPXP6K.js → doctor-5E2VEZPK.js} +5 -5
  47. package/dist/{doctor-WQXPXP6K.js.map → doctor-5E2VEZPK.js.map} +1 -1
  48. package/dist/markdown/index.js +1 -1
  49. package/dist/markdown/index.js.map +1 -1
  50. package/dist/{preview-OGMCNQUO.js → preview-T6CLSQVX.js} +3 -3
  51. package/dist/{preview-OGMCNQUO.js.map → preview-T6CLSQVX.js.map} +1 -1
  52. package/dist/query/index.d.ts +0 -11
  53. package/dist/query/index.js +2 -2
  54. package/dist/{routes-MWBWWOJ2.js → routes-3SGAFDMC.js} +4 -4
  55. package/dist/{routes-MWBWWOJ2.js.map → routes-3SGAFDMC.js.map} +1 -1
  56. package/dist/{search-6Y422SV6.js → search-5LC4XPB5.js} +3 -3
  57. package/dist/{search-6Y422SV6.js.map → search-5LC4XPB5.js.map} +1 -1
  58. package/dist/table/index.js +10 -9
  59. package/dist/table/index.js.map +1 -1
  60. package/dist/ui/index.d.ts +144 -11
  61. package/dist/ui/index.js +1339 -87
  62. package/dist/ui/index.js.map +1 -1
  63. package/dist/{upgrade-HCANX4GQ.js → upgrade-JHXZBGQS.js} +6 -6
  64. package/dist/{upgrade-HCANX4GQ.js.map → upgrade-JHXZBGQS.js.map} +1 -1
  65. package/dist/vite/index.d.ts +10 -0
  66. package/dist/vite/index.js +3 -3
  67. package/docs/en/components.md +29 -15
  68. package/docs/en/parts/data-table.md +22 -0
  69. package/docs/en/parts/delta.md +50 -0
  70. package/docs/en/parts/format.md +43 -0
  71. package/docs/en/parts/kpi-card.md +57 -0
  72. package/docs/en/parts/metric-value.md +3 -2
  73. package/docs/en/parts/sparkline.md +1 -1
  74. package/docs/en/parts/trend-indicator.md +17 -1
  75. package/docs/en/ui-and-theming.md +1 -1
  76. package/docs/index.json +366 -76
  77. package/docs/ja/changelog.md +31 -0
  78. package/docs/ja/components.md +57 -101
  79. package/docs/ja/page-types/csv.md +83 -0
  80. package/docs/ja/page-types/doc.md +83 -0
  81. package/docs/ja/page-types/excel.md +82 -0
  82. package/docs/ja/page-types/slide.md +132 -0
  83. package/docs/ja/page-types.md +47 -0
  84. package/docs/ja/parts/area-chart.md +61 -0
  85. package/docs/ja/parts/bar-chart.md +69 -0
  86. package/docs/ja/parts/bar-list.md +35 -0
  87. package/docs/ja/parts/category-bar.md +36 -0
  88. package/docs/ja/parts/data-table.md +22 -0
  89. package/docs/ja/parts/delta.md +50 -0
  90. package/docs/ja/parts/donut-chart.md +47 -0
  91. package/docs/ja/parts/echart.md +3 -0
  92. package/docs/ja/parts/format.md +44 -0
  93. package/docs/ja/parts/kpi-card.md +55 -0
  94. package/docs/ja/parts/line-chart.md +58 -0
  95. package/docs/ja/parts/metric-value.md +3 -2
  96. package/docs/ja/parts/progress-circle.md +34 -0
  97. package/docs/ja/parts/sparkline.md +2 -2
  98. package/docs/ja/parts/tracker.md +32 -0
  99. package/docs/ja/parts/trend-indicator.md +17 -1
  100. package/docs/ja/routing.md +8 -86
  101. package/docs/ja/ui/alert-dialog.md +41 -0
  102. package/docs/ja/ui/avatar.md +31 -0
  103. package/docs/ja/ui/combobox.md +74 -0
  104. package/docs/ja/ui/drawer.md +41 -0
  105. package/docs/ja/ui/field.md +42 -0
  106. package/docs/ja/ui/hover-card.md +21 -0
  107. package/docs/ja/ui/kbd.md +16 -0
  108. package/docs/ja/ui/pagination.md +36 -0
  109. package/docs/ja/ui/radio-group.md +21 -0
  110. package/docs/ja/ui/toast.md +46 -0
  111. package/docs/ja/ui-and-theming.md +14 -7
  112. package/package.json +13 -4
  113. package/registry/ui/accordion.tsx +76 -0
  114. package/registry/ui/alert-dialog.tsx +189 -0
  115. package/registry/ui/alert.tsx +80 -0
  116. package/registry/ui/app-shell.tsx +287 -0
  117. package/registry/ui/area-chart.tsx +3639 -0
  118. package/registry/ui/avatar.tsx +110 -0
  119. package/registry/ui/badge.tsx +56 -0
  120. package/registry/ui/bar-chart.tsx +3636 -0
  121. package/registry/ui/bar-list.tsx +3680 -0
  122. package/registry/ui/breadcrumb.tsx +128 -0
  123. package/registry/ui/button.tsx +62 -0
  124. package/registry/ui/calendar.tsx +223 -0
  125. package/registry/ui/card.tsx +107 -0
  126. package/registry/ui/category-bar.tsx +1255 -0
  127. package/registry/ui/chart-frame.tsx +1358 -0
  128. package/registry/ui/checkbox.tsx +30 -0
  129. package/registry/ui/collapsible.tsx +23 -0
  130. package/registry/ui/combobox.tsx +310 -0
  131. package/registry/ui/command.tsx +198 -0
  132. package/registry/ui/dashboard-card.tsx +217 -0
  133. package/registry/ui/data-table.tsx +693 -146
  134. package/registry/ui/date-range-picker.tsx +390 -0
  135. package/registry/ui/delta.tsx +188 -0
  136. package/registry/ui/dialog.tsx +161 -0
  137. package/registry/ui/donut-chart.tsx +3688 -0
  138. package/registry/ui/drawer.tsx +229 -0
  139. package/registry/ui/dropdown-menu.tsx +274 -0
  140. package/registry/ui/echart.tsx +890 -0
  141. package/registry/ui/field.tsx +240 -0
  142. package/registry/ui/filter-bar.tsx +392 -0
  143. package/registry/ui/funnel-steps.tsx +3541 -0
  144. package/registry/ui/heatmap.tsx +1752 -0
  145. package/registry/ui/hover-card.tsx +52 -0
  146. package/registry/ui/input-group.tsx +160 -0
  147. package/registry/ui/input.tsx +24 -0
  148. package/registry/ui/kbd.tsx +30 -0
  149. package/registry/ui/kpi-card.tsx +677 -0
  150. package/registry/ui/label.tsx +22 -0
  151. package/registry/ui/legend.tsx +3500 -0
  152. package/registry/ui/line-chart.tsx +3637 -0
  153. package/registry/ui/metric-value.tsx +62 -0
  154. package/registry/ui/multi-select.tsx +232 -0
  155. package/registry/ui/page-shell.tsx +282 -0
  156. package/registry/ui/pagination.tsx +140 -0
  157. package/registry/ui/placeholder.tsx +36 -0
  158. package/registry/ui/popover.tsx +92 -0
  159. package/registry/ui/progress-circle.tsx +867 -0
  160. package/registry/ui/progress.tsx +85 -0
  161. package/registry/ui/radio-group.tsx +39 -0
  162. package/registry/ui/sample-data.tsx +86 -0
  163. package/registry/ui/scatter-chart.tsx +4150 -0
  164. package/registry/ui/scroll-area.tsx +56 -0
  165. package/registry/ui/searchable-select.tsx +214 -0
  166. package/registry/ui/section-header.tsx +43 -0
  167. package/registry/ui/segmented-control.tsx +76 -0
  168. package/registry/ui/select.tsx +255 -0
  169. package/registry/ui/separator.tsx +27 -0
  170. package/registry/ui/sheet.tsx +139 -0
  171. package/registry/ui/sidebar.tsx +725 -0
  172. package/registry/ui/skeleton.tsx +17 -0
  173. package/registry/ui/slider.tsx +56 -0
  174. package/registry/ui/sparkline.tsx +230 -0
  175. package/registry/ui/spinner.tsx +14 -0
  176. package/registry/ui/states.tsx +90 -0
  177. package/registry/ui/status-badge.tsx +121 -0
  178. package/registry/ui/switch.tsx +34 -0
  179. package/registry/ui/table.tsx +118 -0
  180. package/registry/ui/tabs.tsx +84 -0
  181. package/registry/ui/textarea.tsx +22 -0
  182. package/registry/ui/toast.tsx +250 -0
  183. package/registry/ui/toggle-group.tsx +91 -0
  184. package/registry/ui/toggle.tsx +47 -0
  185. package/registry/ui/tooltip.tsx +68 -0
  186. package/registry/ui/tracker.tsx +843 -0
  187. package/registry/ui/trend-indicator.tsx +74 -0
  188. package/registry/ui/updated-at.tsx +122 -0
  189. package/registry/ui/waterfall-chart.tsx +4186 -0
  190. package/skills/vantage-add-feature/SKILL.md +9 -7
  191. package/skills/vantage-pitfalls/SKILL.md +5 -1
  192. package/templates/AGENTS.md +22 -1
  193. package/templates/agents/csv.md +2 -1
  194. package/templates/agents/doc.md +4 -3
  195. package/templates/agents/page.md +20 -6
  196. package/templates/agents/xlsx.md +2 -1
  197. package/theme.css +237 -136
  198. package/dist/add-DY4AXANK.js +0 -6
  199. package/dist/add-DY4AXANK.js.map +0 -1
  200. package/dist/chunk-5ZOP4SQR.js.map +0 -1
  201. package/dist/chunk-A2UUGASH.js.map +0 -1
  202. package/dist/chunk-DTDVSFRY.js.map +0 -1
  203. package/dist/chunk-LMUACBMA.js.map +0 -1
  204. package/dist/chunk-NKFBFDRZ.js +0 -2241
  205. package/dist/chunk-NKFBFDRZ.js.map +0 -1
  206. package/dist/chunk-PVTHHV7X.js.map +0 -1
  207. package/dist/chunk-PXRX5PEC.js.map +0 -1
  208. package/dist/chunk-QI3XQKHS.js.map +0 -1
  209. package/dist/chunk-RPZAALCX.js.map +0 -1
  210. package/dist/chunk-VA776YE5.js +0 -316
  211. package/dist/chunk-VA776YE5.js.map +0 -1
  212. package/dist/dev-GDKATCC7.js.map +0 -1
@@ -0,0 +1,76 @@
1
+ // Copied by `vantage add ui accordion`. This file is yours to edit.
2
+ // Generated from @squadbase/squadkit registry/ui/accordion.tsx by `npm run registry` (in Vantage, edit packages/squadkit, not registry/).
3
+ "use client"
4
+
5
+ import { Accordion as AccordionPrimitive } from "@base-ui/react/accordion"
6
+
7
+ import { cn } from "@squadbase/vantage/ui"
8
+ import { ChevronDownIcon, ChevronUpIcon } from "lucide-react"
9
+
10
+ function Accordion({ className, ...props }: AccordionPrimitive.Root.Props) {
11
+ return (
12
+ <AccordionPrimitive.Root
13
+ data-slot="accordion"
14
+ className={cn("flex w-full flex-col", className)}
15
+ {...props}
16
+ />
17
+ )
18
+ }
19
+
20
+ function AccordionItem({ className, ...props }: AccordionPrimitive.Item.Props) {
21
+ return (
22
+ <AccordionPrimitive.Item
23
+ data-slot="accordion-item"
24
+ className={cn("not-last:border-b", className)}
25
+ {...props}
26
+ />
27
+ )
28
+ }
29
+
30
+ function AccordionTrigger({
31
+ className,
32
+ children,
33
+ ...props
34
+ }: AccordionPrimitive.Trigger.Props) {
35
+ return (
36
+ <AccordionPrimitive.Header className="flex">
37
+ <AccordionPrimitive.Trigger
38
+ data-slot="accordion-trigger"
39
+ className={cn(
40
+ "group/accordion-trigger relative flex flex-1 items-start justify-between rounded-lg border border-transparent py-2.5 text-left text-sm font-medium transition-all outline-none hover:underline focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 focus-visible:after:border-ring aria-disabled:pointer-events-none aria-disabled:opacity-50 **:data-[slot=accordion-trigger-icon]:ml-auto **:data-[slot=accordion-trigger-icon]:size-4 **:data-[slot=accordion-trigger-icon]:text-muted-foreground",
41
+ className
42
+ )}
43
+ {...props}
44
+ >
45
+ {children}
46
+ <ChevronDownIcon data-slot="accordion-trigger-icon" className="pointer-events-none shrink-0 group-aria-expanded/accordion-trigger:hidden" />
47
+ <ChevronUpIcon data-slot="accordion-trigger-icon" className="pointer-events-none hidden shrink-0 group-aria-expanded/accordion-trigger:inline" />
48
+ </AccordionPrimitive.Trigger>
49
+ </AccordionPrimitive.Header>
50
+ )
51
+ }
52
+
53
+ function AccordionContent({
54
+ className,
55
+ children,
56
+ ...props
57
+ }: AccordionPrimitive.Panel.Props) {
58
+ return (
59
+ <AccordionPrimitive.Panel
60
+ data-slot="accordion-content"
61
+ className="overflow-hidden text-sm data-open:animate-accordion-down data-closed:animate-accordion-up motion-reduce:animate-none"
62
+ {...props}
63
+ >
64
+ <div
65
+ className={cn(
66
+ "h-(--accordion-panel-height) pt-0 pb-2.5 data-ending-style:h-0 data-starting-style:h-0 [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground [&_p:not(:last-child)]:mb-4",
67
+ className
68
+ )}
69
+ >
70
+ {children}
71
+ </div>
72
+ </AccordionPrimitive.Panel>
73
+ )
74
+ }
75
+
76
+ export { Accordion, AccordionItem, AccordionTrigger, AccordionContent }
@@ -0,0 +1,189 @@
1
+ // Copied by `vantage add ui alert-dialog`. This file is yours to edit.
2
+ // Generated from @squadbase/squadkit registry/ui/alert-dialog.tsx by `npm run registry` (in Vantage, edit packages/squadkit, not registry/).
3
+ "use client"
4
+
5
+ import * as React from "react"
6
+ import { AlertDialog as AlertDialogPrimitive } from "@base-ui/react/alert-dialog"
7
+ import { cn } from "@squadbase/vantage/ui"
8
+
9
+ import { Button } from "@squadbase/vantage/ui"
10
+
11
+ function AlertDialog({ ...props }: AlertDialogPrimitive.Root.Props) {
12
+ return <AlertDialogPrimitive.Root data-slot="alert-dialog" {...props} />
13
+ }
14
+
15
+ function AlertDialogTrigger({ ...props }: AlertDialogPrimitive.Trigger.Props) {
16
+ return (
17
+ <AlertDialogPrimitive.Trigger data-slot="alert-dialog-trigger" {...props} />
18
+ )
19
+ }
20
+
21
+ function AlertDialogPortal({ ...props }: AlertDialogPrimitive.Portal.Props) {
22
+ return (
23
+ <AlertDialogPrimitive.Portal data-slot="alert-dialog-portal" {...props} />
24
+ )
25
+ }
26
+
27
+ function AlertDialogOverlay({
28
+ className,
29
+ ...props
30
+ }: AlertDialogPrimitive.Backdrop.Props) {
31
+ return (
32
+ <AlertDialogPrimitive.Backdrop
33
+ data-slot="alert-dialog-overlay"
34
+ className={cn(
35
+ "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",
36
+ className
37
+ )}
38
+ {...props}
39
+ />
40
+ )
41
+ }
42
+
43
+ function AlertDialogContent({
44
+ className,
45
+ size = "default",
46
+ ...props
47
+ }: AlertDialogPrimitive.Popup.Props & {
48
+ size?: "default" | "sm"
49
+ }) {
50
+ return (
51
+ <AlertDialogPortal>
52
+ <AlertDialogOverlay />
53
+ <AlertDialogPrimitive.Popup
54
+ data-slot="alert-dialog-content"
55
+ data-size={size}
56
+ className={cn(
57
+ "group/alert-dialog-content fixed top-1/2 left-1/2 z-50 grid w-full -translate-x-1/2 -translate-y-1/2 gap-4 rounded-xl bg-popover p-4 text-popover-foreground ring-1 ring-foreground/10 duration-100 outline-none data-[size=default]:max-w-xs data-[size=sm]:max-w-xs data-[size=default]: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",
58
+ className
59
+ )}
60
+ {...props}
61
+ />
62
+ </AlertDialogPortal>
63
+ )
64
+ }
65
+
66
+ function AlertDialogHeader({
67
+ className,
68
+ ...props
69
+ }: React.ComponentProps<"div">) {
70
+ return (
71
+ <div
72
+ data-slot="alert-dialog-header"
73
+ className={cn(
74
+ "grid grid-rows-[auto_1fr] place-items-center gap-1.5 text-center has-data-[slot=alert-dialog-media]:grid-rows-[auto_auto_1fr] has-data-[slot=alert-dialog-media]:gap-x-4 sm:group-data-[size=default]/alert-dialog-content:place-items-start sm:group-data-[size=default]/alert-dialog-content:text-left sm:group-data-[size=default]/alert-dialog-content:has-data-[slot=alert-dialog-media]:grid-rows-[auto_1fr]",
75
+ className
76
+ )}
77
+ {...props}
78
+ />
79
+ )
80
+ }
81
+
82
+ function AlertDialogFooter({
83
+ className,
84
+ ...props
85
+ }: React.ComponentProps<"div">) {
86
+ return (
87
+ <div
88
+ data-slot="alert-dialog-footer"
89
+ className={cn(
90
+ "-mx-4 -mb-4 flex flex-col-reverse gap-2 rounded-b-xl border-t bg-muted/50 p-4 group-data-[size=sm]/alert-dialog-content:grid group-data-[size=sm]/alert-dialog-content:grid-cols-2 sm:flex-row sm:justify-end",
91
+ className
92
+ )}
93
+ {...props}
94
+ />
95
+ )
96
+ }
97
+
98
+ function AlertDialogMedia({
99
+ className,
100
+ ...props
101
+ }: React.ComponentProps<"div">) {
102
+ return (
103
+ <div
104
+ data-slot="alert-dialog-media"
105
+ className={cn(
106
+ "mb-2 inline-flex size-10 items-center justify-center rounded-md bg-muted sm:group-data-[size=default]/alert-dialog-content:row-span-2 *:[svg:not([class*='size-'])]:size-6",
107
+ className
108
+ )}
109
+ {...props}
110
+ />
111
+ )
112
+ }
113
+
114
+ function AlertDialogTitle({
115
+ className,
116
+ ...props
117
+ }: React.ComponentProps<typeof AlertDialogPrimitive.Title>) {
118
+ return (
119
+ <AlertDialogPrimitive.Title
120
+ data-slot="alert-dialog-title"
121
+ className={cn(
122
+ "cn-font-heading text-base font-medium sm:group-data-[size=default]/alert-dialog-content:group-has-data-[slot=alert-dialog-media]/alert-dialog-content:col-start-2",
123
+ className
124
+ )}
125
+ {...props}
126
+ />
127
+ )
128
+ }
129
+
130
+ function AlertDialogDescription({
131
+ className,
132
+ ...props
133
+ }: React.ComponentProps<typeof AlertDialogPrimitive.Description>) {
134
+ return (
135
+ <AlertDialogPrimitive.Description
136
+ data-slot="alert-dialog-description"
137
+ className={cn(
138
+ "text-sm text-balance text-muted-foreground md:text-pretty *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground",
139
+ className
140
+ )}
141
+ {...props}
142
+ />
143
+ )
144
+ }
145
+
146
+ function AlertDialogAction({
147
+ className,
148
+ ...props
149
+ }: React.ComponentProps<typeof Button>) {
150
+ return (
151
+ <Button
152
+ data-slot="alert-dialog-action"
153
+ className={cn(className)}
154
+ {...props}
155
+ />
156
+ )
157
+ }
158
+
159
+ function AlertDialogCancel({
160
+ className,
161
+ variant = "outline",
162
+ size = "default",
163
+ ...props
164
+ }: AlertDialogPrimitive.Close.Props &
165
+ Pick<React.ComponentProps<typeof Button>, "variant" | "size">) {
166
+ return (
167
+ <AlertDialogPrimitive.Close
168
+ data-slot="alert-dialog-cancel"
169
+ className={cn(className)}
170
+ render={<Button variant={variant} size={size} />}
171
+ {...props}
172
+ />
173
+ )
174
+ }
175
+
176
+ export {
177
+ AlertDialog,
178
+ AlertDialogAction,
179
+ AlertDialogCancel,
180
+ AlertDialogContent,
181
+ AlertDialogDescription,
182
+ AlertDialogFooter,
183
+ AlertDialogHeader,
184
+ AlertDialogMedia,
185
+ AlertDialogOverlay,
186
+ AlertDialogPortal,
187
+ AlertDialogTitle,
188
+ AlertDialogTrigger,
189
+ }
@@ -0,0 +1,80 @@
1
+ // Copied by `vantage add ui alert`. This file is yours to edit.
2
+ // Generated from @squadbase/squadkit registry/ui/alert.tsx by `npm run registry` (in Vantage, edit packages/squadkit, not registry/).
3
+ "use client"
4
+
5
+ import * as React from "react"
6
+ import { cva, type VariantProps } from "class-variance-authority"
7
+
8
+ import { cn } from "@squadbase/vantage/ui"
9
+
10
+ const alertVariants = cva(
11
+ "group/alert relative grid w-full gap-0.5 rounded-lg border px-2.5 py-2 text-left text-sm has-data-[slot=alert-action]:relative has-data-[slot=alert-action]:pr-18 has-[>svg]:grid-cols-[auto_1fr] has-[>svg]:gap-x-2 *:[svg]:row-span-2 *:[svg]:translate-y-0.5 *:[svg]:text-current *:[svg:not([class*='size-'])]:size-4",
12
+ {
13
+ variants: {
14
+ variant: {
15
+ default: "bg-card text-card-foreground",
16
+ destructive:
17
+ "bg-card text-destructive *:data-[slot=alert-description]:text-destructive/90 *:[svg]:text-current",
18
+ },
19
+ },
20
+ defaultVariants: {
21
+ variant: "default",
22
+ },
23
+ }
24
+ )
25
+
26
+ function Alert({
27
+ className,
28
+ variant,
29
+ ...props
30
+ }: React.ComponentProps<"div"> & VariantProps<typeof alertVariants>) {
31
+ return (
32
+ <div
33
+ data-slot="alert"
34
+ role="alert"
35
+ className={cn(alertVariants({ variant }), className)}
36
+ {...props}
37
+ />
38
+ )
39
+ }
40
+
41
+ function AlertTitle({ className, ...props }: React.ComponentProps<"div">) {
42
+ return (
43
+ <div
44
+ data-slot="alert-title"
45
+ className={cn(
46
+ "font-medium group-has-[>svg]/alert:col-start-2 [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground",
47
+ className
48
+ )}
49
+ {...props}
50
+ />
51
+ )
52
+ }
53
+
54
+ function AlertDescription({
55
+ className,
56
+ ...props
57
+ }: React.ComponentProps<"div">) {
58
+ return (
59
+ <div
60
+ data-slot="alert-description"
61
+ className={cn(
62
+ "text-sm text-balance text-muted-foreground md:text-pretty [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground [&_p:not(:last-child)]:mb-4",
63
+ className
64
+ )}
65
+ {...props}
66
+ />
67
+ )
68
+ }
69
+
70
+ function AlertAction({ className, ...props }: React.ComponentProps<"div">) {
71
+ return (
72
+ <div
73
+ data-slot="alert-action"
74
+ className={cn("absolute top-2 right-2", className)}
75
+ {...props}
76
+ />
77
+ )
78
+ }
79
+
80
+ export { Alert, AlertTitle, AlertDescription, AlertAction }
@@ -0,0 +1,287 @@
1
+ // Copied by `vantage add ui app-shell`. This file is yours to edit.
2
+ // Generated from @squadbase/squadkit registry/components/app-shell.tsx by `npm run registry` (in Vantage, edit packages/squadkit, not registry/).
3
+ "use client"
4
+
5
+ /**
6
+ * AppShell — the outermost application frame. `variant="sidebar"` (default)
7
+ * renders a collapsible sidebar with nested nav groups; `variant="header"`
8
+ * collapses the same nav into a single select in a top bar.
9
+ *
10
+ * Navigation is router-agnostic: pass `linkComponent` to render links with your
11
+ * router's Link, or leave it and `onNavigate` handles the header variant.
12
+ */
13
+ import { forwardRef, type ElementType, type ReactNode } from "react"
14
+ import { ChevronRight } from "lucide-react"
15
+
16
+ import { cn } from "@squadbase/vantage/ui"
17
+ import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "@squadbase/vantage/ui"
18
+ import { Separator } from "@squadbase/vantage/ui"
19
+ import {
20
+ Select,
21
+ SelectContent,
22
+ SelectGroup,
23
+ SelectItem,
24
+ SelectLabel,
25
+ SelectTrigger,
26
+ SelectValue,
27
+ } from "@squadbase/vantage/ui"
28
+ import {
29
+ Sidebar,
30
+ SidebarContent,
31
+ SidebarFooter,
32
+ SidebarGroup,
33
+ SidebarGroupLabel,
34
+ SidebarInset,
35
+ SidebarMenu,
36
+ SidebarMenuBadge,
37
+ SidebarMenuButton,
38
+ SidebarMenuItem,
39
+ SidebarMenuSub,
40
+ SidebarMenuSubButton,
41
+ SidebarMenuSubItem,
42
+ SidebarProvider,
43
+ SidebarRail,
44
+ SidebarTrigger,
45
+ } from "@squadbase/vantage/ui"
46
+ import type { NavGroup, NavItem } from "@squadbase/vantage/components"
47
+
48
+ export interface AppShellSidebarProps {
49
+ variant?: "sidebar"
50
+ groups: NavGroup[]
51
+ actions?: ReactNode
52
+ header?: ReactNode
53
+ children: ReactNode
54
+ defaultOpen?: boolean
55
+ className?: string
56
+ linkComponent?: ElementType
57
+ onNavigate?: (href: string) => void
58
+ }
59
+
60
+ export interface AppShellHeaderProps {
61
+ variant: "header"
62
+ groups: NavGroup[]
63
+ actions?: ReactNode
64
+ header?: ReactNode
65
+ children: ReactNode
66
+ className?: string
67
+ linkComponent?: ElementType
68
+ onNavigate?: (href: string) => void
69
+ }
70
+
71
+ export type AppShellProps = AppShellSidebarProps | AppShellHeaderProps
72
+
73
+ /** Nested groups collapse to their leaves — the select is a flat list. */
74
+ function flattenItems(item: NavItem): NavItem[] {
75
+ if (item.children && item.children.length > 0) {
76
+ return item.children.flatMap(flattenItems)
77
+ }
78
+ return [item]
79
+ }
80
+
81
+ function NavSelect({
82
+ groups,
83
+ onNavigate,
84
+ }: {
85
+ groups: NavGroup[]
86
+ onNavigate: (href: string) => void
87
+ }) {
88
+ const allItems = groups.flatMap((g) => g.items.flatMap(flattenItems))
89
+ const currentValue = allItems.find((item) => item.isActive)?.href ?? ""
90
+ // Base UI's SelectValue renders the raw value (the href) unless `items` maps
91
+ // it to a label, so pass the page names explicitly.
92
+ const selectItems = allItems.map((item) => ({ value: item.href, label: item.label }))
93
+
94
+ return (
95
+ <Select
96
+ items={selectItems}
97
+ value={currentValue}
98
+ onValueChange={(href) => {
99
+ // Base UI reports `null` when the selection is cleared; there is no
100
+ // page to navigate to in that case.
101
+ if (href !== null) onNavigate(href)
102
+ }}
103
+ >
104
+ <SelectTrigger size="sm" className="w-48">
105
+ <SelectValue placeholder="ページを選択" />
106
+ </SelectTrigger>
107
+ {/*
108
+ Page titles are author-written and often longer than the 12rem trigger,
109
+ so the list is allowed to grow past the anchor width (bounded by the
110
+ viewport) instead of clamping every title to the trigger's width.
111
+ */}
112
+ <SelectContent
113
+ align="start"
114
+ className="w-auto min-w-(--anchor-width) max-w-[min(24rem,var(--available-width))]"
115
+ >
116
+ {groups.map((group, index) => (
117
+ <SelectGroup key={group.label ?? index}>
118
+ {group.label && <SelectLabel>{group.label}</SelectLabel>}
119
+ {group.items.flatMap(flattenItems).map((item) => (
120
+ <SelectItem key={item.href} value={item.href} disabled={item.disabled}>
121
+ {item.label}
122
+ </SelectItem>
123
+ ))}
124
+ </SelectGroup>
125
+ ))}
126
+ </SelectContent>
127
+ </Select>
128
+ )
129
+ }
130
+
131
+ function NavItemWithChildren({
132
+ item,
133
+ linkComponent: LinkComponent = "a",
134
+ }: {
135
+ item: NavItem
136
+ linkComponent?: ElementType
137
+ }) {
138
+ return (
139
+ <Collapsible
140
+ defaultOpen={item.isActive}
141
+ className="group/collapsible"
142
+ render={<SidebarMenuItem />}
143
+ >
144
+ <CollapsibleTrigger
145
+ render={
146
+ <SidebarMenuButton
147
+ tooltip={item.label}
148
+ aria-disabled={item.disabled}
149
+ className={cn(item.disabled && "pointer-events-none")}
150
+ />
151
+ }
152
+ >
153
+ {item.icon && <item.icon />}
154
+ <span>{item.label}</span>
155
+ <ChevronRight className="ml-auto transition-transform duration-200 group-data-open/collapsible:rotate-90" />
156
+ </CollapsibleTrigger>
157
+ {item.badge && <SidebarMenuBadge>{item.badge}</SidebarMenuBadge>}
158
+ <CollapsibleContent>
159
+ <SidebarMenuSub>
160
+ {item.children!.map((child) => (
161
+ <SidebarMenuSubItem key={child.href}>
162
+ <SidebarMenuSubButton
163
+ isActive={child.isActive}
164
+ render={
165
+ <LinkComponent
166
+ href={child.href}
167
+ aria-disabled={child.disabled}
168
+ tabIndex={child.disabled ? -1 : undefined}
169
+ className={cn(child.disabled && "pointer-events-none opacity-50")}
170
+ />
171
+ }
172
+ >
173
+ {child.icon && <child.icon />}
174
+ <span>{child.label}</span>
175
+ </SidebarMenuSubButton>
176
+ </SidebarMenuSubItem>
177
+ ))}
178
+ </SidebarMenuSub>
179
+ </CollapsibleContent>
180
+ </Collapsible>
181
+ )
182
+ }
183
+
184
+ function NavItemLink({
185
+ item,
186
+ linkComponent: LinkComponent = "a",
187
+ }: {
188
+ item: NavItem
189
+ linkComponent?: ElementType
190
+ }) {
191
+ return (
192
+ <SidebarMenuItem>
193
+ <SidebarMenuButton
194
+ tooltip={item.label}
195
+ isActive={item.isActive}
196
+ render={
197
+ <LinkComponent
198
+ href={item.href}
199
+ aria-disabled={item.disabled}
200
+ tabIndex={item.disabled ? -1 : undefined}
201
+ className={cn(item.disabled && "pointer-events-none")}
202
+ />
203
+ }
204
+ >
205
+ {item.icon && <item.icon />}
206
+ <span>{item.label}</span>
207
+ </SidebarMenuButton>
208
+ {item.badge && <SidebarMenuBadge>{item.badge}</SidebarMenuBadge>}
209
+ </SidebarMenuItem>
210
+ )
211
+ }
212
+
213
+ const defaultNavigate = (href: string) => {
214
+ window.location.assign(href)
215
+ }
216
+
217
+ export const AppShell = forwardRef<HTMLDivElement, AppShellProps>((props, ref) => {
218
+ const {
219
+ variant = "sidebar",
220
+ groups,
221
+ actions,
222
+ header,
223
+ children,
224
+ className,
225
+ linkComponent,
226
+ onNavigate = defaultNavigate,
227
+ } = props
228
+
229
+ if (variant === "header") {
230
+ return (
231
+ <div ref={ref} data-slot="app-shell" className={cn("flex h-full flex-col", className)}>
232
+ {header !== undefined ? (
233
+ header
234
+ ) : (
235
+ <header className="flex h-14 shrink-0 items-center gap-3 border-b px-4">
236
+ {groups.length > 0 && <NavSelect groups={groups} onNavigate={onNavigate} />}
237
+ {actions && <div className="ml-auto flex items-center gap-2">{actions}</div>}
238
+ </header>
239
+ )}
240
+ <main className="flex-1 overflow-auto">{children}</main>
241
+ </div>
242
+ )
243
+ }
244
+
245
+ const { defaultOpen = true } = props as AppShellSidebarProps
246
+
247
+ return (
248
+ <SidebarProvider defaultOpen={defaultOpen}>
249
+ <Sidebar data-slot="app-sidebar" collapsible="offcanvas">
250
+ <SidebarContent>
251
+ {groups.map((group, index) => (
252
+ <SidebarGroup key={group.label ?? index}>
253
+ {group.label && <SidebarGroupLabel>{group.label}</SidebarGroupLabel>}
254
+ <SidebarMenu>
255
+ {group.items.map((item) =>
256
+ item.children && item.children.length > 0 ? (
257
+ <NavItemWithChildren
258
+ key={item.href}
259
+ item={item}
260
+ linkComponent={linkComponent}
261
+ />
262
+ ) : (
263
+ <NavItemLink key={item.href} item={item} linkComponent={linkComponent} />
264
+ ),
265
+ )}
266
+ </SidebarMenu>
267
+ </SidebarGroup>
268
+ ))}
269
+ </SidebarContent>
270
+ {actions && <SidebarFooter>{actions}</SidebarFooter>}
271
+ <SidebarRail />
272
+ </Sidebar>
273
+ <SidebarInset ref={ref} data-slot="app-shell" className={className}>
274
+ {header !== undefined ? (
275
+ header
276
+ ) : (
277
+ <header className="flex h-14 shrink-0 items-center gap-2 border-b px-4">
278
+ <SidebarTrigger />
279
+ <Separator orientation="vertical" className="h-4" />
280
+ </header>
281
+ )}
282
+ <main className="flex-1 overflow-auto">{children}</main>
283
+ </SidebarInset>
284
+ </SidebarProvider>
285
+ )
286
+ })
287
+ AppShell.displayName = "AppShell"