├── .editorconfig ├── .env.example ├── .gitattributes ├── .gitignore ├── Dockerfile ├── LICENSE.md ├── README.md ├── app ├── Actions │ ├── Fortify │ │ ├── CreateNewUser.php │ │ ├── PasswordValidationRules.php │ │ ├── ResetUserPassword.php │ │ ├── UpdateUserPassword.php │ │ └── UpdateUserProfileInformation.php │ ├── Jetstream │ │ ├── AddTeamMember.php │ │ ├── CreateTeam.php │ │ ├── DeleteTeam.php │ │ ├── DeleteUser.php │ │ ├── InviteTeamMember.php │ │ ├── RemoveTeamMember.php │ │ └── UpdateTeamName.php │ └── User │ │ ├── ActiveOauthProviderAction.php │ │ └── HandleOauthCallbackAction.php ├── Console │ └── Commands │ │ └── GenerateSitemap.php ├── Enums │ └── AppEnvironment.php ├── Exceptions │ └── OAuthAccountLinkingException.php ├── Filament │ └── Resources │ │ ├── UserResource.php │ │ └── UserResource │ │ └── Pages │ │ └── ListUsers.php ├── Http │ ├── Controllers │ │ ├── ApiUserController.php │ │ ├── ChatController.php │ │ ├── Controller.php │ │ ├── DashboardController.php │ │ ├── SubscriptionController.php │ │ ├── User │ │ │ ├── LoginLinkController.php │ │ │ └── OauthController.php │ │ └── WelcomeController.php │ └── Middleware │ │ └── HandleInertiaRequests.php ├── Jobs │ └── User │ │ └── UpdateUserProfileInformationJob.php ├── Models │ ├── LoginLink.php │ ├── Membership.php │ ├── OauthConnection.php │ ├── Team.php │ ├── TeamInvitation.php │ └── User.php ├── Notifications │ └── LoginLinkMail.php ├── Policies │ ├── TeamPolicy.php │ └── UserPolicy.php ├── Providers │ ├── AppServiceProvider.php │ ├── Filament │ │ └── AdminPanelProvider.php │ ├── FortifyServiceProvider.php │ ├── JetstreamServiceProvider.php │ └── TelescopeServiceProvider.php └── Traits │ └── AsFakeAction.php ├── artisan ├── bootstrap ├── app.php ├── cache │ └── .gitignore └── providers.php ├── bun.lock ├── components.json ├── composer.json ├── composer.lock ├── config ├── app.php ├── auth.php ├── blasp.php ├── cache.php ├── cashier.php ├── database.php ├── filament.php ├── filesystems.php ├── fortify.php ├── ide-helper.php ├── jetstream.php ├── logging.php ├── mail.php ├── oauth.php ├── octane.php ├── prism.php ├── queue.php ├── sanctum.php ├── scribe.php ├── sentry.php ├── services.php ├── session.php ├── sitemap.php ├── subscriptions.php └── telescope.php ├── database ├── .gitignore ├── factories │ ├── LoginLinkFactory.php │ ├── OauthConnectionFactory.php │ ├── TeamFactory.php │ └── UserFactory.php ├── migrations │ ├── 0001_01_01_000000_create_users_table.php │ ├── 0001_01_01_000001_create_cache_table.php │ ├── 0001_01_01_000002_create_jobs_table.php │ ├── 0001_01_01_000003_add_two_factor_columns_to_users_table.php │ ├── 0001_01_01_000004_create_personal_access_tokens_table.php │ ├── 0001_01_01_000005_create_teams_table.php │ ├── 0001_01_01_000006_create_team_user_table.php │ ├── 0001_01_01_000007_create_team_invitations_table.php │ ├── 0001_01_01_000008_create_oauth_connections_table.php │ ├── 0001_01_01_000009_create_telescope_entries_table.php │ ├── 0001_01_01_000010_create_customer_columns.php │ ├── 0001_01_01_000011_create_subscriptions_table.php │ ├── 0001_01_01_000012_create_subscription_items_table.php │ └── 0001_01_01_000013_create_login_links_table.php └── seeders │ └── DatabaseSeeder.php ├── eslint.config.js ├── package.json ├── phpstan.neon ├── phpunit.xml ├── pint.json ├── postcss.config.js ├── public ├── .htaccess ├── .user.ini ├── android-chrome-192x192.png ├── android-chrome-512x512.png ├── apple-touch-icon.png ├── css │ └── filament │ │ ├── filament │ │ └── app.css │ │ ├── forms │ │ └── forms.css │ │ └── support │ │ └── support.css ├── favicon copy.ico ├── favicon-16x16.png ├── favicon-32x32.png ├── favicon.ico ├── images │ ├── dashboard-dark.webp │ ├── dashboard-light.webp │ ├── og.webp │ └── rocket-dark.png ├── index.php ├── js │ └── filament │ │ ├── filament │ │ ├── app.js │ │ └── echo.js │ │ ├── forms │ │ └── components │ │ │ ├── color-picker.js │ │ │ ├── date-time-picker.js │ │ │ ├── file-upload.js │ │ │ ├── key-value.js │ │ │ ├── markdown-editor.js │ │ │ ├── rich-editor.js │ │ │ ├── select.js │ │ │ ├── tags-input.js │ │ │ └── textarea.js │ │ ├── notifications │ │ └── notifications.js │ │ ├── support │ │ ├── async-alpine.js │ │ └── support.js │ │ ├── tables │ │ ├── components │ │ │ └── table.js │ │ └── tables.js │ │ └── widgets │ │ └── components │ │ ├── chart.js │ │ └── stats-overview │ │ └── stat │ │ └── chart.js ├── llms.txt ├── robots.txt ├── site.webmanifest └── vendor │ └── telescope │ ├── app-dark.css │ ├── app.css │ ├── app.js │ ├── favicon.ico │ └── mix-manifest.json ├── rector.php ├── resources ├── css │ ├── app.css │ └── fonts.css ├── js │ ├── Components │ │ ├── ActionSection.vue │ │ ├── AppSidebarContent.vue │ │ ├── AppTeamManager.vue │ │ ├── AppUserManager.vue │ │ ├── ApplicationLogo.vue │ │ ├── ApplicationShortMark.vue │ │ ├── ConfirmationModal.vue │ │ ├── ConfirmsPassword.vue │ │ ├── FeaturesCard.vue │ │ ├── FormSection.vue │ │ ├── InputError.vue │ │ ├── LogoRedirect.vue │ │ ├── PricingCard.vue │ │ ├── SocialLoginButton.vue │ │ ├── StatsCard.vue │ │ ├── Terminal.vue │ │ └── ui │ │ │ ├── accordion │ │ │ ├── Accordion.vue │ │ │ ├── AccordionContent.vue │ │ │ ├── AccordionItem.vue │ │ │ ├── AccordionTrigger.vue │ │ │ └── index.ts │ │ │ ├── alert-dialog │ │ │ ├── AlertDialog.vue │ │ │ ├── AlertDialogAction.vue │ │ │ ├── AlertDialogCancel.vue │ │ │ ├── AlertDialogContent.vue │ │ │ ├── AlertDialogDescription.vue │ │ │ ├── AlertDialogFooter.vue │ │ │ ├── AlertDialogHeader.vue │ │ │ ├── AlertDialogTitle.vue │ │ │ ├── AlertDialogTrigger.vue │ │ │ └── index.ts │ │ │ ├── alert │ │ │ ├── Alert.vue │ │ │ ├── AlertDescription.vue │ │ │ ├── AlertTitle.vue │ │ │ └── index.ts │ │ │ ├── aspect-ratio │ │ │ ├── AspectRatio.vue │ │ │ └── index.ts │ │ │ ├── avatar │ │ │ ├── Avatar.vue │ │ │ ├── AvatarFallback.vue │ │ │ ├── AvatarImage.vue │ │ │ └── index.ts │ │ │ ├── badge │ │ │ ├── Badge.vue │ │ │ └── index.ts │ │ │ ├── breadcrumb │ │ │ ├── Breadcrumb.vue │ │ │ ├── BreadcrumbEllipsis.vue │ │ │ ├── BreadcrumbItem.vue │ │ │ ├── BreadcrumbLink.vue │ │ │ ├── BreadcrumbList.vue │ │ │ ├── BreadcrumbPage.vue │ │ │ ├── BreadcrumbSeparator.vue │ │ │ └── index.ts │ │ │ ├── button │ │ │ ├── Button.vue │ │ │ └── index.ts │ │ │ ├── calendar │ │ │ ├── Calendar.vue │ │ │ ├── CalendarCell.vue │ │ │ ├── CalendarCellTrigger.vue │ │ │ ├── CalendarGrid.vue │ │ │ ├── CalendarGridBody.vue │ │ │ ├── CalendarGridHead.vue │ │ │ ├── CalendarGridRow.vue │ │ │ ├── CalendarHeadCell.vue │ │ │ ├── CalendarHeader.vue │ │ │ ├── CalendarHeading.vue │ │ │ ├── CalendarNextButton.vue │ │ │ ├── CalendarPrevButton.vue │ │ │ └── index.ts │ │ │ ├── card │ │ │ ├── Card.vue │ │ │ ├── CardAction.vue │ │ │ ├── CardContent.vue │ │ │ ├── CardDescription.vue │ │ │ ├── CardFooter.vue │ │ │ ├── CardHeader.vue │ │ │ ├── CardTitle.vue │ │ │ └── index.ts │ │ │ ├── carousel │ │ │ ├── Carousel.vue │ │ │ ├── CarouselContent.vue │ │ │ ├── CarouselItem.vue │ │ │ ├── CarouselNext.vue │ │ │ ├── CarouselPrevious.vue │ │ │ ├── index.ts │ │ │ ├── interface.ts │ │ │ └── useCarousel.ts │ │ │ ├── checkbox │ │ │ ├── Checkbox.vue │ │ │ └── index.ts │ │ │ ├── collapsible │ │ │ ├── Collapsible.vue │ │ │ ├── CollapsibleContent.vue │ │ │ ├── CollapsibleTrigger.vue │ │ │ └── index.ts │ │ │ ├── command │ │ │ ├── Command.vue │ │ │ ├── CommandDialog.vue │ │ │ ├── CommandEmpty.vue │ │ │ ├── CommandGroup.vue │ │ │ ├── CommandInput.vue │ │ │ ├── CommandItem.vue │ │ │ ├── CommandList.vue │ │ │ ├── CommandSeparator.vue │ │ │ ├── CommandShortcut.vue │ │ │ └── index.ts │ │ │ ├── context-menu │ │ │ ├── ContextMenu.vue │ │ │ ├── ContextMenuCheckboxItem.vue │ │ │ ├── ContextMenuContent.vue │ │ │ ├── ContextMenuGroup.vue │ │ │ ├── ContextMenuItem.vue │ │ │ ├── ContextMenuLabel.vue │ │ │ ├── ContextMenuPortal.vue │ │ │ ├── ContextMenuRadioGroup.vue │ │ │ ├── ContextMenuRadioItem.vue │ │ │ ├── ContextMenuSeparator.vue │ │ │ ├── ContextMenuShortcut.vue │ │ │ ├── ContextMenuSub.vue │ │ │ ├── ContextMenuSubContent.vue │ │ │ ├── ContextMenuSubTrigger.vue │ │ │ ├── ContextMenuTrigger.vue │ │ │ └── index.ts │ │ │ ├── dialog │ │ │ ├── Dialog.vue │ │ │ ├── DialogClose.vue │ │ │ ├── DialogContent.vue │ │ │ ├── DialogDescription.vue │ │ │ ├── DialogFooter.vue │ │ │ ├── DialogHeader.vue │ │ │ ├── DialogOverlay.vue │ │ │ ├── DialogScrollContent.vue │ │ │ ├── DialogTitle.vue │ │ │ ├── DialogTrigger.vue │ │ │ └── index.ts │ │ │ ├── drawer │ │ │ ├── Drawer.vue │ │ │ ├── DrawerClose.vue │ │ │ ├── DrawerContent.vue │ │ │ ├── DrawerDescription.vue │ │ │ ├── DrawerFooter.vue │ │ │ ├── DrawerHeader.vue │ │ │ ├── DrawerOverlay.vue │ │ │ ├── DrawerTitle.vue │ │ │ ├── DrawerTrigger.vue │ │ │ └── index.ts │ │ │ ├── dropdown-menu │ │ │ ├── DropdownMenu.vue │ │ │ ├── DropdownMenuCheckboxItem.vue │ │ │ ├── DropdownMenuContent.vue │ │ │ ├── DropdownMenuGroup.vue │ │ │ ├── DropdownMenuItem.vue │ │ │ ├── DropdownMenuLabel.vue │ │ │ ├── DropdownMenuRadioGroup.vue │ │ │ ├── DropdownMenuRadioItem.vue │ │ │ ├── DropdownMenuSeparator.vue │ │ │ ├── DropdownMenuShortcut.vue │ │ │ ├── DropdownMenuSub.vue │ │ │ ├── DropdownMenuSubContent.vue │ │ │ ├── DropdownMenuSubTrigger.vue │ │ │ ├── DropdownMenuTrigger.vue │ │ │ └── index.ts │ │ │ ├── hover-card │ │ │ ├── HoverCard.vue │ │ │ ├── HoverCardContent.vue │ │ │ ├── HoverCardTrigger.vue │ │ │ └── index.ts │ │ │ ├── input │ │ │ ├── Input.vue │ │ │ └── index.ts │ │ │ ├── label │ │ │ ├── Label.vue │ │ │ └── index.ts │ │ │ ├── menubar │ │ │ ├── Menubar.vue │ │ │ ├── MenubarCheckboxItem.vue │ │ │ ├── MenubarContent.vue │ │ │ ├── MenubarGroup.vue │ │ │ ├── MenubarItem.vue │ │ │ ├── MenubarLabel.vue │ │ │ ├── MenubarMenu.vue │ │ │ ├── MenubarRadioGroup.vue │ │ │ ├── MenubarRadioItem.vue │ │ │ ├── MenubarSeparator.vue │ │ │ ├── MenubarShortcut.vue │ │ │ ├── MenubarSub.vue │ │ │ ├── MenubarSubContent.vue │ │ │ ├── MenubarSubTrigger.vue │ │ │ ├── MenubarTrigger.vue │ │ │ └── index.ts │ │ │ ├── navigation-menu │ │ │ ├── NavigationMenu.vue │ │ │ ├── NavigationMenuContent.vue │ │ │ ├── NavigationMenuIndicator.vue │ │ │ ├── NavigationMenuItem.vue │ │ │ ├── NavigationMenuLink.vue │ │ │ ├── NavigationMenuList.vue │ │ │ ├── NavigationMenuTrigger.vue │ │ │ ├── NavigationMenuViewport.vue │ │ │ └── index.ts │ │ │ ├── pagination │ │ │ ├── Pagination.vue │ │ │ ├── PaginationContent.vue │ │ │ ├── PaginationEllipsis.vue │ │ │ ├── PaginationFirst.vue │ │ │ ├── PaginationItem.vue │ │ │ ├── PaginationLast.vue │ │ │ ├── PaginationNext.vue │ │ │ ├── PaginationPrevious.vue │ │ │ └── index.ts │ │ │ ├── pin-input │ │ │ ├── PinInput.vue │ │ │ ├── PinInputGroup.vue │ │ │ ├── PinInputSeparator.vue │ │ │ ├── PinInputSlot.vue │ │ │ └── index.ts │ │ │ ├── popover │ │ │ ├── Popover.vue │ │ │ ├── PopoverAnchor.vue │ │ │ ├── PopoverContent.vue │ │ │ ├── PopoverTrigger.vue │ │ │ └── index.ts │ │ │ ├── progress │ │ │ ├── Progress.vue │ │ │ └── index.ts │ │ │ ├── radio-group │ │ │ ├── RadioGroup.vue │ │ │ ├── RadioGroupItem.vue │ │ │ └── index.ts │ │ │ ├── range-calendar │ │ │ ├── RangeCalendar.vue │ │ │ ├── RangeCalendarCell.vue │ │ │ ├── RangeCalendarCellTrigger.vue │ │ │ ├── RangeCalendarGrid.vue │ │ │ ├── RangeCalendarGridBody.vue │ │ │ ├── RangeCalendarGridHead.vue │ │ │ ├── RangeCalendarGridRow.vue │ │ │ ├── RangeCalendarHeadCell.vue │ │ │ ├── RangeCalendarHeader.vue │ │ │ ├── RangeCalendarHeading.vue │ │ │ ├── RangeCalendarNextButton.vue │ │ │ ├── RangeCalendarPrevButton.vue │ │ │ └── index.ts │ │ │ ├── resizable │ │ │ ├── ResizableHandle.vue │ │ │ ├── ResizablePanel.vue │ │ │ ├── ResizablePanelGroup.vue │ │ │ └── index.ts │ │ │ ├── scroll-area │ │ │ ├── ScrollArea.vue │ │ │ ├── ScrollBar.vue │ │ │ └── index.ts │ │ │ ├── select │ │ │ ├── Select.vue │ │ │ ├── SelectContent.vue │ │ │ ├── SelectGroup.vue │ │ │ ├── SelectItem.vue │ │ │ ├── SelectItemText.vue │ │ │ ├── SelectLabel.vue │ │ │ ├── SelectScrollDownButton.vue │ │ │ ├── SelectScrollUpButton.vue │ │ │ ├── SelectSeparator.vue │ │ │ ├── SelectTrigger.vue │ │ │ ├── SelectValue.vue │ │ │ └── index.ts │ │ │ ├── separator │ │ │ ├── Separator.vue │ │ │ └── index.ts │ │ │ ├── sheet │ │ │ ├── Sheet.vue │ │ │ ├── SheetClose.vue │ │ │ ├── SheetContent.vue │ │ │ ├── SheetDescription.vue │ │ │ ├── SheetFooter.vue │ │ │ ├── SheetHeader.vue │ │ │ ├── SheetOverlay.vue │ │ │ ├── SheetTitle.vue │ │ │ ├── SheetTrigger.vue │ │ │ └── index.ts │ │ │ ├── sidebar │ │ │ ├── Sidebar.vue │ │ │ ├── SidebarContent.vue │ │ │ ├── SidebarFooter.vue │ │ │ ├── SidebarGroup.vue │ │ │ ├── SidebarGroupAction.vue │ │ │ ├── SidebarGroupContent.vue │ │ │ ├── SidebarGroupLabel.vue │ │ │ ├── SidebarHeader.vue │ │ │ ├── SidebarInput.vue │ │ │ ├── SidebarInset.vue │ │ │ ├── SidebarMenu.vue │ │ │ ├── SidebarMenuAction.vue │ │ │ ├── SidebarMenuBadge.vue │ │ │ ├── SidebarMenuButton.vue │ │ │ ├── SidebarMenuButtonChild.vue │ │ │ ├── SidebarMenuItem.vue │ │ │ ├── SidebarMenuSkeleton.vue │ │ │ ├── SidebarMenuSub.vue │ │ │ ├── SidebarMenuSubButton.vue │ │ │ ├── SidebarMenuSubItem.vue │ │ │ ├── SidebarProvider.vue │ │ │ ├── SidebarRail.vue │ │ │ ├── SidebarSeparator.vue │ │ │ ├── SidebarTrigger.vue │ │ │ ├── index.ts │ │ │ └── utils.ts │ │ │ ├── skeleton │ │ │ ├── Skeleton.vue │ │ │ └── index.ts │ │ │ ├── slider │ │ │ ├── Slider.vue │ │ │ └── index.ts │ │ │ ├── sonner │ │ │ ├── Sonner.vue │ │ │ └── index.ts │ │ │ ├── stepper │ │ │ ├── Stepper.vue │ │ │ ├── StepperDescription.vue │ │ │ ├── StepperIndicator.vue │ │ │ ├── StepperItem.vue │ │ │ ├── StepperSeparator.vue │ │ │ ├── StepperTitle.vue │ │ │ ├── StepperTrigger.vue │ │ │ └── index.ts │ │ │ ├── switch │ │ │ ├── Switch.vue │ │ │ └── index.ts │ │ │ ├── table │ │ │ ├── Table.vue │ │ │ ├── TableBody.vue │ │ │ ├── TableCaption.vue │ │ │ ├── TableCell.vue │ │ │ ├── TableEmpty.vue │ │ │ ├── TableFooter.vue │ │ │ ├── TableHead.vue │ │ │ ├── TableHeader.vue │ │ │ ├── TableRow.vue │ │ │ ├── index.ts │ │ │ └── utils.ts │ │ │ ├── tabs │ │ │ ├── Tabs.vue │ │ │ ├── TabsContent.vue │ │ │ ├── TabsList.vue │ │ │ ├── TabsTrigger.vue │ │ │ └── index.ts │ │ │ ├── tags-input │ │ │ ├── TagsInput.vue │ │ │ ├── TagsInputInput.vue │ │ │ ├── TagsInputItem.vue │ │ │ ├── TagsInputItemDelete.vue │ │ │ ├── TagsInputItemText.vue │ │ │ └── index.ts │ │ │ ├── textarea │ │ │ ├── Textarea.vue │ │ │ └── index.ts │ │ │ ├── toggle-group │ │ │ ├── ToggleGroup.vue │ │ │ ├── ToggleGroupItem.vue │ │ │ └── index.ts │ │ │ ├── toggle │ │ │ ├── Toggle.vue │ │ │ └── index.ts │ │ │ └── tooltip │ │ │ ├── Tooltip.vue │ │ │ ├── TooltipContent.vue │ │ │ ├── TooltipProvider.vue │ │ │ ├── TooltipTrigger.vue │ │ │ └── index.ts │ ├── Composables │ │ └── useSeoMetaTags.js │ ├── Layouts │ │ ├── AppLayout.vue │ │ └── WebLayout.vue │ ├── Pages │ │ ├── API │ │ │ ├── Index.vue │ │ │ └── Partials │ │ │ │ └── ApiTokenManager.vue │ │ ├── Auth │ │ │ ├── ConfirmPassword.vue │ │ │ ├── ForgotPassword.vue │ │ │ ├── Login.vue │ │ │ ├── Register.vue │ │ │ ├── ResetPassword.vue │ │ │ ├── TwoFactorChallenge.vue │ │ │ └── VerifyEmail.vue │ │ ├── Chat │ │ │ ├── Components │ │ │ │ ├── ModelSelector.vue │ │ │ │ └── TemperatureSelector.vue │ │ │ └── Index.vue │ │ ├── Dashboard.vue │ │ ├── PrivacyPolicy.vue │ │ ├── Profile │ │ │ ├── Partials │ │ │ │ ├── DeleteUserForm.vue │ │ │ │ ├── LinkedAccountsForm.vue │ │ │ │ ├── LogoutOtherBrowserSessionsForm.vue │ │ │ │ ├── TwoFactorAuthenticationForm.vue │ │ │ │ ├── UpdatePasswordForm.vue │ │ │ │ └── UpdateProfileInformationForm.vue │ │ │ └── Show.vue │ │ ├── Subscriptions │ │ │ ├── Index.vue │ │ │ └── Partials │ │ │ │ ├── InvoiceManager.vue │ │ │ │ └── SubscriptionManager.vue │ │ ├── Teams │ │ │ ├── Create.vue │ │ │ ├── Partials │ │ │ │ ├── CreateTeamForm.vue │ │ │ │ ├── DeleteTeamForm.vue │ │ │ │ ├── TeamMemberManager.vue │ │ │ │ └── UpdateTeamNameForm.vue │ │ │ └── Show.vue │ │ ├── TermsOfService.vue │ │ └── Welcome.vue │ ├── app.js │ ├── bootstrap.js │ └── lib │ │ └── utils.js ├── markdown │ ├── policy.md │ └── terms.md └── views │ ├── app.blade.php │ ├── emails │ └── team-invitation.blade.php │ ├── prompts │ └── system.blade.php │ ├── scribe │ └── index.blade.php │ └── vendor │ └── mail │ └── html │ └── themes │ └── default.css ├── routes ├── api.php ├── console.php └── web.php ├── storage ├── app │ ├── .gitignore │ ├── private │ │ └── .gitignore │ └── public │ │ └── .gitignore ├── framework │ ├── .gitignore │ ├── cache │ │ ├── .gitignore │ │ └── data │ │ │ └── .gitignore │ ├── sessions │ │ └── .gitignore │ ├── testing │ │ └── .gitignore │ └── views │ │ └── .gitignore └── logs │ └── .gitignore ├── tests ├── Feature │ ├── Actions │ │ ├── Jetstream │ │ │ └── AddTeamMemberTest.php │ │ └── User │ │ │ └── HandleOauthCallbackActionTest.php │ ├── ApiTokenPermissionsTest.php │ ├── AuthenticationTest.php │ ├── BrowserSessionsTest.php │ ├── Controllers │ │ ├── ApiUserControllerTest.php │ │ ├── DashboardControllerTest.php │ │ └── User │ │ │ ├── LoginLinkControllerTest.php │ │ │ └── OauthControllerTest.php │ ├── CreateApiTokenTest.php │ ├── CreateTeamTest.php │ ├── DeleteAccountTest.php │ ├── DeleteApiTokenTest.php │ ├── DeleteTeamTest.php │ ├── EmailVerificationTest.php │ ├── ExampleTest.php │ ├── InviteTeamMemberTest.php │ ├── Jobs │ │ └── User │ │ │ └── UpdateUserProfileInformationJobTest.php │ ├── LeaveTeamTest.php │ ├── Models │ │ ├── LoginLinkTest.php │ │ └── OauthConnectionTest.php │ ├── PasswordConfirmationTest.php │ ├── PasswordResetTest.php │ ├── Policies │ │ └── UserPolicyTest.php │ ├── ProfileInformationTest.php │ ├── RegistrationTest.php │ ├── RemoveTeamMemberTest.php │ ├── TwoFactorAuthenticationSettingsTest.php │ ├── UpdatePasswordTest.php │ ├── UpdateTeamMemberRoleTest.php │ └── UpdateTeamNameTest.php ├── Pest.php ├── TestCase.php └── Unit │ └── ExampleTest.php ├── tsconfig.json └── vite.config.ts /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | end_of_line = lf 6 | indent_size = 4 7 | indent_style = space 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.md] 12 | trim_trailing_whitespace = false 13 | 14 | [*.{yml,yaml}] 15 | indent_size = 2 16 | 17 | [docker-compose.yml] 18 | indent_size = 4 19 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto eol=lf 2 | 3 | *.blade.php diff=html 4 | *.css diff=css 5 | *.html diff=html 6 | *.md diff=markdown 7 | *.php diff=php 8 | 9 | /.github export-ignore 10 | CHANGELOG.md export-ignore 11 | .styleci.yml export-ignore 12 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /.phpunit.cache 2 | /node_modules 3 | /public/build 4 | /public/hot 5 | /public/storage 6 | /storage/*.key 7 | /storage/pail 8 | /vendor 9 | .env 10 | .env.backup 11 | .env.production 12 | .phpactor.json 13 | .phpunit.result.cache 14 | Homestead.json 15 | Homestead.yaml 16 | npm-debug.log 17 | yarn-error.log 18 | /auth.json 19 | /.fleet 20 | /.idea 21 | /.vscode 22 | /.zed 23 | 24 | **/caddy 25 | frankenphp 26 | frankenphp-worker.php 27 | **/composer 28 | 29 | .DS_Store 30 | 31 | _ide_helper.php 32 | _ide_helper_models.php 33 | .phpstorm.meta.php 34 | 35 | .scribe/ 36 | -------------------------------------------------------------------------------- /app/Actions/Fortify/PasswordValidationRules.php: -------------------------------------------------------------------------------- 1 | |string> 16 | */ 17 | protected function passwordRules(): array 18 | { 19 | return ['required', 'string', Password::default(), 'confirmed']; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /app/Actions/Fortify/ResetUserPassword.php: -------------------------------------------------------------------------------- 1 | $input 20 | */ 21 | public function reset(User $user, array $input): void 22 | { 23 | Validator::make($input, [ 24 | 'password' => $this->passwordRules(), 25 | ])->validate(); 26 | 27 | $user->forceFill([ 28 | 'password' => Hash::make($input['password']), 29 | ])->save(); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /app/Actions/Fortify/UpdateUserPassword.php: -------------------------------------------------------------------------------- 1 | $input 20 | */ 21 | public function update(User $user, array $input): void 22 | { 23 | Validator::make($input, [ 24 | 'password' => $this->passwordRules(), 25 | ])->validateWithBag('updatePassword'); 26 | 27 | $user->forceFill([ 28 | 'password' => Hash::make($input['password']), 29 | ])->save(); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /app/Actions/Jetstream/DeleteTeam.php: -------------------------------------------------------------------------------- 1 | purge(); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /app/Actions/Jetstream/UpdateTeamName.php: -------------------------------------------------------------------------------- 1 | $input 19 | */ 20 | public function update(User $user, Team $team, array $input): void 21 | { 22 | Gate::forUser($user)->authorize('update', $team); 23 | 24 | Validator::make($input, [ 25 | 'name' => ['required', 'string', 'max:255'], 26 | ])->validateWithBag('updateTeamName'); 27 | 28 | $team->forceFill([ 29 | 'name' => $input['name'], 30 | ])->save(); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /app/Actions/User/ActiveOauthProviderAction.php: -------------------------------------------------------------------------------- 1 | 15 | */ 16 | public function handle(): array 17 | { 18 | /** @var array */ 19 | $providers = Config::array('oauth.providers'); 20 | 21 | return array_filter($providers, fn (array $provider): bool => $provider['active']); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /app/Console/Commands/GenerateSitemap.php: -------------------------------------------------------------------------------- 1 | writeToFile(public_path('sitemap.xml')); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /app/Enums/AppEnvironment.php: -------------------------------------------------------------------------------- 1 | $provider])); 16 | } 17 | 18 | public static function existingConnection(): self 19 | { 20 | return new self(self::EXISTING_CONNECTION_ERROR_MESSAGE); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/Filament/Resources/UserResource/Pages/ListUsers.php: -------------------------------------------------------------------------------- 1 | $user->subscribed('Larasonic Pro ✨'), 22 | 'systemPrompt' => view('prompts.system')->render(), 23 | 'models' => PrismServer::prisms()->pluck('name'), 24 | ]); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/Http/Controllers/Controller.php: -------------------------------------------------------------------------------- 1 | Route::has('login'), 17 | 'canRegister' => Route::has('register'), 18 | 'seo' => [ 19 | 'title' => 'Home', 20 | ], 21 | ]); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /artisan: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env php 2 | handleCommand(new ArgvInput); 14 | 15 | exit($status); 16 | -------------------------------------------------------------------------------- /bootstrap/cache/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /bootstrap/providers.php: -------------------------------------------------------------------------------- 1 | 13 | */ 14 | final class LoginLinkFactory extends Factory 15 | { 16 | /** 17 | * Define the model's default state. 18 | * 19 | * @return array, mixed> 20 | */ 21 | public function definition(): array 22 | { 23 | return [ 24 | 'user_id' => User::factory()->create()->id, 25 | 'token' => fake()->uuid(), 26 | 'expires_at' => fake()->dateTimeBetween('5 minutes', '15 minutes'), 27 | 'used_at' => null, 28 | ]; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /database/factories/TeamFactory.php: -------------------------------------------------------------------------------- 1 | 13 | */ 14 | final class TeamFactory extends Factory 15 | { 16 | /** 17 | * Define the model's default state. 18 | * 19 | * @return array, mixed> 20 | */ 21 | public function definition(): array 22 | { 23 | return [ 24 | 'name' => $this->faker->unique()->company(), 25 | 'user_id' => User::factory(), 26 | 'personal_team' => true, 27 | ]; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /database/migrations/0001_01_01_000001_create_cache_table.php: -------------------------------------------------------------------------------- 1 | string('key')->primary(); 18 | $table->mediumText('value'); 19 | $table->integer('expiration'); 20 | }); 21 | 22 | Schema::create('cache_locks', function (Blueprint $table): void { 23 | $table->string('key')->primary(); 24 | $table->string('owner'); 25 | $table->integer('expiration'); 26 | }); 27 | } 28 | 29 | /** 30 | * Reverse the migrations. 31 | */ 32 | public function down(): void 33 | { 34 | Schema::dropIfExists('cache'); 35 | Schema::dropIfExists('cache_locks'); 36 | } 37 | }; 38 | -------------------------------------------------------------------------------- /database/migrations/0001_01_01_000005_create_teams_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->foreignId('user_id')->index(); 19 | $table->string('name'); 20 | $table->boolean('personal_team'); 21 | $table->timestamps(); 22 | }); 23 | } 24 | 25 | /** 26 | * Reverse the migrations. 27 | */ 28 | public function down(): void 29 | { 30 | Schema::dropIfExists('teams'); 31 | } 32 | }; 33 | -------------------------------------------------------------------------------- /database/migrations/0001_01_01_000006_create_team_user_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->foreignId('team_id'); 19 | $table->foreignId('user_id'); 20 | $table->string('role')->nullable(); 21 | $table->timestamps(); 22 | 23 | $table->unique(['team_id', 'user_id']); 24 | }); 25 | } 26 | 27 | /** 28 | * Reverse the migrations. 29 | */ 30 | public function down(): void 31 | { 32 | Schema::dropIfExists('team_user'); 33 | } 34 | }; 35 | -------------------------------------------------------------------------------- /database/migrations/0001_01_01_000007_create_team_invitations_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->foreignId('team_id')->constrained()->cascadeOnDelete(); 19 | $table->string('email'); 20 | $table->string('role')->nullable(); 21 | $table->timestamps(); 22 | 23 | $table->unique(['team_id', 'email']); 24 | }); 25 | } 26 | 27 | /** 28 | * Reverse the migrations. 29 | */ 30 | public function down(): void 31 | { 32 | Schema::dropIfExists('team_invitations'); 33 | } 34 | }; 35 | -------------------------------------------------------------------------------- /database/migrations/0001_01_01_000013_create_login_links_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->foreignId('user_id')->constrained()->cascadeOnDelete(); 19 | $table->string('token', 64)->unique(); 20 | $table->timestamp('expires_at'); 21 | $table->timestamp('used_at')->nullable(); 22 | $table->timestamps(); 23 | }); 24 | } 25 | 26 | /** 27 | * Reverse the migrations. 28 | */ 29 | public function down(): void 30 | { 31 | Schema::dropIfExists('login_links'); 32 | } 33 | }; 34 | -------------------------------------------------------------------------------- /database/seeders/DatabaseSeeder.php: -------------------------------------------------------------------------------- 1 | withPersonalTeam()->create([ 20 | 'name' => 'Test User', 21 | 'email' => 'test@example.com', 22 | 'password' => Hash::make('password'), 23 | ]); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /eslint.config.js: -------------------------------------------------------------------------------- 1 | import antfu from '@antfu/eslint-config' 2 | 3 | export default antfu({ 4 | vue: true, 5 | typescript: false, 6 | formatters: { 7 | css: true, 8 | html: true, 9 | markdown: 'prettier', 10 | }, 11 | ignores: ['storage/**/*', '**/*.{yaml,yml,php}', 'resources/js/components/ui/**/*', 'public/**/*'], 12 | }) 13 | -------------------------------------------------------------------------------- /phpstan.neon: -------------------------------------------------------------------------------- 1 | includes: 2 | - vendor/larastan/larastan/extension.neon 3 | - vendor/nesbot/carbon/extension.neon 4 | 5 | parameters: 6 | paths: 7 | - app 8 | - bootstrap 9 | - database/factories 10 | - routes 11 | - config 12 | level: max 13 | checkOctaneCompatibility: true 14 | checkModelProperties: true 15 | excludePaths: 16 | - '**/ide-helper.php' 17 | - '**/ide_helper_models.php' 18 | - '**/phpstorm.meta.php' 19 | # ignoreErrors: 20 | # - '#PHPDoc tag @var#' 21 | # 22 | # excludePaths: 23 | # - ./*/*/FileToBeExcluded.php 24 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | '@tailwindcss/postcss': {}, 4 | }, 5 | } 6 | -------------------------------------------------------------------------------- /public/.htaccess: -------------------------------------------------------------------------------- 1 | 2 | 3 | Options -MultiViews -Indexes 4 | 5 | 6 | RewriteEngine On 7 | 8 | # Handle Authorization Header 9 | RewriteCond %{HTTP:Authorization} . 10 | RewriteRule .* - [E=HTTP_A 11 | 12 | # Handle X-XSRF-Token Header 13 | RewriteCond %{HTTP:x-xsrf-token} . 14 | RewriteRule .* - [E=HTTP_X_XSRF_TOKEN:%{HTTP:X-XSRF-Token}] 15 | 16 | # Redirect Trailing Slashes If Not A Folder... 17 | RewriteCond %{REQUEST_FILENAME} !-d 18 | RewriteCond %{REQUEST_URI} (.+)/$ 19 | RewriteRule ^ %1 [L,R=301] 20 | 21 | # Send Requests To Front Controller... 22 | RewriteCond %{REQUEST_FILENAME} !-d 23 | RewriteCond %{REQUEST_FILENAME} !-f 24 | RewriteRule ^ index.php [L] 25 | 26 | -------------------------------------------------------------------------------- /public/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shipfastlabs/larasonic-vue/f2cb7f5ed42039debd74bd005810dafab5fd9d2e/public/android-chrome-192x192.png -------------------------------------------------------------------------------- /public/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shipfastlabs/larasonic-vue/f2cb7f5ed42039debd74bd005810dafab5fd9d2e/public/android-chrome-512x512.png -------------------------------------------------------------------------------- /public/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shipfastlabs/larasonic-vue/f2cb7f5ed42039debd74bd005810dafab5fd9d2e/public/apple-touch-icon.png -------------------------------------------------------------------------------- /public/favicon copy.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shipfastlabs/larasonic-vue/f2cb7f5ed42039debd74bd005810dafab5fd9d2e/public/favicon copy.ico -------------------------------------------------------------------------------- /public/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shipfastlabs/larasonic-vue/f2cb7f5ed42039debd74bd005810dafab5fd9d2e/public/favicon-16x16.png -------------------------------------------------------------------------------- /public/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shipfastlabs/larasonic-vue/f2cb7f5ed42039debd74bd005810dafab5fd9d2e/public/favicon-32x32.png -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shipfastlabs/larasonic-vue/f2cb7f5ed42039debd74bd005810dafab5fd9d2e/public/favicon.ico -------------------------------------------------------------------------------- /public/images/dashboard-dark.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shipfastlabs/larasonic-vue/f2cb7f5ed42039debd74bd005810dafab5fd9d2e/public/images/dashboard-dark.webp -------------------------------------------------------------------------------- /public/images/dashboard-light.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shipfastlabs/larasonic-vue/f2cb7f5ed42039debd74bd005810dafab5fd9d2e/public/images/dashboard-light.webp -------------------------------------------------------------------------------- /public/images/og.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shipfastlabs/larasonic-vue/f2cb7f5ed42039debd74bd005810dafab5fd9d2e/public/images/og.webp -------------------------------------------------------------------------------- /public/images/rocket-dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shipfastlabs/larasonic-vue/f2cb7f5ed42039debd74bd005810dafab5fd9d2e/public/images/rocket-dark.png -------------------------------------------------------------------------------- /public/index.php: -------------------------------------------------------------------------------- 1 | handleRequest(Request::capture()); 20 | -------------------------------------------------------------------------------- /public/js/filament/forms/components/key-value.js: -------------------------------------------------------------------------------- 1 | function r({state:o}){return{state:o,rows:[],shouldUpdateRows:!0,init:function(){this.updateRows(),this.rows.length<=0?this.rows.push({key:"",value:""}):this.updateState(),this.$watch("state",(t,e)=>{let s=i=>i===null?0:Array.isArray(i)?i.length:typeof i!="object"?0:Object.keys(i).length;s(t)===0&&s(e)===0||this.updateRows()})},addRow:function(){this.rows.push({key:"",value:""}),this.updateState()},deleteRow:function(t){this.rows.splice(t,1),this.rows.length<=0&&this.addRow(),this.updateState()},reorderRows:function(t){let e=Alpine.raw(this.rows);this.rows=[];let s=e.splice(t.oldIndex,1)[0];e.splice(t.newIndex,0,s),this.$nextTick(()=>{this.rows=e,this.updateState()})},updateRows:function(){if(!this.shouldUpdateRows){this.shouldUpdateRows=!0;return}let t=[];for(let[e,s]of Object.entries(this.state??{}))t.push({key:e,value:s});this.rows=t},updateState:function(){let t={};this.rows.forEach(e=>{e.key===""||e.key===null||(t[e.key]=e.value)}),this.shouldUpdateRows=!1,this.state=t}}}export{r as default}; 2 | -------------------------------------------------------------------------------- /public/js/filament/forms/components/tags-input.js: -------------------------------------------------------------------------------- 1 | function i({state:a,splitKeys:n}){return{newTag:"",state:a,createTag:function(){if(this.newTag=this.newTag.trim(),this.newTag!==""){if(this.state.includes(this.newTag)){this.newTag="";return}this.state.push(this.newTag),this.newTag=""}},deleteTag:function(t){this.state=this.state.filter(e=>e!==t)},reorderTags:function(t){let e=this.state.splice(t.oldIndex,1)[0];this.state.splice(t.newIndex,0,e),this.state=[...this.state]},input:{"x-on:blur":"createTag()","x-model":"newTag","x-on:keydown"(t){["Enter",...n].includes(t.key)&&(t.preventDefault(),t.stopPropagation(),this.createTag())},"x-on:paste"(){this.$nextTick(()=>{if(n.length===0){this.createTag();return}let t=n.map(e=>e.replace(/[/\-\\^$*+?.()|[\]{}]/g,"\\$&")).join("|");this.newTag.split(new RegExp(t,"g")).forEach(e=>{this.newTag=e,this.createTag()})})}}}}export{i as default}; 2 | -------------------------------------------------------------------------------- /public/js/filament/forms/components/textarea.js: -------------------------------------------------------------------------------- 1 | function r({initialHeight:t,shouldAutosize:i,state:s}){return{state:s,wrapperEl:null,init:function(){this.wrapperEl=this.$el.parentNode,this.setInitialHeight(),i?this.$watch("state",()=>{this.resize()}):this.setUpResizeObserver()},setInitialHeight:function(){this.$el.scrollHeight<=0||(this.wrapperEl.style.height=t+"rem")},resize:function(){if(this.setInitialHeight(),this.$el.scrollHeight<=0)return;let e=this.$el.scrollHeight+"px";this.wrapperEl.style.height!==e&&(this.wrapperEl.style.height=e)},setUpResizeObserver:function(){new ResizeObserver(()=>{this.wrapperEl.style.height=this.$el.style.height}).observe(this.$el)}}}export{r as default}; 2 | -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: 3 | -------------------------------------------------------------------------------- /public/site.webmanifest: -------------------------------------------------------------------------------- 1 | {"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"} -------------------------------------------------------------------------------- /public/vendor/telescope/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shipfastlabs/larasonic-vue/f2cb7f5ed42039debd74bd005810dafab5fd9d2e/public/vendor/telescope/favicon.ico -------------------------------------------------------------------------------- /public/vendor/telescope/mix-manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "/app.js": "/app.js?id=6a9d3c0fef12c9aadd063e3a357cf7cf", 3 | "/app-dark.css": "/app-dark.css?id=1ea407db56c5163ae29311f1f38eb7b9", 4 | "/app.css": "/app.css?id=de4c978567bfd90b38d186937dee5ccf" 5 | } 6 | -------------------------------------------------------------------------------- /resources/css/fonts.css: -------------------------------------------------------------------------------- 1 | /* latin-ext */ 2 | @font-face { 3 | font-family: 'Geist'; 4 | font-style: normal; 5 | font-weight: 100 900; 6 | font-display: swap; 7 | src: url(https://fonts.gstatic.com/s/geist/v1/gyByhwUxId8gMEwSGFWNOITddY4.woff2) format('woff2'); 8 | unicode-range: 9 | U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, 10 | U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; 11 | } 12 | 13 | /* latin */ 14 | @font-face { 15 | font-family: 'Geist'; 16 | font-style: normal; 17 | font-weight: 100 900; 18 | font-display: swap; 19 | src: url(https://fonts.gstatic.com/s/geist/v1/gyByhwUxId8gMEwcGFWNOITd.woff2) format('woff2'); 20 | unicode-range: 21 | U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, 22 | U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 23 | } 24 | -------------------------------------------------------------------------------- /resources/js/Components/ActionSection.vue: -------------------------------------------------------------------------------- 1 | 26 | -------------------------------------------------------------------------------- /resources/js/Components/ApplicationLogo.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 8 | -------------------------------------------------------------------------------- /resources/js/Components/ApplicationShortMark.vue: -------------------------------------------------------------------------------- 1 | 6 | -------------------------------------------------------------------------------- /resources/js/Components/FeaturesCard.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 31 | -------------------------------------------------------------------------------- /resources/js/Components/InputError.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 15 | -------------------------------------------------------------------------------- /resources/js/Components/LogoRedirect.vue: -------------------------------------------------------------------------------- 1 | 5 | 6 | 11 | -------------------------------------------------------------------------------- /resources/js/Components/SocialLoginButton.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 28 | -------------------------------------------------------------------------------- /resources/js/Components/ui/accordion/Accordion.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 20 | -------------------------------------------------------------------------------- /resources/js/Components/ui/accordion/AccordionContent.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 23 | -------------------------------------------------------------------------------- /resources/js/Components/ui/accordion/AccordionItem.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 23 | -------------------------------------------------------------------------------- /resources/js/Components/ui/accordion/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Accordion } from './Accordion.vue' 2 | export { default as AccordionContent } from './AccordionContent.vue' 3 | export { default as AccordionItem } from './AccordionItem.vue' 4 | export { default as AccordionTrigger } from './AccordionTrigger.vue' 5 | -------------------------------------------------------------------------------- /resources/js/Components/ui/alert-dialog/AlertDialog.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 15 | -------------------------------------------------------------------------------- /resources/js/Components/ui/alert-dialog/AlertDialogAction.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 18 | -------------------------------------------------------------------------------- /resources/js/Components/ui/alert-dialog/AlertDialogCancel.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 25 | -------------------------------------------------------------------------------- /resources/js/Components/ui/alert-dialog/AlertDialogDescription.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 24 | -------------------------------------------------------------------------------- /resources/js/Components/ui/alert-dialog/AlertDialogFooter.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 23 | -------------------------------------------------------------------------------- /resources/js/Components/ui/alert-dialog/AlertDialogHeader.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 18 | -------------------------------------------------------------------------------- /resources/js/Components/ui/alert-dialog/AlertDialogTitle.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 21 | -------------------------------------------------------------------------------- /resources/js/Components/ui/alert-dialog/AlertDialogTrigger.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 12 | -------------------------------------------------------------------------------- /resources/js/Components/ui/alert-dialog/index.ts: -------------------------------------------------------------------------------- 1 | export { default as AlertDialog } from './AlertDialog.vue' 2 | export { default as AlertDialogAction } from './AlertDialogAction.vue' 3 | export { default as AlertDialogCancel } from './AlertDialogCancel.vue' 4 | export { default as AlertDialogContent } from './AlertDialogContent.vue' 5 | export { default as AlertDialogDescription } from './AlertDialogDescription.vue' 6 | export { default as AlertDialogFooter } from './AlertDialogFooter.vue' 7 | export { default as AlertDialogHeader } from './AlertDialogHeader.vue' 8 | export { default as AlertDialogTitle } from './AlertDialogTitle.vue' 9 | export { default as AlertDialogTrigger } from './AlertDialogTrigger.vue' 10 | -------------------------------------------------------------------------------- /resources/js/Components/ui/alert/Alert.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 21 | -------------------------------------------------------------------------------- /resources/js/Components/ui/alert/AlertDescription.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 18 | -------------------------------------------------------------------------------- /resources/js/Components/ui/alert/AlertTitle.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 18 | -------------------------------------------------------------------------------- /resources/js/Components/ui/alert/index.ts: -------------------------------------------------------------------------------- 1 | import { cva, type VariantProps } from 'class-variance-authority' 2 | 3 | export { default as Alert } from './Alert.vue' 4 | export { default as AlertDescription } from './AlertDescription.vue' 5 | export { default as AlertTitle } from './AlertTitle.vue' 6 | 7 | export const alertVariants = cva( 8 | 'relative w-full rounded-lg border px-4 py-3 text-sm grid has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] grid-cols-[0_1fr] has-[>svg]:gap-x-3 gap-y-0.5 items-start [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current', 9 | { 10 | variants: { 11 | variant: { 12 | default: 'bg-card text-card-foreground', 13 | destructive: 14 | 'text-destructive bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-destructive/90', 15 | }, 16 | }, 17 | defaultVariants: { 18 | variant: 'default', 19 | }, 20 | }, 21 | ) 22 | 23 | export type AlertVariants = VariantProps 24 | -------------------------------------------------------------------------------- /resources/js/Components/ui/aspect-ratio/AspectRatio.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 15 | -------------------------------------------------------------------------------- /resources/js/Components/ui/aspect-ratio/index.ts: -------------------------------------------------------------------------------- 1 | export { default as AspectRatio } from './AspectRatio.vue' 2 | -------------------------------------------------------------------------------- /resources/js/Components/ui/avatar/Avatar.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 19 | -------------------------------------------------------------------------------- /resources/js/Components/ui/avatar/AvatarFallback.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 21 | -------------------------------------------------------------------------------- /resources/js/Components/ui/avatar/AvatarImage.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 17 | -------------------------------------------------------------------------------- /resources/js/Components/ui/avatar/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Avatar } from './Avatar.vue' 2 | export { default as AvatarFallback } from './AvatarFallback.vue' 3 | export { default as AvatarImage } from './AvatarImage.vue' 4 | -------------------------------------------------------------------------------- /resources/js/Components/ui/badge/Badge.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 26 | -------------------------------------------------------------------------------- /resources/js/Components/ui/breadcrumb/Breadcrumb.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 18 | -------------------------------------------------------------------------------- /resources/js/Components/ui/breadcrumb/BreadcrumbEllipsis.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 24 | -------------------------------------------------------------------------------- /resources/js/Components/ui/breadcrumb/BreadcrumbItem.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 18 | -------------------------------------------------------------------------------- /resources/js/Components/ui/breadcrumb/BreadcrumbLink.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 21 | -------------------------------------------------------------------------------- /resources/js/Components/ui/breadcrumb/BreadcrumbList.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 18 | -------------------------------------------------------------------------------- /resources/js/Components/ui/breadcrumb/BreadcrumbPage.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 21 | -------------------------------------------------------------------------------- /resources/js/Components/ui/breadcrumb/BreadcrumbSeparator.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 23 | -------------------------------------------------------------------------------- /resources/js/Components/ui/breadcrumb/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Breadcrumb } from './Breadcrumb.vue' 2 | export { default as BreadcrumbEllipsis } from './BreadcrumbEllipsis.vue' 3 | export { default as BreadcrumbItem } from './BreadcrumbItem.vue' 4 | export { default as BreadcrumbLink } from './BreadcrumbLink.vue' 5 | export { default as BreadcrumbList } from './BreadcrumbList.vue' 6 | export { default as BreadcrumbPage } from './BreadcrumbPage.vue' 7 | export { default as BreadcrumbSeparator } from './BreadcrumbSeparator.vue' 8 | -------------------------------------------------------------------------------- /resources/js/Components/ui/button/Button.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 28 | -------------------------------------------------------------------------------- /resources/js/Components/ui/calendar/CalendarCell.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 23 | -------------------------------------------------------------------------------- /resources/js/Components/ui/calendar/CalendarGrid.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 23 | -------------------------------------------------------------------------------- /resources/js/Components/ui/calendar/CalendarGridBody.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 15 | -------------------------------------------------------------------------------- /resources/js/Components/ui/calendar/CalendarGridHead.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 16 | -------------------------------------------------------------------------------- /resources/js/Components/ui/calendar/CalendarGridRow.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 22 | -------------------------------------------------------------------------------- /resources/js/Components/ui/calendar/CalendarHeadCell.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 23 | -------------------------------------------------------------------------------- /resources/js/Components/ui/calendar/CalendarHeader.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 23 | -------------------------------------------------------------------------------- /resources/js/Components/ui/calendar/CalendarHeading.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 30 | -------------------------------------------------------------------------------- /resources/js/Components/ui/calendar/CalendarNextButton.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 32 | -------------------------------------------------------------------------------- /resources/js/Components/ui/calendar/CalendarPrevButton.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 32 | -------------------------------------------------------------------------------- /resources/js/Components/ui/calendar/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Calendar } from './Calendar.vue' 2 | export { default as CalendarCell } from './CalendarCell.vue' 3 | export { default as CalendarCellTrigger } from './CalendarCellTrigger.vue' 4 | export { default as CalendarGrid } from './CalendarGrid.vue' 5 | export { default as CalendarGridBody } from './CalendarGridBody.vue' 6 | export { default as CalendarGridHead } from './CalendarGridHead.vue' 7 | export { default as CalendarGridRow } from './CalendarGridRow.vue' 8 | export { default as CalendarHeadCell } from './CalendarHeadCell.vue' 9 | export { default as CalendarHeader } from './CalendarHeader.vue' 10 | export { default as CalendarHeading } from './CalendarHeading.vue' 11 | export { default as CalendarNextButton } from './CalendarNextButton.vue' 12 | export { default as CalendarPrevButton } from './CalendarPrevButton.vue' 13 | -------------------------------------------------------------------------------- /resources/js/Components/ui/card/Card.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 23 | -------------------------------------------------------------------------------- /resources/js/Components/ui/card/CardAction.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 18 | -------------------------------------------------------------------------------- /resources/js/Components/ui/card/CardContent.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 18 | -------------------------------------------------------------------------------- /resources/js/Components/ui/card/CardDescription.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 18 | -------------------------------------------------------------------------------- /resources/js/Components/ui/card/CardFooter.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 18 | -------------------------------------------------------------------------------- /resources/js/Components/ui/card/CardHeader.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 18 | -------------------------------------------------------------------------------- /resources/js/Components/ui/card/CardTitle.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 18 | -------------------------------------------------------------------------------- /resources/js/Components/ui/card/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Card } from './Card.vue' 2 | export { default as CardAction } from './CardAction.vue' 3 | export { default as CardContent } from './CardContent.vue' 4 | export { default as CardDescription } from './CardDescription.vue' 5 | export { default as CardFooter } from './CardFooter.vue' 6 | export { default as CardHeader } from './CardHeader.vue' 7 | export { default as CardTitle } from './CardTitle.vue' 8 | -------------------------------------------------------------------------------- /resources/js/Components/ui/carousel/CarouselContent.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 34 | -------------------------------------------------------------------------------- /resources/js/Components/ui/carousel/CarouselItem.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 25 | -------------------------------------------------------------------------------- /resources/js/Components/ui/carousel/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Carousel } from './Carousel.vue' 2 | export { default as CarouselContent } from './CarouselContent.vue' 3 | export { default as CarouselItem } from './CarouselItem.vue' 4 | export { default as CarouselNext } from './CarouselNext.vue' 5 | export { default as CarouselPrevious } from './CarouselPrevious.vue' 6 | export type { 7 | UnwrapRefCarouselApi as CarouselApi, 8 | } from './interface' 9 | 10 | export { useCarousel } from './useCarousel' 11 | -------------------------------------------------------------------------------- /resources/js/Components/ui/carousel/interface.ts: -------------------------------------------------------------------------------- 1 | import type useEmblaCarousel from 'embla-carousel-vue' 2 | import type { 3 | EmblaCarouselVueType, 4 | } from 'embla-carousel-vue' 5 | import type { HTMLAttributes, UnwrapRef } from 'vue' 6 | 7 | type CarouselApi = EmblaCarouselVueType[1] 8 | type UseCarouselParameters = Parameters 9 | type CarouselOptions = UseCarouselParameters[0] 10 | type CarouselPlugin = UseCarouselParameters[1] 11 | 12 | export type UnwrapRefCarouselApi = UnwrapRef 13 | 14 | export interface CarouselProps { 15 | opts?: CarouselOptions 16 | plugins?: CarouselPlugin 17 | orientation?: 'horizontal' | 'vertical' 18 | } 19 | 20 | export interface CarouselEmits { 21 | (e: 'init-api', payload: UnwrapRefCarouselApi): void 22 | } 23 | 24 | export interface WithClassAsProps { 25 | class?: HTMLAttributes['class'] 26 | } 27 | -------------------------------------------------------------------------------- /resources/js/Components/ui/checkbox/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Checkbox } from './Checkbox.vue' 2 | -------------------------------------------------------------------------------- /resources/js/Components/ui/collapsible/Collapsible.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 20 | -------------------------------------------------------------------------------- /resources/js/Components/ui/collapsible/CollapsibleContent.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 15 | -------------------------------------------------------------------------------- /resources/js/Components/ui/collapsible/CollapsibleTrigger.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 15 | -------------------------------------------------------------------------------- /resources/js/Components/ui/collapsible/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Collapsible } from './Collapsible.vue' 2 | export { default as CollapsibleContent } from './CollapsibleContent.vue' 3 | export { default as CollapsibleTrigger } from './CollapsibleTrigger.vue' 4 | -------------------------------------------------------------------------------- /resources/js/Components/ui/command/CommandEmpty.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 27 | -------------------------------------------------------------------------------- /resources/js/Components/ui/command/CommandList.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 26 | -------------------------------------------------------------------------------- /resources/js/Components/ui/command/CommandSeparator.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 22 | -------------------------------------------------------------------------------- /resources/js/Components/ui/command/CommandShortcut.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 18 | -------------------------------------------------------------------------------- /resources/js/Components/ui/context-menu/ContextMenu.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 19 | -------------------------------------------------------------------------------- /resources/js/Components/ui/context-menu/ContextMenuGroup.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 15 | -------------------------------------------------------------------------------- /resources/js/Components/ui/context-menu/ContextMenuLabel.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 22 | -------------------------------------------------------------------------------- /resources/js/Components/ui/context-menu/ContextMenuPortal.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 15 | -------------------------------------------------------------------------------- /resources/js/Components/ui/context-menu/ContextMenuRadioGroup.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 23 | -------------------------------------------------------------------------------- /resources/js/Components/ui/context-menu/ContextMenuSeparator.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 22 | -------------------------------------------------------------------------------- /resources/js/Components/ui/context-menu/ContextMenuShortcut.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 18 | -------------------------------------------------------------------------------- /resources/js/Components/ui/context-menu/ContextMenuSub.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 23 | -------------------------------------------------------------------------------- /resources/js/Components/ui/context-menu/ContextMenuTrigger.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 17 | -------------------------------------------------------------------------------- /resources/js/Components/ui/dialog/Dialog.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 18 | -------------------------------------------------------------------------------- /resources/js/Components/ui/dialog/DialogClose.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 15 | -------------------------------------------------------------------------------- /resources/js/Components/ui/dialog/DialogDescription.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 23 | -------------------------------------------------------------------------------- /resources/js/Components/ui/dialog/DialogFooter.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 16 | -------------------------------------------------------------------------------- /resources/js/Components/ui/dialog/DialogHeader.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 18 | -------------------------------------------------------------------------------- /resources/js/Components/ui/dialog/DialogOverlay.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 21 | -------------------------------------------------------------------------------- /resources/js/Components/ui/dialog/DialogTitle.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 23 | -------------------------------------------------------------------------------- /resources/js/Components/ui/dialog/DialogTrigger.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 15 | -------------------------------------------------------------------------------- /resources/js/Components/ui/dialog/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Dialog } from './Dialog.vue' 2 | export { default as DialogClose } from './DialogClose.vue' 3 | export { default as DialogContent } from './DialogContent.vue' 4 | export { default as DialogDescription } from './DialogDescription.vue' 5 | export { default as DialogFooter } from './DialogFooter.vue' 6 | export { default as DialogHeader } from './DialogHeader.vue' 7 | export { default as DialogOverlay } from './DialogOverlay.vue' 8 | export { default as DialogScrollContent } from './DialogScrollContent.vue' 9 | export { default as DialogTitle } from './DialogTitle.vue' 10 | export { default as DialogTrigger } from './DialogTrigger.vue' 11 | -------------------------------------------------------------------------------- /resources/js/Components/ui/drawer/Drawer.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 23 | -------------------------------------------------------------------------------- /resources/js/Components/ui/drawer/DrawerClose.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 16 | -------------------------------------------------------------------------------- /resources/js/Components/ui/drawer/DrawerDescription.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 22 | -------------------------------------------------------------------------------- /resources/js/Components/ui/drawer/DrawerFooter.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 18 | -------------------------------------------------------------------------------- /resources/js/Components/ui/drawer/DrawerHeader.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 18 | -------------------------------------------------------------------------------- /resources/js/Components/ui/drawer/DrawerOverlay.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 20 | -------------------------------------------------------------------------------- /resources/js/Components/ui/drawer/DrawerTitle.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 22 | -------------------------------------------------------------------------------- /resources/js/Components/ui/drawer/DrawerTrigger.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 16 | -------------------------------------------------------------------------------- /resources/js/Components/ui/drawer/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Drawer } from './Drawer.vue' 2 | export { default as DrawerClose } from './DrawerClose.vue' 3 | export { default as DrawerContent } from './DrawerContent.vue' 4 | export { default as DrawerDescription } from './DrawerDescription.vue' 5 | export { default as DrawerFooter } from './DrawerFooter.vue' 6 | export { default as DrawerHeader } from './DrawerHeader.vue' 7 | export { default as DrawerOverlay } from './DrawerOverlay.vue' 8 | export { default as DrawerTitle } from './DrawerTitle.vue' 9 | export { default as DrawerTrigger } from './DrawerTrigger.vue' 10 | -------------------------------------------------------------------------------- /resources/js/Components/ui/dropdown-menu/DropdownMenu.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 18 | -------------------------------------------------------------------------------- /resources/js/Components/ui/dropdown-menu/DropdownMenuGroup.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 15 | -------------------------------------------------------------------------------- /resources/js/Components/ui/dropdown-menu/DropdownMenuLabel.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 23 | -------------------------------------------------------------------------------- /resources/js/Components/ui/dropdown-menu/DropdownMenuRadioGroup.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 23 | -------------------------------------------------------------------------------- /resources/js/Components/ui/dropdown-menu/DropdownMenuSeparator.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 24 | -------------------------------------------------------------------------------- /resources/js/Components/ui/dropdown-menu/DropdownMenuShortcut.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 18 | -------------------------------------------------------------------------------- /resources/js/Components/ui/dropdown-menu/DropdownMenuSub.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 20 | -------------------------------------------------------------------------------- /resources/js/Components/ui/dropdown-menu/DropdownMenuTrigger.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 17 | -------------------------------------------------------------------------------- /resources/js/Components/ui/hover-card/HoverCard.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 18 | -------------------------------------------------------------------------------- /resources/js/Components/ui/hover-card/HoverCardTrigger.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 15 | -------------------------------------------------------------------------------- /resources/js/Components/ui/hover-card/index.ts: -------------------------------------------------------------------------------- 1 | export { default as HoverCard } from './HoverCard.vue' 2 | export { default as HoverCardContent } from './HoverCardContent.vue' 3 | export { default as HoverCardTrigger } from './HoverCardTrigger.vue' 4 | -------------------------------------------------------------------------------- /resources/js/Components/ui/input/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Input } from './Input.vue' 2 | -------------------------------------------------------------------------------- /resources/js/Components/ui/label/Label.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 26 | -------------------------------------------------------------------------------- /resources/js/Components/ui/label/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Label } from './Label.vue' 2 | -------------------------------------------------------------------------------- /resources/js/Components/ui/menubar/Menubar.vue: -------------------------------------------------------------------------------- 1 | 19 | 20 | 34 | -------------------------------------------------------------------------------- /resources/js/Components/ui/menubar/MenubarGroup.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 15 | -------------------------------------------------------------------------------- /resources/js/Components/ui/menubar/MenubarLabel.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 20 | -------------------------------------------------------------------------------- /resources/js/Components/ui/menubar/MenubarMenu.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 15 | -------------------------------------------------------------------------------- /resources/js/Components/ui/menubar/MenubarRadioGroup.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 23 | -------------------------------------------------------------------------------- /resources/js/Components/ui/menubar/MenubarSeparator.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 21 | -------------------------------------------------------------------------------- /resources/js/Components/ui/menubar/MenubarShortcut.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 18 | -------------------------------------------------------------------------------- /resources/js/Components/ui/menubar/MenubarSub.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 23 | -------------------------------------------------------------------------------- /resources/js/Components/ui/menubar/MenubarTrigger.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 28 | -------------------------------------------------------------------------------- /resources/js/Components/ui/menubar/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Menubar } from './Menubar.vue' 2 | export { default as MenubarCheckboxItem } from './MenubarCheckboxItem.vue' 3 | export { default as MenubarContent } from './MenubarContent.vue' 4 | export { default as MenubarGroup } from './MenubarGroup.vue' 5 | export { default as MenubarItem } from './MenubarItem.vue' 6 | export { default as MenubarLabel } from './MenubarLabel.vue' 7 | export { default as MenubarMenu } from './MenubarMenu.vue' 8 | export { default as MenubarRadioGroup } from './MenubarRadioGroup.vue' 9 | export { default as MenubarRadioItem } from './MenubarRadioItem.vue' 10 | export { default as MenubarSeparator } from './MenubarSeparator.vue' 11 | export { default as MenubarShortcut } from './MenubarShortcut.vue' 12 | export { default as MenubarSub } from './MenubarSub.vue' 13 | export { default as MenubarSubContent } from './MenubarSubContent.vue' 14 | export { default as MenubarSubTrigger } from './MenubarSubTrigger.vue' 15 | export { default as MenubarTrigger } from './MenubarTrigger.vue' 16 | -------------------------------------------------------------------------------- /resources/js/Components/ui/navigation-menu/NavigationMenuIndicator.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 23 | -------------------------------------------------------------------------------- /resources/js/Components/ui/navigation-menu/NavigationMenuItem.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 21 | -------------------------------------------------------------------------------- /resources/js/Components/ui/navigation-menu/NavigationMenuList.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 28 | -------------------------------------------------------------------------------- /resources/js/Components/ui/pagination/Pagination.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 26 | -------------------------------------------------------------------------------- /resources/js/Components/ui/pagination/PaginationContent.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 22 | -------------------------------------------------------------------------------- /resources/js/Components/ui/pagination/PaginationEllipsis.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 25 | -------------------------------------------------------------------------------- /resources/js/Components/ui/pagination/PaginationItem.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 33 | -------------------------------------------------------------------------------- /resources/js/Components/ui/pagination/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Pagination } from './Pagination.vue' 2 | export { default as PaginationContent } from './PaginationContent.vue' 3 | export { default as PaginationEllipsis } from './PaginationEllipsis.vue' 4 | export { default as PaginationFirst } from './PaginationFirst.vue' 5 | export { default as PaginationItem } from './PaginationItem.vue' 6 | export { default as PaginationLast } from './PaginationLast.vue' 7 | export { default as PaginationNext } from './PaginationNext.vue' 8 | export { default as PaginationPrevious } from './PaginationPrevious.vue' 9 | -------------------------------------------------------------------------------- /resources/js/Components/ui/pin-input/PinInput.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 25 | -------------------------------------------------------------------------------- /resources/js/Components/ui/pin-input/PinInputGroup.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 21 | -------------------------------------------------------------------------------- /resources/js/Components/ui/pin-input/PinInputSeparator.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 19 | -------------------------------------------------------------------------------- /resources/js/Components/ui/pin-input/index.ts: -------------------------------------------------------------------------------- 1 | export { default as PinInput } from './PinInput.vue' 2 | export { default as PinInputGroup } from './PinInputGroup.vue' 3 | export { default as PinInputSeparator } from './PinInputSeparator.vue' 4 | export { default as PinInputSlot } from './PinInputSlot.vue' 5 | -------------------------------------------------------------------------------- /resources/js/Components/ui/popover/Popover.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 19 | -------------------------------------------------------------------------------- /resources/js/Components/ui/popover/PopoverAnchor.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 16 | -------------------------------------------------------------------------------- /resources/js/Components/ui/popover/PopoverTrigger.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 15 | -------------------------------------------------------------------------------- /resources/js/Components/ui/popover/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Popover } from './Popover.vue' 2 | export { default as PopoverAnchor } from './PopoverAnchor.vue' 3 | export { default as PopoverContent } from './PopoverContent.vue' 4 | export { default as PopoverTrigger } from './PopoverTrigger.vue' 5 | -------------------------------------------------------------------------------- /resources/js/Components/ui/progress/Progress.vue: -------------------------------------------------------------------------------- 1 | 20 | 21 | 39 | -------------------------------------------------------------------------------- /resources/js/Components/ui/progress/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Progress } from './Progress.vue' 2 | -------------------------------------------------------------------------------- /resources/js/Components/ui/radio-group/RadioGroup.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 24 | -------------------------------------------------------------------------------- /resources/js/Components/ui/radio-group/index.ts: -------------------------------------------------------------------------------- 1 | export { default as RadioGroup } from './RadioGroup.vue' 2 | export { default as RadioGroupItem } from './RadioGroupItem.vue' 3 | -------------------------------------------------------------------------------- /resources/js/Components/ui/range-calendar/RangeCalendarCell.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 23 | -------------------------------------------------------------------------------- /resources/js/Components/ui/range-calendar/RangeCalendarGrid.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 23 | -------------------------------------------------------------------------------- /resources/js/Components/ui/range-calendar/RangeCalendarGridBody.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 15 | -------------------------------------------------------------------------------- /resources/js/Components/ui/range-calendar/RangeCalendarGridHead.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 15 | -------------------------------------------------------------------------------- /resources/js/Components/ui/range-calendar/RangeCalendarGridRow.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 22 | -------------------------------------------------------------------------------- /resources/js/Components/ui/range-calendar/RangeCalendarHeadCell.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 23 | -------------------------------------------------------------------------------- /resources/js/Components/ui/range-calendar/RangeCalendarHeader.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 23 | -------------------------------------------------------------------------------- /resources/js/Components/ui/range-calendar/RangeCalendarHeading.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 30 | -------------------------------------------------------------------------------- /resources/js/Components/ui/range-calendar/index.ts: -------------------------------------------------------------------------------- 1 | export { default as RangeCalendar } from './RangeCalendar.vue' 2 | export { default as RangeCalendarCell } from './RangeCalendarCell.vue' 3 | export { default as RangeCalendarCellTrigger } from './RangeCalendarCellTrigger.vue' 4 | export { default as RangeCalendarGrid } from './RangeCalendarGrid.vue' 5 | export { default as RangeCalendarGridBody } from './RangeCalendarGridBody.vue' 6 | export { default as RangeCalendarGridHead } from './RangeCalendarGridHead.vue' 7 | export { default as RangeCalendarGridRow } from './RangeCalendarGridRow.vue' 8 | export { default as RangeCalendarHeadCell } from './RangeCalendarHeadCell.vue' 9 | export { default as RangeCalendarHeader } from './RangeCalendarHeader.vue' 10 | export { default as RangeCalendarHeading } from './RangeCalendarHeading.vue' 11 | export { default as RangeCalendarNextButton } from './RangeCalendarNextButton.vue' 12 | export { default as RangeCalendarPrevButton } from './RangeCalendarPrevButton.vue' 13 | -------------------------------------------------------------------------------- /resources/js/Components/ui/resizable/ResizablePanel.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 19 | -------------------------------------------------------------------------------- /resources/js/Components/ui/resizable/ResizablePanelGroup.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 24 | -------------------------------------------------------------------------------- /resources/js/Components/ui/resizable/index.ts: -------------------------------------------------------------------------------- 1 | export { default as ResizableHandle } from './ResizableHandle.vue' 2 | export { default as ResizablePanel } from './ResizablePanel.vue' 3 | export { default as ResizablePanelGroup } from './ResizablePanelGroup.vue' 4 | -------------------------------------------------------------------------------- /resources/js/Components/ui/scroll-area/index.ts: -------------------------------------------------------------------------------- 1 | export { default as ScrollArea } from './ScrollArea.vue' 2 | export { default as ScrollBar } from './ScrollBar.vue' 3 | -------------------------------------------------------------------------------- /resources/js/Components/ui/select/Select.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 19 | -------------------------------------------------------------------------------- /resources/js/Components/ui/select/SelectGroup.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 15 | -------------------------------------------------------------------------------- /resources/js/Components/ui/select/SelectItemText.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 15 | -------------------------------------------------------------------------------- /resources/js/Components/ui/select/SelectLabel.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 17 | -------------------------------------------------------------------------------- /resources/js/Components/ui/select/SelectScrollDownButton.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 26 | -------------------------------------------------------------------------------- /resources/js/Components/ui/select/SelectScrollUpButton.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 26 | -------------------------------------------------------------------------------- /resources/js/Components/ui/select/SelectSeparator.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 19 | -------------------------------------------------------------------------------- /resources/js/Components/ui/select/SelectValue.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 15 | -------------------------------------------------------------------------------- /resources/js/Components/ui/select/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Select } from './Select.vue' 2 | export { default as SelectContent } from './SelectContent.vue' 3 | export { default as SelectGroup } from './SelectGroup.vue' 4 | export { default as SelectItem } from './SelectItem.vue' 5 | export { default as SelectItemText } from './SelectItemText.vue' 6 | export { default as SelectLabel } from './SelectLabel.vue' 7 | export { default as SelectScrollDownButton } from './SelectScrollDownButton.vue' 8 | export { default as SelectScrollUpButton } from './SelectScrollUpButton.vue' 9 | export { default as SelectSeparator } from './SelectSeparator.vue' 10 | export { default as SelectTrigger } from './SelectTrigger.vue' 11 | export { default as SelectValue } from './SelectValue.vue' 12 | -------------------------------------------------------------------------------- /resources/js/Components/ui/separator/Separator.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 29 | -------------------------------------------------------------------------------- /resources/js/Components/ui/separator/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Separator } from './Separator.vue' 2 | -------------------------------------------------------------------------------- /resources/js/Components/ui/sheet/Sheet.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 18 | -------------------------------------------------------------------------------- /resources/js/Components/ui/sheet/SheetClose.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 15 | -------------------------------------------------------------------------------- /resources/js/Components/ui/sheet/SheetDescription.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 21 | -------------------------------------------------------------------------------- /resources/js/Components/ui/sheet/SheetFooter.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 17 | -------------------------------------------------------------------------------- /resources/js/Components/ui/sheet/SheetHeader.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 16 | -------------------------------------------------------------------------------- /resources/js/Components/ui/sheet/SheetOverlay.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 21 | -------------------------------------------------------------------------------- /resources/js/Components/ui/sheet/SheetTitle.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 21 | -------------------------------------------------------------------------------- /resources/js/Components/ui/sheet/SheetTrigger.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 15 | -------------------------------------------------------------------------------- /resources/js/Components/ui/sheet/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Sheet } from './Sheet.vue' 2 | export { default as SheetClose } from './SheetClose.vue' 3 | export { default as SheetContent } from './SheetContent.vue' 4 | export { default as SheetDescription } from './SheetDescription.vue' 5 | export { default as SheetFooter } from './SheetFooter.vue' 6 | export { default as SheetHeader } from './SheetHeader.vue' 7 | export { default as SheetTitle } from './SheetTitle.vue' 8 | export { default as SheetTrigger } from './SheetTrigger.vue' 9 | -------------------------------------------------------------------------------- /resources/js/Components/ui/sidebar/SidebarContent.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 19 | -------------------------------------------------------------------------------- /resources/js/Components/ui/sidebar/SidebarFooter.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 19 | -------------------------------------------------------------------------------- /resources/js/Components/ui/sidebar/SidebarGroup.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 19 | -------------------------------------------------------------------------------- /resources/js/Components/ui/sidebar/SidebarGroupAction.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 28 | -------------------------------------------------------------------------------- /resources/js/Components/ui/sidebar/SidebarGroupContent.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 19 | -------------------------------------------------------------------------------- /resources/js/Components/ui/sidebar/SidebarGroupLabel.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 26 | -------------------------------------------------------------------------------- /resources/js/Components/ui/sidebar/SidebarHeader.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 19 | -------------------------------------------------------------------------------- /resources/js/Components/ui/sidebar/SidebarInput.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 23 | -------------------------------------------------------------------------------- /resources/js/Components/ui/sidebar/SidebarInset.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 22 | -------------------------------------------------------------------------------- /resources/js/Components/ui/sidebar/SidebarMenu.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 19 | -------------------------------------------------------------------------------- /resources/js/Components/ui/sidebar/SidebarMenuBadge.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 27 | -------------------------------------------------------------------------------- /resources/js/Components/ui/sidebar/SidebarMenuItem.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 19 | -------------------------------------------------------------------------------- /resources/js/Components/ui/sidebar/SidebarMenuSkeleton.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 35 | -------------------------------------------------------------------------------- /resources/js/Components/ui/sidebar/SidebarMenuSub.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 23 | -------------------------------------------------------------------------------- /resources/js/Components/ui/sidebar/SidebarMenuSubItem.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 19 | -------------------------------------------------------------------------------- /resources/js/Components/ui/sidebar/SidebarSeparator.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 20 | -------------------------------------------------------------------------------- /resources/js/Components/ui/sidebar/SidebarTrigger.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 28 | -------------------------------------------------------------------------------- /resources/js/Components/ui/sidebar/utils.ts: -------------------------------------------------------------------------------- 1 | import type { ComputedRef, Ref } from 'vue' 2 | import { createContext } from 'reka-ui' 3 | 4 | export const SIDEBAR_COOKIE_NAME = 'sidebar_state' 5 | export const SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7 6 | export const SIDEBAR_WIDTH = '16rem' 7 | export const SIDEBAR_WIDTH_MOBILE = '18rem' 8 | export const SIDEBAR_WIDTH_ICON = '3rem' 9 | export const SIDEBAR_KEYBOARD_SHORTCUT = 'b' 10 | 11 | export const [useSidebar, provideSidebarContext] = createContext<{ 12 | state: ComputedRef<'expanded' | 'collapsed'> 13 | open: Ref 14 | setOpen: (value: boolean) => void 15 | isMobile: Ref 16 | openMobile: Ref 17 | setOpenMobile: (value: boolean) => void 18 | toggleSidebar: () => void 19 | }>('Sidebar') 20 | -------------------------------------------------------------------------------- /resources/js/Components/ui/skeleton/Skeleton.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 18 | -------------------------------------------------------------------------------- /resources/js/Components/ui/skeleton/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Skeleton } from './Skeleton.vue' 2 | -------------------------------------------------------------------------------- /resources/js/Components/ui/slider/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Slider } from './Slider.vue' 2 | -------------------------------------------------------------------------------- /resources/js/Components/ui/sonner/Sonner.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 19 | -------------------------------------------------------------------------------- /resources/js/Components/ui/sonner/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Toaster } from './Sonner.vue' 2 | -------------------------------------------------------------------------------- /resources/js/Components/ui/stepper/Stepper.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 28 | -------------------------------------------------------------------------------- /resources/js/Components/ui/stepper/StepperDescription.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 20 | -------------------------------------------------------------------------------- /resources/js/Components/ui/stepper/StepperItem.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 24 | -------------------------------------------------------------------------------- /resources/js/Components/ui/stepper/StepperSeparator.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 28 | -------------------------------------------------------------------------------- /resources/js/Components/ui/stepper/StepperTitle.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 20 | -------------------------------------------------------------------------------- /resources/js/Components/ui/stepper/StepperTrigger.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 23 | -------------------------------------------------------------------------------- /resources/js/Components/ui/stepper/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Stepper } from './Stepper.vue' 2 | export { default as StepperDescription } from './StepperDescription.vue' 3 | export { default as StepperIndicator } from './StepperIndicator.vue' 4 | export { default as StepperItem } from './StepperItem.vue' 5 | export { default as StepperSeparator } from './StepperSeparator.vue' 6 | export { default as StepperTitle } from './StepperTitle.vue' 7 | export { default as StepperTrigger } from './StepperTrigger.vue' 8 | -------------------------------------------------------------------------------- /resources/js/Components/ui/switch/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Switch } from './Switch.vue' 2 | -------------------------------------------------------------------------------- /resources/js/Components/ui/table/Table.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 17 | -------------------------------------------------------------------------------- /resources/js/Components/ui/table/TableBody.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 18 | -------------------------------------------------------------------------------- /resources/js/Components/ui/table/TableCaption.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 18 | -------------------------------------------------------------------------------- /resources/js/Components/ui/table/TableCell.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 23 | -------------------------------------------------------------------------------- /resources/js/Components/ui/table/TableEmpty.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 35 | -------------------------------------------------------------------------------- /resources/js/Components/ui/table/TableFooter.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 18 | -------------------------------------------------------------------------------- /resources/js/Components/ui/table/TableHead.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 18 | -------------------------------------------------------------------------------- /resources/js/Components/ui/table/TableHeader.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 18 | -------------------------------------------------------------------------------- /resources/js/Components/ui/table/TableRow.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 18 | -------------------------------------------------------------------------------- /resources/js/Components/ui/table/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Table } from './Table.vue' 2 | export { default as TableBody } from './TableBody.vue' 3 | export { default as TableCaption } from './TableCaption.vue' 4 | export { default as TableCell } from './TableCell.vue' 5 | export { default as TableEmpty } from './TableEmpty.vue' 6 | export { default as TableFooter } from './TableFooter.vue' 7 | export { default as TableHead } from './TableHead.vue' 8 | export { default as TableHeader } from './TableHeader.vue' 9 | export { default as TableRow } from './TableRow.vue' 10 | -------------------------------------------------------------------------------- /resources/js/Components/ui/table/utils.ts: -------------------------------------------------------------------------------- 1 | import type { Updater } from '@tanstack/vue-table' 2 | import type { Ref } from 'vue' 3 | 4 | export function valueUpdater>(updaterOrValue: T, ref: Ref) { 5 | ref.value 6 | = typeof updaterOrValue === 'function' 7 | ? updaterOrValue(ref.value) 8 | : updaterOrValue 9 | } 10 | -------------------------------------------------------------------------------- /resources/js/Components/ui/tabs/Tabs.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 24 | -------------------------------------------------------------------------------- /resources/js/Components/ui/tabs/TabsContent.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 21 | -------------------------------------------------------------------------------- /resources/js/Components/ui/tabs/TabsList.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 24 | -------------------------------------------------------------------------------- /resources/js/Components/ui/tabs/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Tabs } from './Tabs.vue' 2 | export { default as TabsContent } from './TabsContent.vue' 3 | export { default as TabsList } from './TabsList.vue' 4 | export { default as TabsTrigger } from './TabsTrigger.vue' 5 | -------------------------------------------------------------------------------- /resources/js/Components/ui/tags-input/TagsInput.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 20 | -------------------------------------------------------------------------------- /resources/js/Components/ui/tags-input/TagsInputInput.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 17 | -------------------------------------------------------------------------------- /resources/js/Components/ui/tags-input/TagsInputItem.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 20 | -------------------------------------------------------------------------------- /resources/js/Components/ui/tags-input/TagsInputItemDelete.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 22 | -------------------------------------------------------------------------------- /resources/js/Components/ui/tags-input/TagsInputItemText.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 17 | -------------------------------------------------------------------------------- /resources/js/Components/ui/tags-input/index.ts: -------------------------------------------------------------------------------- 1 | export { default as TagsInput } from './TagsInput.vue' 2 | export { default as TagsInputInput } from './TagsInputInput.vue' 3 | export { default as TagsInputItem } from './TagsInputItem.vue' 4 | export { default as TagsInputItemDelete } from './TagsInputItemDelete.vue' 5 | export { default as TagsInputItemText } from './TagsInputItemText.vue' 6 | -------------------------------------------------------------------------------- /resources/js/Components/ui/textarea/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Textarea } from './Textarea.vue' 2 | -------------------------------------------------------------------------------- /resources/js/Components/ui/toggle-group/index.ts: -------------------------------------------------------------------------------- 1 | export { default as ToggleGroup } from './ToggleGroup.vue' 2 | export { default as ToggleGroupItem } from './ToggleGroupItem.vue' 3 | -------------------------------------------------------------------------------- /resources/js/Components/ui/toggle/Toggle.vue: -------------------------------------------------------------------------------- 1 | 23 | 24 | 34 | -------------------------------------------------------------------------------- /resources/js/Components/ui/tooltip/Tooltip.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 18 | -------------------------------------------------------------------------------- /resources/js/Components/ui/tooltip/TooltipProvider.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 14 | -------------------------------------------------------------------------------- /resources/js/Components/ui/tooltip/TooltipTrigger.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 15 | -------------------------------------------------------------------------------- /resources/js/Components/ui/tooltip/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Tooltip } from './Tooltip.vue' 2 | export { default as TooltipContent } from './TooltipContent.vue' 3 | export { default as TooltipProvider } from './TooltipProvider.vue' 4 | export { default as TooltipTrigger } from './TooltipTrigger.vue' 5 | -------------------------------------------------------------------------------- /resources/js/Pages/API/Index.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 31 | -------------------------------------------------------------------------------- /resources/js/Pages/PrivacyPolicy.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 27 | -------------------------------------------------------------------------------- /resources/js/Pages/Teams/Create.vue: -------------------------------------------------------------------------------- 1 | 5 | 6 | 21 | -------------------------------------------------------------------------------- /resources/js/Pages/TermsOfService.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 27 | -------------------------------------------------------------------------------- /resources/js/bootstrap.js: -------------------------------------------------------------------------------- 1 | import axios from 'axios' 2 | 3 | window.axios = axios 4 | 5 | window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest' 6 | -------------------------------------------------------------------------------- /resources/js/lib/utils.js: -------------------------------------------------------------------------------- 1 | import { clsx } from 'clsx' 2 | import { twMerge } from 'tailwind-merge' 3 | 4 | export function cn(...inputs) { 5 | return twMerge(clsx(inputs)) 6 | } 7 | -------------------------------------------------------------------------------- /resources/views/emails/team-invitation.blade.php: -------------------------------------------------------------------------------- 1 | @component('mail::message') 2 | {{ __('You have been invited to join the :team team!', ['team' => $invitation->team->name]) }} 3 | 4 | @if (Laravel\Fortify\Features::enabled(Laravel\Fortify\Features::registration())) 5 | {{ __('If you do not have an account, you may create one by clicking the button below. After creating an account, you may click the invitation acceptance button in this email to accept the team invitation:') }} 6 | 7 | @component('mail::button', ['url' => route('register')]) 8 | {{ __('Create Account') }} 9 | @endcomponent 10 | 11 | {{ __('If you already have an account, you may accept this invitation by clicking the button below:') }} 12 | 13 | @else 14 | {{ __('You may accept this invitation by clicking the button below:') }} 15 | @endif 16 | 17 | 18 | @component('mail::button', ['url' => $acceptUrl]) 19 | {{ __('Accept Invitation') }} 20 | @endcomponent 21 | 22 | {{ __('If you did not expect to receive an invitation to this team, you may discard this email.') }} 23 | @endcomponent 24 | -------------------------------------------------------------------------------- /resources/views/prompts/system.blade.php: -------------------------------------------------------------------------------- 1 | You are Larasonic AI, a virtual assistant for the Larasonic Laravel Starter Kit. Your role is to help developers understand and use Larasonic to build SaaS applications faster. 2 | 3 | Highlight features like: 4 | - Advanced authentication 5 | - Payment integration 6 | 7 | Provide clear guidance on setup, including: 8 | - Docker 9 | - APIs 10 | - Integrations 11 | 12 | Use a professional and friendly tone, addressing technical queries effectively and encouraging users to explore the GitHub repository. 13 | Always keep the response less than 5 words. 14 | -------------------------------------------------------------------------------- /resources/views/scribe/index.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Larasonic Documentation 5 | 6 | 9 | 14 | 15 | 16 | 17 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /routes/api.php: -------------------------------------------------------------------------------- 1 | middleware('auth:sanctum'); 9 | -------------------------------------------------------------------------------- /routes/console.php: -------------------------------------------------------------------------------- 1 | onOneServer() 9 | ->group(fn () => [ 10 | Schedule::command('sitemap:generate'), 11 | ]); 12 | -------------------------------------------------------------------------------- /storage/app/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !private/ 3 | !public/ 4 | !.gitignore 5 | -------------------------------------------------------------------------------- /storage/app/private/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/app/public/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/framework/.gitignore: -------------------------------------------------------------------------------- 1 | compiled.php 2 | config.php 3 | down 4 | events.scanned.php 5 | maintenance.php 6 | routes.php 7 | routes.scanned.php 8 | schedule-* 9 | services.json 10 | -------------------------------------------------------------------------------- /storage/framework/cache/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !data/ 3 | !.gitignore 4 | -------------------------------------------------------------------------------- /storage/framework/cache/data/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/framework/sessions/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/framework/testing/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/framework/views/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/logs/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /tests/Feature/AuthenticationTest.php: -------------------------------------------------------------------------------- 1 | get('/login'); 9 | 10 | $response->assertStatus(200); 11 | }); 12 | 13 | test('users can authenticate using the login screen', function (): void { 14 | $user = User::factory()->create(); 15 | 16 | $response = $this->post('/login', [ 17 | 'email' => $user->email, 18 | 'password' => 'password', 19 | ]); 20 | 21 | $this->assertAuthenticated(); 22 | $response->assertRedirect(route('dashboard', absolute: false)); 23 | }); 24 | 25 | test('users cannot authenticate with invalid password', function (): void { 26 | $user = User::factory()->create(); 27 | 28 | $this->post('/login', [ 29 | 'email' => $user->email, 30 | 'password' => 'wrong-password', 31 | ]); 32 | 33 | $this->assertGuest(); 34 | }); 35 | -------------------------------------------------------------------------------- /tests/Feature/BrowserSessionsTest.php: -------------------------------------------------------------------------------- 1 | actingAs(User::factory()->create()); 9 | 10 | $response = $this->delete('/user/other-browser-sessions', [ 11 | 'password' => 'password', 12 | ]); 13 | 14 | $response->assertSessionHasNoErrors(); 15 | }); 16 | -------------------------------------------------------------------------------- /tests/Feature/CreateApiTokenTest.php: -------------------------------------------------------------------------------- 1 | actingAs($user = User::factory()->withPersonalTeam()->create()); 11 | } else { 12 | $this->actingAs($user = User::factory()->create()); 13 | } 14 | 15 | $this->post('/user/api-tokens', [ 16 | 'name' => 'Test Token', 17 | 'permissions' => [ 18 | 'read', 19 | 'update', 20 | ], 21 | ]); 22 | 23 | expect($user->fresh()->tokens)->toHaveCount(1); 24 | expect($user->fresh()->tokens->first()) 25 | ->name->toEqual('Test Token') 26 | ->can('read')->toBeTrue() 27 | ->can('delete')->toBeFalse(); 28 | })->skip(fn (): bool => ! Features::hasApiFeatures(), 'API support is not enabled.'); 29 | -------------------------------------------------------------------------------- /tests/Feature/CreateTeamTest.php: -------------------------------------------------------------------------------- 1 | actingAs($user = User::factory()->withPersonalTeam()->create()); 9 | 10 | $this->post('/teams', [ 11 | 'name' => 'Test Team', 12 | ]); 13 | 14 | expect($user->fresh()->ownedTeams)->toHaveCount(2); 15 | expect($user->fresh()->ownedTeams()->latest('id')->first()->name)->toEqual('Test Team'); 16 | }); 17 | -------------------------------------------------------------------------------- /tests/Feature/DeleteAccountTest.php: -------------------------------------------------------------------------------- 1 | actingAs($user = User::factory()->create()); 10 | 11 | $this->delete('/user', [ 12 | 'password' => 'password', 13 | ]); 14 | 15 | expect($user->fresh())->toBeNull(); 16 | })->skip(fn (): bool => ! Features::hasAccountDeletionFeatures(), 'Account deletion is not enabled.'); 17 | 18 | test('correct password must be provided before account can be deleted', function (): void { 19 | $this->actingAs($user = User::factory()->create()); 20 | 21 | $this->delete('/user', [ 22 | 'password' => 'wrong-password', 23 | ]); 24 | 25 | expect($user->fresh())->not->toBeNull(); 26 | })->skip(fn (): bool => ! Features::hasAccountDeletionFeatures(), 'Account deletion is not enabled.'); 27 | -------------------------------------------------------------------------------- /tests/Feature/DeleteApiTokenTest.php: -------------------------------------------------------------------------------- 1 | actingAs($user = User::factory()->withPersonalTeam()->create()); 12 | } else { 13 | $this->actingAs($user = User::factory()->create()); 14 | } 15 | 16 | $token = $user->tokens()->create([ 17 | 'name' => 'Test Token', 18 | 'token' => Str::random(40), 19 | 'abilities' => ['create', 'read'], 20 | ]); 21 | 22 | $this->delete('/user/api-tokens/'.$token->id); 23 | 24 | expect($user->fresh()->tokens)->toHaveCount(0); 25 | })->skip(fn (): bool => ! Features::hasApiFeatures(), 'API support is not enabled.'); 26 | -------------------------------------------------------------------------------- /tests/Feature/DeleteTeamTest.php: -------------------------------------------------------------------------------- 1 | actingAs($user = User::factory()->withPersonalTeam()->create()); 10 | 11 | $user->ownedTeams()->save($team = Team::factory()->make([ 12 | 'personal_team' => false, 13 | ])); 14 | 15 | $team->users()->attach( 16 | $otherUser = User::factory()->create(), ['role' => 'test-role'] 17 | ); 18 | 19 | $this->delete('/teams/'.$team->id); 20 | 21 | expect($team->fresh())->toBeNull(); 22 | expect($otherUser->fresh()->teams)->toHaveCount(0); 23 | }); 24 | 25 | test('personal teams cant be deleted', function (): void { 26 | $this->actingAs($user = User::factory()->withPersonalTeam()->create()); 27 | 28 | $this->delete('/teams/'.$user->currentTeam->id); 29 | 30 | expect($user->currentTeam->fresh())->not->toBeNull(); 31 | }); 32 | -------------------------------------------------------------------------------- /tests/Feature/ExampleTest.php: -------------------------------------------------------------------------------- 1 | get('/'); 7 | 8 | $response->assertStatus(200); 9 | }); 10 | -------------------------------------------------------------------------------- /tests/Feature/LeaveTeamTest.php: -------------------------------------------------------------------------------- 1 | withPersonalTeam()->create(); 9 | 10 | $user->currentTeam->users()->attach( 11 | $otherUser = User::factory()->create(), ['role' => 'admin'] 12 | ); 13 | 14 | $this->actingAs($otherUser); 15 | 16 | $this->delete('/teams/'.$user->currentTeam->id.'/members/'.$otherUser->id); 17 | 18 | expect($user->currentTeam->fresh()->users)->toHaveCount(0); 19 | }); 20 | 21 | test('team owners cant leave their own team', function (): void { 22 | $this->actingAs($user = User::factory()->withPersonalTeam()->create()); 23 | 24 | $response = $this->delete('/teams/'.$user->currentTeam->id.'/members/'.$user->id); 25 | 26 | $response->assertSessionHasErrorsIn('removeTeamMember', ['team']); 27 | 28 | expect($user->currentTeam->fresh())->not->toBeNull(); 29 | }); 30 | -------------------------------------------------------------------------------- /tests/Feature/ProfileInformationTest.php: -------------------------------------------------------------------------------- 1 | actingAs($user = User::factory()->create()); 9 | 10 | $this->put('/user/profile-information', [ 11 | 'name' => 'Test Name', 12 | 'email' => 'test@example.com', 13 | ]); 14 | 15 | expect($user->fresh()) 16 | ->name->toEqual('Test Name') 17 | ->email->toEqual('test@example.com'); 18 | }); 19 | -------------------------------------------------------------------------------- /tests/Feature/RegistrationTest.php: -------------------------------------------------------------------------------- 1 | get('/register'); 10 | 11 | $response->assertStatus(200); 12 | })->skip(fn (): bool => ! Features::enabled(Features::registration()), 'Registration support is not enabled.'); 13 | 14 | test('new users can register', function (): void { 15 | $response = $this->post('/register', [ 16 | 'name' => fake()->name(), 17 | 'email' => fake()->unique()->safeEmail(), 18 | 'password' => 'password', 19 | 'password_confirmation' => 'password', 20 | 'terms' => Jetstream::hasTermsAndPrivacyPolicyFeature(), 21 | ]); 22 | 23 | $this->assertAuthenticated(); 24 | $response->assertRedirect(route('dashboard', absolute: false)); 25 | }); 26 | -------------------------------------------------------------------------------- /tests/Feature/RemoveTeamMemberTest.php: -------------------------------------------------------------------------------- 1 | actingAs($user = User::factory()->withPersonalTeam()->create()); 9 | 10 | $user->currentTeam->users()->attach( 11 | $otherUser = User::factory()->create(), ['role' => 'admin'] 12 | ); 13 | 14 | $this->delete('/teams/'.$user->currentTeam->id.'/members/'.$otherUser->id); 15 | 16 | expect($user->currentTeam->fresh()->users)->toHaveCount(0); 17 | }); 18 | 19 | test('only team owner can remove team members', function (): void { 20 | $user = User::factory()->withPersonalTeam()->create(); 21 | 22 | $user->currentTeam->users()->attach( 23 | $otherUser = User::factory()->create(), ['role' => 'admin'] 24 | ); 25 | 26 | $this->actingAs($otherUser); 27 | 28 | $response = $this->delete('/teams/'.$user->currentTeam->id.'/members/'.$user->id); 29 | 30 | $response->assertStatus(403); 31 | }); 32 | -------------------------------------------------------------------------------- /tests/Feature/UpdatePasswordTest.php: -------------------------------------------------------------------------------- 1 | actingAs($user = User::factory()->create()); 10 | 11 | $this->put('/user/password', [ 12 | 'current_password' => 'password', 13 | 'password' => 'new-password', 14 | 'password_confirmation' => 'new-password', 15 | ]); 16 | 17 | expect(Hash::check('new-password', $user->fresh()->password))->toBeTrue(); 18 | }); 19 | 20 | test('new passwords must match', function (): void { 21 | $this->actingAs($user = User::factory()->create()); 22 | 23 | $response = $this->put('/user/password', [ 24 | 'current_password' => 'password', 25 | 'password' => 'new-password', 26 | 'password_confirmation' => 'wrong-password', 27 | ]); 28 | 29 | $response->assertSessionHasErrors(); 30 | 31 | expect(Hash::check('password', $user->fresh()->password))->toBeTrue(); 32 | }); 33 | -------------------------------------------------------------------------------- /tests/Feature/UpdateTeamNameTest.php: -------------------------------------------------------------------------------- 1 | actingAs($user = User::factory()->withPersonalTeam()->create()); 9 | 10 | $this->put('/teams/'.$user->currentTeam->id, [ 11 | 'name' => 'Test Team', 12 | ]); 13 | 14 | expect($user->fresh()->ownedTeams)->toHaveCount(1); 15 | expect($user->currentTeam->fresh()->name)->toEqual('Test Team'); 16 | }); 17 | -------------------------------------------------------------------------------- /tests/TestCase.php: -------------------------------------------------------------------------------- 1 | toBeTrue(); 7 | }); 8 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import path, { resolve } from 'node:path' 2 | import tailwindcss from '@tailwindcss/vite' 3 | import vue from '@vitejs/plugin-vue' 4 | import laravel from 'laravel-vite-plugin' 5 | import { defineConfig } from 'vite' 6 | 7 | export default defineConfig({ 8 | plugins: [ 9 | laravel({ 10 | input: ['resources/js/app.js'], 11 | refresh: true, 12 | }), 13 | tailwindcss(), 14 | vue({ 15 | template: { 16 | transformAssetUrls: { 17 | base: null, 18 | includeAbsolute: false, 19 | }, 20 | }, 21 | }), 22 | ], 23 | resolve: { 24 | alias: { 25 | '@': path.resolve(__dirname, './resources/js'), 26 | 'ziggy-js': resolve(__dirname, 'vendor/tightenco/ziggy'), 27 | }, 28 | }, 29 | }) 30 | --------------------------------------------------------------------------------