From 7c56df38232b6f2f5f13fa9f48fdb0a48d043e87 Mon Sep 17 00:00:00 2001 From: myrmidex Date: Sat, 9 May 2026 23:28:17 +0200 Subject: [PATCH 01/29] fix - CI: continue-on-error for coverage comment step (DNS unreachable from runner) --- .forgejo/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.forgejo/workflows/ci.yml b/.forgejo/workflows/ci.yml index 71e54d8..75dd807 100644 --- a/.forgejo/workflows/ci.yml +++ b/.forgejo/workflows/ci.yml @@ -80,6 +80,7 @@ jobs: - name: Comment coverage on PR if: github.event_name == 'pull_request' + continue-on-error: true env: FORGEJO_TOKEN: ${{ secrets.FORGEJO_TOKEN }} PR_NUMBER: ${{ github.event.pull_request.number }} From d379f00d76373395a3f0e2701054c3be4d1c43b6 Mon Sep 17 00:00:00 2001 From: myrmidex Date: Sat, 15 Aug 2026 14:04:05 +0200 Subject: [PATCH 02/29] 47 - Delete unreachable frontend scaffolding --- docker/dev/docker-compose.yml | 10 +- package-lock.json | 2 +- .../js/components/Assets/AssetSetupForm.tsx | 156 ---- .../js/components/Display/AppContent.tsx | 18 - resources/js/components/Display/AppHeader.tsx | 182 ---- resources/js/components/Display/AppLogo.tsx | 14 - .../js/components/Display/AppLogoIcon.tsx | 13 - resources/js/components/Display/AppShell.tsx | 18 - .../js/components/Display/AppSidebar.tsx | 56 -- .../components/Display/AppSidebarHeader.tsx | 14 - .../js/components/Display/Breadcrumbs.tsx | 34 - resources/js/components/Display/NavFooter.tsx | 34 - resources/js/components/Display/NavMain.tsx | 24 - resources/js/components/Display/NavUser.tsx | 36 - resources/js/components/HeadingSmall.tsx | 8 - .../js/components/Pricing/UpdatePriceForm.tsx | 112 --- .../js/components/Settings/DeleteUser.tsx | 89 -- resources/js/components/Settings/UserInfo.tsx | 22 - .../components/Settings/UserMenuContent.tsx | 45 - resources/js/components/TextLink.tsx | 19 - resources/js/components/heading.tsx | 8 - resources/js/components/icon.tsx | 11 - resources/js/components/ui/DropdownMenu.tsx | 255 ------ resources/js/components/ui/NavigationMenu.tsx | 168 ---- .../js/components/ui/PlaceholderPattern.tsx | 20 - resources/js/components/ui/ToggleGroup.tsx | 71 -- resources/js/components/ui/alert.tsx | 66 -- resources/js/components/ui/avatar.tsx | 51 -- resources/js/components/ui/badge.tsx | 46 - resources/js/components/ui/breadcrumb.tsx | 109 --- resources/js/components/ui/card.tsx | 68 -- resources/js/components/ui/checkbox.tsx | 30 - resources/js/components/ui/collapsible.tsx | 31 - resources/js/components/ui/dialog.tsx | 133 --- resources/js/components/ui/icon.tsx | 14 - resources/js/components/ui/select.tsx | 179 ---- resources/js/components/ui/separator.tsx | 26 - resources/js/components/ui/sheet.tsx | 137 --- resources/js/components/ui/sidebar.tsx | 721 ---------------- resources/js/components/ui/skeleton.tsx | 13 - resources/js/components/ui/toggle.tsx | 45 - resources/js/components/ui/tooltip.tsx | 59 -- resources/js/hooks/use-initials.tsx | 15 - resources/js/hooks/use-mobile-navigation.ts | 8 - resources/js/hooks/use-mobile.tsx | 22 - resources/js/layouts/app-layout.tsx | 14 - .../js/layouts/app/app-header-layout.tsx | 14 - .../js/layouts/app/app-sidebar-layout.tsx | 18 - resources/js/layouts/auth-layout.tsx | 9 - .../js/layouts/auth/auth-card-layout.tsx | 36 - .../js/layouts/auth/auth-simple-layout.tsx | 34 - .../js/layouts/auth/auth-split-layout.tsx | 45 - resources/js/pages/dashboard.tsx | 4 - resources/js/pages/welcome.tsx | 791 ------------------ 54 files changed, 7 insertions(+), 4170 deletions(-) delete mode 100644 resources/js/components/Assets/AssetSetupForm.tsx delete mode 100644 resources/js/components/Display/AppContent.tsx delete mode 100644 resources/js/components/Display/AppHeader.tsx delete mode 100644 resources/js/components/Display/AppLogo.tsx delete mode 100644 resources/js/components/Display/AppLogoIcon.tsx delete mode 100644 resources/js/components/Display/AppShell.tsx delete mode 100644 resources/js/components/Display/AppSidebar.tsx delete mode 100644 resources/js/components/Display/AppSidebarHeader.tsx delete mode 100644 resources/js/components/Display/Breadcrumbs.tsx delete mode 100644 resources/js/components/Display/NavFooter.tsx delete mode 100644 resources/js/components/Display/NavMain.tsx delete mode 100644 resources/js/components/Display/NavUser.tsx delete mode 100644 resources/js/components/HeadingSmall.tsx delete mode 100644 resources/js/components/Pricing/UpdatePriceForm.tsx delete mode 100644 resources/js/components/Settings/DeleteUser.tsx delete mode 100644 resources/js/components/Settings/UserInfo.tsx delete mode 100644 resources/js/components/Settings/UserMenuContent.tsx delete mode 100644 resources/js/components/TextLink.tsx delete mode 100644 resources/js/components/heading.tsx delete mode 100644 resources/js/components/icon.tsx delete mode 100644 resources/js/components/ui/DropdownMenu.tsx delete mode 100644 resources/js/components/ui/NavigationMenu.tsx delete mode 100644 resources/js/components/ui/PlaceholderPattern.tsx delete mode 100644 resources/js/components/ui/ToggleGroup.tsx delete mode 100644 resources/js/components/ui/alert.tsx delete mode 100644 resources/js/components/ui/avatar.tsx delete mode 100644 resources/js/components/ui/badge.tsx delete mode 100644 resources/js/components/ui/breadcrumb.tsx delete mode 100644 resources/js/components/ui/card.tsx delete mode 100644 resources/js/components/ui/checkbox.tsx delete mode 100644 resources/js/components/ui/collapsible.tsx delete mode 100644 resources/js/components/ui/dialog.tsx delete mode 100644 resources/js/components/ui/icon.tsx delete mode 100644 resources/js/components/ui/select.tsx delete mode 100644 resources/js/components/ui/separator.tsx delete mode 100644 resources/js/components/ui/sheet.tsx delete mode 100644 resources/js/components/ui/sidebar.tsx delete mode 100644 resources/js/components/ui/skeleton.tsx delete mode 100644 resources/js/components/ui/toggle.tsx delete mode 100644 resources/js/components/ui/tooltip.tsx delete mode 100644 resources/js/hooks/use-initials.tsx delete mode 100644 resources/js/hooks/use-mobile-navigation.ts delete mode 100644 resources/js/hooks/use-mobile.tsx delete mode 100644 resources/js/layouts/app-layout.tsx delete mode 100644 resources/js/layouts/app/app-header-layout.tsx delete mode 100644 resources/js/layouts/app/app-sidebar-layout.tsx delete mode 100644 resources/js/layouts/auth-layout.tsx delete mode 100644 resources/js/layouts/auth/auth-card-layout.tsx delete mode 100644 resources/js/layouts/auth/auth-simple-layout.tsx delete mode 100644 resources/js/layouts/auth/auth-split-layout.tsx delete mode 100644 resources/js/pages/welcome.tsx diff --git a/docker/dev/docker-compose.yml b/docker/dev/docker-compose.yml index ae79d11..5d68508 100644 --- a/docker/dev/docker-compose.yml +++ b/docker/dev/docker-compose.yml @@ -1,3 +1,5 @@ +name: incr + services: app: build: @@ -10,7 +12,7 @@ services: - DB_HOST=db volumes: - ../../:/var/www/html:Z - - app_node_modules:/var/www/html/node_modules + - incr_app_node_modules:/var/www/html/node_modules ports: - "8000:8000" - "5173:5173" @@ -30,7 +32,7 @@ services: - MYSQL_PASSWORD=incr_password - MYSQL_ROOT_PASSWORD=root_password volumes: - - db_data:/var/lib/mysql + - incr_db_data:/var/lib/mysql - ./mysql-init:/docker-entrypoint-initdb.d:ro ports: - "3307:3306" @@ -48,7 +50,7 @@ networks: driver: bridge volumes: - db_data: + incr_db_data: driver: local - app_node_modules: + incr_app_node_modules: driver: local diff --git a/package-lock.json b/package-lock.json index 90d424c..1750cfe 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,5 +1,5 @@ { - "name": "incr", + "name": "html", "lockfileVersion": 3, "requires": true, "packages": { diff --git a/resources/js/components/Assets/AssetSetupForm.tsx b/resources/js/components/Assets/AssetSetupForm.tsx deleted file mode 100644 index 5f0c313..0000000 --- a/resources/js/components/Assets/AssetSetupForm.tsx +++ /dev/null @@ -1,156 +0,0 @@ -import { Button } from '@/components/ui/button'; -import { Input } from '@/components/ui/input'; -import { Label } from '@/components/ui/label'; -import InputError from '@/components/InputError'; -import { useForm } from '@inertiajs/react'; -import { LoaderCircle } from 'lucide-react'; -import { FormEventHandler, useState, useEffect } from 'react'; -import ComponentTitle from '@/components/ui/ComponentTitle'; - -interface AssetFormData { - symbol: string; - full_name: string; - [key: string]: string; -} - -interface AssetSetupFormProps { - onSuccess?: () => void; - onCancel?: () => void; -} - -export default function AssetSetupForm({ onSuccess, onCancel }: AssetSetupFormProps) { - const { data, setData, patch, processing, errors } = useForm({ - symbol: '', - full_name: '', - }); - - // Load existing asset data on mount - useEffect(() => { - const fetchCurrentAsset = async () => { - try { - const response = await fetch('/tracker'); - if (response.ok) { - const { tracker } = await response.json(); - if (tracker?.asset) { - setData({ - symbol: tracker.asset.symbol || '', - full_name: tracker.asset.full_name || '', - }); - } - } - } catch (error) { - console.error('Failed to fetch current asset:', error); - } - }; - - fetchCurrentAsset(); - }, []); - - const [suggestions] = useState([ - { symbol: 'VWCE', full_name: 'Vanguard FTSE All-World UCITS ETF' }, - { symbol: 'VTI', full_name: 'Vanguard Total Stock Market ETF' }, - { symbol: 'SPY', full_name: 'SPDR S&P 500 ETF Trust' }, - { symbol: 'QQQ', full_name: 'Invesco QQQ Trust' }, - { symbol: 'IWDA', full_name: 'iShares Core MSCI World UCITS ETF' }, - ]); - - const submit: FormEventHandler = (e) => { - e.preventDefault(); - - patch(route('tracker.update'), { - onSuccess: () => { - if (onSuccess) onSuccess(); - }, - }); - }; - - const handleSuggestionClick = (suggestion: { symbol: string; full_name: string }) => { - setData({ - symbol: suggestion.symbol, - full_name: suggestion.full_name, - }); - }; - - return ( -
-
- SET ASSET -

- [SYSTEM] Specify the asset you want to track -

- - {/* Quick suggestions */} -
- -
- {suggestions.map((suggestion) => ( - - ))} -
-
- -
-
- - setData('symbol', e.target.value.toUpperCase())} - className="bg-black border-red-500 text-red-400 focus:border-red-300 font-mono text-sm rounded-none border-2 focus:ring-0 focus:outline-none focus:shadow-[0_0_10px_rgba(239,68,68,0.5)] placeholder:text-red-400/40 transition-all" - /> -

- [REQUIRED] ticker symbol (e.g. VWCE, VTI, SPY) -

- -
- -
- - setData('full_name', e.target.value)} - className="bg-black border-red-500 text-red-400 focus:border-red-300 font-mono text-sm rounded-none border-2 focus:ring-0 focus:outline-none focus:shadow-[0_0_10px_rgba(239,68,68,0.5)] placeholder:text-red-400/40 transition-all" - /> -

- [OPTIONAL] human-readable asset name -

- -
- -
- - {onCancel && ( - - )} -
-
-
-
- ); -} \ No newline at end of file diff --git a/resources/js/components/Display/AppContent.tsx b/resources/js/components/Display/AppContent.tsx deleted file mode 100644 index e5d04cd..0000000 --- a/resources/js/components/Display/AppContent.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import { SidebarInset } from '@/components/ui/sidebar'; -import * as React from 'react'; - -interface AppContentProps extends React.ComponentProps<'main'> { - variant?: 'header' | 'sidebar'; -} - -export function AppContent({ variant = 'header', children, ...props }: AppContentProps) { - if (variant === 'sidebar') { - return {children}; - } - - return ( -
- {children} -
- ); -} diff --git a/resources/js/components/Display/AppHeader.tsx b/resources/js/components/Display/AppHeader.tsx deleted file mode 100644 index 2bc1fe4..0000000 --- a/resources/js/components/Display/AppHeader.tsx +++ /dev/null @@ -1,182 +0,0 @@ -import { Breadcrumbs } from '@/components/Display/Breadcrumbs'; -import { Icon } from '@/components/icon'; -import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar'; -import { Button } from '@/components/ui/button'; -import { DropdownMenu, DropdownMenuContent, DropdownMenuTrigger } from '@/components/ui/DropdownMenu'; -import { NavigationMenu, NavigationMenuItem, NavigationMenuList, navigationMenuTriggerStyle } from '@/components/ui/NavigationMenu'; -import { Sheet, SheetContent, SheetHeader, SheetTitle, SheetTrigger } from '@/components/ui/sheet'; -import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip'; -import { UserMenuContent } from '@/components/Settings/UserMenuContent'; -import { useInitials } from '@/hooks/use-initials'; -import { cn } from '@/lib/utils'; -import { type BreadcrumbItem, type NavItem, type SharedData } from '@/types'; -import { Link, usePage } from '@inertiajs/react'; -import { BookOpen, Folder, LayoutGrid, Menu, Search } from 'lucide-react'; -import AppLogo from './AppLogo'; -import AppLogoIcon from './AppLogoIcon'; - -const mainNavItems: NavItem[] = [ - { - title: 'Dashboard', - href: '/dashboard', - icon: LayoutGrid, - }, -]; - -const rightNavItems: NavItem[] = [ - { - title: 'Repository', - href: 'https://github.com/laravel/react-starter-kit', - icon: Folder, - }, - { - title: 'Documentation', - href: 'https://laravel.com/docs/starter-kits#react', - icon: BookOpen, - }, -]; - -const activeItemStyles = 'text-neutral-900 dark:bg-neutral-800 dark:text-neutral-100'; - -interface AppHeaderProps { - breadcrumbs?: BreadcrumbItem[]; -} - -export function AppHeader({ breadcrumbs = [] }: AppHeaderProps) { - const page = usePage(); - const { auth } = page.props; - const getInitials = useInitials(); - return ( - <> -
-
- {/* Mobile Menu */} -
- - - - - - Navigation Menu - - - -
-
-
- {mainNavItems.map((item) => ( - - {item.icon && } - {item.title} - - ))} -
- -
- {rightNavItems.map((item) => ( - - {item.icon && } - {item.title} - - ))} -
-
-
-
-
-
- - - - - - {/* Desktop Navigation */} -
- - - {mainNavItems.map((item, index) => ( - - - {item.icon && } - {item.title} - - {page.url === item.href && ( -
- )} -
- ))} -
-
-
- -
-
- -
- {rightNavItems.map((item) => ( - - - - - {item.title} - {item.icon && } - - - -

{item.title}

-
-
-
- ))} -
-
- - - - - - - - -
-
-
- {breadcrumbs.length > 1 && ( -
-
- -
-
- )} - - ); -} diff --git a/resources/js/components/Display/AppLogo.tsx b/resources/js/components/Display/AppLogo.tsx deleted file mode 100644 index 6c377cf..0000000 --- a/resources/js/components/Display/AppLogo.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import AppLogoIcon from './AppLogoIcon'; - -export default function AppLogo() { - return ( - <> -
- -
-
- Laravel Starter Kit -
- - ); -} diff --git a/resources/js/components/Display/AppLogoIcon.tsx b/resources/js/components/Display/AppLogoIcon.tsx deleted file mode 100644 index 9bd62ad..0000000 --- a/resources/js/components/Display/AppLogoIcon.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import { SVGAttributes } from 'react'; - -export default function AppLogoIcon(props: SVGAttributes) { - return ( - - - - ); -} diff --git a/resources/js/components/Display/AppShell.tsx b/resources/js/components/Display/AppShell.tsx deleted file mode 100644 index 0d5cdb9..0000000 --- a/resources/js/components/Display/AppShell.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import { SidebarProvider } from '@/components/ui/sidebar'; -import { SharedData } from '@/types'; -import { usePage } from '@inertiajs/react'; - -interface AppShellProps { - children: React.ReactNode; - variant?: 'header' | 'sidebar'; -} - -export function AppShell({ children, variant = 'header' }: AppShellProps) { - const isOpen = usePage().props.sidebarOpen; - - if (variant === 'header') { - return
{children}
; - } - - return {children}; -} diff --git a/resources/js/components/Display/AppSidebar.tsx b/resources/js/components/Display/AppSidebar.tsx deleted file mode 100644 index b2151b8..0000000 --- a/resources/js/components/Display/AppSidebar.tsx +++ /dev/null @@ -1,56 +0,0 @@ -import { NavFooter } from '@/components/Display/NavFooter'; -import { NavMain } from '@/components/Display/NavMain'; -import { NavUser } from '@/components/Display/NavUser'; -import { Sidebar, SidebarContent, SidebarFooter, SidebarHeader, SidebarMenu, SidebarMenuButton, SidebarMenuItem } from '@/components/ui/sidebar'; -import { type NavItem } from '@/types'; -import { Link } from '@inertiajs/react'; -import { BookOpen, Folder, LayoutGrid } from 'lucide-react'; -import AppLogo from './AppLogo'; - -const mainNavItems: NavItem[] = [ - { - title: 'Dashboard', - href: '/dashboard', - icon: LayoutGrid, - }, -]; - -const footerNavItems: NavItem[] = [ - { - title: 'Repository', - href: 'https://github.com/laravel/react-starter-kit', - icon: Folder, - }, - { - title: 'Documentation', - href: 'https://laravel.com/docs/starter-kits#react', - icon: BookOpen, - }, -]; - -export function AppSidebar() { - return ( - - - - - - - - - - - - - - - - - - - - - - - ); -} diff --git a/resources/js/components/Display/AppSidebarHeader.tsx b/resources/js/components/Display/AppSidebarHeader.tsx deleted file mode 100644 index 10c7da2..0000000 --- a/resources/js/components/Display/AppSidebarHeader.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import { Breadcrumbs } from '@/components/Display/Breadcrumbs'; -import { SidebarTrigger } from '@/components/ui/sidebar'; -import { type BreadcrumbItem as BreadcrumbItemType } from '@/types'; - -export function AppSidebarHeader({ breadcrumbs = [] }: { breadcrumbs?: BreadcrumbItemType[] }) { - return ( -
-
- - -
-
- ); -} diff --git a/resources/js/components/Display/Breadcrumbs.tsx b/resources/js/components/Display/Breadcrumbs.tsx deleted file mode 100644 index cb00f91..0000000 --- a/resources/js/components/Display/Breadcrumbs.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import { Breadcrumb, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator } from '@/components/ui/breadcrumb'; -import { type BreadcrumbItem as BreadcrumbItemType } from '@/types'; -import { Link } from '@inertiajs/react'; -import { Fragment } from 'react'; - -export function Breadcrumbs({ breadcrumbs }: { breadcrumbs: BreadcrumbItemType[] }) { - return ( - <> - {breadcrumbs.length > 0 && ( - - - {breadcrumbs.map((item, index) => { - const isLast = index === breadcrumbs.length - 1; - return ( - - - {isLast ? ( - {item.title} - ) : ( - - {item.title} - - )} - - {!isLast && } - - ); - })} - - - )} - - ); -} diff --git a/resources/js/components/Display/NavFooter.tsx b/resources/js/components/Display/NavFooter.tsx deleted file mode 100644 index 13b6737..0000000 --- a/resources/js/components/Display/NavFooter.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import { Icon } from '@/components/icon'; -import { SidebarGroup, SidebarGroupContent, SidebarMenu, SidebarMenuButton, SidebarMenuItem } from '@/components/ui/sidebar'; -import { type NavItem } from '@/types'; -import { type ComponentPropsWithoutRef } from 'react'; - -export function NavFooter({ - items, - className, - ...props -}: ComponentPropsWithoutRef & { - items: NavItem[]; -}) { - return ( - - - - {items.map((item) => ( - - - - {item.icon && } - {item.title} - - - - ))} - - - - ); -} diff --git a/resources/js/components/Display/NavMain.tsx b/resources/js/components/Display/NavMain.tsx deleted file mode 100644 index 0dc62c6..0000000 --- a/resources/js/components/Display/NavMain.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import { SidebarGroup, SidebarGroupLabel, SidebarMenu, SidebarMenuButton, SidebarMenuItem } from '@/components/ui/sidebar'; -import { type NavItem } from '@/types'; -import { Link, usePage } from '@inertiajs/react'; - -export function NavMain({ items = [] }: { items: NavItem[] }) { - const page = usePage(); - return ( - - Platform - - {items.map((item) => ( - - - - {item.icon && } - {item.title} - - - - ))} - - - ); -} diff --git a/resources/js/components/Display/NavUser.tsx b/resources/js/components/Display/NavUser.tsx deleted file mode 100644 index 7918dfc..0000000 --- a/resources/js/components/Display/NavUser.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import { DropdownMenu, DropdownMenuContent, DropdownMenuTrigger } from '@/components/ui/DropdownMenu'; -import { SidebarMenu, SidebarMenuButton, SidebarMenuItem, useSidebar } from '@/components/ui/sidebar'; -import { UserInfo } from '@/components/Settings/UserInfo'; -import { UserMenuContent } from '@/components/Settings/UserMenuContent'; -import { useIsMobile } from '@/hooks/use-mobile'; -import { type SharedData } from '@/types'; -import { usePage } from '@inertiajs/react'; -import { ChevronsUpDown } from 'lucide-react'; - -export function NavUser() { - const { auth } = usePage().props; - const { state } = useSidebar(); - const isMobile = useIsMobile(); - - return ( - - - - - - - - - - - - - - - - ); -} diff --git a/resources/js/components/HeadingSmall.tsx b/resources/js/components/HeadingSmall.tsx deleted file mode 100644 index cbd3658..0000000 --- a/resources/js/components/HeadingSmall.tsx +++ /dev/null @@ -1,8 +0,0 @@ -export default function HeadingSmall({ title, description }: { title: string; description?: string }) { - return ( -
-

{title}

- {description &&

{description}

} -
- ); -} diff --git a/resources/js/components/Pricing/UpdatePriceForm.tsx b/resources/js/components/Pricing/UpdatePriceForm.tsx deleted file mode 100644 index b88c882..0000000 --- a/resources/js/components/Pricing/UpdatePriceForm.tsx +++ /dev/null @@ -1,112 +0,0 @@ -import { Button } from '@/components/ui/button'; -import { Input } from '@/components/ui/input'; -import { Label } from '@/components/ui/label'; -import InputError from '@/components/InputError'; -import { useForm } from '@inertiajs/react'; -import { todayISO } from '@/lib/utils'; -import { LoaderCircle } from 'lucide-react'; -import { FormEventHandler } from 'react'; -import ComponentTitle from '@/components/ui/ComponentTitle'; - -interface PriceUpdateFormData { - date: string; - price: string; - [key: string]: string; -} - -interface UpdatePriceFormProps { - currentPrice?: number; - className?: string; - onSuccess?: () => void; - onCancel?: () => void; -} - -export default function UpdatePriceForm({ currentPrice, className, onSuccess, onCancel }: UpdatePriceFormProps) { - const { data, setData, post, processing, errors } = useForm({ - date: todayISO(), // Today's date in YYYY-MM-DD format - price: currentPrice?.toString() || '100.00', - }); - - const submit: FormEventHandler = (e) => { - e.preventDefault(); - - post(route('pricing.update'), { - onSuccess: () => { - // Keep the date, reset only price if needed - // User might want to update same day multiple times - if (onSuccess) { - onSuccess(); - } - }, - onError: (errors) => { - console.error('Price update failed:', errors); - } - }); - }; - - return ( -
-
- UPDATE PRICE - {currentPrice && ( -

- [CURRENT] €{currentPrice.toFixed(4)} -

- )} -
-
- - setData('date', e.target.value)} - max={todayISO()} - className="bg-black border-red-500 text-red-400 focus:border-red-300 font-mono text-sm rounded-none border-2 focus:ring-0 focus:outline-none transition-all glow-red" - /> - -
- -
- - setData('price', e.target.value)} - className="bg-black border-red-500 text-red-400 focus:border-red-300 font-mono text-sm rounded-none border-2 focus:ring-0 focus:outline-none focus:shadow-[0_0_10px_rgba(239,68,68,0.5)] placeholder:text-red-400/40 transition-all" - /> -

- [UNIT] price per share -

- -
- -
- - {onCancel && ( - - )} -
-
-
-
- ); -} diff --git a/resources/js/components/Settings/DeleteUser.tsx b/resources/js/components/Settings/DeleteUser.tsx deleted file mode 100644 index 976fae0..0000000 --- a/resources/js/components/Settings/DeleteUser.tsx +++ /dev/null @@ -1,89 +0,0 @@ -import { useForm } from '@inertiajs/react'; -import { FormEventHandler, useRef } from 'react'; - -import InputError from '@/components/InputError'; -import { Button } from '@/components/ui/button'; -import { Input } from '@/components/ui/input'; -import { Label } from '@/components/ui/label'; - -import HeadingSmall from '@/components/HeadingSmall'; - -import { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogTitle, DialogTrigger } from '@/components/ui/dialog'; - -export default function DeleteUser() { - const passwordInput = useRef(null); - const { data, setData, delete: destroy, processing, reset, errors, clearErrors } = useForm>({ password: '' }); - - const deleteUser: FormEventHandler = (e) => { - e.preventDefault(); - - destroy(route('profile.destroy'), { - preserveScroll: true, - onSuccess: () => closeModal(), - onError: () => passwordInput.current?.focus(), - onFinish: () => reset(), - }); - }; - - const closeModal = () => { - clearErrors(); - reset(); - }; - - return ( -
- -
-
-

Warning

-

Please proceed with caution, this cannot be undone.

-
- - - - - - - Are you sure you want to delete your account? - - Once your account is deleted, all of its resources and data will also be permanently deleted. Please enter your password - to confirm you would like to permanently delete your account. - -
-
- - - setData('password', e.target.value)} - placeholder="Password" - autoComplete="current-password" - /> - - -
- - - - - - - - - -
-
-
-
-
- ); -} diff --git a/resources/js/components/Settings/UserInfo.tsx b/resources/js/components/Settings/UserInfo.tsx deleted file mode 100644 index 042e38a..0000000 --- a/resources/js/components/Settings/UserInfo.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar'; -import { useInitials } from '@/hooks/use-initials'; -import { type User } from '@/types'; - -export function UserInfo({ user, showEmail = false }: { user: User; showEmail?: boolean }) { - const getInitials = useInitials(); - - return ( - <> - - - - {getInitials(user.name)} - - -
- {user.name} - {showEmail && {user.email}} -
- - ); -} diff --git a/resources/js/components/Settings/UserMenuContent.tsx b/resources/js/components/Settings/UserMenuContent.tsx deleted file mode 100644 index f57285f..0000000 --- a/resources/js/components/Settings/UserMenuContent.tsx +++ /dev/null @@ -1,45 +0,0 @@ -import { DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator } from '@/components/ui/DropdownMenu'; -import { UserInfo } from '@/components/Settings/UserInfo'; -import { useMobileNavigation } from '@/hooks/use-mobile-navigation'; -import { type User } from '@/types'; -import { Link, router } from '@inertiajs/react'; -import { LogOut, Settings } from 'lucide-react'; - -interface UserMenuContentProps { - user: User; -} - -export function UserMenuContent({ user }: UserMenuContentProps) { - const cleanup = useMobileNavigation(); - - const handleLogout = () => { - cleanup(); - router.flushAll(); - }; - - return ( - <> - -
- -
-
- - - - - - Settings - - - - - - - - Log out - - - - ); -} diff --git a/resources/js/components/TextLink.tsx b/resources/js/components/TextLink.tsx deleted file mode 100644 index 1c2ddb8..0000000 --- a/resources/js/components/TextLink.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import { cn } from '@/lib/utils'; -import { Link } from '@inertiajs/react'; -import { ComponentProps } from 'react'; - -type LinkProps = ComponentProps; - -export default function TextLink({ className = '', children, ...props }: LinkProps) { - return ( - - {children} - - ); -} diff --git a/resources/js/components/heading.tsx b/resources/js/components/heading.tsx deleted file mode 100644 index 6384e4b..0000000 --- a/resources/js/components/heading.tsx +++ /dev/null @@ -1,8 +0,0 @@ -export default function Heading({ title, description }: { title: string; description?: string }) { - return ( -
-

{title}

- {description &&

{description}

} -
- ); -} diff --git a/resources/js/components/icon.tsx b/resources/js/components/icon.tsx deleted file mode 100644 index 0f81d9c..0000000 --- a/resources/js/components/icon.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import { cn } from '@/lib/utils'; -import { type LucideProps } from 'lucide-react'; -import { type ComponentType } from 'react'; - -interface IconProps extends Omit { - iconNode: ComponentType; -} - -export function Icon({ iconNode: IconComponent, className, ...props }: IconProps) { - return ; -} diff --git a/resources/js/components/ui/DropdownMenu.tsx b/resources/js/components/ui/DropdownMenu.tsx deleted file mode 100644 index 1d8da1e..0000000 --- a/resources/js/components/ui/DropdownMenu.tsx +++ /dev/null @@ -1,255 +0,0 @@ -import * as React from "react" -import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu" -import { CheckIcon, ChevronRightIcon, CircleIcon } from "lucide-react" - -import { cn } from "@/lib/utils" - -function DropdownMenu({ - ...props -}: React.ComponentProps) { - return -} - -function DropdownMenuPortal({ - ...props -}: React.ComponentProps) { - return ( - - ) -} - -function DropdownMenuTrigger({ - ...props -}: React.ComponentProps) { - return ( - - ) -} - -function DropdownMenuContent({ - className, - sideOffset = 4, - ...props -}: React.ComponentProps) { - return ( - - - - ) -} - -function DropdownMenuGroup({ - ...props -}: React.ComponentProps) { - return ( - - ) -} - -function DropdownMenuItem({ - className, - inset, - variant = "default", - ...props -}: React.ComponentProps & { - inset?: boolean - variant?: "default" | "destructive" -}) { - return ( - - ) -} - -function DropdownMenuCheckboxItem({ - className, - children, - checked, - ...props -}: React.ComponentProps) { - return ( - - - - - - - {children} - - ) -} - -function DropdownMenuRadioGroup({ - ...props -}: React.ComponentProps) { - return ( - - ) -} - -function DropdownMenuRadioItem({ - className, - children, - ...props -}: React.ComponentProps) { - return ( - - - - - - - {children} - - ) -} - -function DropdownMenuLabel({ - className, - inset, - ...props -}: React.ComponentProps & { - inset?: boolean -}) { - return ( - - ) -} - -function DropdownMenuSeparator({ - className, - ...props -}: React.ComponentProps) { - return ( - - ) -} - -function DropdownMenuShortcut({ - className, - ...props -}: React.ComponentProps<"span">) { - return ( - - ) -} - -function DropdownMenuSub({ - ...props -}: React.ComponentProps) { - return -} - -function DropdownMenuSubTrigger({ - className, - inset, - children, - ...props -}: React.ComponentProps & { - inset?: boolean -}) { - return ( - - {children} - - - ) -} - -function DropdownMenuSubContent({ - className, - ...props -}: React.ComponentProps) { - return ( - - ) -} - -export { - DropdownMenu, - DropdownMenuPortal, - DropdownMenuTrigger, - DropdownMenuContent, - DropdownMenuGroup, - DropdownMenuLabel, - DropdownMenuItem, - DropdownMenuCheckboxItem, - DropdownMenuRadioGroup, - DropdownMenuRadioItem, - DropdownMenuSeparator, - DropdownMenuShortcut, - DropdownMenuSub, - DropdownMenuSubTrigger, - DropdownMenuSubContent, -} diff --git a/resources/js/components/ui/NavigationMenu.tsx b/resources/js/components/ui/NavigationMenu.tsx deleted file mode 100644 index 1dd90ad..0000000 --- a/resources/js/components/ui/NavigationMenu.tsx +++ /dev/null @@ -1,168 +0,0 @@ -import * as React from "react" -import * as NavigationMenuPrimitive from "@radix-ui/react-navigation-menu" -import { cva } from "class-variance-authority" -import { ChevronDownIcon } from "lucide-react" - -import { cn } from "@/lib/utils" - -function NavigationMenu({ - className, - children, - viewport = true, - ...props -}: React.ComponentProps & { - viewport?: boolean -}) { - return ( - - {children} - {viewport && } - - ) -} - -function NavigationMenuList({ - className, - ...props -}: React.ComponentProps) { - return ( - - ) -} - -function NavigationMenuItem({ - className, - ...props -}: React.ComponentProps) { - return ( - - ) -} - -const navigationMenuTriggerStyle = cva( - "group inline-flex h-9 w-max items-center justify-center rounded-md bg-background px-4 py-2 text-sm font-medium hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground disabled:pointer-events-none disabled:opacity-50 data-[active=true]:bg-accent/50 data-[state=open]:bg-accent/50 data-[active=true]:text-accent-foreground ring-ring/10 dark:ring-ring/20 dark:outline-ring/40 outline-ring/50 transition-[color,box-shadow] focus-visible:ring-4 focus-visible:outline-1" -) - -function NavigationMenuTrigger({ - className, - children, - ...props -}: React.ComponentProps) { - return ( - - {children}{" "} - - ) -} - -function NavigationMenuContent({ - className, - ...props -}: React.ComponentProps) { - return ( - - ) -} - -function NavigationMenuViewport({ - className, - ...props -}: React.ComponentProps) { - return ( -
- -
- ) -} - -function NavigationMenuLink({ - className, - ...props -}: React.ComponentProps) { - return ( - - ) -} - -function NavigationMenuIndicator({ - className, - ...props -}: React.ComponentProps) { - return ( - -
- - ) -} - -export { - NavigationMenu, - NavigationMenuList, - NavigationMenuItem, - NavigationMenuContent, - NavigationMenuTrigger, - NavigationMenuLink, - NavigationMenuIndicator, - NavigationMenuViewport, - navigationMenuTriggerStyle, -} diff --git a/resources/js/components/ui/PlaceholderPattern.tsx b/resources/js/components/ui/PlaceholderPattern.tsx deleted file mode 100644 index 09f7ea4..0000000 --- a/resources/js/components/ui/PlaceholderPattern.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import { useId } from 'react'; - -interface PlaceholderPatternProps { - className?: string; -} - -export function PlaceholderPattern({ className }: PlaceholderPatternProps) { - const patternId = useId(); - - return ( - - - - - - - - - ); -} diff --git a/resources/js/components/ui/ToggleGroup.tsx b/resources/js/components/ui/ToggleGroup.tsx deleted file mode 100644 index e8b41e8..0000000 --- a/resources/js/components/ui/ToggleGroup.tsx +++ /dev/null @@ -1,71 +0,0 @@ -import * as React from "react" -import * as ToggleGroupPrimitive from "@radix-ui/react-toggle-group" -import { type VariantProps } from "class-variance-authority" - -import { cn } from "@/lib/utils" -import { toggleVariants } from "@/components/ui/toggle" - -const ToggleGroupContext = React.createContext< - VariantProps ->({ - size: "default", - variant: "default", -}) - -function ToggleGroup({ - className, - variant, - size, - children, - ...props -}: React.ComponentProps & - VariantProps) { - return ( - - - {children} - - - ) -} - -function ToggleGroupItem({ - className, - children, - variant, - size, - ...props -}: React.ComponentProps & - VariantProps) { - const context = React.useContext(ToggleGroupContext) - - return ( - - {children} - - ) -} - -export { ToggleGroup, ToggleGroupItem } diff --git a/resources/js/components/ui/alert.tsx b/resources/js/components/ui/alert.tsx deleted file mode 100644 index 3b8ee79..0000000 --- a/resources/js/components/ui/alert.tsx +++ /dev/null @@ -1,66 +0,0 @@ -import * as React from "react" -import { cva, type VariantProps } from "class-variance-authority" - -import { cn } from "@/lib/utils" - -const alertVariants = cva( - "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", - { - variants: { - variant: { - default: "bg-background text-foreground", - destructive: - "text-destructive-foreground [&>svg]:text-current *:data-[slot=alert-description]:text-destructive-foreground/80", - }, - }, - defaultVariants: { - variant: "default", - }, - } -) - -function Alert({ - className, - variant, - ...props -}: React.ComponentProps<"div"> & VariantProps) { - return ( -
- ) -} - -function AlertTitle({ className, ...props }: React.ComponentProps<"div">) { - return ( -
- ) -} - -function AlertDescription({ - className, - ...props -}: React.ComponentProps<"div">) { - return ( -
- ) -} - -export { Alert, AlertTitle, AlertDescription } diff --git a/resources/js/components/ui/avatar.tsx b/resources/js/components/ui/avatar.tsx deleted file mode 100644 index b7224f0..0000000 --- a/resources/js/components/ui/avatar.tsx +++ /dev/null @@ -1,51 +0,0 @@ -import * as React from "react" -import * as AvatarPrimitive from "@radix-ui/react-avatar" - -import { cn } from "@/lib/utils" - -function Avatar({ - className, - ...props -}: React.ComponentProps) { - return ( - - ) -} - -function AvatarImage({ - className, - ...props -}: React.ComponentProps) { - return ( - - ) -} - -function AvatarFallback({ - className, - ...props -}: React.ComponentProps) { - return ( - - ) -} - -export { Avatar, AvatarImage, AvatarFallback } diff --git a/resources/js/components/ui/badge.tsx b/resources/js/components/ui/badge.tsx deleted file mode 100644 index 268ea77..0000000 --- a/resources/js/components/ui/badge.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import * as React from "react" -import { Slot } from "@radix-ui/react-slot" -import { cva, type VariantProps } from "class-variance-authority" - -import { cn } from "@/lib/utils" - -const badgeVariants = cva( - "inline-flex items-center justify-center rounded-md border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-auto", - { - variants: { - variant: { - default: - "border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90", - secondary: - "border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90", - destructive: - "border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40", - outline: - "text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground", - }, - }, - defaultVariants: { - variant: "default", - }, - } -) - -function Badge({ - className, - variant, - asChild = false, - ...props -}: React.ComponentProps<"span"> & - VariantProps & { asChild?: boolean }) { - const Comp = asChild ? Slot : "span" - - return ( - - ) -} - -export { Badge, badgeVariants } diff --git a/resources/js/components/ui/breadcrumb.tsx b/resources/js/components/ui/breadcrumb.tsx deleted file mode 100644 index eb88f32..0000000 --- a/resources/js/components/ui/breadcrumb.tsx +++ /dev/null @@ -1,109 +0,0 @@ -import * as React from "react" -import { Slot } from "@radix-ui/react-slot" -import { ChevronRight, MoreHorizontal } from "lucide-react" - -import { cn } from "@/lib/utils" - -function Breadcrumb({ ...props }: React.ComponentProps<"nav">) { - return