diff --git a/frontend/biome.json b/frontend/biome.json
new file mode 100644
--- /dev/null
+++ b/frontend/biome.json
@@ -0,0 +1,24 @@
+{
+ "$schema": "https://biomejs.dev/schemas/2.5.3/schema.json",
+ "files": {
+ "includes": ["**"]
+ },
+ "vcs": {
+ "enabled": true,
+ "useIgnoreFile": true,
+ "clientKind": "git"
+ },
+ "assist": { "actions": { "source": { "organizeImports": "on" } } },
+ "css": {
+ "parser": {
+ "tailwindDirectives": true
+ }
+ },
+ "html": {
+ "experimentalFullSupportEnabled": true,
+ "formatter": {
+ "enabled": true,
+ "indentScriptAndStyle": true
+ }
+ }
+}
diff --git a/frontend/index.html b/frontend/index.html
--- a/frontend/index.html
+++ b/frontend/index.html
@@ -1,13 +1,13 @@
-
-
-
-
- frontend
-
-
-
-
-
+
+
+
+
+ frontend
+
+
+
+
+
diff --git a/frontend/package.json b/frontend/package.json
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -1,22 +1,25 @@
{
- "name": "frontend",
- "private": true,
- "version": "0.0.0",
- "type": "module",
- "scripts": {
- "dev": "vite",
- "build": "vue-tsc -b && vite build",
- "preview": "vite preview"
- },
- "dependencies": {
- "vue": "^3.5.39"
- },
- "devDependencies": {
- "@types/node": "^24.13.2",
- "@vitejs/plugin-vue": "^6.0.7",
- "@vue/tsconfig": "^0.9.1",
- "typescript": "~6.0.2",
- "vite": "^8.1.1",
- "vue-tsc": "^3.3.5"
- }
+ "name": "frontend",
+ "private": true,
+ "version": "0.0.0",
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "build": "vue-tsc -b && vite build",
+ "preview": "vite preview",
+ "lint:fix": "biome check --write",
+ "lint": "biome check"
+ },
+ "dependencies": {
+ "vue": "^3.5.39"
+ },
+ "devDependencies": {
+ "@biomejs/biome": "^2.5.3",
+ "@types/node": "^24.13.2",
+ "@vitejs/plugin-vue": "^6.0.7",
+ "@vue/tsconfig": "^0.9.1",
+ "typescript": "~6.0.2",
+ "vite": "^8.1.1",
+ "vue-tsc": "^3.3.5"
+ }
}
diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml
--- a/frontend/pnpm-lock.yaml
+++ b/frontend/pnpm-lock.yaml
@@ -12,6 +12,9 @@
specifier: ^3.5.39
version: 3.5.39(typescript@6.0.3)
devDependencies:
+ '@biomejs/biome':
+ specifier: ^2.5.3
+ version: 2.5.3
'@types/node':
specifier: ^24.13.2
version: 24.13.2
@@ -49,6 +52,63 @@
'@babel/types@7.29.7':
resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==}
engines: {node: '>=6.9.0'}
+
+ '@biomejs/biome@2.5.3':
+ resolution: {integrity: sha512-MrJswFdei9EfDwwUy2tQrPDpK0AO+RmMFvBoaaJ6ayBc3sUbHdCE+XG5N8vp+5So41ZupZJQm0roHFFhMGVD7A==}
+ engines: {node: '>=14.21.3'}
+ hasBin: true
+
+ '@biomejs/cli-darwin-arm64@2.5.3':
+ resolution: {integrity: sha512-QhYP9muVQ0nUO5zztFuPbEwi4+94sJWVjaZds9aMi1l/KNZBiUjdiSUrGHsTaMGDXrYl+r4AS2sUKfgH3w+V3g==}
+ engines: {node: '>=14.21.3'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@biomejs/cli-darwin-x64@2.5.3':
+ resolution: {integrity: sha512-NC1Ss13UaW7QZX+y8j44bF7AP0jSJdBl6iRhe0MAkvaSqZy+mWg3GaXsrb+eSoHoGDBtaXWEbMVV0iVN2cZ7cQ==}
+ engines: {node: '>=14.21.3'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@biomejs/cli-linux-arm64-musl@2.5.3':
+ resolution: {integrity: sha512-fccix0w6xp6csCXgxeC0dU/3ecgRQal0y+cv2SP9ajNlhe7Yrk2Ug7UDe2j9AT9ZDYitkXpvUKgZjjuoYeP4Vg==}
+ engines: {node: '>=14.21.3'}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
+
+ '@biomejs/cli-linux-arm64@2.5.3':
+ resolution: {integrity: sha512-ksx1KWeyYW18ILL04msF/J4ZBtBDN33znYK8Z/aNv/vlBVxL9/g3mGP+omgHJKy4+KWbK87vcmmpmurfNjSgiA==}
+ engines: {node: '>=14.21.3'}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
+
+ '@biomejs/cli-linux-x64-musl@2.5.3':
+ resolution: {integrity: sha512-O/yU9YKRUiHhmcjF2f38PSjseVk3G4VLWYc0G2HWpzdBVREV6G8IGWIVEFf7MFPfWIzNUIvPsEjeAZQIOgnLcQ==}
+ engines: {node: '>=14.21.3'}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
+
+ '@biomejs/cli-linux-x64@2.5.3':
+ resolution: {integrity: sha512-yMkJtilsgvILDcVkh187aVLTb64xYsrxYajx5kym+r1ULkO5HUOfu9AYKLGQbOVLwJtT2utNw7hhFNg+17mUYA==}
+ engines: {node: '>=14.21.3'}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
+
+ '@biomejs/cli-win32-arm64@2.5.3':
+ resolution: {integrity: sha512-cX5z+GYwRcqEok0AH3KSfQGgqYd0Nomfp6Fbe1uiTtELE38hdH2k842wQ9wLNaF/JJ7r4rjJQ4VR+ce+fRmQbw==}
+ engines: {node: '>=14.21.3'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@biomejs/cli-win32-x64@2.5.3':
+ resolution: {integrity: sha512-ExSaJWi4/u6+GXCszlSKpWSjKNbDseAYqqkCznsCsZ/4uidZ/BEqsCc5/3ctlq6dfIubdIIRSVLC/PG9xPl70Q==}
+ engines: {node: '>=14.21.3'}
+ cpu: [x64]
+ os: [win32]
'@emnapi/core@1.11.1':
resolution: {integrity: sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==}
@@ -462,6 +522,41 @@
dependencies:
'@babel/helper-string-parser': 7.29.7
'@babel/helper-validator-identifier': 7.29.7
+
+ '@biomejs/biome@2.5.3':
+ optionalDependencies:
+ '@biomejs/cli-darwin-arm64': 2.5.3
+ '@biomejs/cli-darwin-x64': 2.5.3
+ '@biomejs/cli-linux-arm64': 2.5.3
+ '@biomejs/cli-linux-arm64-musl': 2.5.3
+ '@biomejs/cli-linux-x64': 2.5.3
+ '@biomejs/cli-linux-x64-musl': 2.5.3
+ '@biomejs/cli-win32-arm64': 2.5.3
+ '@biomejs/cli-win32-x64': 2.5.3
+
+ '@biomejs/cli-darwin-arm64@2.5.3':
+ optional: true
+
+ '@biomejs/cli-darwin-x64@2.5.3':
+ optional: true
+
+ '@biomejs/cli-linux-arm64-musl@2.5.3':
+ optional: true
+
+ '@biomejs/cli-linux-arm64@2.5.3':
+ optional: true
+
+ '@biomejs/cli-linux-x64-musl@2.5.3':
+ optional: true
+
+ '@biomejs/cli-linux-x64@2.5.3':
+ optional: true
+
+ '@biomejs/cli-win32-arm64@2.5.3':
+ optional: true
+
+ '@biomejs/cli-win32-x64@2.5.3':
+ optional: true
'@emnapi/core@1.11.1':
dependencies:
diff --git a/frontend/tsconfig.app.json b/frontend/tsconfig.app.json
--- a/frontend/tsconfig.app.json
+++ b/frontend/tsconfig.app.json
@@ -1,15 +1,15 @@
{
- "extends": "@vue/tsconfig/tsconfig.dom.json",
- "compilerOptions": {
- "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
- "types": ["vite/client"],
- "allowArbitraryExtensions": true,
+ "extends": "@vue/tsconfig/tsconfig.dom.json",
+ "compilerOptions": {
+ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
+ "types": ["vite/client"],
+ "allowArbitraryExtensions": true,
- /* Linting */
- "noUnusedLocals": true,
- "noUnusedParameters": true,
- "erasableSyntaxOnly": true,
- "noFallthroughCasesInSwitch": true
- },
- "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"]
+ /* Linting */
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "erasableSyntaxOnly": true,
+ "noFallthroughCasesInSwitch": true
+ },
+ "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"]
}
diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json
--- a/frontend/tsconfig.json
+++ b/frontend/tsconfig.json
@@ -1,7 +1,7 @@
{
- "files": [],
- "references": [
- { "path": "./tsconfig.app.json" },
- { "path": "./tsconfig.node.json" }
- ]
+ "files": [],
+ "references": [
+ { "path": "./tsconfig.app.json" },
+ { "path": "./tsconfig.node.json" }
+ ]
}
diff --git a/frontend/tsconfig.node.json b/frontend/tsconfig.node.json
--- a/frontend/tsconfig.node.json
+++ b/frontend/tsconfig.node.json
@@ -1,23 +1,23 @@
{
- "compilerOptions": {
- "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
- "target": "es2023",
- "lib": ["ES2023"],
- "types": ["node"],
- "skipLibCheck": true,
+ "compilerOptions": {
+ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
+ "target": "es2023",
+ "lib": ["ES2023"],
+ "types": ["node"],
+ "skipLibCheck": true,
- /* Bundler mode */
- "module": "nodenext",
- "allowImportingTsExtensions": true,
- "verbatimModuleSyntax": true,
- "moduleDetection": "force",
- "noEmit": true,
+ /* Bundler mode */
+ "module": "nodenext",
+ "allowImportingTsExtensions": true,
+ "verbatimModuleSyntax": true,
+ "moduleDetection": "force",
+ "noEmit": true,
- /* Linting */
- "noUnusedLocals": true,
- "noUnusedParameters": true,
- "erasableSyntaxOnly": true,
- "noFallthroughCasesInSwitch": true
- },
- "include": ["vite.config.ts"]
+ /* Linting */
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "erasableSyntaxOnly": true,
+ "noFallthroughCasesInSwitch": true
+ },
+ "include": ["vite.config.ts"]
}
diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts
--- a/frontend/vite.config.ts
+++ b/frontend/vite.config.ts
@@ -1,15 +1,15 @@
-import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";
+import { defineConfig } from "vite";
// https://vite.dev/config/
export default defineConfig({
- plugins: [vue()],
- server: {
- proxy: {
- "/api": {
- target: "http://localhost:8080",
- changeOrigin: true,
- },
- },
- },
+ plugins: [vue()],
+ server: {
+ proxy: {
+ "/api": {
+ target: "http://localhost:8080",
+ changeOrigin: true,
+ },
+ },
+ },
});
diff --git a/frontend/.zed/settings.json b/frontend/.zed/settings.json
new file mode 100644
--- /dev/null
+++ b/frontend/.zed/settings.json
@@ -0,0 +1,9 @@
+{
+ "languages": {
+ "Vue.js": { "formatter": { "language_server": { "name": "biome" } } },
+ "TypeScript": { "formatter": { "language_server": { "name": "biome" } } },
+ "JSON": { "formatter": { "language_server": { "name": "biome" } } },
+ "JSONC": { "formatter": { "language_server": { "name": "biome" } } },
+ "CSS": { "formatter": { "language_server": { "name": "biome" } } }
+ }
+}
diff --git a/frontend/public/favicon.svg b/frontend/public/favicon.svg
--- a/frontend/public/favicon.svg
+++ b/frontend/public/favicon.svg
@@ -1,1 +1,439 @@
-
\ No newline at end of file
+
diff --git a/frontend/public/icons.svg b/frontend/public/icons.svg
deleted file mode 100644
--- a/frontend/public/icons.svg
+++ /dev/null
@@ -1,24 +0,0 @@
-
diff --git a/frontend/src/App.vue b/frontend/src/App.vue
--- a/frontend/src/App.vue
+++ b/frontend/src/App.vue
@@ -1,7 +1,7 @@
-
+
diff --git a/frontend/src/main.ts b/frontend/src/main.ts
--- a/frontend/src/main.ts
+++ b/frontend/src/main.ts
@@ -1,5 +1,5 @@
-import { createApp } from 'vue'
-import './style.css'
-import App from './App.vue'
+import { createApp } from "vue";
+import "./style.css";
+import App from "./App.vue";
-createApp(App).mount('#app')
+createApp(App).mount("#app");
diff --git a/frontend/src/components/HelloWorld.vue b/frontend/src/components/HelloWorld.vue
--- a/frontend/src/components/HelloWorld.vue
+++ b/frontend/src/components/HelloWorld.vue
@@ -1,23 +1,23 @@
-
-
{{ count }}
-
+
+
{{ count }}
+
-
-
{{ health }}
-
+
+
{{ health }}
+