From ab86f68638cbffe3f623f78ca26afc43baf107d6 Mon Sep 17 00:00:00 2001 From: Twyco Date: Thu, 16 Apr 2026 01:48:14 +0200 Subject: [PATCH] first ui rework commit --- package-lock.json | 74 +++++++-- package.json | 6 +- resources/css/app.css | 113 +++++++------- resources/js/components/AppHeader.vue | 140 ++++++------------ resources/js/components/UserMenuContent.vue | 35 ++++- .../js/components/ui/popover/Popover.vue | 19 +++ .../components/ui/popover/PopoverAnchor.vue | 15 ++ .../components/ui/popover/PopoverContent.vue | 45 ++++++ .../components/ui/popover/PopoverTrigger.vue | 15 ++ resources/js/components/ui/popover/index.ts | 4 + .../js/components/ui/progress/Progress.vue | 38 +++++ resources/js/components/ui/progress/index.ts | 1 + .../components/ui/radio-group/RadioGroup.vue | 25 ++++ .../ui/radio-group/RadioGroupItem.vue | 40 +++++ .../js/components/ui/radio-group/index.ts | 2 + .../components/ui/scroll-area/ScrollArea.vue | 33 +++++ .../components/ui/scroll-area/ScrollBar.vue | 32 ++++ .../js/components/ui/scroll-area/index.ts | 2 + resources/js/components/ui/sonner/Sonner.vue | 42 ++++++ resources/js/components/ui/sonner/index.ts | 1 + resources/js/components/ui/switch/Switch.vue | 38 +++++ resources/js/components/ui/switch/index.ts | 1 + resources/js/components/ui/table/Table.vue | 16 ++ .../js/components/ui/table/TableBody.vue | 17 +++ .../js/components/ui/table/TableCaption.vue | 17 +++ .../js/components/ui/table/TableCell.vue | 22 +++ .../js/components/ui/table/TableEmpty.vue | 34 +++++ .../js/components/ui/table/TableFooter.vue | 17 +++ .../js/components/ui/table/TableHead.vue | 17 +++ .../js/components/ui/table/TableHeader.vue | 17 +++ resources/js/components/ui/table/TableRow.vue | 17 +++ resources/js/components/ui/table/index.ts | 9 ++ resources/js/components/ui/table/utils.ts | 10 ++ resources/js/components/ui/tabs/Tabs.vue | 24 +++ .../js/components/ui/tabs/TabsContent.vue | 21 +++ resources/js/components/ui/tabs/TabsList.vue | 24 +++ .../js/components/ui/tabs/TabsTrigger.vue | 26 ++++ resources/js/components/ui/tabs/index.ts | 4 + .../js/components/ui/textarea/Textarea.vue | 28 ++++ resources/js/components/ui/textarea/index.ts | 1 + .../ui/toggle-group/ToggleGroup.vue | 49 ++++++ .../ui/toggle-group/ToggleGroupItem.vue | 46 ++++++ .../js/components/ui/toggle-group/index.ts | 2 + resources/js/components/ui/toggle/Toggle.vue | 35 +++++ resources/js/components/ui/toggle/index.ts | 28 ++++ resources/js/layouts/AppLayout.vue | 2 +- resources/views/app.blade.php | 6 +- 47 files changed, 1045 insertions(+), 165 deletions(-) create mode 100644 resources/js/components/ui/popover/Popover.vue create mode 100644 resources/js/components/ui/popover/PopoverAnchor.vue create mode 100644 resources/js/components/ui/popover/PopoverContent.vue create mode 100644 resources/js/components/ui/popover/PopoverTrigger.vue create mode 100644 resources/js/components/ui/popover/index.ts create mode 100644 resources/js/components/ui/progress/Progress.vue create mode 100644 resources/js/components/ui/progress/index.ts create mode 100644 resources/js/components/ui/radio-group/RadioGroup.vue create mode 100644 resources/js/components/ui/radio-group/RadioGroupItem.vue create mode 100644 resources/js/components/ui/radio-group/index.ts create mode 100644 resources/js/components/ui/scroll-area/ScrollArea.vue create mode 100644 resources/js/components/ui/scroll-area/ScrollBar.vue create mode 100644 resources/js/components/ui/scroll-area/index.ts create mode 100644 resources/js/components/ui/sonner/Sonner.vue create mode 100644 resources/js/components/ui/sonner/index.ts create mode 100644 resources/js/components/ui/switch/Switch.vue create mode 100644 resources/js/components/ui/switch/index.ts create mode 100644 resources/js/components/ui/table/Table.vue create mode 100644 resources/js/components/ui/table/TableBody.vue create mode 100644 resources/js/components/ui/table/TableCaption.vue create mode 100644 resources/js/components/ui/table/TableCell.vue create mode 100644 resources/js/components/ui/table/TableEmpty.vue create mode 100644 resources/js/components/ui/table/TableFooter.vue create mode 100644 resources/js/components/ui/table/TableHead.vue create mode 100644 resources/js/components/ui/table/TableHeader.vue create mode 100644 resources/js/components/ui/table/TableRow.vue create mode 100644 resources/js/components/ui/table/index.ts create mode 100644 resources/js/components/ui/table/utils.ts create mode 100644 resources/js/components/ui/tabs/Tabs.vue create mode 100644 resources/js/components/ui/tabs/TabsContent.vue create mode 100644 resources/js/components/ui/tabs/TabsList.vue create mode 100644 resources/js/components/ui/tabs/TabsTrigger.vue create mode 100644 resources/js/components/ui/tabs/index.ts create mode 100644 resources/js/components/ui/textarea/Textarea.vue create mode 100644 resources/js/components/ui/textarea/index.ts create mode 100644 resources/js/components/ui/toggle-group/ToggleGroup.vue create mode 100644 resources/js/components/ui/toggle-group/ToggleGroupItem.vue create mode 100644 resources/js/components/ui/toggle-group/index.ts create mode 100644 resources/js/components/ui/toggle/Toggle.vue create mode 100644 resources/js/components/ui/toggle/index.ts diff --git a/package-lock.json b/package-lock.json index a81d29e..079c0ab 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6,17 +6,19 @@ "": { "dependencies": { "@inertiajs/vue3": "^2.3.7", + "@tanstack/vue-table": "^8.21.3", "@vueuse/core": "^12.8.2", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "laravel-vite-plugin": "^3.0.0", "lucide-vue-next": "^0.468.0", - "reka-ui": "^2.6.1", + "reka-ui": "^2.9.6", "tailwind-merge": "^3.2.0", "tailwindcss": "^4.1.1", "tw-animate-css": "^1.2.5", "vue": "^3.5.13", - "vue-input-otp": "^0.3.2" + "vue-input-otp": "^0.3.2", + "vue-sonner": "^2.0.9" }, "devDependencies": { "@eslint/js": "^9.39.4", @@ -1236,6 +1238,19 @@ "vite": "^5.2.0 || ^6 || ^7 || ^8" } }, + "node_modules/@tanstack/table-core": { + "version": "8.21.3", + "resolved": "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.21.3.tgz", + "integrity": "sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, "node_modules/@tanstack/virtual-core": { "version": "3.13.23", "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.13.23.tgz", @@ -1246,6 +1261,25 @@ "url": "https://github.com/sponsors/tannerlinsley" } }, + "node_modules/@tanstack/vue-table": { + "version": "8.21.3", + "resolved": "https://registry.npmjs.org/@tanstack/vue-table/-/vue-table-8.21.3.tgz", + "integrity": "sha512-rusRyd77c5tDPloPskctMyPLFEQUeBzxdQ+2Eow4F7gDPlPOB1UnnhzfpdvqZ8ZyX2rRNGmqNnQWm87OI2OQPw==", + "license": "MIT", + "dependencies": { + "@tanstack/table-core": "8.21.3" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "vue": ">=3.2" + } + }, "node_modules/@tanstack/vue-virtual": { "version": "3.13.23", "resolved": "https://registry.npmjs.org/@tanstack/vue-virtual/-/vue-virtual-3.13.23.tgz", @@ -2758,9 +2792,9 @@ } }, "node_modules/defu": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", - "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.7.tgz", + "integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==", "license": "MIT" }, "node_modules/delayed-stream": { @@ -5649,9 +5683,9 @@ } }, "node_modules/reka-ui": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/reka-ui/-/reka-ui-2.9.2.tgz", - "integrity": "sha512-/t4e6y1hcG+uDuRfpg6tbMz3uUEvRzNco6NeYTufoJeUghy5Iosxos5YL/p+ieAsid84sdMX9OrgDqpEuCJhBw==", + "version": "2.9.6", + "resolved": "https://registry.npmjs.org/reka-ui/-/reka-ui-2.9.6.tgz", + "integrity": "sha512-K6bL457owpvWONc7hsjFxo3HDC9s6IzhRqShW0w9JSKelPGfRbkHD558UQTn/NH1cvrXVHygKyC7fExFmRketg==", "license": "MIT", "dependencies": { "@floating-ui/dom": "^1.6.13", @@ -5662,7 +5696,7 @@ "@vueuse/core": "^14.1.0", "@vueuse/shared": "^14.1.0", "aria-hidden": "^1.2.4", - "defu": "^6.1.4", + "defu": "^6.1.5", "ohash": "^2.0.11" }, "funding": { @@ -6753,6 +6787,28 @@ "vue": "^3.2.0" } }, + "node_modules/vue-sonner": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/vue-sonner/-/vue-sonner-2.0.9.tgz", + "integrity": "sha512-i6BokNlNDL93fpzNxN/LZSn6D6MzlO+i3qXt6iVZne3x1k7R46d5HlFB4P8tYydhgqOrRbIZEsnRd3kG7qGXyw==", + "license": "MIT", + "peerDependencies": { + "@nuxt/kit": "^4.0.3", + "@nuxt/schema": "^4.0.3", + "nuxt": "^4.0.3" + }, + "peerDependenciesMeta": { + "@nuxt/kit": { + "optional": true + }, + "@nuxt/schema": { + "optional": true + }, + "nuxt": { + "optional": true + } + } + }, "node_modules/vue-tsc": { "version": "2.2.12", "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.2.12.tgz", diff --git a/package.json b/package.json index e221a50..dac3650 100644 --- a/package.json +++ b/package.json @@ -40,17 +40,19 @@ }, "dependencies": { "@inertiajs/vue3": "^2.3.7", + "@tanstack/vue-table": "^8.21.3", "@vueuse/core": "^12.8.2", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "laravel-vite-plugin": "^3.0.0", "lucide-vue-next": "^0.468.0", - "reka-ui": "^2.6.1", + "reka-ui": "^2.9.6", "tailwind-merge": "^3.2.0", "tailwindcss": "^4.1.1", "tw-animate-css": "^1.2.5", "vue": "^3.5.13", - "vue-input-otp": "^0.3.2" + "vue-input-otp": "^0.3.2", + "vue-sonner": "^2.0.9" }, "optionalDependencies": { "@rollup/rollup-linux-x64-gnu": "4.9.5", diff --git a/resources/css/app.css b/resources/css/app.css index 6f9d1f5..4b67ee7 100644 --- a/resources/css/app.css +++ b/resources/css/app.css @@ -9,10 +9,13 @@ @theme inline { --font-sans: - Instrument Sans, ui-sans-serif, system-ui, sans-serif, + Inter, ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; + --font-display: + Manrope, ui-sans-serif, system-ui, sans-serif; + --radius-lg: var(--radius); --radius-md: calc(var(--radius) - 2px); --radius-sm: calc(var(--radius) - 4px); @@ -83,83 +86,83 @@ body, html { --font-sans: - 'Instrument Sans', ui-sans-serif, system-ui, sans-serif, + 'Inter', ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; } } :root { - --background: hsl(0 0% 100%); - --foreground: hsl(0 0% 3.9%); + --background: hsl(120 10% 98%); + --foreground: hsl(120 5% 12%); --card: hsl(0 0% 100%); - --card-foreground: hsl(0 0% 3.9%); + --card-foreground: hsl(120 5% 12%); --popover: hsl(0 0% 100%); - --popover-foreground: hsl(0 0% 3.9%); - --primary: hsl(0 0% 9%); - --primary-foreground: hsl(0 0% 98%); - --secondary: hsl(0 0% 92.1%); - --secondary-foreground: hsl(0 0% 9%); - --muted: hsl(0 0% 96.1%); - --muted-foreground: hsl(0 0% 45.1%); - --accent: hsl(0 0% 96.1%); - --accent-foreground: hsl(0 0% 9%); + --popover-foreground: hsl(120 5% 12%); + --primary: hsl(107 80% 24%); + --primary-foreground: hsl(107 30% 97%); + --secondary: hsl(107 8% 91%); + --secondary-foreground: hsl(107 10% 18%); + --muted: hsl(107 8% 95%); + --muted-foreground: hsl(107 5% 42%); + --accent: hsl(107 10% 93%); + --accent-foreground: hsl(107 10% 18%); --destructive: hsl(0 84.2% 60.2%); --destructive-foreground: hsl(0 0% 98%); - --border: hsl(0 0% 92.8%); - --input: hsl(0 0% 89.8%); - --ring: hsl(0 0% 3.9%); - --chart-1: hsl(12 76% 61%); + --border: hsl(107 8% 90%); + --input: hsl(107 8% 87%); + --ring: hsl(107 80% 24%); + --chart-1: hsl(107 80% 30%); --chart-2: hsl(173 58% 39%); --chart-3: hsl(197 37% 24%); --chart-4: hsl(43 74% 66%); --chart-5: hsl(27 87% 67%); - --radius: 0.5rem; - --sidebar-background: hsl(0 0% 98%); - --sidebar-foreground: hsl(240 5.3% 26.1%); - --sidebar-primary: hsl(0 0% 10%); - --sidebar-primary-foreground: hsl(0 0% 98%); - --sidebar-accent: hsl(0 0% 94%); - --sidebar-accent-foreground: hsl(0 0% 30%); - --sidebar-border: hsl(0 0% 91%); - --sidebar-ring: hsl(217.2 91.2% 59.8%); - --sidebar: hsl(0 0% 98%); + --radius: 0.625rem; + --sidebar-background: hsl(120 10% 97%); + --sidebar-foreground: hsl(120 5% 26%); + --sidebar-primary: hsl(107 80% 24%); + --sidebar-primary-foreground: hsl(107 30% 97%); + --sidebar-accent: hsl(107 10% 93%); + --sidebar-accent-foreground: hsl(107 10% 25%); + --sidebar-border: hsl(107 8% 90%); + --sidebar-ring: hsl(107 80% 24%); + --sidebar: hsl(120 10% 97%); } .dark { - --background: hsl(0 0% 3.9%); - --foreground: hsl(0 0% 98%); - --card: hsl(0 0% 3.9%); - --card-foreground: hsl(0 0% 98%); - --popover: hsl(0 0% 3.9%); - --popover-foreground: hsl(0 0% 98%); - --primary: hsl(0 0% 98%); - --primary-foreground: hsl(0 0% 9%); - --secondary: hsl(0 0% 14.9%); - --secondary-foreground: hsl(0 0% 98%); - --muted: hsl(0 0% 16.08%); - --muted-foreground: hsl(0 0% 63.9%); - --accent: hsl(0 0% 14.9%); - --accent-foreground: hsl(0 0% 98%); + --background: hsl(120 5% 6%); + --foreground: hsl(120 5% 95%); + --card: hsl(120 5% 8%); + --card-foreground: hsl(120 5% 95%); + --popover: hsl(120 5% 8%); + --popover-foreground: hsl(120 5% 95%); + --primary: hsl(107 70% 55%); + --primary-foreground: hsl(107 80% 8%); + --secondary: hsl(107 5% 16%); + --secondary-foreground: hsl(107 5% 90%); + --muted: hsl(107 5% 14%); + --muted-foreground: hsl(107 5% 60%); + --accent: hsl(107 8% 16%); + --accent-foreground: hsl(107 5% 90%); --destructive: hsl(0 84% 60%); --destructive-foreground: hsl(0 0% 98%); - --border: hsl(0 0% 14.9%); - --input: hsl(0 0% 14.9%); - --ring: hsl(0 0% 83.1%); - --chart-1: hsl(220 70% 50%); + --border: hsl(107 5% 16%); + --input: hsl(107 5% 16%); + --ring: hsl(107 70% 55%); + --chart-1: hsl(107 60% 45%); --chart-2: hsl(160 60% 45%); --chart-3: hsl(30 80% 55%); --chart-4: hsl(280 65% 60%); --chart-5: hsl(340 75% 55%); - --sidebar-background: hsl(0 0% 7%); - --sidebar-foreground: hsl(0 0% 95.9%); - --sidebar-primary: hsl(360, 100%, 100%); - --sidebar-primary-foreground: hsl(0 0% 100%); - --sidebar-accent: hsl(0 0% 15.9%); - --sidebar-accent-foreground: hsl(240 4.8% 95.9%); - --sidebar-border: hsl(0 0% 15.9%); - --sidebar-ring: hsl(217.2 91.2% 59.8%); - --sidebar: hsl(240 5.9% 10%); + --sidebar-background: hsl(120 5% 7%); + --sidebar-foreground: hsl(120 5% 92%); + --sidebar-primary: hsl(107 70% 55%); + --sidebar-primary-foreground: hsl(107 80% 8%); + --sidebar-accent: hsl(107 8% 16%); + --sidebar-accent-foreground: hsl(107 5% 88%); + --sidebar-border: hsl(107 5% 16%); + --sidebar-ring: hsl(107 70% 55%); + --sidebar: hsl(120 5% 7%); } @layer base { diff --git a/resources/js/components/AppHeader.vue b/resources/js/components/AppHeader.vue index ca3cb1c..0e1551f 100644 --- a/resources/js/components/AppHeader.vue +++ b/resources/js/components/AppHeader.vue @@ -1,6 +1,6 @@