@helloleo/plugins 0.2.20 → 0.2.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +61 -36
- package/package.json +3 -4
- package/dist/templates/tanstack-router-2026-06-15/components.json +0 -22
- package/dist/templates/tanstack-router-2026-06-15/index.html +0 -20
- package/dist/templates/tanstack-router-2026-06-15/package.json +0 -90
- package/dist/templates/tanstack-router-2026-06-15/src/components/error-component.tsx +0 -50
- package/dist/templates/tanstack-router-2026-06-15/src/components/ui/accordion.tsx +0 -51
- package/dist/templates/tanstack-router-2026-06-15/src/components/ui/alert-dialog.tsx +0 -115
- package/dist/templates/tanstack-router-2026-06-15/src/components/ui/alert.tsx +0 -49
- package/dist/templates/tanstack-router-2026-06-15/src/components/ui/aspect-ratio.tsx +0 -5
- package/dist/templates/tanstack-router-2026-06-15/src/components/ui/avatar.tsx +0 -47
- package/dist/templates/tanstack-router-2026-06-15/src/components/ui/badge.tsx +0 -32
- package/dist/templates/tanstack-router-2026-06-15/src/components/ui/breadcrumb.tsx +0 -101
- package/dist/templates/tanstack-router-2026-06-15/src/components/ui/button.tsx +0 -49
- package/dist/templates/tanstack-router-2026-06-15/src/components/ui/calendar.tsx +0 -177
- package/dist/templates/tanstack-router-2026-06-15/src/components/ui/card.tsx +0 -55
- package/dist/templates/tanstack-router-2026-06-15/src/components/ui/carousel.tsx +0 -240
- package/dist/templates/tanstack-router-2026-06-15/src/components/ui/chart.tsx +0 -331
- package/dist/templates/tanstack-router-2026-06-15/src/components/ui/checkbox.tsx +0 -26
- package/dist/templates/tanstack-router-2026-06-15/src/components/ui/collapsible.tsx +0 -11
- package/dist/templates/tanstack-router-2026-06-15/src/components/ui/command.tsx +0 -143
- package/dist/templates/tanstack-router-2026-06-15/src/components/ui/context-menu.tsx +0 -187
- package/dist/templates/tanstack-router-2026-06-15/src/components/ui/dialog.tsx +0 -104
- package/dist/templates/tanstack-router-2026-06-15/src/components/ui/drawer.tsx +0 -98
- package/dist/templates/tanstack-router-2026-06-15/src/components/ui/dropdown-menu.tsx +0 -188
- package/dist/templates/tanstack-router-2026-06-15/src/components/ui/form.tsx +0 -171
- package/dist/templates/tanstack-router-2026-06-15/src/components/ui/hover-card.tsx +0 -27
- package/dist/templates/tanstack-router-2026-06-15/src/components/ui/input-otp.tsx +0 -69
- package/dist/templates/tanstack-router-2026-06-15/src/components/ui/input.tsx +0 -22
- package/dist/templates/tanstack-router-2026-06-15/src/components/ui/label.tsx +0 -21
- package/dist/templates/tanstack-router-2026-06-15/src/components/ui/menubar.tsx +0 -229
- package/dist/templates/tanstack-router-2026-06-15/src/components/ui/navigation-menu.tsx +0 -120
- package/dist/templates/tanstack-router-2026-06-15/src/components/ui/pagination.tsx +0 -98
- package/dist/templates/tanstack-router-2026-06-15/src/components/ui/popover.tsx +0 -31
- package/dist/templates/tanstack-router-2026-06-15/src/components/ui/progress.tsx +0 -25
- package/dist/templates/tanstack-router-2026-06-15/src/components/ui/radio-group.tsx +0 -36
- package/dist/templates/tanstack-router-2026-06-15/src/components/ui/resizable.tsx +0 -37
- package/dist/templates/tanstack-router-2026-06-15/src/components/ui/scroll-area.tsx +0 -44
- package/dist/templates/tanstack-router-2026-06-15/src/components/ui/select.tsx +0 -152
- package/dist/templates/tanstack-router-2026-06-15/src/components/ui/separator.tsx +0 -24
- package/dist/templates/tanstack-router-2026-06-15/src/components/ui/sheet.tsx +0 -122
- package/dist/templates/tanstack-router-2026-06-15/src/components/ui/sidebar.tsx +0 -744
- package/dist/templates/tanstack-router-2026-06-15/src/components/ui/skeleton.tsx +0 -7
- package/dist/templates/tanstack-router-2026-06-15/src/components/ui/slider.tsx +0 -23
- package/dist/templates/tanstack-router-2026-06-15/src/components/ui/sonner.tsx +0 -23
- package/dist/templates/tanstack-router-2026-06-15/src/components/ui/switch.tsx +0 -27
- package/dist/templates/tanstack-router-2026-06-15/src/components/ui/table.tsx +0 -94
- package/dist/templates/tanstack-router-2026-06-15/src/components/ui/tabs.tsx +0 -53
- package/dist/templates/tanstack-router-2026-06-15/src/components/ui/textarea.tsx +0 -21
- package/dist/templates/tanstack-router-2026-06-15/src/components/ui/toggle-group.tsx +0 -57
- package/dist/templates/tanstack-router-2026-06-15/src/components/ui/toggle.tsx +0 -42
- package/dist/templates/tanstack-router-2026-06-15/src/components/ui/tooltip.tsx +0 -32
- package/dist/templates/tanstack-router-2026-06-15/src/hooks/use-mobile.tsx +0 -19
- package/dist/templates/tanstack-router-2026-06-15/src/lib/proxy.ts +0 -123
- package/dist/templates/tanstack-router-2026-06-15/src/lib/utils.ts +0 -6
- package/dist/templates/tanstack-router-2026-06-15/src/main.tsx +0 -37
- package/dist/templates/tanstack-router-2026-06-15/src/routeTree.gen.ts +0 -59
- package/dist/templates/tanstack-router-2026-06-15/src/routes/README.md +0 -85
- package/dist/templates/tanstack-router-2026-06-15/src/routes/__root.tsx +0 -18
- package/dist/templates/tanstack-router-2026-06-15/src/routes/index.tsx +0 -18
- package/dist/templates/tanstack-router-2026-06-15/src/styles.css +0 -214
- package/dist/templates/tanstack-router-2026-06-15/tsconfig.json +0 -27
- package/dist/templates/tanstack-router-2026-06-15/vite.config.ts +0 -23
- package/dist/templates/tanstack-start-2026-06-18/components.json +0 -22
- package/dist/templates/tanstack-start-2026-06-18/drizzle.config.ts +0 -15
- package/dist/templates/tanstack-start-2026-06-18/package.json +0 -104
- package/dist/templates/tanstack-start-2026-06-18/src/components/error-component.tsx +0 -50
- package/dist/templates/tanstack-start-2026-06-18/src/components/ui/accordion.tsx +0 -51
- package/dist/templates/tanstack-start-2026-06-18/src/components/ui/alert-dialog.tsx +0 -115
- package/dist/templates/tanstack-start-2026-06-18/src/components/ui/alert.tsx +0 -49
- package/dist/templates/tanstack-start-2026-06-18/src/components/ui/aspect-ratio.tsx +0 -5
- package/dist/templates/tanstack-start-2026-06-18/src/components/ui/avatar.tsx +0 -47
- package/dist/templates/tanstack-start-2026-06-18/src/components/ui/badge.tsx +0 -32
- package/dist/templates/tanstack-start-2026-06-18/src/components/ui/breadcrumb.tsx +0 -101
- package/dist/templates/tanstack-start-2026-06-18/src/components/ui/button.tsx +0 -49
- package/dist/templates/tanstack-start-2026-06-18/src/components/ui/calendar.tsx +0 -177
- package/dist/templates/tanstack-start-2026-06-18/src/components/ui/card.tsx +0 -55
- package/dist/templates/tanstack-start-2026-06-18/src/components/ui/carousel.tsx +0 -240
- package/dist/templates/tanstack-start-2026-06-18/src/components/ui/chart.tsx +0 -371
- package/dist/templates/tanstack-start-2026-06-18/src/components/ui/checkbox.tsx +0 -26
- package/dist/templates/tanstack-start-2026-06-18/src/components/ui/collapsible.tsx +0 -11
- package/dist/templates/tanstack-start-2026-06-18/src/components/ui/command.tsx +0 -143
- package/dist/templates/tanstack-start-2026-06-18/src/components/ui/context-menu.tsx +0 -187
- package/dist/templates/tanstack-start-2026-06-18/src/components/ui/dialog.tsx +0 -104
- package/dist/templates/tanstack-start-2026-06-18/src/components/ui/drawer.tsx +0 -98
- package/dist/templates/tanstack-start-2026-06-18/src/components/ui/dropdown-menu.tsx +0 -188
- package/dist/templates/tanstack-start-2026-06-18/src/components/ui/form.tsx +0 -171
- package/dist/templates/tanstack-start-2026-06-18/src/components/ui/hover-card.tsx +0 -27
- package/dist/templates/tanstack-start-2026-06-18/src/components/ui/input-otp.tsx +0 -69
- package/dist/templates/tanstack-start-2026-06-18/src/components/ui/input.tsx +0 -22
- package/dist/templates/tanstack-start-2026-06-18/src/components/ui/label.tsx +0 -21
- package/dist/templates/tanstack-start-2026-06-18/src/components/ui/menubar.tsx +0 -229
- package/dist/templates/tanstack-start-2026-06-18/src/components/ui/navigation-menu.tsx +0 -120
- package/dist/templates/tanstack-start-2026-06-18/src/components/ui/pagination.tsx +0 -98
- package/dist/templates/tanstack-start-2026-06-18/src/components/ui/popover.tsx +0 -31
- package/dist/templates/tanstack-start-2026-06-18/src/components/ui/progress.tsx +0 -25
- package/dist/templates/tanstack-start-2026-06-18/src/components/ui/radio-group.tsx +0 -36
- package/dist/templates/tanstack-start-2026-06-18/src/components/ui/resizable.tsx +0 -37
- package/dist/templates/tanstack-start-2026-06-18/src/components/ui/scroll-area.tsx +0 -44
- package/dist/templates/tanstack-start-2026-06-18/src/components/ui/select.tsx +0 -152
- package/dist/templates/tanstack-start-2026-06-18/src/components/ui/separator.tsx +0 -24
- package/dist/templates/tanstack-start-2026-06-18/src/components/ui/sheet.tsx +0 -122
- package/dist/templates/tanstack-start-2026-06-18/src/components/ui/sidebar.tsx +0 -744
- package/dist/templates/tanstack-start-2026-06-18/src/components/ui/skeleton.tsx +0 -7
- package/dist/templates/tanstack-start-2026-06-18/src/components/ui/slider.tsx +0 -23
- package/dist/templates/tanstack-start-2026-06-18/src/components/ui/sonner.tsx +0 -23
- package/dist/templates/tanstack-start-2026-06-18/src/components/ui/switch.tsx +0 -27
- package/dist/templates/tanstack-start-2026-06-18/src/components/ui/table.tsx +0 -94
- package/dist/templates/tanstack-start-2026-06-18/src/components/ui/tabs.tsx +0 -53
- package/dist/templates/tanstack-start-2026-06-18/src/components/ui/textarea.tsx +0 -21
- package/dist/templates/tanstack-start-2026-06-18/src/components/ui/toggle-group.tsx +0 -57
- package/dist/templates/tanstack-start-2026-06-18/src/components/ui/toggle.tsx +0 -42
- package/dist/templates/tanstack-start-2026-06-18/src/components/ui/tooltip.tsx +0 -32
- package/dist/templates/tanstack-start-2026-06-18/src/db/index.ts +0 -9
- package/dist/templates/tanstack-start-2026-06-18/src/db/schema.ts +0 -18
- package/dist/templates/tanstack-start-2026-06-18/src/global.d.ts +0 -3
- package/dist/templates/tanstack-start-2026-06-18/src/hooks/use-mobile.tsx +0 -19
- package/dist/templates/tanstack-start-2026-06-18/src/lib/proxy.ts +0 -119
- package/dist/templates/tanstack-start-2026-06-18/src/lib/utils.ts +0 -6
- package/dist/templates/tanstack-start-2026-06-18/src/routeTree.gen.ts +0 -86
- package/dist/templates/tanstack-start-2026-06-18/src/router.tsx +0 -37
- package/dist/templates/tanstack-start-2026-06-18/src/routes/README.md +0 -94
- package/dist/templates/tanstack-start-2026-06-18/src/routes/__root.tsx +0 -65
- package/dist/templates/tanstack-start-2026-06-18/src/routes/api/health.ts +0 -81
- package/dist/templates/tanstack-start-2026-06-18/src/routes/index.tsx +0 -33
- package/dist/templates/tanstack-start-2026-06-18/src/server.ts +0 -32
- package/dist/templates/tanstack-start-2026-06-18/src/styles.css +0 -214
- package/dist/templates/tanstack-start-2026-06-18/tsconfig.json +0 -27
- package/dist/templates/tanstack-start-2026-06-18/vite.config.ts +0 -17
- package/src/index.ts +0 -8
- package/src/template-render.ts +0 -53
- package/src/templates/tanstack-router-2026-06-15/components.json +0 -22
- package/src/templates/tanstack-router-2026-06-15/index.html +0 -20
- package/src/templates/tanstack-router-2026-06-15/package.json +0 -90
- package/src/templates/tanstack-router-2026-06-15/src/components/error-component.tsx +0 -50
- package/src/templates/tanstack-router-2026-06-15/src/components/ui/accordion.tsx +0 -51
- package/src/templates/tanstack-router-2026-06-15/src/components/ui/alert-dialog.tsx +0 -115
- package/src/templates/tanstack-router-2026-06-15/src/components/ui/alert.tsx +0 -49
- package/src/templates/tanstack-router-2026-06-15/src/components/ui/aspect-ratio.tsx +0 -5
- package/src/templates/tanstack-router-2026-06-15/src/components/ui/avatar.tsx +0 -47
- package/src/templates/tanstack-router-2026-06-15/src/components/ui/badge.tsx +0 -32
- package/src/templates/tanstack-router-2026-06-15/src/components/ui/breadcrumb.tsx +0 -101
- package/src/templates/tanstack-router-2026-06-15/src/components/ui/button.tsx +0 -49
- package/src/templates/tanstack-router-2026-06-15/src/components/ui/calendar.tsx +0 -177
- package/src/templates/tanstack-router-2026-06-15/src/components/ui/card.tsx +0 -55
- package/src/templates/tanstack-router-2026-06-15/src/components/ui/carousel.tsx +0 -240
- package/src/templates/tanstack-router-2026-06-15/src/components/ui/chart.tsx +0 -331
- package/src/templates/tanstack-router-2026-06-15/src/components/ui/checkbox.tsx +0 -26
- package/src/templates/tanstack-router-2026-06-15/src/components/ui/collapsible.tsx +0 -11
- package/src/templates/tanstack-router-2026-06-15/src/components/ui/command.tsx +0 -143
- package/src/templates/tanstack-router-2026-06-15/src/components/ui/context-menu.tsx +0 -187
- package/src/templates/tanstack-router-2026-06-15/src/components/ui/dialog.tsx +0 -104
- package/src/templates/tanstack-router-2026-06-15/src/components/ui/drawer.tsx +0 -98
- package/src/templates/tanstack-router-2026-06-15/src/components/ui/dropdown-menu.tsx +0 -188
- package/src/templates/tanstack-router-2026-06-15/src/components/ui/form.tsx +0 -171
- package/src/templates/tanstack-router-2026-06-15/src/components/ui/hover-card.tsx +0 -27
- package/src/templates/tanstack-router-2026-06-15/src/components/ui/input-otp.tsx +0 -69
- package/src/templates/tanstack-router-2026-06-15/src/components/ui/input.tsx +0 -22
- package/src/templates/tanstack-router-2026-06-15/src/components/ui/label.tsx +0 -21
- package/src/templates/tanstack-router-2026-06-15/src/components/ui/menubar.tsx +0 -229
- package/src/templates/tanstack-router-2026-06-15/src/components/ui/navigation-menu.tsx +0 -120
- package/src/templates/tanstack-router-2026-06-15/src/components/ui/pagination.tsx +0 -98
- package/src/templates/tanstack-router-2026-06-15/src/components/ui/popover.tsx +0 -31
- package/src/templates/tanstack-router-2026-06-15/src/components/ui/progress.tsx +0 -25
- package/src/templates/tanstack-router-2026-06-15/src/components/ui/radio-group.tsx +0 -36
- package/src/templates/tanstack-router-2026-06-15/src/components/ui/resizable.tsx +0 -37
- package/src/templates/tanstack-router-2026-06-15/src/components/ui/scroll-area.tsx +0 -44
- package/src/templates/tanstack-router-2026-06-15/src/components/ui/select.tsx +0 -152
- package/src/templates/tanstack-router-2026-06-15/src/components/ui/separator.tsx +0 -24
- package/src/templates/tanstack-router-2026-06-15/src/components/ui/sheet.tsx +0 -122
- package/src/templates/tanstack-router-2026-06-15/src/components/ui/sidebar.tsx +0 -744
- package/src/templates/tanstack-router-2026-06-15/src/components/ui/skeleton.tsx +0 -7
- package/src/templates/tanstack-router-2026-06-15/src/components/ui/slider.tsx +0 -23
- package/src/templates/tanstack-router-2026-06-15/src/components/ui/sonner.tsx +0 -23
- package/src/templates/tanstack-router-2026-06-15/src/components/ui/switch.tsx +0 -27
- package/src/templates/tanstack-router-2026-06-15/src/components/ui/table.tsx +0 -94
- package/src/templates/tanstack-router-2026-06-15/src/components/ui/tabs.tsx +0 -53
- package/src/templates/tanstack-router-2026-06-15/src/components/ui/textarea.tsx +0 -21
- package/src/templates/tanstack-router-2026-06-15/src/components/ui/toggle-group.tsx +0 -57
- package/src/templates/tanstack-router-2026-06-15/src/components/ui/toggle.tsx +0 -42
- package/src/templates/tanstack-router-2026-06-15/src/components/ui/tooltip.tsx +0 -32
- package/src/templates/tanstack-router-2026-06-15/src/hooks/use-mobile.tsx +0 -19
- package/src/templates/tanstack-router-2026-06-15/src/lib/proxy.ts +0 -123
- package/src/templates/tanstack-router-2026-06-15/src/lib/utils.ts +0 -6
- package/src/templates/tanstack-router-2026-06-15/src/main.tsx +0 -37
- package/src/templates/tanstack-router-2026-06-15/src/routeTree.gen.ts +0 -59
- package/src/templates/tanstack-router-2026-06-15/src/routes/README.md +0 -85
- package/src/templates/tanstack-router-2026-06-15/src/routes/__root.tsx +0 -18
- package/src/templates/tanstack-router-2026-06-15/src/routes/index.tsx +0 -18
- package/src/templates/tanstack-router-2026-06-15/src/styles.css +0 -214
- package/src/templates/tanstack-router-2026-06-15/tsconfig.json +0 -27
- package/src/templates/tanstack-router-2026-06-15/vite.config.ts +0 -23
- package/src/templates/tanstack-start-2026-06-18/components.json +0 -22
- package/src/templates/tanstack-start-2026-06-18/drizzle.config.ts +0 -15
- package/src/templates/tanstack-start-2026-06-18/package.json +0 -104
- package/src/templates/tanstack-start-2026-06-18/src/components/error-component.tsx +0 -50
- package/src/templates/tanstack-start-2026-06-18/src/components/ui/accordion.tsx +0 -51
- package/src/templates/tanstack-start-2026-06-18/src/components/ui/alert-dialog.tsx +0 -115
- package/src/templates/tanstack-start-2026-06-18/src/components/ui/alert.tsx +0 -49
- package/src/templates/tanstack-start-2026-06-18/src/components/ui/aspect-ratio.tsx +0 -5
- package/src/templates/tanstack-start-2026-06-18/src/components/ui/avatar.tsx +0 -47
- package/src/templates/tanstack-start-2026-06-18/src/components/ui/badge.tsx +0 -32
- package/src/templates/tanstack-start-2026-06-18/src/components/ui/breadcrumb.tsx +0 -101
- package/src/templates/tanstack-start-2026-06-18/src/components/ui/button.tsx +0 -49
- package/src/templates/tanstack-start-2026-06-18/src/components/ui/calendar.tsx +0 -177
- package/src/templates/tanstack-start-2026-06-18/src/components/ui/card.tsx +0 -55
- package/src/templates/tanstack-start-2026-06-18/src/components/ui/carousel.tsx +0 -240
- package/src/templates/tanstack-start-2026-06-18/src/components/ui/chart.tsx +0 -371
- package/src/templates/tanstack-start-2026-06-18/src/components/ui/checkbox.tsx +0 -26
- package/src/templates/tanstack-start-2026-06-18/src/components/ui/collapsible.tsx +0 -11
- package/src/templates/tanstack-start-2026-06-18/src/components/ui/command.tsx +0 -143
- package/src/templates/tanstack-start-2026-06-18/src/components/ui/context-menu.tsx +0 -187
- package/src/templates/tanstack-start-2026-06-18/src/components/ui/dialog.tsx +0 -104
- package/src/templates/tanstack-start-2026-06-18/src/components/ui/drawer.tsx +0 -98
- package/src/templates/tanstack-start-2026-06-18/src/components/ui/dropdown-menu.tsx +0 -188
- package/src/templates/tanstack-start-2026-06-18/src/components/ui/form.tsx +0 -171
- package/src/templates/tanstack-start-2026-06-18/src/components/ui/hover-card.tsx +0 -27
- package/src/templates/tanstack-start-2026-06-18/src/components/ui/input-otp.tsx +0 -69
- package/src/templates/tanstack-start-2026-06-18/src/components/ui/input.tsx +0 -22
- package/src/templates/tanstack-start-2026-06-18/src/components/ui/label.tsx +0 -21
- package/src/templates/tanstack-start-2026-06-18/src/components/ui/menubar.tsx +0 -229
- package/src/templates/tanstack-start-2026-06-18/src/components/ui/navigation-menu.tsx +0 -120
- package/src/templates/tanstack-start-2026-06-18/src/components/ui/pagination.tsx +0 -98
- package/src/templates/tanstack-start-2026-06-18/src/components/ui/popover.tsx +0 -31
- package/src/templates/tanstack-start-2026-06-18/src/components/ui/progress.tsx +0 -25
- package/src/templates/tanstack-start-2026-06-18/src/components/ui/radio-group.tsx +0 -36
- package/src/templates/tanstack-start-2026-06-18/src/components/ui/resizable.tsx +0 -37
- package/src/templates/tanstack-start-2026-06-18/src/components/ui/scroll-area.tsx +0 -44
- package/src/templates/tanstack-start-2026-06-18/src/components/ui/select.tsx +0 -152
- package/src/templates/tanstack-start-2026-06-18/src/components/ui/separator.tsx +0 -24
- package/src/templates/tanstack-start-2026-06-18/src/components/ui/sheet.tsx +0 -122
- package/src/templates/tanstack-start-2026-06-18/src/components/ui/sidebar.tsx +0 -744
- package/src/templates/tanstack-start-2026-06-18/src/components/ui/skeleton.tsx +0 -7
- package/src/templates/tanstack-start-2026-06-18/src/components/ui/slider.tsx +0 -23
- package/src/templates/tanstack-start-2026-06-18/src/components/ui/sonner.tsx +0 -23
- package/src/templates/tanstack-start-2026-06-18/src/components/ui/switch.tsx +0 -27
- package/src/templates/tanstack-start-2026-06-18/src/components/ui/table.tsx +0 -94
- package/src/templates/tanstack-start-2026-06-18/src/components/ui/tabs.tsx +0 -53
- package/src/templates/tanstack-start-2026-06-18/src/components/ui/textarea.tsx +0 -21
- package/src/templates/tanstack-start-2026-06-18/src/components/ui/toggle-group.tsx +0 -57
- package/src/templates/tanstack-start-2026-06-18/src/components/ui/toggle.tsx +0 -42
- package/src/templates/tanstack-start-2026-06-18/src/components/ui/tooltip.tsx +0 -32
- package/src/templates/tanstack-start-2026-06-18/src/db/index.ts +0 -9
- package/src/templates/tanstack-start-2026-06-18/src/db/schema.ts +0 -18
- package/src/templates/tanstack-start-2026-06-18/src/global.d.ts +0 -3
- package/src/templates/tanstack-start-2026-06-18/src/hooks/use-mobile.tsx +0 -19
- package/src/templates/tanstack-start-2026-06-18/src/lib/proxy.ts +0 -119
- package/src/templates/tanstack-start-2026-06-18/src/lib/utils.ts +0 -6
- package/src/templates/tanstack-start-2026-06-18/src/routeTree.gen.ts +0 -86
- package/src/templates/tanstack-start-2026-06-18/src/router.tsx +0 -37
- package/src/templates/tanstack-start-2026-06-18/src/routes/README.md +0 -94
- package/src/templates/tanstack-start-2026-06-18/src/routes/__root.tsx +0 -65
- package/src/templates/tanstack-start-2026-06-18/src/routes/api/health.ts +0 -81
- package/src/templates/tanstack-start-2026-06-18/src/routes/index.tsx +0 -33
- package/src/templates/tanstack-start-2026-06-18/src/server.ts +0 -32
- package/src/templates/tanstack-start-2026-06-18/src/styles.css +0 -214
- package/src/templates/tanstack-start-2026-06-18/tsconfig.json +0 -27
- package/src/templates/tanstack-start-2026-06-18/vite.config.ts +0 -17
- package/src/templates/tanstack-start-2026-07-30/components.json +0 -22
- package/src/templates/tanstack-start-2026-07-30/drizzle/meta/_journal.json +0 -1
- package/src/templates/tanstack-start-2026-07-30/drizzle.config.ts +0 -18
- package/src/templates/tanstack-start-2026-07-30/package.json +0 -103
- package/src/templates/tanstack-start-2026-07-30/src/components/error-component.tsx +0 -50
- package/src/templates/tanstack-start-2026-07-30/src/components/ui/accordion.tsx +0 -51
- package/src/templates/tanstack-start-2026-07-30/src/components/ui/alert-dialog.tsx +0 -115
- package/src/templates/tanstack-start-2026-07-30/src/components/ui/alert.tsx +0 -49
- package/src/templates/tanstack-start-2026-07-30/src/components/ui/aspect-ratio.tsx +0 -5
- package/src/templates/tanstack-start-2026-07-30/src/components/ui/avatar.tsx +0 -47
- package/src/templates/tanstack-start-2026-07-30/src/components/ui/badge.tsx +0 -32
- package/src/templates/tanstack-start-2026-07-30/src/components/ui/breadcrumb.tsx +0 -101
- package/src/templates/tanstack-start-2026-07-30/src/components/ui/button.tsx +0 -49
- package/src/templates/tanstack-start-2026-07-30/src/components/ui/calendar.tsx +0 -177
- package/src/templates/tanstack-start-2026-07-30/src/components/ui/card.tsx +0 -55
- package/src/templates/tanstack-start-2026-07-30/src/components/ui/carousel.tsx +0 -240
- package/src/templates/tanstack-start-2026-07-30/src/components/ui/chart.tsx +0 -371
- package/src/templates/tanstack-start-2026-07-30/src/components/ui/checkbox.tsx +0 -26
- package/src/templates/tanstack-start-2026-07-30/src/components/ui/collapsible.tsx +0 -11
- package/src/templates/tanstack-start-2026-07-30/src/components/ui/command.tsx +0 -143
- package/src/templates/tanstack-start-2026-07-30/src/components/ui/context-menu.tsx +0 -187
- package/src/templates/tanstack-start-2026-07-30/src/components/ui/dialog.tsx +0 -104
- package/src/templates/tanstack-start-2026-07-30/src/components/ui/drawer.tsx +0 -98
- package/src/templates/tanstack-start-2026-07-30/src/components/ui/dropdown-menu.tsx +0 -188
- package/src/templates/tanstack-start-2026-07-30/src/components/ui/form.tsx +0 -171
- package/src/templates/tanstack-start-2026-07-30/src/components/ui/hover-card.tsx +0 -27
- package/src/templates/tanstack-start-2026-07-30/src/components/ui/input-otp.tsx +0 -69
- package/src/templates/tanstack-start-2026-07-30/src/components/ui/input.tsx +0 -22
- package/src/templates/tanstack-start-2026-07-30/src/components/ui/label.tsx +0 -21
- package/src/templates/tanstack-start-2026-07-30/src/components/ui/menubar.tsx +0 -229
- package/src/templates/tanstack-start-2026-07-30/src/components/ui/navigation-menu.tsx +0 -120
- package/src/templates/tanstack-start-2026-07-30/src/components/ui/pagination.tsx +0 -98
- package/src/templates/tanstack-start-2026-07-30/src/components/ui/popover.tsx +0 -31
- package/src/templates/tanstack-start-2026-07-30/src/components/ui/progress.tsx +0 -25
- package/src/templates/tanstack-start-2026-07-30/src/components/ui/radio-group.tsx +0 -36
- package/src/templates/tanstack-start-2026-07-30/src/components/ui/resizable.tsx +0 -37
- package/src/templates/tanstack-start-2026-07-30/src/components/ui/scroll-area.tsx +0 -44
- package/src/templates/tanstack-start-2026-07-30/src/components/ui/select.tsx +0 -152
- package/src/templates/tanstack-start-2026-07-30/src/components/ui/separator.tsx +0 -24
- package/src/templates/tanstack-start-2026-07-30/src/components/ui/sheet.tsx +0 -122
- package/src/templates/tanstack-start-2026-07-30/src/components/ui/sidebar.tsx +0 -744
- package/src/templates/tanstack-start-2026-07-30/src/components/ui/skeleton.tsx +0 -7
- package/src/templates/tanstack-start-2026-07-30/src/components/ui/slider.tsx +0 -23
- package/src/templates/tanstack-start-2026-07-30/src/components/ui/sonner.tsx +0 -23
- package/src/templates/tanstack-start-2026-07-30/src/components/ui/switch.tsx +0 -27
- package/src/templates/tanstack-start-2026-07-30/src/components/ui/table.tsx +0 -94
- package/src/templates/tanstack-start-2026-07-30/src/components/ui/tabs.tsx +0 -53
- package/src/templates/tanstack-start-2026-07-30/src/components/ui/textarea.tsx +0 -21
- package/src/templates/tanstack-start-2026-07-30/src/components/ui/toggle-group.tsx +0 -57
- package/src/templates/tanstack-start-2026-07-30/src/components/ui/toggle.tsx +0 -42
- package/src/templates/tanstack-start-2026-07-30/src/components/ui/tooltip.tsx +0 -32
- package/src/templates/tanstack-start-2026-07-30/src/db/index.ts +0 -9
- package/src/templates/tanstack-start-2026-07-30/src/db/schema.ts +0 -34
- package/src/templates/tanstack-start-2026-07-30/src/global.d.ts +0 -3
- package/src/templates/tanstack-start-2026-07-30/src/hooks/use-mobile.tsx +0 -19
- package/src/templates/tanstack-start-2026-07-30/src/lib/kv.ts +0 -37
- package/src/templates/tanstack-start-2026-07-30/src/lib/proxy.ts +0 -111
- package/src/templates/tanstack-start-2026-07-30/src/lib/storage.ts +0 -45
- package/src/templates/tanstack-start-2026-07-30/src/lib/utils.ts +0 -6
- package/src/templates/tanstack-start-2026-07-30/src/routeTree.gen.ts +0 -86
- package/src/templates/tanstack-start-2026-07-30/src/router.tsx +0 -37
- package/src/templates/tanstack-start-2026-07-30/src/routes/README.md +0 -94
- package/src/templates/tanstack-start-2026-07-30/src/routes/__root.tsx +0 -65
- package/src/templates/tanstack-start-2026-07-30/src/routes/api/health.ts +0 -83
- package/src/templates/tanstack-start-2026-07-30/src/routes/index.tsx +0 -33
- package/src/templates/tanstack-start-2026-07-30/src/server.ts +0 -32
- package/src/templates/tanstack-start-2026-07-30/src/styles.css +0 -214
- package/src/templates/tanstack-start-2026-07-30/tsconfig.json +0 -27
- package/src/templates/tanstack-start-2026-07-30/vite.config.ts +0 -17
- package/src/tools/create-plan.ts +0 -61
- package/src/tools/inspect-http.ts +0 -276
- package/src/tools/list-plans.ts +0 -85
- package/src/tools/modify-plan.ts +0 -79
- package/src/tools/remove.ts +0 -53
- package/src/tools/scaffold.ts +0 -213
- package/src/tools/setup-authentication/auth-files.ts +0 -144
- package/src/tools/setup-authentication/constants.ts +0 -19
- package/src/tools/setup-authentication/db-schema.ts +0 -96
- package/src/tools/setup-authentication/index.ts +0 -148
- package/src/tools/setup-authentication/package-json.ts +0 -17
- package/src/tools/setup-authentication/pages.ts +0 -241
- package/src/tools/setup-netsuite.ts +0 -1357
package/dist/index.js
CHANGED
|
@@ -24900,23 +24900,9 @@ async function renderTemplate(templateId, vars, destDir) {
|
|
|
24900
24900
|
}
|
|
24901
24901
|
|
|
24902
24902
|
// src/tools/scaffold.ts
|
|
24903
|
-
var
|
|
24904
|
-
|
|
24905
|
-
|
|
24906
|
-
};
|
|
24907
|
-
var LEGACY_TEMPLATES = ["tanstack-start-2026-06-18"];
|
|
24908
|
-
var SCAFFOLD_VERSION = SCAFFOLD_TEMPLATES["tanstack-start"];
|
|
24909
|
-
function resolveTemplateId(type) {
|
|
24910
|
-
const version3 = process.env.PLUGINS_SCAFFOLD_VERSION;
|
|
24911
|
-
const known = [
|
|
24912
|
-
...Object.values(SCAFFOLD_TEMPLATES),
|
|
24913
|
-
...LEGACY_TEMPLATES
|
|
24914
|
-
];
|
|
24915
|
-
const pinned = version3 && known.includes(version3) ? version3 : undefined;
|
|
24916
|
-
if (type) {
|
|
24917
|
-
return pinned?.startsWith(type) ? pinned : SCAFFOLD_TEMPLATES[type];
|
|
24918
|
-
}
|
|
24919
|
-
return pinned ?? SCAFFOLD_TEMPLATES["tanstack-router"];
|
|
24903
|
+
var SCAFFOLD_VERSION = "tanstack-start-2026-07-30";
|
|
24904
|
+
function resolveTemplateId() {
|
|
24905
|
+
return SCAFFOLD_VERSION;
|
|
24920
24906
|
}
|
|
24921
24907
|
function projectUuidFromDir(dir) {
|
|
24922
24908
|
return path3.basename(dir);
|
|
@@ -24927,14 +24913,13 @@ function integrationProxyUrl(projectUuid) {
|
|
|
24927
24913
|
}
|
|
24928
24914
|
var scaffoldOptionsSchema = exports_external2.object({
|
|
24929
24915
|
name: exports_external2.string().describe("Human-readable name for SEO, e.g. 'Shipping Platform'"),
|
|
24930
|
-
description: exports_external2.string().describe("One sentence describing the app. Used as the meta description.")
|
|
24931
|
-
type: exports_external2.enum(["tanstack-start", "tanstack-router"]).optional().describe("Project type. 'tanstack-start': SSR app with API routes and a " + "database, KV and bucket \u2014 use it whenever the app needs to " + "persist data or run server-side code, and always for " + "setup_authentication (it needs server routes). " + "'tanstack-router': client-only SPA with no server and no database " + "\u2014 use it only for pure frontends that talk to external APIs. " + "Omit to use the deployment's default.")
|
|
24916
|
+
description: exports_external2.string().describe("One sentence describing the app. Used as the meta description.")
|
|
24932
24917
|
});
|
|
24933
24918
|
function slugify(name) {
|
|
24934
24919
|
return name.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "") || "leo-project";
|
|
24935
24920
|
}
|
|
24936
|
-
async function writeBaseScaffold({ name, description
|
|
24937
|
-
const templateId = resolveTemplateId(
|
|
24921
|
+
async function writeBaseScaffold({ name, description }, dir) {
|
|
24922
|
+
const templateId = resolveTemplateId();
|
|
24938
24923
|
const projectUuid = projectUuidFromDir(dir);
|
|
24939
24924
|
const created = await renderTemplate(templateId, {
|
|
24940
24925
|
LEO_NAME: name,
|
|
@@ -24949,33 +24934,26 @@ async function writeBaseScaffold({ name, description, type }, dir) {
|
|
|
24949
24934
|
return [...created, leoPath];
|
|
24950
24935
|
}
|
|
24951
24936
|
var scaffold = tool({
|
|
24952
|
-
description: "Scaffold a new project with React 19, file-based routing (TanStack), " + "Tailwind v4, shadcn/ui, and react-query.
|
|
24937
|
+
description: "Scaffold a new project with React 19, file-based routing (TanStack), " + "Tailwind v4, shadcn/ui, and react-query. Projects are TanStack Start: " + "SSR with API routes and a database, KV and bucket via @helloleo/runtime. " + "Call this first for any new project, before writing routes or components.",
|
|
24953
24938
|
args: {
|
|
24954
24939
|
name: scaffoldOptionsSchema.shape.name,
|
|
24955
|
-
description: scaffoldOptionsSchema.shape.description
|
|
24956
|
-
type: scaffoldOptionsSchema.shape.type
|
|
24940
|
+
description: scaffoldOptionsSchema.shape.description
|
|
24957
24941
|
},
|
|
24958
24942
|
async execute(args, context) {
|
|
24959
|
-
const isStart = resolveTemplateId(args.type).startsWith("tanstack-start");
|
|
24960
24943
|
const created = await writeBaseScaffold(args, context.directory);
|
|
24961
24944
|
const uiComponents = created.filter((f) => f.startsWith("src/components/ui/"));
|
|
24962
24945
|
const rest = created.filter((f) => !f.startsWith("src/components/ui/"));
|
|
24963
|
-
const typeNotes =
|
|
24946
|
+
const typeNotes = [
|
|
24964
24947
|
"- This is a TanStack Start project. The server entry is src/server.ts. There is no index.html or client entrypoint.",
|
|
24965
24948
|
"- For JSON/CRUD APIs, add server routes under src/routes/api/. Read src/routes/api/health.ts first, add routes as needed.",
|
|
24966
24949
|
"- The database schema lives in src/db/schema.ts and is the single source of truth. Migration files under drizzle/ are generated and applied automatically. Never create, edit or delete them.",
|
|
24967
24950
|
"- Never rename existing tables or columns in schema.ts. Renames cannot be auto-migrated: no migration file is generated, the database keeps the old name, and every query against the new name fails at runtime with a 500. To reshape data, add a new column or table, write to it, and migrate old values in app code (e.g. fall back to the old column on read).",
|
|
24968
24951
|
"- Persistence goes through @helloleo/runtime exclusively: database via #/db (see src/db/index.ts), key-value store via #/lib/kv (see src/lib/kv.ts), file storage via #/lib/storage (see src/lib/storage.ts -- uploads/downloads flow through your API routes; presigned URLs are NOT available), env/secrets via env from @helloleo/runtime. Read those files before server-side data work. Never install another DB/storage client, never import from cloudflare:workers, all of it is server-side only."
|
|
24969
|
-
] : [
|
|
24970
|
-
"- This is a TanStack Router SPA. The client entry is index.html -> src/main.tsx. There is no server: no API routes, no server functions, no database.",
|
|
24971
|
-
"- Fetch data from external APIs only. If the app needs its own persistence or server-side code, it should have been scaffolded as tanstack-start."
|
|
24972
24952
|
];
|
|
24973
|
-
const nextSteps =
|
|
24953
|
+
const nextSteps = [
|
|
24974
24954
|
"Next: read src/routes/index.tsx and continue with the user's request.",
|
|
24975
24955
|
"For authentication (password and/or OAuth), call setup_authentication.",
|
|
24976
24956
|
"For NetSuite projects, call setup_netsuite."
|
|
24977
|
-
] : [
|
|
24978
|
-
"Next: read src/routes/index.tsx and continue with the user's request."
|
|
24979
24957
|
];
|
|
24980
24958
|
return [
|
|
24981
24959
|
`Scaffolded ${created.length} files:`,
|
|
@@ -25613,7 +25591,9 @@ function netsuiteServerTs() {
|
|
|
25613
25591
|
* Config is read from the Cloudflare env binding via @helloleo/runtime.
|
|
25614
25592
|
* Set NETSUITE_ACCOUNT_ID / _CLIENT_ID / _CLIENT_SECRET (secret optional for a
|
|
25615
25593
|
* PKCE public client) and optional PUBLIC_APP_URL as HelloLeo Cloud secrets
|
|
25616
|
-
* (prod) or dev vars (preview).
|
|
25594
|
+
* (prod) or dev vars (preview). NETSUITE_BROKER_CALLBACK (written by the
|
|
25595
|
+
* HelloLeo wizard) switches the redirect URI to the shared OAuth broker so
|
|
25596
|
+
* one URI serves every app/environment. They never reach the browser.
|
|
25617
25597
|
*/
|
|
25618
25598
|
import { eq } from 'drizzle-orm'
|
|
25619
25599
|
import { env as runtimeEnv } from '@helloleo/runtime'
|
|
@@ -25624,6 +25604,7 @@ interface NsEnv {
|
|
|
25624
25604
|
NETSUITE_ACCOUNT_ID?: string
|
|
25625
25605
|
NETSUITE_CLIENT_ID?: string
|
|
25626
25606
|
NETSUITE_CLIENT_SECRET?: string
|
|
25607
|
+
NETSUITE_BROKER_CALLBACK?: string
|
|
25627
25608
|
PUBLIC_APP_URL?: string
|
|
25628
25609
|
HELLOLEO_URL?: string
|
|
25629
25610
|
}
|
|
@@ -25684,8 +25665,47 @@ export function appOrigin(request: Request) {
|
|
|
25684
25665
|
url.host
|
|
25685
25666
|
return \`\${proto}://\${hostHeader}\`
|
|
25686
25667
|
}
|
|
25668
|
+
/**
|
|
25669
|
+
* HelloLeo's shared OAuth broker (integration-proxy Worker). When
|
|
25670
|
+
* NETSUITE_BROKER_CALLBACK is set (the platform writes it to the project env),
|
|
25671
|
+
* customers register that ONE stable URI on their Integration Record instead
|
|
25672
|
+
* of one URI per app/environment: the authorize redirect goes to the broker,
|
|
25673
|
+
* the broker 302s the callback back to THIS app (looked up by the state
|
|
25674
|
+
* nonce), and the token exchange passes the same broker URI. Unset (self-host
|
|
25675
|
+
* / standalone), the app falls back to its own origin's callback.
|
|
25676
|
+
*/
|
|
25677
|
+
export function brokerCallback(): string | null {
|
|
25678
|
+
const raw = nsEnv.NETSUITE_BROKER_CALLBACK
|
|
25679
|
+
if (!raw) return null
|
|
25680
|
+
try {
|
|
25681
|
+
const u = new URL(raw)
|
|
25682
|
+
return u.protocol === 'https:' ? u.toString() : null
|
|
25683
|
+
} catch {
|
|
25684
|
+
return null
|
|
25685
|
+
}
|
|
25686
|
+
}
|
|
25687
|
+
|
|
25687
25688
|
export function redirectUri(request: Request) {
|
|
25688
|
-
return \`\${appOrigin(request)}/auth/netsuite/callback\`
|
|
25689
|
+
return brokerCallback() ?? \`\${appOrigin(request)}/auth/netsuite/callback\`
|
|
25690
|
+
}
|
|
25691
|
+
|
|
25692
|
+
/**
|
|
25693
|
+
* Tell the broker where to send this flow's callback: nonce -> this app's
|
|
25694
|
+
* origin. MUST succeed before redirecting to NetSuite, otherwise the callback
|
|
25695
|
+
* dead-ends at the broker. No-op when the broker isn't configured.
|
|
25696
|
+
*/
|
|
25697
|
+
export async function registerWithBroker(request: Request, flowId: string): Promise<void> {
|
|
25698
|
+
const callback = brokerCallback()
|
|
25699
|
+
if (!callback) return
|
|
25700
|
+
const registerUrl = new URL('/auth/netsuite/register', callback)
|
|
25701
|
+
const res = await fetch(registerUrl.toString(), {
|
|
25702
|
+
method: 'POST',
|
|
25703
|
+
headers: { 'Content-Type': 'application/json' },
|
|
25704
|
+
body: JSON.stringify({ nonce: flowId, target: appOrigin(request) }),
|
|
25705
|
+
})
|
|
25706
|
+
if (!res.ok) {
|
|
25707
|
+
throw new Error(\`NetSuite broker registration failed (HTTP \${res.status}) -- cannot start sign-in\`)
|
|
25708
|
+
}
|
|
25689
25709
|
}
|
|
25690
25710
|
|
|
25691
25711
|
// Coerce ?return_to= to our OWN origin. The callback appends the session bearer
|
|
@@ -25849,6 +25869,7 @@ import {
|
|
|
25849
25869
|
authorizeUrl,
|
|
25850
25870
|
pkce,
|
|
25851
25871
|
redirectUri,
|
|
25872
|
+
registerWithBroker,
|
|
25852
25873
|
requireConfig,
|
|
25853
25874
|
safeReturnTo,
|
|
25854
25875
|
SCOPE,
|
|
@@ -25866,6 +25887,10 @@ export const Route = createFileRoute('/auth/netsuite/start')({
|
|
|
25866
25887
|
|
|
25867
25888
|
const { verifier, challenge } = await pkce()
|
|
25868
25889
|
const flowId = crypto.randomUUID()
|
|
25890
|
+
// With the shared broker, NetSuite redirects to the broker's fixed
|
|
25891
|
+
// callback and the broker forwards here -- it must know this flow's
|
|
25892
|
+
// target before the user leaves for NetSuite.
|
|
25893
|
+
await registerWithBroker(request, flowId)
|
|
25869
25894
|
await db.insert(netsuiteFlows).values({ flowId, codeVerifier: verifier, returnTo })
|
|
25870
25895
|
|
|
25871
25896
|
const authorize = new URL(authorizeUrl(accountId))
|
|
@@ -26728,8 +26753,8 @@ import { integer, sqliteTable, text } from 'drizzle-orm/sqlite-core'
|
|
|
26728
26753
|
"CONFIG -- NETSUITE_ACCOUNT_ID, NETSUITE_CLIENT_ID, NETSUITE_CLIENT_SECRET (secret optional for PKCE public clients). Never hardcode; never put in code. Same var names in every environment, different SOURCE:",
|
|
26729
26754
|
"- DEV (Fly preview): read from the project .env. HelloLeo writes them there (the setup wizard, or the env tooling). In dev the app uses .env -- do NOT tell the user to use HelloLeo Cloud here.",
|
|
26730
26755
|
"- PROD (published Worker): the SAME names live as HelloLeo Cloud secrets; the publish step promotes them from .env onto the Worker automatically. Same code path (@helloleo/runtime env), just a different source per environment.",
|
|
26731
|
-
"- PUBLIC_APP_URL / HELLOLEO_URL are set by the platform per environment; don't hardcode them.",
|
|
26732
|
-
"- REDIRECT URI -- never guess or hardcode it.
|
|
26756
|
+
"- PUBLIC_APP_URL / HELLOLEO_URL / NETSUITE_BROKER_CALLBACK are set by the platform per environment; don't hardcode them.",
|
|
26757
|
+
"- REDIRECT URI -- never guess or hardcode it. When NETSUITE_BROKER_CALLBACK is set (the HelloLeo wizard writes it), the redirect URI is HelloLeo's shared OAuth broker: ONE stable URI the user registers ONCE on Integration Record #2 (scope: rest_webservices), valid for both the preview and the published app -- the broker routes each callback back to this app. Without it, the app falls back to its own origin's callback. Either way, read the exact value from GET /auth/netsuite/config (or getNetSuiteRedirectUri() on the client) and tell the user to register THAT.",
|
|
26733
26758
|
"- Never replace <AuthLayout> with a password gate. Real OAuth is the only supported login."
|
|
26734
26759
|
].join(`
|
|
26735
26760
|
`);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@helloleo/plugins",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.22",
|
|
4
4
|
"description": "OpenCode plugins for HelloLeo",
|
|
5
5
|
"license": "UNLICENSED",
|
|
6
6
|
"type": "module",
|
|
@@ -9,14 +9,13 @@
|
|
|
9
9
|
".": "./dist/index.js"
|
|
10
10
|
},
|
|
11
11
|
"files": [
|
|
12
|
-
"dist"
|
|
13
|
-
"src"
|
|
12
|
+
"dist"
|
|
14
13
|
],
|
|
15
14
|
"publishConfig": {
|
|
16
15
|
"access": "public"
|
|
17
16
|
},
|
|
18
17
|
"scripts": {
|
|
19
|
-
"build": "rm -rf dist && bun build src/index.ts --outdir dist --target bun --format esm &&
|
|
18
|
+
"build": "rm -rf dist && bun build src/index.ts --outdir dist --target bun --format esm && bun run scripts/copy-templates.ts",
|
|
20
19
|
"format": "bunx --bun @biomejs/biome format --write src",
|
|
21
20
|
"lint": "bunx --bun @biomejs/biome lint --write src",
|
|
22
21
|
"check": "bunx --bun @biomejs/biome check --write src",
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "https://ui.shadcn.com/schema.json",
|
|
3
|
-
"style": "new-york",
|
|
4
|
-
"rsc": false,
|
|
5
|
-
"tsx": true,
|
|
6
|
-
"tailwind": {
|
|
7
|
-
"css": "src/styles.css",
|
|
8
|
-
"baseColor": "slate",
|
|
9
|
-
"cssVariables": true,
|
|
10
|
-
"prefix": ""
|
|
11
|
-
},
|
|
12
|
-
"iconLibrary": "lucide",
|
|
13
|
-
"rtl": false,
|
|
14
|
-
"aliases": {
|
|
15
|
-
"components": "@/components",
|
|
16
|
-
"utils": "@/lib/utils",
|
|
17
|
-
"ui": "@/components/ui",
|
|
18
|
-
"lib": "@/lib",
|
|
19
|
-
"hooks": "@/hooks"
|
|
20
|
-
},
|
|
21
|
-
"registries": {}
|
|
22
|
-
}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
<!doctype html>
|
|
3
|
-
<html lang="en">
|
|
4
|
-
<head>
|
|
5
|
-
<meta charset="UTF-8" />
|
|
6
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
7
|
-
<title>{{LEO_NAME}}</title>
|
|
8
|
-
<meta name="description" content="{{LEO_DESCRIPTION}}" />
|
|
9
|
-
<meta property="og:title" content="{{LEO_NAME}}" />
|
|
10
|
-
<meta property="og:description" content="{{LEO_DESCRIPTION}}" />
|
|
11
|
-
<meta property="og:type" content="website" />
|
|
12
|
-
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
13
|
-
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
14
|
-
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Space+Grotesk:wght@400;500;600;700&display=swap" rel="stylesheet">
|
|
15
|
-
</head>
|
|
16
|
-
<body>
|
|
17
|
-
<div id="app"></div>
|
|
18
|
-
<script type="module" src="/src/main.tsx"></script>
|
|
19
|
-
</body>
|
|
20
|
-
</html>
|
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "{{LEO_SLUG}}",
|
|
3
|
-
"private": true,
|
|
4
|
-
"type": "module",
|
|
5
|
-
"imports": {
|
|
6
|
-
"#/*": "./src/*"
|
|
7
|
-
},
|
|
8
|
-
"scripts": {
|
|
9
|
-
"dev": "vite dev",
|
|
10
|
-
"generate-routes": "tsr generate",
|
|
11
|
-
"build": "oxlint --fix && vite build",
|
|
12
|
-
"preview": "vite preview",
|
|
13
|
-
"lint": "oxlint --fix",
|
|
14
|
-
"test": "vitest run"
|
|
15
|
-
},
|
|
16
|
-
"dependencies": {
|
|
17
|
-
"@hookform/resolvers": "^5.2.2",
|
|
18
|
-
"@radix-ui/react-accordion": "^1.2.12",
|
|
19
|
-
"@radix-ui/react-alert-dialog": "^1.1.15",
|
|
20
|
-
"@radix-ui/react-aspect-ratio": "^1.1.8",
|
|
21
|
-
"@radix-ui/react-avatar": "^1.1.11",
|
|
22
|
-
"@radix-ui/react-checkbox": "^1.3.3",
|
|
23
|
-
"@radix-ui/react-collapsible": "^1.1.12",
|
|
24
|
-
"@radix-ui/react-context-menu": "^2.2.16",
|
|
25
|
-
"@radix-ui/react-dialog": "^1.1.15",
|
|
26
|
-
"@radix-ui/react-dropdown-menu": "^2.1.16",
|
|
27
|
-
"@radix-ui/react-hover-card": "^1.1.15",
|
|
28
|
-
"@radix-ui/react-label": "^2.1.8",
|
|
29
|
-
"@radix-ui/react-menubar": "^1.1.16",
|
|
30
|
-
"@radix-ui/react-navigation-menu": "^1.2.14",
|
|
31
|
-
"@radix-ui/react-popover": "^1.1.15",
|
|
32
|
-
"@radix-ui/react-progress": "^1.1.8",
|
|
33
|
-
"@radix-ui/react-radio-group": "^1.3.8",
|
|
34
|
-
"@radix-ui/react-scroll-area": "^1.2.10",
|
|
35
|
-
"@radix-ui/react-select": "^2.2.6",
|
|
36
|
-
"@radix-ui/react-separator": "^1.1.8",
|
|
37
|
-
"@radix-ui/react-slider": "^1.3.6",
|
|
38
|
-
"@radix-ui/react-slot": "^1.2.4",
|
|
39
|
-
"@radix-ui/react-switch": "^1.2.6",
|
|
40
|
-
"@radix-ui/react-tabs": "^1.1.13",
|
|
41
|
-
"@radix-ui/react-toggle": "^1.1.10",
|
|
42
|
-
"@radix-ui/react-toggle-group": "^1.1.11",
|
|
43
|
-
"@radix-ui/react-tooltip": "^1.2.8",
|
|
44
|
-
"@tailwindcss/vite": "^4.1.18",
|
|
45
|
-
"@tanstack/react-query": "^5.90.0",
|
|
46
|
-
"@tanstack/react-router": "latest",
|
|
47
|
-
"@tanstack/router-plugin": "^1.132.0",
|
|
48
|
-
"class-variance-authority": "^0.7.1",
|
|
49
|
-
"clsx": "^2.1.1",
|
|
50
|
-
"cmdk": "^1.1.1",
|
|
51
|
-
"date-fns": "^4.1.0",
|
|
52
|
-
"embla-carousel-react": "^8.6.0",
|
|
53
|
-
"input-otp": "^1.4.2",
|
|
54
|
-
"lucide-react": "^0.575.0",
|
|
55
|
-
"react": "^19.2.0",
|
|
56
|
-
"react-day-picker": "^9.14.0",
|
|
57
|
-
"react-dom": "^19.2.0",
|
|
58
|
-
"react-hook-form": "^7.71.2",
|
|
59
|
-
"react-resizable-panels": "^4.6.5",
|
|
60
|
-
"recharts": "^2.15.4",
|
|
61
|
-
"sonner": "^2.0.7",
|
|
62
|
-
"tailwind-merge": "^3.5.0",
|
|
63
|
-
"tailwindcss": "^4.1.18",
|
|
64
|
-
"tw-animate-css": "^1.3.4",
|
|
65
|
-
"vaul": "^1.1.2",
|
|
66
|
-
"zod": "^3.24.2"
|
|
67
|
-
},
|
|
68
|
-
"devDependencies": {
|
|
69
|
-
"@tailwindcss/typography": "^0.5.16",
|
|
70
|
-
"@tanstack/router-cli": "^1.132.0",
|
|
71
|
-
"@tanstack/router-plugin": "latest",
|
|
72
|
-
"@testing-library/dom": "^10.4.1",
|
|
73
|
-
"@testing-library/react": "^16.3.0",
|
|
74
|
-
"@types/node": "^22.10.2",
|
|
75
|
-
"@types/react": "^19.2.0",
|
|
76
|
-
"@types/react-dom": "^19.2.0",
|
|
77
|
-
"@vitejs/plugin-react": "^6.0.1",
|
|
78
|
-
"jsdom": "^28.1.0",
|
|
79
|
-
"oxlint": "^1.69.0",
|
|
80
|
-
"typescript": "^6.0.2",
|
|
81
|
-
"vite": "^8.0.0",
|
|
82
|
-
"vitest": "^4.1.5"
|
|
83
|
-
},
|
|
84
|
-
"pnpm": {
|
|
85
|
-
"onlyBuiltDependencies": [
|
|
86
|
-
"esbuild",
|
|
87
|
-
"lightningcss"
|
|
88
|
-
]
|
|
89
|
-
}
|
|
90
|
-
}
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import { useState } from 'react'
|
|
2
|
-
import { useRouterState } from '@tanstack/react-router'
|
|
3
|
-
|
|
4
|
-
// Rendered by the router's defaultErrorComponent for any uncaught render or
|
|
5
|
-
// loader error. Per-route `errorComponent` options override it. Keep this
|
|
6
|
-
// component free of app dependencies (toasts, auth, ui components, etc).
|
|
7
|
-
export function DefaultErrorComponent({ error }: { error: Error }) {
|
|
8
|
-
const pathname = useRouterState({ select: (s) => s.location.pathname })
|
|
9
|
-
const [copied, setCopied] = useState(false)
|
|
10
|
-
|
|
11
|
-
async function copyForLeo() {
|
|
12
|
-
// Blank lines + fenced stack so the report keeps its structure when
|
|
13
|
-
// pasted into a markdown-rendering chat.
|
|
14
|
-
const report = [
|
|
15
|
-
'My app threw an error, please fix it:',
|
|
16
|
-
`Page: ${pathname}`,
|
|
17
|
-
`Error: ${error.message}`,
|
|
18
|
-
['Stack:', '```', error.stack ?? '(no stack trace)', '```'].join('\n'),
|
|
19
|
-
].join('\n\n')
|
|
20
|
-
|
|
21
|
-
await navigator.clipboard.writeText(report)
|
|
22
|
-
setCopied(true)
|
|
23
|
-
setTimeout(() => setCopied(false), 2000)
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
return (
|
|
27
|
-
<div className="min-h-screen flex items-center justify-center bg-white p-4">
|
|
28
|
-
<div className="w-full max-w-lg rounded-xl border border-neutral-200 bg-white p-6 shadow-sm">
|
|
29
|
-
<h2 className="text-base font-semibold text-neutral-900">
|
|
30
|
-
Something went wrong
|
|
31
|
-
</h2>
|
|
32
|
-
<div className="mt-4 space-y-4">
|
|
33
|
-
<pre className="text-sm text-red-600 whitespace-pre-wrap break-words rounded-md bg-neutral-100 p-3">
|
|
34
|
-
{error.message}
|
|
35
|
-
</pre>
|
|
36
|
-
<button
|
|
37
|
-
type="button"
|
|
38
|
-
onClick={copyForLeo}
|
|
39
|
-
className="inline-flex items-center rounded-md bg-neutral-900 px-4 py-2 text-sm font-medium text-neutral-50"
|
|
40
|
-
>
|
|
41
|
-
{copied ? 'Copied!' : 'Copy error'}
|
|
42
|
-
</button>
|
|
43
|
-
<p className="text-sm text-neutral-500">
|
|
44
|
-
Paste the copied error to Leo and it will help you fix it.
|
|
45
|
-
</p>
|
|
46
|
-
</div>
|
|
47
|
-
</div>
|
|
48
|
-
</div>
|
|
49
|
-
)
|
|
50
|
-
}
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import * as React from "react";
|
|
2
|
-
import * as AccordionPrimitive from "@radix-ui/react-accordion";
|
|
3
|
-
import { ChevronDown } from "lucide-react";
|
|
4
|
-
|
|
5
|
-
import { cn } from "@/lib/utils";
|
|
6
|
-
|
|
7
|
-
const Accordion = AccordionPrimitive.Root;
|
|
8
|
-
|
|
9
|
-
const AccordionItem = React.forwardRef<
|
|
10
|
-
React.ElementRef<typeof AccordionPrimitive.Item>,
|
|
11
|
-
React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Item>
|
|
12
|
-
>(({ className, ...props }, ref) => (
|
|
13
|
-
<AccordionPrimitive.Item ref={ref} className={cn("border-b", className)} {...props} />
|
|
14
|
-
));
|
|
15
|
-
AccordionItem.displayName = "AccordionItem";
|
|
16
|
-
|
|
17
|
-
const AccordionTrigger = React.forwardRef<
|
|
18
|
-
React.ElementRef<typeof AccordionPrimitive.Trigger>,
|
|
19
|
-
React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Trigger>
|
|
20
|
-
>(({ className, children, ...props }, ref) => (
|
|
21
|
-
<AccordionPrimitive.Header className="flex">
|
|
22
|
-
<AccordionPrimitive.Trigger
|
|
23
|
-
ref={ref}
|
|
24
|
-
className={cn(
|
|
25
|
-
"flex flex-1 items-center justify-between py-4 text-sm font-medium cursor-pointer transition-all hover:underline text-left [&[data-state=open]>svg]:rotate-180",
|
|
26
|
-
className,
|
|
27
|
-
)}
|
|
28
|
-
{...props}
|
|
29
|
-
>
|
|
30
|
-
{children}
|
|
31
|
-
<ChevronDown className="h-4 w-4 shrink-0 text-muted-foreground transition-transform duration-200" />
|
|
32
|
-
</AccordionPrimitive.Trigger>
|
|
33
|
-
</AccordionPrimitive.Header>
|
|
34
|
-
));
|
|
35
|
-
AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName;
|
|
36
|
-
|
|
37
|
-
const AccordionContent = React.forwardRef<
|
|
38
|
-
React.ElementRef<typeof AccordionPrimitive.Content>,
|
|
39
|
-
React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Content>
|
|
40
|
-
>(({ className, children, ...props }, ref) => (
|
|
41
|
-
<AccordionPrimitive.Content
|
|
42
|
-
ref={ref}
|
|
43
|
-
className="overflow-hidden text-sm data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down"
|
|
44
|
-
{...props}
|
|
45
|
-
>
|
|
46
|
-
<div className={cn("pb-4 pt-0", className)}>{children}</div>
|
|
47
|
-
</AccordionPrimitive.Content>
|
|
48
|
-
));
|
|
49
|
-
AccordionContent.displayName = AccordionPrimitive.Content.displayName;
|
|
50
|
-
|
|
51
|
-
export { Accordion, AccordionItem, AccordionTrigger, AccordionContent };
|
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
import * as React from "react";
|
|
2
|
-
import * as AlertDialogPrimitive from "@radix-ui/react-alert-dialog";
|
|
3
|
-
|
|
4
|
-
import { cn } from "@/lib/utils";
|
|
5
|
-
import { buttonVariants } from "@/components/ui/button";
|
|
6
|
-
|
|
7
|
-
const AlertDialog = AlertDialogPrimitive.Root;
|
|
8
|
-
|
|
9
|
-
const AlertDialogTrigger = AlertDialogPrimitive.Trigger;
|
|
10
|
-
|
|
11
|
-
const AlertDialogPortal = AlertDialogPrimitive.Portal;
|
|
12
|
-
|
|
13
|
-
const AlertDialogOverlay = React.forwardRef<
|
|
14
|
-
React.ElementRef<typeof AlertDialogPrimitive.Overlay>,
|
|
15
|
-
React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Overlay>
|
|
16
|
-
>(({ className, ...props }, ref) => (
|
|
17
|
-
<AlertDialogPrimitive.Overlay
|
|
18
|
-
className={cn(
|
|
19
|
-
"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
|
|
20
|
-
className,
|
|
21
|
-
)}
|
|
22
|
-
{...props}
|
|
23
|
-
ref={ref}
|
|
24
|
-
/>
|
|
25
|
-
));
|
|
26
|
-
AlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName;
|
|
27
|
-
|
|
28
|
-
const AlertDialogContent = React.forwardRef<
|
|
29
|
-
React.ElementRef<typeof AlertDialogPrimitive.Content>,
|
|
30
|
-
React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Content>
|
|
31
|
-
>(({ className, ...props }, ref) => (
|
|
32
|
-
<AlertDialogPortal>
|
|
33
|
-
<AlertDialogOverlay />
|
|
34
|
-
<AlertDialogPrimitive.Content
|
|
35
|
-
ref={ref}
|
|
36
|
-
className={cn(
|
|
37
|
-
"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 sm:rounded-lg",
|
|
38
|
-
className,
|
|
39
|
-
)}
|
|
40
|
-
{...props}
|
|
41
|
-
/>
|
|
42
|
-
</AlertDialogPortal>
|
|
43
|
-
));
|
|
44
|
-
AlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName;
|
|
45
|
-
|
|
46
|
-
const AlertDialogHeader = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (
|
|
47
|
-
<div className={cn("flex flex-col space-y-2 text-center sm:text-left", className)} {...props} />
|
|
48
|
-
);
|
|
49
|
-
AlertDialogHeader.displayName = "AlertDialogHeader";
|
|
50
|
-
|
|
51
|
-
const AlertDialogFooter = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (
|
|
52
|
-
<div
|
|
53
|
-
className={cn("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2", className)}
|
|
54
|
-
{...props}
|
|
55
|
-
/>
|
|
56
|
-
);
|
|
57
|
-
AlertDialogFooter.displayName = "AlertDialogFooter";
|
|
58
|
-
|
|
59
|
-
const AlertDialogTitle = React.forwardRef<
|
|
60
|
-
React.ElementRef<typeof AlertDialogPrimitive.Title>,
|
|
61
|
-
React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Title>
|
|
62
|
-
>(({ className, ...props }, ref) => (
|
|
63
|
-
<AlertDialogPrimitive.Title
|
|
64
|
-
ref={ref}
|
|
65
|
-
className={cn("text-lg font-semibold", className)}
|
|
66
|
-
{...props}
|
|
67
|
-
/>
|
|
68
|
-
));
|
|
69
|
-
AlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName;
|
|
70
|
-
|
|
71
|
-
const AlertDialogDescription = React.forwardRef<
|
|
72
|
-
React.ElementRef<typeof AlertDialogPrimitive.Description>,
|
|
73
|
-
React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Description>
|
|
74
|
-
>(({ className, ...props }, ref) => (
|
|
75
|
-
<AlertDialogPrimitive.Description
|
|
76
|
-
ref={ref}
|
|
77
|
-
className={cn("text-sm text-muted-foreground", className)}
|
|
78
|
-
{...props}
|
|
79
|
-
/>
|
|
80
|
-
));
|
|
81
|
-
AlertDialogDescription.displayName = AlertDialogPrimitive.Description.displayName;
|
|
82
|
-
|
|
83
|
-
const AlertDialogAction = React.forwardRef<
|
|
84
|
-
React.ElementRef<typeof AlertDialogPrimitive.Action>,
|
|
85
|
-
React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Action>
|
|
86
|
-
>(({ className, ...props }, ref) => (
|
|
87
|
-
<AlertDialogPrimitive.Action ref={ref} className={cn(buttonVariants(), className)} {...props} />
|
|
88
|
-
));
|
|
89
|
-
AlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName;
|
|
90
|
-
|
|
91
|
-
const AlertDialogCancel = React.forwardRef<
|
|
92
|
-
React.ElementRef<typeof AlertDialogPrimitive.Cancel>,
|
|
93
|
-
React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Cancel>
|
|
94
|
-
>(({ className, ...props }, ref) => (
|
|
95
|
-
<AlertDialogPrimitive.Cancel
|
|
96
|
-
ref={ref}
|
|
97
|
-
className={cn(buttonVariants({ variant: "outline" }), "mt-2 sm:mt-0", className)}
|
|
98
|
-
{...props}
|
|
99
|
-
/>
|
|
100
|
-
));
|
|
101
|
-
AlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName;
|
|
102
|
-
|
|
103
|
-
export {
|
|
104
|
-
AlertDialog,
|
|
105
|
-
AlertDialogPortal,
|
|
106
|
-
AlertDialogOverlay,
|
|
107
|
-
AlertDialogTrigger,
|
|
108
|
-
AlertDialogContent,
|
|
109
|
-
AlertDialogHeader,
|
|
110
|
-
AlertDialogFooter,
|
|
111
|
-
AlertDialogTitle,
|
|
112
|
-
AlertDialogDescription,
|
|
113
|
-
AlertDialogAction,
|
|
114
|
-
AlertDialogCancel,
|
|
115
|
-
};
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import * as React from "react";
|
|
2
|
-
import { cva, type VariantProps } from "class-variance-authority";
|
|
3
|
-
|
|
4
|
-
import { cn } from "@/lib/utils";
|
|
5
|
-
|
|
6
|
-
const alertVariants = cva(
|
|
7
|
-
"relative w-full rounded-lg border px-4 py-3 text-sm [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground [&>svg~*]:pl-7",
|
|
8
|
-
{
|
|
9
|
-
variants: {
|
|
10
|
-
variant: {
|
|
11
|
-
default: "bg-background text-foreground",
|
|
12
|
-
destructive:
|
|
13
|
-
"border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive",
|
|
14
|
-
},
|
|
15
|
-
},
|
|
16
|
-
defaultVariants: {
|
|
17
|
-
variant: "default",
|
|
18
|
-
},
|
|
19
|
-
},
|
|
20
|
-
);
|
|
21
|
-
|
|
22
|
-
const Alert = React.forwardRef<
|
|
23
|
-
HTMLDivElement,
|
|
24
|
-
React.HTMLAttributes<HTMLDivElement> & VariantProps<typeof alertVariants>
|
|
25
|
-
>(({ className, variant, ...props }, ref) => (
|
|
26
|
-
<div ref={ref} role="alert" className={cn(alertVariants({ variant }), className)} {...props} />
|
|
27
|
-
));
|
|
28
|
-
Alert.displayName = "Alert";
|
|
29
|
-
|
|
30
|
-
const AlertTitle = React.forwardRef<HTMLParagraphElement, React.HTMLAttributes<HTMLHeadingElement>>(
|
|
31
|
-
({ className, ...props }, ref) => (
|
|
32
|
-
<h5
|
|
33
|
-
ref={ref}
|
|
34
|
-
className={cn("mb-1 font-medium leading-none tracking-tight", className)}
|
|
35
|
-
{...props}
|
|
36
|
-
/>
|
|
37
|
-
),
|
|
38
|
-
);
|
|
39
|
-
AlertTitle.displayName = "AlertTitle";
|
|
40
|
-
|
|
41
|
-
const AlertDescription = React.forwardRef<
|
|
42
|
-
HTMLParagraphElement,
|
|
43
|
-
React.HTMLAttributes<HTMLParagraphElement>
|
|
44
|
-
>(({ className, ...props }, ref) => (
|
|
45
|
-
<div ref={ref} className={cn("text-sm [&_p]:leading-relaxed", className)} {...props} />
|
|
46
|
-
));
|
|
47
|
-
AlertDescription.displayName = "AlertDescription";
|
|
48
|
-
|
|
49
|
-
export { Alert, AlertTitle, AlertDescription };
|