From c5bdae445ba2b59ad97fa7aa3a87762bad927857 Mon Sep 17 00:00:00 2001 From: TZGyn Date: Wed, 25 Oct 2023 00:41:54 +0800 Subject: [PATCH] Frontend: migrating from react to vue (login form) --- vue-frontend/.env | 1 + vue-frontend/.gitignore | 28 ++++++ vue-frontend/.prettierrc.yaml | 16 ++++ vue-frontend/.vscode/extensions.json | 3 + vue-frontend/README.md | 40 +++++++++ vue-frontend/bun.lockb | Bin 0 -> 187926 bytes vue-frontend/components.json | 15 ++++ vue-frontend/env.d.ts | 1 + vue-frontend/index.html | 13 +++ vue-frontend/package.json | 38 ++++++++ vue-frontend/postcss.config.js | 6 ++ vue-frontend/public/favicon.ico | Bin 0 -> 4286 bytes vue-frontend/src/App.vue | 11 +++ vue-frontend/src/assets/index.css | 80 +++++++++++++++++ vue-frontend/src/assets/logo.svg | 1 + vue-frontend/src/components/Navbar.vue | 14 +++ .../src/components/ToggleThemeButton.vue | 21 +++++ vue-frontend/src/components/UserLoginForm.vue | 76 ++++++++++++++++ .../src/components/UserSignUpForm.vue | 84 ++++++++++++++++++ .../src/components/ui/button/Button.vue | 23 +++++ .../src/components/ui/button/index.ts | 33 +++++++ .../src/components/ui/input/Input.vue | 22 +++++ vue-frontend/src/components/ui/input/index.ts | 1 + .../src/components/ui/label/Label.vue | 20 +++++ vue-frontend/src/components/ui/label/index.ts | 1 + vue-frontend/src/lib/auth.ts | 3 + vue-frontend/src/lib/utils.ts | 7 ++ vue-frontend/src/main.ts | 11 +++ vue-frontend/src/router/index.ts | 37 ++++++++ vue-frontend/src/views/HomeView.vue | 3 + vue-frontend/src/views/LoginPage.vue | 43 +++++++++ vue-frontend/src/views/SignUpPage.vue | 43 +++++++++ vue-frontend/tailwind.config.js | 79 ++++++++++++++++ vue-frontend/tsconfig.app.json | 12 +++ vue-frontend/tsconfig.json | 11 +++ vue-frontend/tsconfig.node.json | 16 ++++ vue-frontend/vite.config.ts | 16 ++++ 37 files changed, 829 insertions(+) create mode 100644 vue-frontend/.env create mode 100644 vue-frontend/.gitignore create mode 100644 vue-frontend/.prettierrc.yaml create mode 100644 vue-frontend/.vscode/extensions.json create mode 100644 vue-frontend/README.md create mode 100755 vue-frontend/bun.lockb create mode 100644 vue-frontend/components.json create mode 100644 vue-frontend/env.d.ts create mode 100644 vue-frontend/index.html create mode 100644 vue-frontend/package.json create mode 100644 vue-frontend/postcss.config.js create mode 100644 vue-frontend/public/favicon.ico create mode 100644 vue-frontend/src/App.vue create mode 100644 vue-frontend/src/assets/index.css create mode 100644 vue-frontend/src/assets/logo.svg create mode 100644 vue-frontend/src/components/Navbar.vue create mode 100644 vue-frontend/src/components/ToggleThemeButton.vue create mode 100644 vue-frontend/src/components/UserLoginForm.vue create mode 100644 vue-frontend/src/components/UserSignUpForm.vue create mode 100644 vue-frontend/src/components/ui/button/Button.vue create mode 100644 vue-frontend/src/components/ui/button/index.ts create mode 100644 vue-frontend/src/components/ui/input/Input.vue create mode 100644 vue-frontend/src/components/ui/input/index.ts create mode 100644 vue-frontend/src/components/ui/label/Label.vue create mode 100644 vue-frontend/src/components/ui/label/index.ts create mode 100644 vue-frontend/src/lib/auth.ts create mode 100644 vue-frontend/src/lib/utils.ts create mode 100644 vue-frontend/src/main.ts create mode 100644 vue-frontend/src/router/index.ts create mode 100644 vue-frontend/src/views/HomeView.vue create mode 100644 vue-frontend/src/views/LoginPage.vue create mode 100644 vue-frontend/src/views/SignUpPage.vue create mode 100644 vue-frontend/tailwind.config.js create mode 100644 vue-frontend/tsconfig.app.json create mode 100644 vue-frontend/tsconfig.json create mode 100644 vue-frontend/tsconfig.node.json create mode 100644 vue-frontend/vite.config.ts diff --git a/vue-frontend/.env b/vue-frontend/.env new file mode 100644 index 0000000..dd97135 --- /dev/null +++ b/vue-frontend/.env @@ -0,0 +1 @@ +BASE_URL=https//5173.tzgyn.com diff --git a/vue-frontend/.gitignore b/vue-frontend/.gitignore new file mode 100644 index 0000000..38adffa --- /dev/null +++ b/vue-frontend/.gitignore @@ -0,0 +1,28 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +.DS_Store +dist +dist-ssr +coverage +*.local + +/cypress/videos/ +/cypress/screenshots/ + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/vue-frontend/.prettierrc.yaml b/vue-frontend/.prettierrc.yaml new file mode 100644 index 0000000..1439e2e --- /dev/null +++ b/vue-frontend/.prettierrc.yaml @@ -0,0 +1,16 @@ +--- +printWidth: 80 +tabWidth: 4 +useTabs: true +semi: false +singleQuote: true +quoteProps: consistent +jsxSingleQuote: true +trailingComma: es5 +bracketSpacing: true +bracketSameLine: true +arrowParens: always +htmlWhitespaceSensitivity: strict +vueIndentScriptAndStyle: false +singleAttributePerLine: true +plugins: [prettier-plugin-tailwindcss] diff --git a/vue-frontend/.vscode/extensions.json b/vue-frontend/.vscode/extensions.json new file mode 100644 index 0000000..c0a6e5a --- /dev/null +++ b/vue-frontend/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["Vue.volar", "Vue.vscode-typescript-vue-plugin"] +} diff --git a/vue-frontend/README.md b/vue-frontend/README.md new file mode 100644 index 0000000..e1cff9b --- /dev/null +++ b/vue-frontend/README.md @@ -0,0 +1,40 @@ +# vue-frontend + +This template should help get you started developing with Vue 3 in Vite. + +## Recommended IDE Setup + +[VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur) + [TypeScript Vue Plugin (Volar)](https://marketplace.visualstudio.com/items?itemName=Vue.vscode-typescript-vue-plugin). + +## Type Support for `.vue` Imports in TS + +TypeScript cannot handle type information for `.vue` imports by default, so we replace the `tsc` CLI with `vue-tsc` for type checking. In editors, we need [TypeScript Vue Plugin (Volar)](https://marketplace.visualstudio.com/items?itemName=Vue.vscode-typescript-vue-plugin) to make the TypeScript language service aware of `.vue` types. + +If the standalone TypeScript plugin doesn't feel fast enough to you, Volar has also implemented a [Take Over Mode](https://github.com/johnsoncodehk/volar/discussions/471#discussioncomment-1361669) that is more performant. You can enable it by the following steps: + +1. Disable the built-in TypeScript Extension + 1) Run `Extensions: Show Built-in Extensions` from VSCode's command palette + 2) Find `TypeScript and JavaScript Language Features`, right click and select `Disable (Workspace)` +2. Reload the VSCode window by running `Developer: Reload Window` from the command palette. + +## Customize configuration + +See [Vite Configuration Reference](https://vitejs.dev/config/). + +## Project Setup + +```sh +npm install +``` + +### Compile and Hot-Reload for Development + +```sh +npm run dev +``` + +### Type-Check, Compile and Minify for Production + +```sh +npm run build +``` diff --git a/vue-frontend/bun.lockb b/vue-frontend/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..f18d3eac8cd53d003b3e0e467f5dd10a82586bf3 GIT binary patch literal 187926 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�rew}tn`I?UCyD3Sk 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 x*~_P`U>wv-MWTw diff --git a/vue-frontend/index.html b/vue-frontend/index.html new file mode 100644 index 0000000..a888544 --- /dev/null +++ b/vue-frontend/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite App + + +
+ + + diff --git a/vue-frontend/package.json b/vue-frontend/package.json new file mode 100644 index 0000000..183d8e2 --- /dev/null +++ b/vue-frontend/package.json @@ -0,0 +1,38 @@ +{ + "name": "vue-frontend", + "version": "0.0.0", + "private": true, + "scripts": { + "dev": "vite", + "build": "run-p type-check \"build-only {@}\" --", + "preview": "vite preview", + "build-only": "vite build", + "type-check": "vue-tsc --noEmit -p tsconfig.app.json --composite false" + }, + "dependencies": { + "@vueuse/core": "^10.5.0", + "class-variance-authority": "^0.7.0", + "clsx": "^2.0.0", + "lucide-vue-next": "^0.288.0", + "radix-vue": "^0.4.1", + "tailwind-merge": "^1.14.0", + "tailwindcss-animate": "^1.0.7", + "vue": "^3.3.4", + "vue-router": "^4.2.5" + }, + "devDependencies": { + "@tsconfig/node18": "^18.2.2", + "@types/node": "^18.18.5", + "@vitejs/plugin-vue": "^4.4.0", + "@vue/tsconfig": "^0.4.0", + "autoprefixer": "^10.4.16", + "npm-run-all2": "^6.1.1", + "postcss": "^8.4.31", + "prettier": "^3.0.3", + "prettier-plugin-tailwindcss": "^0.5.6", + "tailwindcss": "^3.3.3", + "typescript": "~5.2.0", + "vite": "^4.4.11", + "vue-tsc": "^1.8.19" + } +} diff --git a/vue-frontend/postcss.config.js b/vue-frontend/postcss.config.js new file mode 100644 index 0000000..33ad091 --- /dev/null +++ b/vue-frontend/postcss.config.js @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/vue-frontend/public/favicon.ico b/vue-frontend/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..df36fcfb72584e00488330b560ebcf34a41c64c2 GIT binary patch literal 4286 zcmds*O-Phc6o&64GDVCEQHxsW(p4>LW*W<827=Unuo8sGpRux(DN@jWP-e29Wl%wj zY84_aq9}^Am9-cWTD5GGEo#+5Fi2wX_P*bo+xO!)p*7B;iKlbFd(U~_d(U?#hLj56 zPhFkj-|A6~Qk#@g^#D^U0XT1cu=c-vu1+SElX9NR;kzAUV(q0|dl0|%h|dI$%VICy zJnu2^L*Te9JrJMGh%-P79CL0}dq92RGU6gI{v2~|)p}sG5x0U*z<8U;Ij*hB9z?ei z@g6Xq-pDoPl=MANPiR7%172VA%r)kevtV-_5H*QJKFmd;8yA$98zCxBZYXTNZ#QFk2(TX0;Y2dt&WitL#$96|gJY=3xX zpCoi|YNzgO3R`f@IiEeSmKrPSf#h#Qd<$%Ej^RIeeYfsxhPMOG`S`Pz8q``=511zm zAm)MX5AV^5xIWPyEu7u>qYs?pn$I4nL9J!=K=SGlKLXpE<5x+2cDTXq?brj?n6sp= zphe9;_JHf40^9~}9i08r{XM$7HB!`{Ys~TK0kx<}ZQng`UPvH*11|q7&l9?@FQz;8 zx!=3<4seY*%=OlbCbcae?5^V_}*K>Uo6ZWV8mTyE^B=DKy7-sdLYkR5Z?paTgK-zyIkKjIcpyO z{+uIt&YSa_$QnN_@t~L014dyK(fOOo+W*MIxbA6Ndgr=Y!f#Tokqv}n<7-9qfHkc3 z=>a|HWqcX8fzQCT=dqVbogRq!-S>H%yA{1w#2Pn;=e>JiEj7Hl;zdt-2f+j2%DeVD zsW0Ab)ZK@0cIW%W7z}H{&~yGhn~D;aiP4=;m-HCo`BEI+Kd6 z={Xwx{TKxD#iCLfl2vQGDitKtN>z|-AdCN|$jTFDg0m3O`WLD4_s#$S literal 0 HcmV?d00001 diff --git a/vue-frontend/src/App.vue b/vue-frontend/src/App.vue new file mode 100644 index 0000000..e9f44f1 --- /dev/null +++ b/vue-frontend/src/App.vue @@ -0,0 +1,11 @@ + + + diff --git a/vue-frontend/src/assets/index.css b/vue-frontend/src/assets/index.css new file mode 100644 index 0000000..865834e --- /dev/null +++ b/vue-frontend/src/assets/index.css @@ -0,0 +1,80 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +@layer base { + :root { + --background: 0 0% 100%; + --foreground: 240 10% 3.9%; + + --card: 0 0% 100%; + --card-foreground: 240 10% 3.9%; + + --popover: 0 0% 100%; + --popover-foreground: 240 10% 3.9%; + + --primary: 240 5.9% 10%; + --primary-foreground: 0 0% 98%; + + --secondary: 240 4.8% 95.9%; + --secondary-foreground: 240 5.9% 10%; + + --muted: 240 4.8% 95.9%; + --muted-foreground: 240 3.8% 46.1%; + + --accent: 240 4.8% 95.9%; + --accent-foreground: 240 5.9% 10%; + + --destructive: 0 84.2% 60.2%; + --destructive-foreground: 0 0% 98%; + + --border: 240 5.9% 90%; + --input: 240 5.9% 90%; + --ring: 240 10% 3.9%; + + --radius: 0.5rem; + } + + .dark { + --background: 240 10% 3.9%; + --foreground: 0 0% 98%; + + --card: 240 10% 3.9%; + --card-foreground: 0 0% 98%; + + --popover: 240 10% 3.9%; + --popover-foreground: 0 0% 98%; + + --primary: 0 0% 98%; + --primary-foreground: 240 5.9% 10%; + + --secondary: 240 3.7% 15.9%; + --secondary-foreground: 0 0% 98%; + + --muted: 240 3.7% 15.9%; + --muted-foreground: 240 5% 64.9%; + + --accent: 240 3.7% 15.9%; + --accent-foreground: 0 0% 98%; + + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 0 0% 98%; + + --border: 240 3.7% 15.9%; + --input: 240 3.7% 15.9%; + --ring: 240 4.9% 83.9%; + } +} + +@layer base { + * { + @apply border-border; + } + body { + @apply bg-background text-foreground; + } +} + +#app { + @apply h-screen w-screen; +} diff --git a/vue-frontend/src/assets/logo.svg b/vue-frontend/src/assets/logo.svg new file mode 100644 index 0000000..7565660 --- /dev/null +++ b/vue-frontend/src/assets/logo.svg @@ -0,0 +1 @@ + diff --git a/vue-frontend/src/components/Navbar.vue b/vue-frontend/src/components/Navbar.vue new file mode 100644 index 0000000..1b27eb8 --- /dev/null +++ b/vue-frontend/src/components/Navbar.vue @@ -0,0 +1,14 @@ + + diff --git a/vue-frontend/src/components/ToggleThemeButton.vue b/vue-frontend/src/components/ToggleThemeButton.vue new file mode 100644 index 0000000..c2054a8 --- /dev/null +++ b/vue-frontend/src/components/ToggleThemeButton.vue @@ -0,0 +1,21 @@ + + + diff --git a/vue-frontend/src/components/UserLoginForm.vue b/vue-frontend/src/components/UserLoginForm.vue new file mode 100644 index 0000000..e93a791 --- /dev/null +++ b/vue-frontend/src/components/UserLoginForm.vue @@ -0,0 +1,76 @@ + + + diff --git a/vue-frontend/src/components/UserSignUpForm.vue b/vue-frontend/src/components/UserSignUpForm.vue new file mode 100644 index 0000000..bde2cd6 --- /dev/null +++ b/vue-frontend/src/components/UserSignUpForm.vue @@ -0,0 +1,84 @@ + + + diff --git a/vue-frontend/src/components/ui/button/Button.vue b/vue-frontend/src/components/ui/button/Button.vue new file mode 100644 index 0000000..d721b1a --- /dev/null +++ b/vue-frontend/src/components/ui/button/Button.vue @@ -0,0 +1,23 @@ + + + diff --git a/vue-frontend/src/components/ui/button/index.ts b/vue-frontend/src/components/ui/button/index.ts new file mode 100644 index 0000000..4211057 --- /dev/null +++ b/vue-frontend/src/components/ui/button/index.ts @@ -0,0 +1,33 @@ +import { cva } from 'class-variance-authority' + +export { default as Button } from './Button.vue' + +export const buttonVariants = cva( + 'inline-flex items-center justify-center 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-foreground text-primary hover:bg-primary-foreground/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', + sm: 'h-9 rounded-md px-3', + lg: 'h-11 rounded-md px-8', + icon: 'h-10 w-10', + }, + }, + defaultVariants: { + variant: 'default', + size: 'default', + }, + } +) diff --git a/vue-frontend/src/components/ui/input/Input.vue b/vue-frontend/src/components/ui/input/Input.vue new file mode 100644 index 0000000..66ece7a --- /dev/null +++ b/vue-frontend/src/components/ui/input/Input.vue @@ -0,0 +1,22 @@ + + + diff --git a/vue-frontend/src/components/ui/input/index.ts b/vue-frontend/src/components/ui/input/index.ts new file mode 100644 index 0000000..a691dd6 --- /dev/null +++ b/vue-frontend/src/components/ui/input/index.ts @@ -0,0 +1 @@ +export { default as Input } from './Input.vue' diff --git a/vue-frontend/src/components/ui/label/Label.vue b/vue-frontend/src/components/ui/label/Label.vue new file mode 100644 index 0000000..e44d139 --- /dev/null +++ b/vue-frontend/src/components/ui/label/Label.vue @@ -0,0 +1,20 @@ + + + diff --git a/vue-frontend/src/components/ui/label/index.ts b/vue-frontend/src/components/ui/label/index.ts new file mode 100644 index 0000000..572c2f0 --- /dev/null +++ b/vue-frontend/src/components/ui/label/index.ts @@ -0,0 +1 @@ +export { default as Label } from './Label.vue' diff --git a/vue-frontend/src/lib/auth.ts b/vue-frontend/src/lib/auth.ts new file mode 100644 index 0000000..b6c2799 --- /dev/null +++ b/vue-frontend/src/lib/auth.ts @@ -0,0 +1,3 @@ +export const isAuthenticated = async () => { + return false +} diff --git a/vue-frontend/src/lib/utils.ts b/vue-frontend/src/lib/utils.ts new file mode 100644 index 0000000..24470b3 --- /dev/null +++ b/vue-frontend/src/lib/utils.ts @@ -0,0 +1,7 @@ +import { type ClassValue, clsx } from 'clsx' +import { twMerge } from 'tailwind-merge' +import { camelize, getCurrentInstance, toHandlerKey } from 'vue' + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)) +} diff --git a/vue-frontend/src/main.ts b/vue-frontend/src/main.ts new file mode 100644 index 0000000..72d93d8 --- /dev/null +++ b/vue-frontend/src/main.ts @@ -0,0 +1,11 @@ +import "./assets/index.css"; + +import { createApp } from "vue"; +import App from "./App.vue"; +import router from "./router"; + +const app = createApp(App); + +app.use(router); + +app.mount("#app"); diff --git a/vue-frontend/src/router/index.ts b/vue-frontend/src/router/index.ts new file mode 100644 index 0000000..a5794bf --- /dev/null +++ b/vue-frontend/src/router/index.ts @@ -0,0 +1,37 @@ +import { createRouter, createWebHistory } from 'vue-router' +import { isAuthenticated } from '@/lib/auth' +import HomeView from '@/views/HomeView.vue' +import LoginPage from '@/views/LoginPage.vue' +import SignUpPage from '@/views/SignUpPage.vue' + +const router = createRouter({ + history: createWebHistory(import.meta.env.BASE_URL), + routes: [ + { + path: '/', + component: HomeView, + }, + { + path: '/login', + name: 'login', + component: LoginPage, + }, + { + path: '/signup', + name: 'signup', + component: SignUpPage, + }, + ], +}) + +router.beforeEach(async (to) => { + const isLoggedIn = await isAuthenticated() + if (isLoggedIn && (to.name === 'login' || to.name === 'signup')) { + return { name: 'home' } + } + if (!isLoggedIn && to.name !== 'login' && to.name !== 'signup') { + return { name: 'login' } + } +}) + +export default router diff --git a/vue-frontend/src/views/HomeView.vue b/vue-frontend/src/views/HomeView.vue new file mode 100644 index 0000000..0a45c22 --- /dev/null +++ b/vue-frontend/src/views/HomeView.vue @@ -0,0 +1,3 @@ + diff --git a/vue-frontend/src/views/LoginPage.vue b/vue-frontend/src/views/LoginPage.vue new file mode 100644 index 0000000..cd18c1e --- /dev/null +++ b/vue-frontend/src/views/LoginPage.vue @@ -0,0 +1,43 @@ + + + diff --git a/vue-frontend/src/views/SignUpPage.vue b/vue-frontend/src/views/SignUpPage.vue new file mode 100644 index 0000000..f759724 --- /dev/null +++ b/vue-frontend/src/views/SignUpPage.vue @@ -0,0 +1,43 @@ + + + diff --git a/vue-frontend/tailwind.config.js b/vue-frontend/tailwind.config.js new file mode 100644 index 0000000..aedb250 --- /dev/null +++ b/vue-frontend/tailwind.config.js @@ -0,0 +1,79 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + darkMode: ['class'], + + content: [ + './pages/**/*.{ts,tsx,vue}', + './components/**/*.{ts,tsx,vue}', + './app/**/*.{ts,tsx,vue}', + './src/**/*.{ts,tsx,vue}', + './index.html', + ], + + 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: { + lg: 'var(--radius)', + md: 'calc(var(--radius) - 2px)', + sm: 'calc(var(--radius) - 4px)', + }, + 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 }, + }, + }, + animation: { + 'accordion-down': 'accordion-down 0.2s ease-out', + 'accordion-up': 'accordion-up 0.2s ease-out', + }, + }, + }, + plugins: [require('tailwindcss-animate')], +} diff --git a/vue-frontend/tsconfig.app.json b/vue-frontend/tsconfig.app.json new file mode 100644 index 0000000..3e5b621 --- /dev/null +++ b/vue-frontend/tsconfig.app.json @@ -0,0 +1,12 @@ +{ + "extends": "@vue/tsconfig/tsconfig.dom.json", + "include": ["env.d.ts", "src/**/*", "src/**/*.vue"], + "exclude": ["src/**/__tests__/*"], + "compilerOptions": { + "composite": true, + "baseUrl": ".", + "paths": { + "@/*": ["./src/*"] + } + } +} diff --git a/vue-frontend/tsconfig.json b/vue-frontend/tsconfig.json new file mode 100644 index 0000000..66b5e57 --- /dev/null +++ b/vue-frontend/tsconfig.json @@ -0,0 +1,11 @@ +{ + "files": [], + "references": [ + { + "path": "./tsconfig.node.json" + }, + { + "path": "./tsconfig.app.json" + } + ] +} diff --git a/vue-frontend/tsconfig.node.json b/vue-frontend/tsconfig.node.json new file mode 100644 index 0000000..dee96be --- /dev/null +++ b/vue-frontend/tsconfig.node.json @@ -0,0 +1,16 @@ +{ + "extends": "@tsconfig/node18/tsconfig.json", + "include": [ + "vite.config.*", + "vitest.config.*", + "cypress.config.*", + "nightwatch.conf.*", + "playwright.config.*" + ], + "compilerOptions": { + "composite": true, + "module": "ESNext", + "moduleResolution": "Bundler", + "types": ["node"] + } +} diff --git a/vue-frontend/vite.config.ts b/vue-frontend/vite.config.ts new file mode 100644 index 0000000..5c45e1d --- /dev/null +++ b/vue-frontend/vite.config.ts @@ -0,0 +1,16 @@ +import { fileURLToPath, URL } from 'node:url' + +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [ + vue(), + ], + resolve: { + alias: { + '@': fileURLToPath(new URL('./src', import.meta.url)) + } + } +})