From 07037cffb0d9ab210c207473e378b813517816a7 Mon Sep 17 00:00:00 2001 From: GaryCraft Date: Mon, 24 Jun 2024 03:45:12 -0600 Subject: [PATCH] disable HMR, tailwind is dumb Add Shadcn-vue --- package-lock.json | 239 +- src/modules/webui/index.ts | 62 +- web/README.md | 16 - web/components.json | 17 + web/index.html | 2 +- web/package-lock.json | 4620 ++++++++++++++--- web/package.json | 21 +- web/server.js | 77 - web/src/App.vue | 31 - web/src/assets/index.css | 78 + web/src/components/HelloWorld.vue | 38 - web/src/components/NavBar.vue | 19 + web/src/components/ui/avatar/Avatar.vue | 21 + .../components/ui/avatar/AvatarFallback.vue | 11 + web/src/components/ui/avatar/AvatarImage.vue | 9 + web/src/components/ui/avatar/index.ts | 24 + web/src/components/ui/button/Button.vue | 26 + web/src/components/ui/button/index.ts | 35 + web/src/components/ui/card/Card.vue | 21 + web/src/components/ui/card/CardContent.vue | 14 + .../components/ui/card/CardDescription.vue | 14 + web/src/components/ui/card/CardFooter.vue | 14 + web/src/components/ui/card/CardHeader.vue | 14 + web/src/components/ui/card/CardTitle.vue | 18 + web/src/components/ui/card/index.ts | 6 + web/src/components/ui/chart-bar/BarChart.vue | 115 + web/src/components/ui/chart-bar/index.ts | 66 + .../components/ui/chart/ChartCrosshair.vue | 44 + web/src/components/ui/chart/ChartLegend.vue | 50 + .../ui/chart/ChartSingleTooltip.vue | 63 + web/src/components/ui/chart/ChartTooltip.vue | 40 + web/src/components/ui/chart/index.ts | 18 + web/src/components/ui/chart/interface.ts | 64 + web/src/components/ui/command/Command.vue | 30 + .../components/ui/command/CommandDialog.vue | 21 + .../components/ui/command/CommandEmpty.vue | 20 + .../components/ui/command/CommandGroup.vue | 29 + .../components/ui/command/CommandInput.vue | 33 + web/src/components/ui/command/CommandItem.vue | 26 + web/src/components/ui/command/CommandList.vue | 27 + .../ui/command/CommandSeparator.vue | 23 + .../components/ui/command/CommandShortcut.vue | 14 + web/src/components/ui/command/index.ts | 9 + web/src/components/ui/dialog/Dialog.vue | 14 + web/src/components/ui/dialog/DialogClose.vue | 11 + .../components/ui/dialog/DialogContent.vue | 50 + .../ui/dialog/DialogDescription.vue | 24 + web/src/components/ui/dialog/DialogFooter.vue | 19 + web/src/components/ui/dialog/DialogHeader.vue | 16 + .../ui/dialog/DialogScrollContent.vue | 59 + web/src/components/ui/dialog/DialogTitle.vue | 29 + .../components/ui/dialog/DialogTrigger.vue | 11 + web/src/components/ui/dialog/index.ts | 9 + .../ui/dropdown-menu/DropdownMenu.vue | 14 + .../DropdownMenuCheckboxItem.vue | 40 + .../ui/dropdown-menu/DropdownMenuContent.vue | 38 + .../ui/dropdown-menu/DropdownMenuGroup.vue | 11 + .../ui/dropdown-menu/DropdownMenuItem.vue | 28 + .../ui/dropdown-menu/DropdownMenuLabel.vue | 24 + .../dropdown-menu/DropdownMenuRadioGroup.vue | 19 + .../dropdown-menu/DropdownMenuRadioItem.vue | 41 + .../dropdown-menu/DropdownMenuSeparator.vue | 22 + .../ui/dropdown-menu/DropdownMenuShortcut.vue | 14 + .../ui/dropdown-menu/DropdownMenuSub.vue | 19 + .../dropdown-menu/DropdownMenuSubContent.vue | 30 + .../dropdown-menu/DropdownMenuSubTrigger.vue | 33 + .../ui/dropdown-menu/DropdownMenuTrigger.vue | 13 + web/src/components/ui/dropdown-menu/index.ts | 16 + web/src/components/ui/input/Input.vue | 24 + web/src/components/ui/input/index.ts | 1 + web/src/components/ui/label/Label.vue | 27 + web/src/components/ui/label/index.ts | 1 + web/src/components/ui/popover/Popover.vue | 15 + .../components/ui/popover/PopoverContent.vue | 48 + .../components/ui/popover/PopoverTrigger.vue | 11 + web/src/components/ui/popover/index.ts | 3 + .../ui/range-calendar/RangeCalendar.vue | 60 + .../ui/range-calendar/RangeCalendarCell.vue | 24 + .../RangeCalendarCellTrigger.vue | 40 + .../ui/range-calendar/RangeCalendarGrid.vue | 24 + .../range-calendar/RangeCalendarGridBody.vue | 11 + .../range-calendar/RangeCalendarGridHead.vue | 11 + .../range-calendar/RangeCalendarGridRow.vue | 21 + .../range-calendar/RangeCalendarHeadCell.vue | 21 + .../ui/range-calendar/RangeCalendarHeader.vue | 21 + .../range-calendar/RangeCalendarHeading.vue | 27 + .../RangeCalendarNextButton.vue | 32 + .../RangeCalendarPrevButton.vue | 32 + web/src/components/ui/range-calendar/index.ts | 12 + web/src/components/ui/select/Select.vue | 15 + .../components/ui/select/SelectContent.vue | 53 + web/src/components/ui/select/SelectGroup.vue | 19 + web/src/components/ui/select/SelectItem.vue | 44 + .../components/ui/select/SelectItemText.vue | 11 + web/src/components/ui/select/SelectLabel.vue | 13 + .../ui/select/SelectScrollDownButton.vue | 24 + .../ui/select/SelectScrollUpButton.vue | 24 + .../components/ui/select/SelectSeparator.vue | 17 + .../components/ui/select/SelectTrigger.vue | 31 + web/src/components/ui/select/SelectValue.vue | 11 + web/src/components/ui/select/index.ts | 11 + web/src/components/ui/tabs/Tabs.vue | 15 + web/src/components/ui/tabs/TabsContent.vue | 22 + web/src/components/ui/tabs/TabsList.vue | 25 + web/src/components/ui/tabs/TabsTrigger.vue | 27 + web/src/components/ui/tabs/index.ts | 4 + web/src/components/util/ColorMode.vue | 33 + web/src/entry-client.ts | 3 +- web/src/lib/utils.ts | 6 + web/src/main.ts | 9 +- web/src/pages/Index.vue | 10 + web/src/pages/UtilityDust.vue | 5 + web/src/router.ts | 12 + web/src/style.css | 79 - web/tailwind.config.ts | 100 + web/tsconfig.json | 64 +- web/tsconfig.node.json | 26 +- web/vite.config.ts | 16 + 118 files changed, 6866 insertions(+), 1072 deletions(-) delete mode 100644 web/README.md create mode 100644 web/components.json delete mode 100644 web/server.js delete mode 100644 web/src/App.vue create mode 100644 web/src/assets/index.css delete mode 100644 web/src/components/HelloWorld.vue create mode 100644 web/src/components/NavBar.vue create mode 100644 web/src/components/ui/avatar/Avatar.vue create mode 100644 web/src/components/ui/avatar/AvatarFallback.vue create mode 100644 web/src/components/ui/avatar/AvatarImage.vue create mode 100644 web/src/components/ui/avatar/index.ts create mode 100644 web/src/components/ui/button/Button.vue create mode 100644 web/src/components/ui/button/index.ts create mode 100644 web/src/components/ui/card/Card.vue create mode 100644 web/src/components/ui/card/CardContent.vue create mode 100644 web/src/components/ui/card/CardDescription.vue create mode 100644 web/src/components/ui/card/CardFooter.vue create mode 100644 web/src/components/ui/card/CardHeader.vue create mode 100644 web/src/components/ui/card/CardTitle.vue create mode 100644 web/src/components/ui/card/index.ts create mode 100644 web/src/components/ui/chart-bar/BarChart.vue create mode 100644 web/src/components/ui/chart-bar/index.ts create mode 100644 web/src/components/ui/chart/ChartCrosshair.vue create mode 100644 web/src/components/ui/chart/ChartLegend.vue create mode 100644 web/src/components/ui/chart/ChartSingleTooltip.vue create mode 100644 web/src/components/ui/chart/ChartTooltip.vue create mode 100644 web/src/components/ui/chart/index.ts create mode 100644 web/src/components/ui/chart/interface.ts create mode 100644 web/src/components/ui/command/Command.vue create mode 100644 web/src/components/ui/command/CommandDialog.vue create mode 100644 web/src/components/ui/command/CommandEmpty.vue create mode 100644 web/src/components/ui/command/CommandGroup.vue create mode 100644 web/src/components/ui/command/CommandInput.vue create mode 100644 web/src/components/ui/command/CommandItem.vue create mode 100644 web/src/components/ui/command/CommandList.vue create mode 100644 web/src/components/ui/command/CommandSeparator.vue create mode 100644 web/src/components/ui/command/CommandShortcut.vue create mode 100644 web/src/components/ui/command/index.ts create mode 100644 web/src/components/ui/dialog/Dialog.vue create mode 100644 web/src/components/ui/dialog/DialogClose.vue create mode 100644 web/src/components/ui/dialog/DialogContent.vue create mode 100644 web/src/components/ui/dialog/DialogDescription.vue create mode 100644 web/src/components/ui/dialog/DialogFooter.vue create mode 100644 web/src/components/ui/dialog/DialogHeader.vue create mode 100644 web/src/components/ui/dialog/DialogScrollContent.vue create mode 100644 web/src/components/ui/dialog/DialogTitle.vue create mode 100644 web/src/components/ui/dialog/DialogTrigger.vue create mode 100644 web/src/components/ui/dialog/index.ts create mode 100644 web/src/components/ui/dropdown-menu/DropdownMenu.vue create mode 100644 web/src/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue create mode 100644 web/src/components/ui/dropdown-menu/DropdownMenuContent.vue create mode 100644 web/src/components/ui/dropdown-menu/DropdownMenuGroup.vue create mode 100644 web/src/components/ui/dropdown-menu/DropdownMenuItem.vue create mode 100644 web/src/components/ui/dropdown-menu/DropdownMenuLabel.vue create mode 100644 web/src/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue create mode 100644 web/src/components/ui/dropdown-menu/DropdownMenuRadioItem.vue create mode 100644 web/src/components/ui/dropdown-menu/DropdownMenuSeparator.vue create mode 100644 web/src/components/ui/dropdown-menu/DropdownMenuShortcut.vue create mode 100644 web/src/components/ui/dropdown-menu/DropdownMenuSub.vue create mode 100644 web/src/components/ui/dropdown-menu/DropdownMenuSubContent.vue create mode 100644 web/src/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue create mode 100644 web/src/components/ui/dropdown-menu/DropdownMenuTrigger.vue create mode 100644 web/src/components/ui/dropdown-menu/index.ts create mode 100644 web/src/components/ui/input/Input.vue create mode 100644 web/src/components/ui/input/index.ts create mode 100644 web/src/components/ui/label/Label.vue create mode 100644 web/src/components/ui/label/index.ts create mode 100644 web/src/components/ui/popover/Popover.vue create mode 100644 web/src/components/ui/popover/PopoverContent.vue create mode 100644 web/src/components/ui/popover/PopoverTrigger.vue create mode 100644 web/src/components/ui/popover/index.ts create mode 100644 web/src/components/ui/range-calendar/RangeCalendar.vue create mode 100644 web/src/components/ui/range-calendar/RangeCalendarCell.vue create mode 100644 web/src/components/ui/range-calendar/RangeCalendarCellTrigger.vue create mode 100644 web/src/components/ui/range-calendar/RangeCalendarGrid.vue create mode 100644 web/src/components/ui/range-calendar/RangeCalendarGridBody.vue create mode 100644 web/src/components/ui/range-calendar/RangeCalendarGridHead.vue create mode 100644 web/src/components/ui/range-calendar/RangeCalendarGridRow.vue create mode 100644 web/src/components/ui/range-calendar/RangeCalendarHeadCell.vue create mode 100644 web/src/components/ui/range-calendar/RangeCalendarHeader.vue create mode 100644 web/src/components/ui/range-calendar/RangeCalendarHeading.vue create mode 100644 web/src/components/ui/range-calendar/RangeCalendarNextButton.vue create mode 100644 web/src/components/ui/range-calendar/RangeCalendarPrevButton.vue create mode 100644 web/src/components/ui/range-calendar/index.ts create mode 100644 web/src/components/ui/select/Select.vue create mode 100644 web/src/components/ui/select/SelectContent.vue create mode 100644 web/src/components/ui/select/SelectGroup.vue create mode 100644 web/src/components/ui/select/SelectItem.vue create mode 100644 web/src/components/ui/select/SelectItemText.vue create mode 100644 web/src/components/ui/select/SelectLabel.vue create mode 100644 web/src/components/ui/select/SelectScrollDownButton.vue create mode 100644 web/src/components/ui/select/SelectScrollUpButton.vue create mode 100644 web/src/components/ui/select/SelectSeparator.vue create mode 100644 web/src/components/ui/select/SelectTrigger.vue create mode 100644 web/src/components/ui/select/SelectValue.vue create mode 100644 web/src/components/ui/select/index.ts create mode 100644 web/src/components/ui/tabs/Tabs.vue create mode 100644 web/src/components/ui/tabs/TabsContent.vue create mode 100644 web/src/components/ui/tabs/TabsList.vue create mode 100644 web/src/components/ui/tabs/TabsTrigger.vue create mode 100644 web/src/components/ui/tabs/index.ts create mode 100644 web/src/components/util/ColorMode.vue create mode 100644 web/src/lib/utils.ts create mode 100644 web/src/pages/Index.vue create mode 100644 web/src/pages/UtilityDust.vue create mode 100644 web/src/router.ts delete mode 100644 web/src/style.css create mode 100644 web/tailwind.config.ts diff --git a/package-lock.json b/package-lock.json index 2e61a33..c750af3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,6 @@ "dependencies": { "@garycraft/orizuru": "^0.2.2", "@spaceproject/findrecursive": "^1.0.4", - "@universal-middleware/express": "^0.0.2", "chalk": "^4.1.2", "cookie-parser": "^1.4.6", "discord.js": "^14.14.1", @@ -365,151 +364,6 @@ "node": ">=17.X.X" } }, - "node_modules/@hattip/core": { - "version": "0.0.45", - "resolved": "https://registry.npmjs.org/@hattip/core/-/core-0.0.45.tgz", - "integrity": "sha512-4BK9dPU7sLvmP9sUq048uSaKFvQY2Qa6D0xQteQBIiDYuTdbopcUQLETM1sdkUeUtFxHPwPu/NclfJAC5INarw==" - }, - "node_modules/@hattip/polyfills": { - "version": "0.0.45", - "resolved": "https://registry.npmjs.org/@hattip/polyfills/-/polyfills-0.0.45.tgz", - "integrity": "sha512-H8a+NVu/rAspycnkLSLVvWu3ei/ndFhA+3KQS1p2YjCcuf4Wuj4EWfScrwgL4d6CR0J+FxqX1P9NDGa4tdJQmQ==", - "dependencies": { - "@hattip/core": "0.0.45", - "@whatwg-node/fetch": "^0.9.17", - "node-fetch-native": "^1.6.4" - } - }, - "node_modules/@hattip/polyfills/node_modules/@kamilkisiela/fast-url-parser": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@kamilkisiela/fast-url-parser/-/fast-url-parser-1.1.4.tgz", - "integrity": "sha512-gbkePEBupNydxCelHCESvFSFM8XPh1Zs/OAVRW/rKpEqPAl5PbOM90Si8mv9bvnR53uPD2s/FiRxdvSejpRJew==" - }, - "node_modules/@hattip/polyfills/node_modules/@whatwg-node/events": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@whatwg-node/events/-/events-0.1.1.tgz", - "integrity": "sha512-AyQEn5hIPV7Ze+xFoXVU3QTHXVbWPrzaOkxtENMPMuNL6VVHrp4hHfDt9nrQpjO7BgvuM95dMtkycX5M/DZR3w==", - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@hattip/polyfills/node_modules/@whatwg-node/fetch": { - "version": "0.9.18", - "resolved": "https://registry.npmjs.org/@whatwg-node/fetch/-/fetch-0.9.18.tgz", - "integrity": "sha512-hqoz6StCW+AjV/3N+vg0s1ah82ptdVUb9nH2ttj3UbySOXUvytWw2yqy8c1cKzyRk6mDD00G47qS3fZI9/gMjg==", - "dependencies": { - "@whatwg-node/node-fetch": "^0.5.7", - "urlpattern-polyfill": "^10.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@hattip/polyfills/node_modules/@whatwg-node/node-fetch": { - "version": "0.5.11", - "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.5.11.tgz", - "integrity": "sha512-LS8tSomZa3YHnntpWt3PP43iFEEl6YeIsvDakczHBKlay5LdkXFr8w7v8H6akpG5nRrzydyB0k1iE2eoL6aKIQ==", - "dependencies": { - "@kamilkisiela/fast-url-parser": "^1.1.4", - "@whatwg-node/events": "^0.1.0", - "busboy": "^1.6.0", - "fast-querystring": "^1.1.1", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@hattip/polyfills/node_modules/busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "dependencies": { - "streamsearch": "^1.1.0" - }, - "engines": { - "node": ">=10.16.0" - } - }, - "node_modules/@hattip/polyfills/node_modules/fast-decode-uri-component": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz", - "integrity": "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==" - }, - "node_modules/@hattip/polyfills/node_modules/fast-querystring": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.1.2.tgz", - "integrity": "sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==", - "dependencies": { - "fast-decode-uri-component": "^1.0.1" - } - }, - "node_modules/@hattip/polyfills/node_modules/node-fetch-native": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.4.tgz", - "integrity": "sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==" - }, - "node_modules/@hattip/polyfills/node_modules/streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@hattip/polyfills/node_modules/urlpattern-polyfill": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz", - "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==" - }, - "node_modules/@hattip/walk": { - "version": "0.0.45", - "resolved": "https://registry.npmjs.org/@hattip/walk/-/walk-0.0.45.tgz", - "integrity": "sha512-GYEQN5n2JUzjLl9hdMJ+0mbsfwvldRKMBdxx+l29SxmRhOwyWURDyaSfX7UEkEmmxjbg4YqEoWyYgaAtxeW7Jw==", - "dependencies": { - "@hattip/headers": "0.0.45", - "cac": "^6.7.14", - "mime-types": "^2.1.35" - }, - "bin": { - "hattip-walk": "cli.js" - } - }, - "node_modules/@hattip/walk/node_modules/@hattip/headers": { - "version": "0.0.45", - "resolved": "https://registry.npmjs.org/@hattip/headers/-/headers-0.0.45.tgz", - "integrity": "sha512-owgxAt1jdhEcAdDfnlpPa8iQx/swItReYUlo8UFZ0GUCMiWJvnpl6rTdUsS6bCwMK9IJOliivN4dHEY8VKdGQw==", - "dependencies": { - "@hattip/core": "0.0.45" - } - }, - "node_modules/@hattip/walk/node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@hattip/walk/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@hattip/walk/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/@kwsites/file-exists": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", @@ -542,6 +396,25 @@ "resolved": "https://registry.npmjs.org/@sqltools/formatter/-/formatter-1.2.5.tgz", "integrity": "sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw==" }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/cookie-parser": { "version": "1.4.7", "resolved": "https://registry.npmjs.org/@types/cookie-parser/-/cookie-parser-1.4.7.tgz", @@ -585,6 +458,27 @@ "@types/node": "*" } }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "dev": true + }, + "node_modules/@types/jsonfile": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.4.tgz", + "integrity": "sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true + }, "node_modules/@types/node": { "version": "20.14.8", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.8.tgz", @@ -602,6 +496,39 @@ "@types/node": "*" } }, + "node_modules/@types/qs": { + "version": "6.9.15", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", + "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true + }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dev": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", + "dev": true, + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", @@ -1115,16 +1042,6 @@ "node": ">=0.10.0" } }, - "node_modules/@universal-middleware/express": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/@universal-middleware/express/-/express-0.0.2.tgz", - "integrity": "sha512-qw9v/OOpmfcz69369xeDq3u8ZRJhd8l+0B6qo5uCcgUh7zWt5mOl6gPVciIxXuyrlgcHVW86hNoyf7pPLIQGlg==", - "dependencies": { - "@hattip/core": "^0.0.45", - "@hattip/polyfills": "^0.0.45", - "@hattip/walk": "^0.0.45" - } - }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -5913,6 +5830,11 @@ "node": "^18.x.x || ^20.x.x" } }, + "node_modules/picocolors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" + }, "node_modules/plimit-lit": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/plimit-lit/-/plimit-lit-1.6.1.tgz", @@ -5978,11 +5900,6 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/postcss/node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" - }, "node_modules/postcss/node_modules/source-map-js": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", diff --git a/src/modules/webui/index.ts b/src/modules/webui/index.ts index 6953941..a7e80ae 100644 --- a/src/modules/webui/index.ts +++ b/src/modules/webui/index.ts @@ -21,35 +21,55 @@ const HMR_PORT = 1421; export default { name: "webui", - + loadFunction: async (config) => { return new EventEmitter(); }, initFunction: async (ctx, config) => { const appCtx = getAppContext(); - const isProduction = process.env.NODE_ENV !== "development" + const isProduction = process.env.NODE_ENV === "production"; const v = await import("vite"); let vite; - if (isProduction) { - const result = await buildWebUI(WebBuildFromPath, WebBuildToPath); - if (!result) { - error("Failed to build webui"); - return; - } else { - info("WebUI built successfully"); - } - const clientPath = path.join(WebBuildToPath, "client"); - // Expect the web build to be in the public directory - if (!fs.existsSync(clientPath)) { - error("Web build not found in public directory"); - return; + // When HMR is working, move this to the isProduction block + const result = await buildWebUI(WebBuildFromPath, WebBuildToPath); + if (!result) { + error("Failed to build webui"); + return; + } else { + info("WebUI built successfully"); + } + + const clientPath = path.join(WebBuildToPath, "client"); + // Expect the web build to be in the public directory + if (!fs.existsSync(clientPath)) { + error("Web build not found in public directory"); + return; + } + appCtx.http.server.use(express.static("web/dist/client")); + + // Watch for changes in the web directory and rebuild + fs.watch(path.join( + WebBuildFromPath, + "src" + ), { recursive: true }, async (event, filename) => { + if (filename) { + const result = await buildWebUI(WebBuildFromPath, WebBuildToPath); + if (!result) { + error("Failed to build webui"); + return; + } else { + info("WebUI built successfully"); + } } - appCtx.http.server.use(express.static("web/dist/client")); + }); + /* if (isProduction) { + // provisionally empty } else { // Vite dev server debug("Starting Vite dev server"); vite = await v.createServer({ + configFile: path.join(WebBuildFromPath, "vite.config.ts"), root: WebBuildFromPath, server: { middlewareMode: true, hmr: { port: HMR_PORT } }, appType: "custom", @@ -65,9 +85,9 @@ export default { debug("Vite dev server started"); } - if (!vite) { - // error("Vite dev server not started, exiting"); - return; + if(!vite){ + error("Vite not initialized") + return } const template = isProduction ? @@ -79,7 +99,7 @@ export default { ) ) const render = isProduction ? - (await import(`${WebBuildToPath}/server/entry-server.js`)).render : + (require(`${WebBuildToPath}/server/entry-server.js`)).render : ( await vite.ssrLoadModule( path.join(WebBuildFromPath, '/src/entry-server') @@ -109,6 +129,6 @@ export default { error("Error serving web page", e) res.status(500).send("Internal Server Error") } - }) + }) */ } } satisfies Module; \ No newline at end of file diff --git a/web/README.md b/web/README.md deleted file mode 100644 index 30b15e2..0000000 --- a/web/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# Vue 3 + TypeScript + Vite - -This template should help get you started developing with Vue 3 and TypeScript in Vite. The template uses Vue 3 ` - - - - diff --git a/web/src/assets/index.css b/web/src/assets/index.css new file mode 100644 index 0000000..8a04b2b --- /dev/null +++ b/web/src/assets/index.css @@ -0,0 +1,78 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +@layer base { + :root { + --background: 0 0% 100%; + --foreground: 240 10% 3.9%; + + --muted: 240 4.8% 95.9%; + --muted-foreground: 240 3.8% 46.1%; + + --popover: 0 0% 100%; + --popover-foreground: 240 10% 3.9%; + + --card: 0 0% 100%; + --card-foreground: 240 10% 3.9%; + + --border: 240 5.9% 90%; + --input: 240 5.9% 90%; + + --primary: 240 5.9% 10%; + --primary-foreground: 0 0% 98%; + + --secondary: 240 4.8% 95.9%; + --secondary-foreground: 240 5.9% 10%; + + --accent: 240 4.8% 95.9%; + --accent-foreground: 240 5.9% 10%; + + --destructive: 0 84.2% 60.2%; + --destructive-foreground: 0 0% 98%; + + --ring: 240 10% 3.9%; + + --radius: 0.5rem; + } + + .dark { + --background: 240 10% 3.9%; + --foreground: 0 0% 98%; + + --muted: 240 3.7% 15.9%; + --muted-foreground: 240 5% 64.9%; + + --popover: 240 10% 3.9%; + --popover-foreground: 0 0% 98%; + + --card: 240 10% 3.9%; + --card-foreground: 0 0% 98%; + + --border: 240 3.7% 15.9%; + --input: 240 3.7% 15.9%; + + --primary: 0 0% 98%; + --primary-foreground: 240 5.9% 10%; + + --secondary: 240 3.7% 15.9%; + --secondary-foreground: 0 0% 98%; + + --accent: 240 3.7% 15.9%; + --accent-foreground: 0 0% 98%; + + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 0 0% 98%; + + --ring: 240 4.9% 83.9%; + } +} + +@layer base { + * { + @apply border-border; + } + body { + @apply bg-background text-foreground; + } +} \ No newline at end of file diff --git a/web/src/components/HelloWorld.vue b/web/src/components/HelloWorld.vue deleted file mode 100644 index 5230910..0000000 --- a/web/src/components/HelloWorld.vue +++ /dev/null @@ -1,38 +0,0 @@ - - - - - diff --git a/web/src/components/NavBar.vue b/web/src/components/NavBar.vue new file mode 100644 index 0000000..a40ce26 --- /dev/null +++ b/web/src/components/NavBar.vue @@ -0,0 +1,19 @@ + + \ No newline at end of file diff --git a/web/src/components/ui/avatar/Avatar.vue b/web/src/components/ui/avatar/Avatar.vue new file mode 100644 index 0000000..5b7b9fb --- /dev/null +++ b/web/src/components/ui/avatar/Avatar.vue @@ -0,0 +1,21 @@ + + + diff --git a/web/src/components/ui/avatar/AvatarFallback.vue b/web/src/components/ui/avatar/AvatarFallback.vue new file mode 100644 index 0000000..a671a21 --- /dev/null +++ b/web/src/components/ui/avatar/AvatarFallback.vue @@ -0,0 +1,11 @@ + + + diff --git a/web/src/components/ui/avatar/AvatarImage.vue b/web/src/components/ui/avatar/AvatarImage.vue new file mode 100644 index 0000000..43499fa --- /dev/null +++ b/web/src/components/ui/avatar/AvatarImage.vue @@ -0,0 +1,9 @@ + + + diff --git a/web/src/components/ui/avatar/index.ts b/web/src/components/ui/avatar/index.ts new file mode 100644 index 0000000..c4af1a6 --- /dev/null +++ b/web/src/components/ui/avatar/index.ts @@ -0,0 +1,24 @@ +import { type VariantProps, cva } from 'class-variance-authority' + +export { default as Avatar } from './Avatar.vue' +export { default as AvatarImage } from './AvatarImage.vue' +export { default as AvatarFallback } from './AvatarFallback.vue' + +export const avatarVariant = cva( + 'inline-flex items-center justify-center font-normal text-foreground select-none shrink-0 bg-secondary overflow-hidden', + { + variants: { + size: { + sm: 'h-10 w-10 text-xs', + base: 'h-16 w-16 text-2xl', + lg: 'h-32 w-32 text-5xl', + }, + shape: { + circle: 'rounded-full', + square: 'rounded-md', + }, + }, + }, +) + +export type AvatarVariants = VariantProps diff --git a/web/src/components/ui/button/Button.vue b/web/src/components/ui/button/Button.vue new file mode 100644 index 0000000..5cfd668 --- /dev/null +++ b/web/src/components/ui/button/Button.vue @@ -0,0 +1,26 @@ + + + diff --git a/web/src/components/ui/button/index.ts b/web/src/components/ui/button/index.ts new file mode 100644 index 0000000..1b00c32 --- /dev/null +++ b/web/src/components/ui/button/index.ts @@ -0,0 +1,35 @@ +import { type VariantProps, cva } from 'class-variance-authority' + +export { default as Button } from './Button.vue' + +export const buttonVariants = cva( + 'inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50', + { + variants: { + variant: { + default: 'bg-primary text-primary-foreground hover:bg-primary/90', + destructive: + 'bg-destructive text-destructive-foreground hover:bg-destructive/90', + outline: + 'border border-input bg-background hover:bg-accent hover:text-accent-foreground', + secondary: + 'bg-secondary text-secondary-foreground hover:bg-secondary/80', + ghost: 'hover:bg-accent hover:text-accent-foreground', + link: 'text-primary underline-offset-4 hover:underline', + }, + size: { + default: 'h-10 px-4 py-2', + xs: 'h-7 rounded px-2', + sm: 'h-9 rounded-md px-3', + lg: 'h-11 rounded-md px-8', + icon: 'h-10 w-10', + }, + }, + defaultVariants: { + variant: 'default', + size: 'default', + }, + }, +) + +export type ButtonVariants = VariantProps diff --git a/web/src/components/ui/card/Card.vue b/web/src/components/ui/card/Card.vue new file mode 100644 index 0000000..12dd5ec --- /dev/null +++ b/web/src/components/ui/card/Card.vue @@ -0,0 +1,21 @@ + + + diff --git a/web/src/components/ui/card/CardContent.vue b/web/src/components/ui/card/CardContent.vue new file mode 100644 index 0000000..785913a --- /dev/null +++ b/web/src/components/ui/card/CardContent.vue @@ -0,0 +1,14 @@ + + + diff --git a/web/src/components/ui/card/CardDescription.vue b/web/src/components/ui/card/CardDescription.vue new file mode 100644 index 0000000..d5faedd --- /dev/null +++ b/web/src/components/ui/card/CardDescription.vue @@ -0,0 +1,14 @@ + + + diff --git a/web/src/components/ui/card/CardFooter.vue b/web/src/components/ui/card/CardFooter.vue new file mode 100644 index 0000000..1ed2efe --- /dev/null +++ b/web/src/components/ui/card/CardFooter.vue @@ -0,0 +1,14 @@ + + + diff --git a/web/src/components/ui/card/CardHeader.vue b/web/src/components/ui/card/CardHeader.vue new file mode 100644 index 0000000..951d227 --- /dev/null +++ b/web/src/components/ui/card/CardHeader.vue @@ -0,0 +1,14 @@ + + + diff --git a/web/src/components/ui/card/CardTitle.vue b/web/src/components/ui/card/CardTitle.vue new file mode 100644 index 0000000..842e168 --- /dev/null +++ b/web/src/components/ui/card/CardTitle.vue @@ -0,0 +1,18 @@ + + + diff --git a/web/src/components/ui/card/index.ts b/web/src/components/ui/card/index.ts new file mode 100644 index 0000000..8170483 --- /dev/null +++ b/web/src/components/ui/card/index.ts @@ -0,0 +1,6 @@ +export { default as Card } from './Card.vue' +export { default as CardHeader } from './CardHeader.vue' +export { default as CardTitle } from './CardTitle.vue' +export { default as CardDescription } from './CardDescription.vue' +export { default as CardContent } from './CardContent.vue' +export { default as CardFooter } from './CardFooter.vue' diff --git a/web/src/components/ui/chart-bar/BarChart.vue b/web/src/components/ui/chart-bar/BarChart.vue new file mode 100644 index 0000000..bfaa601 --- /dev/null +++ b/web/src/components/ui/chart-bar/BarChart.vue @@ -0,0 +1,115 @@ + + + diff --git a/web/src/components/ui/chart-bar/index.ts b/web/src/components/ui/chart-bar/index.ts new file mode 100644 index 0000000..e3107a4 --- /dev/null +++ b/web/src/components/ui/chart-bar/index.ts @@ -0,0 +1,66 @@ +export { default as BarChart } from './BarChart.vue' + +import type { Spacing } from '@unovis/ts' + +type KeyOf> = Extract + +export interface BaseChartProps> { + /** + * The source data, in which each entry is a dictionary. + */ + data: T[] + /** + * Select the categories from your data. Used to populate the legend and toolip. + */ + categories: KeyOf[] + /** + * Sets the key to map the data to the axis. + */ + index: KeyOf + /** + * Change the default colors. + */ + colors?: string[] + /** + * Margin of each the container + */ + margin?: Spacing + /** + * Change the opacity of the non-selected field + * @default 0.2 + */ + filterOpacity?: number + /** + * Function to format X label + */ + xFormatter?: (tick: number | Date, i: number, ticks: number[] | Date[]) => string + /** + * Function to format Y label + */ + yFormatter?: (tick: number | Date, i: number, ticks: number[] | Date[]) => string + /** + * Controls the visibility of the X axis. + * @default true + */ + showXAxis?: boolean + /** + * Controls the visibility of the Y axis. + * @default true + */ + showYAxis?: boolean + /** + * Controls the visibility of tooltip. + * @default true + */ + showTooltip?: boolean + /** + * Controls the visibility of legend. + * @default true + */ + showLegend?: boolean + /** + * Controls the visibility of gridline. + * @default true + */ + showGridLine?: boolean +} diff --git a/web/src/components/ui/chart/ChartCrosshair.vue b/web/src/components/ui/chart/ChartCrosshair.vue new file mode 100644 index 0000000..4c47149 --- /dev/null +++ b/web/src/components/ui/chart/ChartCrosshair.vue @@ -0,0 +1,44 @@ + + + diff --git a/web/src/components/ui/chart/ChartLegend.vue b/web/src/components/ui/chart/ChartLegend.vue new file mode 100644 index 0000000..e77b644 --- /dev/null +++ b/web/src/components/ui/chart/ChartLegend.vue @@ -0,0 +1,50 @@ + + + diff --git a/web/src/components/ui/chart/ChartSingleTooltip.vue b/web/src/components/ui/chart/ChartSingleTooltip.vue new file mode 100644 index 0000000..49ca011 --- /dev/null +++ b/web/src/components/ui/chart/ChartSingleTooltip.vue @@ -0,0 +1,63 @@ + + + diff --git a/web/src/components/ui/chart/ChartTooltip.vue b/web/src/components/ui/chart/ChartTooltip.vue new file mode 100644 index 0000000..a20c80c --- /dev/null +++ b/web/src/components/ui/chart/ChartTooltip.vue @@ -0,0 +1,40 @@ + + + diff --git a/web/src/components/ui/chart/index.ts b/web/src/components/ui/chart/index.ts new file mode 100644 index 0000000..e2d64c1 --- /dev/null +++ b/web/src/components/ui/chart/index.ts @@ -0,0 +1,18 @@ +export { default as ChartTooltip } from './ChartTooltip.vue' +export { default as ChartSingleTooltip } from './ChartSingleTooltip.vue' +export { default as ChartLegend } from './ChartLegend.vue' +export { default as ChartCrosshair } from './ChartCrosshair.vue' + +export function defaultColors(count: number = 3) { + const quotient = Math.floor(count / 2) + const remainder = count % 2 + + const primaryCount = quotient + remainder + const secondaryCount = quotient + return [ + ...Array.from(Array(primaryCount).keys()).map(i => `hsl(var(--vis-primary-color) / ${1 - (1 / primaryCount) * i})`), + ...Array.from(Array(secondaryCount).keys()).map(i => `hsl(var(--vis-secondary-color) / ${1 - (1 / secondaryCount) * i})`), + ] +} + +export * from './interface' diff --git a/web/src/components/ui/chart/interface.ts b/web/src/components/ui/chart/interface.ts new file mode 100644 index 0000000..c3838af --- /dev/null +++ b/web/src/components/ui/chart/interface.ts @@ -0,0 +1,64 @@ +import type { Spacing } from '@unovis/ts' + +type KeyOf> = Extract + +export interface BaseChartProps> { + /** + * The source data, in which each entry is a dictionary. + */ + data: T[] + /** + * Select the categories from your data. Used to populate the legend and toolip. + */ + categories: KeyOf[] + /** + * Sets the key to map the data to the axis. + */ + index: KeyOf + /** + * Change the default colors. + */ + colors?: string[] + /** + * Margin of each the container + */ + margin?: Spacing + /** + * Change the opacity of the non-selected field + * @default 0.2 + */ + filterOpacity?: number + /** + * Function to format X label + */ + xFormatter?: (tick: number | Date, i: number, ticks: number[] | Date[]) => string + /** + * Function to format Y label + */ + yFormatter?: (tick: number | Date, i: number, ticks: number[] | Date[]) => string + /** + * Controls the visibility of the X axis. + * @default true + */ + showXAxis?: boolean + /** + * Controls the visibility of the Y axis. + * @default true + */ + showYAxis?: boolean + /** + * Controls the visibility of tooltip. + * @default true + */ + showTooltip?: boolean + /** + * Controls the visibility of legend. + * @default true + */ + showLegend?: boolean + /** + * Controls the visibility of gridline. + * @default true + */ + showGridLine?: boolean +} diff --git a/web/src/components/ui/command/Command.vue b/web/src/components/ui/command/Command.vue new file mode 100644 index 0000000..fe7445c --- /dev/null +++ b/web/src/components/ui/command/Command.vue @@ -0,0 +1,30 @@ + + + diff --git a/web/src/components/ui/command/CommandDialog.vue b/web/src/components/ui/command/CommandDialog.vue new file mode 100644 index 0000000..53f520b --- /dev/null +++ b/web/src/components/ui/command/CommandDialog.vue @@ -0,0 +1,21 @@ + + + diff --git a/web/src/components/ui/command/CommandEmpty.vue b/web/src/components/ui/command/CommandEmpty.vue new file mode 100644 index 0000000..1295d2a --- /dev/null +++ b/web/src/components/ui/command/CommandEmpty.vue @@ -0,0 +1,20 @@ + + + diff --git a/web/src/components/ui/command/CommandGroup.vue b/web/src/components/ui/command/CommandGroup.vue new file mode 100644 index 0000000..ba6433e --- /dev/null +++ b/web/src/components/ui/command/CommandGroup.vue @@ -0,0 +1,29 @@ + + + diff --git a/web/src/components/ui/command/CommandInput.vue b/web/src/components/ui/command/CommandInput.vue new file mode 100644 index 0000000..6692373 --- /dev/null +++ b/web/src/components/ui/command/CommandInput.vue @@ -0,0 +1,33 @@ + + + diff --git a/web/src/components/ui/command/CommandItem.vue b/web/src/components/ui/command/CommandItem.vue new file mode 100644 index 0000000..5c6a6ff --- /dev/null +++ b/web/src/components/ui/command/CommandItem.vue @@ -0,0 +1,26 @@ + + + diff --git a/web/src/components/ui/command/CommandList.vue b/web/src/components/ui/command/CommandList.vue new file mode 100644 index 0000000..00d1b3a --- /dev/null +++ b/web/src/components/ui/command/CommandList.vue @@ -0,0 +1,27 @@ + + + diff --git a/web/src/components/ui/command/CommandSeparator.vue b/web/src/components/ui/command/CommandSeparator.vue new file mode 100644 index 0000000..477799c --- /dev/null +++ b/web/src/components/ui/command/CommandSeparator.vue @@ -0,0 +1,23 @@ + + + diff --git a/web/src/components/ui/command/CommandShortcut.vue b/web/src/components/ui/command/CommandShortcut.vue new file mode 100644 index 0000000..0d4da92 --- /dev/null +++ b/web/src/components/ui/command/CommandShortcut.vue @@ -0,0 +1,14 @@ + + + diff --git a/web/src/components/ui/command/index.ts b/web/src/components/ui/command/index.ts new file mode 100644 index 0000000..0e35f4b --- /dev/null +++ b/web/src/components/ui/command/index.ts @@ -0,0 +1,9 @@ +export { default as Command } from './Command.vue' +export { default as CommandDialog } from './CommandDialog.vue' +export { default as CommandEmpty } from './CommandEmpty.vue' +export { default as CommandGroup } from './CommandGroup.vue' +export { default as CommandInput } from './CommandInput.vue' +export { default as CommandItem } from './CommandItem.vue' +export { default as CommandList } from './CommandList.vue' +export { default as CommandSeparator } from './CommandSeparator.vue' +export { default as CommandShortcut } from './CommandShortcut.vue' diff --git a/web/src/components/ui/dialog/Dialog.vue b/web/src/components/ui/dialog/Dialog.vue new file mode 100644 index 0000000..a04c026 --- /dev/null +++ b/web/src/components/ui/dialog/Dialog.vue @@ -0,0 +1,14 @@ + + + diff --git a/web/src/components/ui/dialog/DialogClose.vue b/web/src/components/ui/dialog/DialogClose.vue new file mode 100644 index 0000000..a64703e --- /dev/null +++ b/web/src/components/ui/dialog/DialogClose.vue @@ -0,0 +1,11 @@ + + + diff --git a/web/src/components/ui/dialog/DialogContent.vue b/web/src/components/ui/dialog/DialogContent.vue new file mode 100644 index 0000000..7b3aeab --- /dev/null +++ b/web/src/components/ui/dialog/DialogContent.vue @@ -0,0 +1,50 @@ + + + diff --git a/web/src/components/ui/dialog/DialogDescription.vue b/web/src/components/ui/dialog/DialogDescription.vue new file mode 100644 index 0000000..3637b7e --- /dev/null +++ b/web/src/components/ui/dialog/DialogDescription.vue @@ -0,0 +1,24 @@ + + + diff --git a/web/src/components/ui/dialog/DialogFooter.vue b/web/src/components/ui/dialog/DialogFooter.vue new file mode 100644 index 0000000..ac2d0c1 --- /dev/null +++ b/web/src/components/ui/dialog/DialogFooter.vue @@ -0,0 +1,19 @@ + + + diff --git a/web/src/components/ui/dialog/DialogHeader.vue b/web/src/components/ui/dialog/DialogHeader.vue new file mode 100644 index 0000000..b2c9085 --- /dev/null +++ b/web/src/components/ui/dialog/DialogHeader.vue @@ -0,0 +1,16 @@ + + + diff --git a/web/src/components/ui/dialog/DialogScrollContent.vue b/web/src/components/ui/dialog/DialogScrollContent.vue new file mode 100644 index 0000000..cd9ba0d --- /dev/null +++ b/web/src/components/ui/dialog/DialogScrollContent.vue @@ -0,0 +1,59 @@ + + + diff --git a/web/src/components/ui/dialog/DialogTitle.vue b/web/src/components/ui/dialog/DialogTitle.vue new file mode 100644 index 0000000..1bb4046 --- /dev/null +++ b/web/src/components/ui/dialog/DialogTitle.vue @@ -0,0 +1,29 @@ + + + diff --git a/web/src/components/ui/dialog/DialogTrigger.vue b/web/src/components/ui/dialog/DialogTrigger.vue new file mode 100644 index 0000000..ee0c12f --- /dev/null +++ b/web/src/components/ui/dialog/DialogTrigger.vue @@ -0,0 +1,11 @@ + + + diff --git a/web/src/components/ui/dialog/index.ts b/web/src/components/ui/dialog/index.ts new file mode 100644 index 0000000..847e999 --- /dev/null +++ b/web/src/components/ui/dialog/index.ts @@ -0,0 +1,9 @@ +export { default as Dialog } from './Dialog.vue' +export { default as DialogClose } from './DialogClose.vue' +export { default as DialogTrigger } from './DialogTrigger.vue' +export { default as DialogHeader } from './DialogHeader.vue' +export { default as DialogTitle } from './DialogTitle.vue' +export { default as DialogDescription } from './DialogDescription.vue' +export { default as DialogContent } from './DialogContent.vue' +export { default as DialogScrollContent } from './DialogScrollContent.vue' +export { default as DialogFooter } from './DialogFooter.vue' diff --git a/web/src/components/ui/dropdown-menu/DropdownMenu.vue b/web/src/components/ui/dropdown-menu/DropdownMenu.vue new file mode 100644 index 0000000..b83d90b --- /dev/null +++ b/web/src/components/ui/dropdown-menu/DropdownMenu.vue @@ -0,0 +1,14 @@ + + + diff --git a/web/src/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue b/web/src/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue new file mode 100644 index 0000000..cd21fde --- /dev/null +++ b/web/src/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue @@ -0,0 +1,40 @@ + + + diff --git a/web/src/components/ui/dropdown-menu/DropdownMenuContent.vue b/web/src/components/ui/dropdown-menu/DropdownMenuContent.vue new file mode 100644 index 0000000..b33d58e --- /dev/null +++ b/web/src/components/ui/dropdown-menu/DropdownMenuContent.vue @@ -0,0 +1,38 @@ + + + diff --git a/web/src/components/ui/dropdown-menu/DropdownMenuGroup.vue b/web/src/components/ui/dropdown-menu/DropdownMenuGroup.vue new file mode 100644 index 0000000..3f20135 --- /dev/null +++ b/web/src/components/ui/dropdown-menu/DropdownMenuGroup.vue @@ -0,0 +1,11 @@ + + + diff --git a/web/src/components/ui/dropdown-menu/DropdownMenuItem.vue b/web/src/components/ui/dropdown-menu/DropdownMenuItem.vue new file mode 100644 index 0000000..04d3d60 --- /dev/null +++ b/web/src/components/ui/dropdown-menu/DropdownMenuItem.vue @@ -0,0 +1,28 @@ + + + diff --git a/web/src/components/ui/dropdown-menu/DropdownMenuLabel.vue b/web/src/components/ui/dropdown-menu/DropdownMenuLabel.vue new file mode 100644 index 0000000..5fa684e --- /dev/null +++ b/web/src/components/ui/dropdown-menu/DropdownMenuLabel.vue @@ -0,0 +1,24 @@ + + + diff --git a/web/src/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue b/web/src/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue new file mode 100644 index 0000000..4a72790 --- /dev/null +++ b/web/src/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue @@ -0,0 +1,19 @@ + + + diff --git a/web/src/components/ui/dropdown-menu/DropdownMenuRadioItem.vue b/web/src/components/ui/dropdown-menu/DropdownMenuRadioItem.vue new file mode 100644 index 0000000..c8b9029 --- /dev/null +++ b/web/src/components/ui/dropdown-menu/DropdownMenuRadioItem.vue @@ -0,0 +1,41 @@ + + + diff --git a/web/src/components/ui/dropdown-menu/DropdownMenuSeparator.vue b/web/src/components/ui/dropdown-menu/DropdownMenuSeparator.vue new file mode 100644 index 0000000..fc51205 --- /dev/null +++ b/web/src/components/ui/dropdown-menu/DropdownMenuSeparator.vue @@ -0,0 +1,22 @@ + + + diff --git a/web/src/components/ui/dropdown-menu/DropdownMenuShortcut.vue b/web/src/components/ui/dropdown-menu/DropdownMenuShortcut.vue new file mode 100644 index 0000000..abaeda6 --- /dev/null +++ b/web/src/components/ui/dropdown-menu/DropdownMenuShortcut.vue @@ -0,0 +1,14 @@ + + + diff --git a/web/src/components/ui/dropdown-menu/DropdownMenuSub.vue b/web/src/components/ui/dropdown-menu/DropdownMenuSub.vue new file mode 100644 index 0000000..e0f4bd7 --- /dev/null +++ b/web/src/components/ui/dropdown-menu/DropdownMenuSub.vue @@ -0,0 +1,19 @@ + + + diff --git a/web/src/components/ui/dropdown-menu/DropdownMenuSubContent.vue b/web/src/components/ui/dropdown-menu/DropdownMenuSubContent.vue new file mode 100644 index 0000000..446f9fb --- /dev/null +++ b/web/src/components/ui/dropdown-menu/DropdownMenuSubContent.vue @@ -0,0 +1,30 @@ + + + diff --git a/web/src/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue b/web/src/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue new file mode 100644 index 0000000..3474553 --- /dev/null +++ b/web/src/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue @@ -0,0 +1,33 @@ + + + diff --git a/web/src/components/ui/dropdown-menu/DropdownMenuTrigger.vue b/web/src/components/ui/dropdown-menu/DropdownMenuTrigger.vue new file mode 100644 index 0000000..8efd5a9 --- /dev/null +++ b/web/src/components/ui/dropdown-menu/DropdownMenuTrigger.vue @@ -0,0 +1,13 @@ + + + diff --git a/web/src/components/ui/dropdown-menu/index.ts b/web/src/components/ui/dropdown-menu/index.ts new file mode 100644 index 0000000..6f9446c --- /dev/null +++ b/web/src/components/ui/dropdown-menu/index.ts @@ -0,0 +1,16 @@ +export { DropdownMenuPortal } from 'radix-vue' + +export { default as DropdownMenu } from './DropdownMenu.vue' +export { default as DropdownMenuTrigger } from './DropdownMenuTrigger.vue' +export { default as DropdownMenuContent } from './DropdownMenuContent.vue' +export { default as DropdownMenuGroup } from './DropdownMenuGroup.vue' +export { default as DropdownMenuRadioGroup } from './DropdownMenuRadioGroup.vue' +export { default as DropdownMenuItem } from './DropdownMenuItem.vue' +export { default as DropdownMenuCheckboxItem } from './DropdownMenuCheckboxItem.vue' +export { default as DropdownMenuRadioItem } from './DropdownMenuRadioItem.vue' +export { default as DropdownMenuShortcut } from './DropdownMenuShortcut.vue' +export { default as DropdownMenuSeparator } from './DropdownMenuSeparator.vue' +export { default as DropdownMenuLabel } from './DropdownMenuLabel.vue' +export { default as DropdownMenuSub } from './DropdownMenuSub.vue' +export { default as DropdownMenuSubTrigger } from './DropdownMenuSubTrigger.vue' +export { default as DropdownMenuSubContent } from './DropdownMenuSubContent.vue' diff --git a/web/src/components/ui/input/Input.vue b/web/src/components/ui/input/Input.vue new file mode 100644 index 0000000..39c9cee --- /dev/null +++ b/web/src/components/ui/input/Input.vue @@ -0,0 +1,24 @@ + + + diff --git a/web/src/components/ui/input/index.ts b/web/src/components/ui/input/index.ts new file mode 100644 index 0000000..a691dd6 --- /dev/null +++ b/web/src/components/ui/input/index.ts @@ -0,0 +1 @@ +export { default as Input } from './Input.vue' diff --git a/web/src/components/ui/label/Label.vue b/web/src/components/ui/label/Label.vue new file mode 100644 index 0000000..8fba8db --- /dev/null +++ b/web/src/components/ui/label/Label.vue @@ -0,0 +1,27 @@ + + + diff --git a/web/src/components/ui/label/index.ts b/web/src/components/ui/label/index.ts new file mode 100644 index 0000000..572c2f0 --- /dev/null +++ b/web/src/components/ui/label/index.ts @@ -0,0 +1 @@ +export { default as Label } from './Label.vue' diff --git a/web/src/components/ui/popover/Popover.vue b/web/src/components/ui/popover/Popover.vue new file mode 100644 index 0000000..1a5873a --- /dev/null +++ b/web/src/components/ui/popover/Popover.vue @@ -0,0 +1,15 @@ + + + diff --git a/web/src/components/ui/popover/PopoverContent.vue b/web/src/components/ui/popover/PopoverContent.vue new file mode 100644 index 0000000..e691fe8 --- /dev/null +++ b/web/src/components/ui/popover/PopoverContent.vue @@ -0,0 +1,48 @@ + + + diff --git a/web/src/components/ui/popover/PopoverTrigger.vue b/web/src/components/ui/popover/PopoverTrigger.vue new file mode 100644 index 0000000..22f4772 --- /dev/null +++ b/web/src/components/ui/popover/PopoverTrigger.vue @@ -0,0 +1,11 @@ + + + diff --git a/web/src/components/ui/popover/index.ts b/web/src/components/ui/popover/index.ts new file mode 100644 index 0000000..495d55a --- /dev/null +++ b/web/src/components/ui/popover/index.ts @@ -0,0 +1,3 @@ +export { default as Popover } from './Popover.vue' +export { default as PopoverTrigger } from './PopoverTrigger.vue' +export { default as PopoverContent } from './PopoverContent.vue' diff --git a/web/src/components/ui/range-calendar/RangeCalendar.vue b/web/src/components/ui/range-calendar/RangeCalendar.vue new file mode 100644 index 0000000..3033f05 --- /dev/null +++ b/web/src/components/ui/range-calendar/RangeCalendar.vue @@ -0,0 +1,60 @@ + + + diff --git a/web/src/components/ui/range-calendar/RangeCalendarCell.vue b/web/src/components/ui/range-calendar/RangeCalendarCell.vue new file mode 100644 index 0000000..bc8e415 --- /dev/null +++ b/web/src/components/ui/range-calendar/RangeCalendarCell.vue @@ -0,0 +1,24 @@ + + + diff --git a/web/src/components/ui/range-calendar/RangeCalendarCellTrigger.vue b/web/src/components/ui/range-calendar/RangeCalendarCellTrigger.vue new file mode 100644 index 0000000..c2f817a --- /dev/null +++ b/web/src/components/ui/range-calendar/RangeCalendarCellTrigger.vue @@ -0,0 +1,40 @@ + + + diff --git a/web/src/components/ui/range-calendar/RangeCalendarGrid.vue b/web/src/components/ui/range-calendar/RangeCalendarGrid.vue new file mode 100644 index 0000000..e346b07 --- /dev/null +++ b/web/src/components/ui/range-calendar/RangeCalendarGrid.vue @@ -0,0 +1,24 @@ + + + diff --git a/web/src/components/ui/range-calendar/RangeCalendarGridBody.vue b/web/src/components/ui/range-calendar/RangeCalendarGridBody.vue new file mode 100644 index 0000000..cae15cc --- /dev/null +++ b/web/src/components/ui/range-calendar/RangeCalendarGridBody.vue @@ -0,0 +1,11 @@ + + + diff --git a/web/src/components/ui/range-calendar/RangeCalendarGridHead.vue b/web/src/components/ui/range-calendar/RangeCalendarGridHead.vue new file mode 100644 index 0000000..c11ad36 --- /dev/null +++ b/web/src/components/ui/range-calendar/RangeCalendarGridHead.vue @@ -0,0 +1,11 @@ + + + diff --git a/web/src/components/ui/range-calendar/RangeCalendarGridRow.vue b/web/src/components/ui/range-calendar/RangeCalendarGridRow.vue new file mode 100644 index 0000000..425ed58 --- /dev/null +++ b/web/src/components/ui/range-calendar/RangeCalendarGridRow.vue @@ -0,0 +1,21 @@ + + + diff --git a/web/src/components/ui/range-calendar/RangeCalendarHeadCell.vue b/web/src/components/ui/range-calendar/RangeCalendarHeadCell.vue new file mode 100644 index 0000000..26ea928 --- /dev/null +++ b/web/src/components/ui/range-calendar/RangeCalendarHeadCell.vue @@ -0,0 +1,21 @@ + + + diff --git a/web/src/components/ui/range-calendar/RangeCalendarHeader.vue b/web/src/components/ui/range-calendar/RangeCalendarHeader.vue new file mode 100644 index 0000000..7d98caf --- /dev/null +++ b/web/src/components/ui/range-calendar/RangeCalendarHeader.vue @@ -0,0 +1,21 @@ + + + diff --git a/web/src/components/ui/range-calendar/RangeCalendarHeading.vue b/web/src/components/ui/range-calendar/RangeCalendarHeading.vue new file mode 100644 index 0000000..51ee1f8 --- /dev/null +++ b/web/src/components/ui/range-calendar/RangeCalendarHeading.vue @@ -0,0 +1,27 @@ + + + diff --git a/web/src/components/ui/range-calendar/RangeCalendarNextButton.vue b/web/src/components/ui/range-calendar/RangeCalendarNextButton.vue new file mode 100644 index 0000000..a69fa9b --- /dev/null +++ b/web/src/components/ui/range-calendar/RangeCalendarNextButton.vue @@ -0,0 +1,32 @@ + + + diff --git a/web/src/components/ui/range-calendar/RangeCalendarPrevButton.vue b/web/src/components/ui/range-calendar/RangeCalendarPrevButton.vue new file mode 100644 index 0000000..6e46c6a --- /dev/null +++ b/web/src/components/ui/range-calendar/RangeCalendarPrevButton.vue @@ -0,0 +1,32 @@ + + + diff --git a/web/src/components/ui/range-calendar/index.ts b/web/src/components/ui/range-calendar/index.ts new file mode 100644 index 0000000..7ba1637 --- /dev/null +++ b/web/src/components/ui/range-calendar/index.ts @@ -0,0 +1,12 @@ +export { default as RangeCalendar } from './RangeCalendar.vue' +export { default as RangeCalendarCell } from './RangeCalendarCell.vue' +export { default as RangeCalendarCellTrigger } from './RangeCalendarCellTrigger.vue' +export { default as RangeCalendarGrid } from './RangeCalendarGrid.vue' +export { default as RangeCalendarGridBody } from './RangeCalendarGridBody.vue' +export { default as RangeCalendarGridHead } from './RangeCalendarGridHead.vue' +export { default as RangeCalendarGridRow } from './RangeCalendarGridRow.vue' +export { default as RangeCalendarHeadCell } from './RangeCalendarHeadCell.vue' +export { default as RangeCalendarHeader } from './RangeCalendarHeader.vue' +export { default as RangeCalendarHeading } from './RangeCalendarHeading.vue' +export { default as RangeCalendarNextButton } from './RangeCalendarNextButton.vue' +export { default as RangeCalendarPrevButton } from './RangeCalendarPrevButton.vue' diff --git a/web/src/components/ui/select/Select.vue b/web/src/components/ui/select/Select.vue new file mode 100644 index 0000000..adc42fd --- /dev/null +++ b/web/src/components/ui/select/Select.vue @@ -0,0 +1,15 @@ + + + diff --git a/web/src/components/ui/select/SelectContent.vue b/web/src/components/ui/select/SelectContent.vue new file mode 100644 index 0000000..4fe234b --- /dev/null +++ b/web/src/components/ui/select/SelectContent.vue @@ -0,0 +1,53 @@ + + + diff --git a/web/src/components/ui/select/SelectGroup.vue b/web/src/components/ui/select/SelectGroup.vue new file mode 100644 index 0000000..407d8ad --- /dev/null +++ b/web/src/components/ui/select/SelectGroup.vue @@ -0,0 +1,19 @@ + + + diff --git a/web/src/components/ui/select/SelectItem.vue b/web/src/components/ui/select/SelectItem.vue new file mode 100644 index 0000000..b102a81 --- /dev/null +++ b/web/src/components/ui/select/SelectItem.vue @@ -0,0 +1,44 @@ + + + diff --git a/web/src/components/ui/select/SelectItemText.vue b/web/src/components/ui/select/SelectItemText.vue new file mode 100644 index 0000000..a0bb5c2 --- /dev/null +++ b/web/src/components/ui/select/SelectItemText.vue @@ -0,0 +1,11 @@ + + + diff --git a/web/src/components/ui/select/SelectLabel.vue b/web/src/components/ui/select/SelectLabel.vue new file mode 100644 index 0000000..3d45cdb --- /dev/null +++ b/web/src/components/ui/select/SelectLabel.vue @@ -0,0 +1,13 @@ + + + diff --git a/web/src/components/ui/select/SelectScrollDownButton.vue b/web/src/components/ui/select/SelectScrollDownButton.vue new file mode 100644 index 0000000..54b6c6a --- /dev/null +++ b/web/src/components/ui/select/SelectScrollDownButton.vue @@ -0,0 +1,24 @@ + + + diff --git a/web/src/components/ui/select/SelectScrollUpButton.vue b/web/src/components/ui/select/SelectScrollUpButton.vue new file mode 100644 index 0000000..5535f1c --- /dev/null +++ b/web/src/components/ui/select/SelectScrollUpButton.vue @@ -0,0 +1,24 @@ + + + diff --git a/web/src/components/ui/select/SelectSeparator.vue b/web/src/components/ui/select/SelectSeparator.vue new file mode 100644 index 0000000..5ae593d --- /dev/null +++ b/web/src/components/ui/select/SelectSeparator.vue @@ -0,0 +1,17 @@ + + + diff --git a/web/src/components/ui/select/SelectTrigger.vue b/web/src/components/ui/select/SelectTrigger.vue new file mode 100644 index 0000000..cfac8eb --- /dev/null +++ b/web/src/components/ui/select/SelectTrigger.vue @@ -0,0 +1,31 @@ + + + diff --git a/web/src/components/ui/select/SelectValue.vue b/web/src/components/ui/select/SelectValue.vue new file mode 100644 index 0000000..4bc37dd --- /dev/null +++ b/web/src/components/ui/select/SelectValue.vue @@ -0,0 +1,11 @@ + + + diff --git a/web/src/components/ui/select/index.ts b/web/src/components/ui/select/index.ts new file mode 100644 index 0000000..b1d89ee --- /dev/null +++ b/web/src/components/ui/select/index.ts @@ -0,0 +1,11 @@ +export { default as Select } from './Select.vue' +export { default as SelectValue } from './SelectValue.vue' +export { default as SelectTrigger } from './SelectTrigger.vue' +export { default as SelectContent } from './SelectContent.vue' +export { default as SelectGroup } from './SelectGroup.vue' +export { default as SelectItem } from './SelectItem.vue' +export { default as SelectItemText } from './SelectItemText.vue' +export { default as SelectLabel } from './SelectLabel.vue' +export { default as SelectSeparator } from './SelectSeparator.vue' +export { default as SelectScrollUpButton } from './SelectScrollUpButton.vue' +export { default as SelectScrollDownButton } from './SelectScrollDownButton.vue' diff --git a/web/src/components/ui/tabs/Tabs.vue b/web/src/components/ui/tabs/Tabs.vue new file mode 100644 index 0000000..2fa0971 --- /dev/null +++ b/web/src/components/ui/tabs/Tabs.vue @@ -0,0 +1,15 @@ + + + diff --git a/web/src/components/ui/tabs/TabsContent.vue b/web/src/components/ui/tabs/TabsContent.vue new file mode 100644 index 0000000..c0aa0f3 --- /dev/null +++ b/web/src/components/ui/tabs/TabsContent.vue @@ -0,0 +1,22 @@ + + + diff --git a/web/src/components/ui/tabs/TabsList.vue b/web/src/components/ui/tabs/TabsList.vue new file mode 100644 index 0000000..9644cdc --- /dev/null +++ b/web/src/components/ui/tabs/TabsList.vue @@ -0,0 +1,25 @@ + + + diff --git a/web/src/components/ui/tabs/TabsTrigger.vue b/web/src/components/ui/tabs/TabsTrigger.vue new file mode 100644 index 0000000..5fa6748 --- /dev/null +++ b/web/src/components/ui/tabs/TabsTrigger.vue @@ -0,0 +1,27 @@ + + + diff --git a/web/src/components/ui/tabs/index.ts b/web/src/components/ui/tabs/index.ts new file mode 100644 index 0000000..fbea0c6 --- /dev/null +++ b/web/src/components/ui/tabs/index.ts @@ -0,0 +1,4 @@ +export { default as Tabs } from './Tabs.vue' +export { default as TabsTrigger } from './TabsTrigger.vue' +export { default as TabsList } from './TabsList.vue' +export { default as TabsContent } from './TabsContent.vue' diff --git a/web/src/components/util/ColorMode.vue b/web/src/components/util/ColorMode.vue new file mode 100644 index 0000000..a8bb469 --- /dev/null +++ b/web/src/components/util/ColorMode.vue @@ -0,0 +1,33 @@ + + + \ No newline at end of file diff --git a/web/src/entry-client.ts b/web/src/entry-client.ts index 4a4c936..0f15acf 100644 --- a/web/src/entry-client.ts +++ b/web/src/entry-client.ts @@ -1,6 +1,7 @@ -import './style.css' +import './assets/index.css' import { createApp } from './main' + const { app } = createApp() app.mount('#app') diff --git a/web/src/lib/utils.ts b/web/src/lib/utils.ts new file mode 100644 index 0000000..d32b0fe --- /dev/null +++ b/web/src/lib/utils.ts @@ -0,0 +1,6 @@ +import { type ClassValue, clsx } from 'clsx' +import { twMerge } from 'tailwind-merge' + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)) +} diff --git a/web/src/main.ts b/web/src/main.ts index ff091f8..6d792d5 100644 --- a/web/src/main.ts +++ b/web/src/main.ts @@ -1,10 +1,13 @@ import { createSSRApp } from 'vue' -import App from './App.vue' +import App from './pages/Index.vue' +import { router } from './router' + // SSR requires a fresh app instance per request, therefore we export a function // that creates a fresh app instance. If using Vuex, we'd also be creating a // fresh store here. export function createApp() { - const app = createSSRApp(App) - return { app } + const app = createSSRApp(App) + app.use(router) + return { app } } diff --git a/web/src/pages/Index.vue b/web/src/pages/Index.vue new file mode 100644 index 0000000..d87ca1d --- /dev/null +++ b/web/src/pages/Index.vue @@ -0,0 +1,10 @@ + + + diff --git a/web/src/pages/UtilityDust.vue b/web/src/pages/UtilityDust.vue new file mode 100644 index 0000000..1b66995 --- /dev/null +++ b/web/src/pages/UtilityDust.vue @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/web/src/router.ts b/web/src/router.ts new file mode 100644 index 0000000..297bd6a --- /dev/null +++ b/web/src/router.ts @@ -0,0 +1,12 @@ +import { createMemoryHistory, createRouter } from 'vue-router' +import Index from '@/pages/Index.vue' + +const routes = [ + { path: '', component: Index }, + { path: '/utilitydust', component: () => import('@/pages/UtilityDust.vue') }, +] + +export const router = createRouter({ + history: createMemoryHistory(), + routes, +}) \ No newline at end of file diff --git a/web/src/style.css b/web/src/style.css deleted file mode 100644 index bb131d6..0000000 --- a/web/src/style.css +++ /dev/null @@ -1,79 +0,0 @@ -:root { - font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; - line-height: 1.5; - font-weight: 400; - - color-scheme: light dark; - color: rgba(255, 255, 255, 0.87); - background-color: #242424; - - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -a { - font-weight: 500; - color: #646cff; - text-decoration: inherit; -} -a:hover { - color: #535bf2; -} - -body { - margin: 0; - display: flex; - place-items: center; - min-width: 320px; - min-height: 100vh; -} - -h1 { - font-size: 3.2em; - line-height: 1.1; -} - -button { - border-radius: 8px; - border: 1px solid transparent; - padding: 0.6em 1.2em; - font-size: 1em; - font-weight: 500; - font-family: inherit; - background-color: #1a1a1a; - cursor: pointer; - transition: border-color 0.25s; -} -button:hover { - border-color: #646cff; -} -button:focus, -button:focus-visible { - outline: 4px auto -webkit-focus-ring-color; -} - -.card { - padding: 2em; -} - -#app { - max-width: 1280px; - margin: 0 auto; - padding: 2rem; - text-align: center; -} - -@media (prefers-color-scheme: light) { - :root { - color: #213547; - background-color: #ffffff; - } - a:hover { - color: #747bff; - } - button { - background-color: #f9f9f9; - } -} diff --git a/web/tailwind.config.ts b/web/tailwind.config.ts new file mode 100644 index 0000000..8d828cd --- /dev/null +++ b/web/tailwind.config.ts @@ -0,0 +1,100 @@ +const animate = require("tailwindcss-animate") + +/** @type {import('tailwindcss').Config} */ +module.exports = { + darkMode: ["class"], + safelist: ["dark"], + prefix: "", + + content: [ + './pages/**/*.{ts,tsx,vue}', + './components/**/*.{ts,tsx,vue}', + './app/**/*.{ts,tsx,vue}', + './src/**/*.{ts,tsx,vue}', + ], + + theme: { + container: { + center: true, + padding: "2rem", + screens: { + "2xl": "1400px", + }, + }, + extend: { + colors: { + border: "hsl(var(--border))", + input: "hsl(var(--input))", + ring: "hsl(var(--ring))", + background: "hsl(var(--background))", + foreground: "hsl(var(--foreground))", + primary: { + DEFAULT: "hsl(var(--primary))", + foreground: "hsl(var(--primary-foreground))", + }, + secondary: { + DEFAULT: "hsl(var(--secondary))", + foreground: "hsl(var(--secondary-foreground))", + }, + destructive: { + DEFAULT: "hsl(var(--destructive))", + foreground: "hsl(var(--destructive-foreground))", + }, + muted: { + DEFAULT: "hsl(var(--muted))", + foreground: "hsl(var(--muted-foreground))", + }, + accent: { + DEFAULT: "hsl(var(--accent))", + foreground: "hsl(var(--accent-foreground))", + }, + popover: { + DEFAULT: "hsl(var(--popover))", + foreground: "hsl(var(--popover-foreground))", + }, + card: { + DEFAULT: "hsl(var(--card))", + foreground: "hsl(var(--card-foreground))", + }, + }, + borderRadius: { + xl: "calc(var(--radius) + 4px)", + lg: "var(--radius)", + md: "calc(var(--radius) - 2px)", + sm: "calc(var(--radius) - 4px)", + }, + borderWidth: { + DEFAULT: "1px", + 0: "0", + 2: "2px", + 4: "4px", + 8: "8px", + }, + keyframes: { + "accordion-down": { + from: { height: 0 }, + to: { height: "var(--radix-accordion-content-height)" }, + }, + "accordion-up": { + from: { height: "var(--radix-accordion-content-height)" }, + to: { height: 0 }, + }, + "collapsible-down": { + from: { height: 0 }, + to: { height: 'var(--radix-collapsible-content-height)' }, + }, + "collapsible-up": { + from: { height: 'var(--radix-collapsible-content-height)' }, + to: { height: 0 }, + }, + }, + animation: { + "accordion-down": "accordion-down 0.2s ease-out", + "accordion-up": "accordion-up 0.2s ease-out", + "collapsible-down": "collapsible-down 0.2s ease-in-out", + "collapsible-up": "collapsible-up 0.2s ease-in-out", + }, + }, + }, + plugins: [animate], +} \ No newline at end of file diff --git a/web/tsconfig.json b/web/tsconfig.json index 0e68ad3..4dc95e8 100644 --- a/web/tsconfig.json +++ b/web/tsconfig.json @@ -1,25 +1,41 @@ { - "compilerOptions": { - "target": "ES2020", - "useDefineForClassFields": true, - "module": "ESNext", - "lib": ["ES2020", "DOM", "DOM.Iterable"], - "skipLibCheck": true, - - /* Bundler mode */ - "moduleResolution": "Bundler", - "allowImportingTsExtensions": true, - "resolveJsonModule": true, - "isolatedModules": true, - "noEmit": true, - "jsx": "preserve", - - /* Linting */ - "strict": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "noFallthroughCasesInSwitch": true - }, - "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"], - "references": [{ "path": "./tsconfig.node.json" }] -} + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "module": "ESNext", + "lib": [ + "ES2020", + "DOM", + "DOM.Iterable" + ], + "skipLibCheck": true, + /* Bundler mode */ + "moduleResolution": "Bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "preserve", + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "baseUrl": ".", + "paths": { + "@/*": [ + "./src/*" + ] + } + }, + "include": [ + "src/**/*.ts", + "src/**/*.tsx", + "src/**/*.vue" + ], + "references": [ + { + "path": "./tsconfig.node.json" + } + ] +} \ No newline at end of file diff --git a/web/tsconfig.node.json b/web/tsconfig.node.json index 3adda81..8984e2b 100644 --- a/web/tsconfig.node.json +++ b/web/tsconfig.node.json @@ -1,10 +1,18 @@ { - "compilerOptions": { - "composite": true, - "skipLibCheck": true, - "module": "ESNext", - "moduleResolution": "Bundler", - "allowSyntheticDefaultImports": true - }, - "include": ["vite.config.ts"] -} + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "Bundler", + "allowSyntheticDefaultImports": true, + "baseUrl": ".", + "paths": { + "@/*": [ + "./src/*" + ] + } + }, + "include": [ + "vite.config.ts" + ] +} \ No newline at end of file diff --git a/web/vite.config.ts b/web/vite.config.ts index ba9336f..1d98bab 100644 --- a/web/vite.config.ts +++ b/web/vite.config.ts @@ -1,9 +1,25 @@ import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' +import tailwind from "tailwindcss" +import autoprefixer from "autoprefixer" +import path from 'path' + // https://vitejs.dev/config/ export default defineConfig({ + css: { + postcss: { + plugins: [tailwind({ + config: path.resolve(__dirname, "./tailwind.config.ts"), + }), autoprefixer()], + }, + }, plugins: [vue()], + resolve: { + alias: { + "@": path.resolve(__dirname, "./src"), + }, + }, build: { outDir: '../public', emptyOutDir: true,