diff --git a/.env b/.env
new file mode 100644
index 0000000..f99f4bd
--- /dev/null
+++ b/.env
@@ -0,0 +1 @@
+VITE_BASE_API_URL=http://192.168.1.36:9527
\ No newline at end of file
diff --git a/auto-imports.d.ts b/auto-imports.d.ts
new file mode 100644
index 0000000..72370df
--- /dev/null
+++ b/auto-imports.d.ts
@@ -0,0 +1,78 @@
+/* eslint-disable */
+/* prettier-ignore */
+// @ts-nocheck
+// noinspection JSUnusedGlobalSymbols
+// Generated by unplugin-auto-import
+// biome-ignore lint: disable
+export {}
+declare global {
+ const EffectScope: typeof import('vue').EffectScope
+ const computed: typeof import('vue').computed
+ const createApp: typeof import('vue').createApp
+ const customRef: typeof import('vue').customRef
+ const defineAsyncComponent: typeof import('vue').defineAsyncComponent
+ const defineComponent: typeof import('vue').defineComponent
+ const effectScope: typeof import('vue').effectScope
+ const getCurrentInstance: typeof import('vue').getCurrentInstance
+ const getCurrentScope: typeof import('vue').getCurrentScope
+ const getCurrentWatcher: typeof import('vue').getCurrentWatcher
+ const h: typeof import('vue').h
+ const inject: typeof import('vue').inject
+ const isProxy: typeof import('vue').isProxy
+ const isReactive: typeof import('vue').isReactive
+ const isReadonly: typeof import('vue').isReadonly
+ const isRef: typeof import('vue').isRef
+ const isShallow: typeof import('vue').isShallow
+ const markRaw: typeof import('vue').markRaw
+ const nextTick: typeof import('vue').nextTick
+ const onActivated: typeof import('vue').onActivated
+ const onBeforeMount: typeof import('vue').onBeforeMount
+ const onBeforeRouteLeave: typeof import('vue-router').onBeforeRouteLeave
+ const onBeforeRouteUpdate: typeof import('vue-router').onBeforeRouteUpdate
+ const onBeforeUnmount: typeof import('vue').onBeforeUnmount
+ const onBeforeUpdate: typeof import('vue').onBeforeUpdate
+ const onDeactivated: typeof import('vue').onDeactivated
+ const onErrorCaptured: typeof import('vue').onErrorCaptured
+ const onMounted: typeof import('vue').onMounted
+ const onRenderTracked: typeof import('vue').onRenderTracked
+ const onRenderTriggered: typeof import('vue').onRenderTriggered
+ const onScopeDispose: typeof import('vue').onScopeDispose
+ const onServerPrefetch: typeof import('vue').onServerPrefetch
+ const onUnmounted: typeof import('vue').onUnmounted
+ const onUpdated: typeof import('vue').onUpdated
+ const onWatcherCleanup: typeof import('vue').onWatcherCleanup
+ const provide: typeof import('vue').provide
+ const reactive: typeof import('vue').reactive
+ const readonly: typeof import('vue').readonly
+ const ref: typeof import('vue').ref
+ const resolveComponent: typeof import('vue').resolveComponent
+ const shallowReactive: typeof import('vue').shallowReactive
+ const shallowReadonly: typeof import('vue').shallowReadonly
+ const shallowRef: typeof import('vue').shallowRef
+ const toRaw: typeof import('vue').toRaw
+ const toRef: typeof import('vue').toRef
+ const toRefs: typeof import('vue').toRefs
+ const toValue: typeof import('vue').toValue
+ const triggerRef: typeof import('vue').triggerRef
+ const unref: typeof import('vue').unref
+ const useAttrs: typeof import('vue').useAttrs
+ const useCssModule: typeof import('vue').useCssModule
+ const useCssVars: typeof import('vue').useCssVars
+ const useId: typeof import('vue').useId
+ const useLink: typeof import('vue-router').useLink
+ const useModel: typeof import('vue').useModel
+ const useRoute: typeof import('vue-router').useRoute
+ const useRouter: typeof import('vue-router').useRouter
+ const useSlots: typeof import('vue').useSlots
+ const useTemplateRef: typeof import('vue').useTemplateRef
+ const watch: typeof import('vue').watch
+ const watchEffect: typeof import('vue').watchEffect
+ const watchPostEffect: typeof import('vue').watchPostEffect
+ const watchSyncEffect: typeof import('vue').watchSyncEffect
+}
+// for type re-export
+declare global {
+ // @ts-ignore
+ export type { Component, Slot, Slots, ComponentPublicInstance, ComputedRef, DirectiveBinding, ExtractDefaultPropTypes, ExtractPropTypes, ExtractPublicPropTypes, InjectionKey, PropType, Ref, ShallowRef, MaybeRef, MaybeRefOrGetter, VNode, WritableComputedRef } from 'vue'
+ import('vue')
+}
diff --git a/components.d.ts b/components.d.ts
new file mode 100644
index 0000000..798e142
--- /dev/null
+++ b/components.d.ts
@@ -0,0 +1,35 @@
+/* eslint-disable */
+// @ts-nocheck
+// biome-ignore lint: disable
+// oxlint-disable
+// ------
+// Generated by unplugin-vue-components
+// Read more: https://github.com/vuejs/core/pull/3399
+
+export {}
+
+/* prettier-ignore */
+declare module 'vue' {
+ export interface GlobalComponents {
+ ExploreContainer: typeof import('./src/components/ExploreContainer.vue')['default']
+ IonApp: typeof import('@ionic/vue')['IonApp']
+ IonButton: typeof import('@ionic/vue')['IonButton']
+ IonButtons: typeof import('@ionic/vue')['IonButtons']
+ IonContent: typeof import('@ionic/vue')['IonContent']
+ IonHeader: typeof import('@ionic/vue')['IonHeader']
+ IonIcon: typeof import('@ionic/vue')['IonIcon']
+ IonInput: typeof import('@ionic/vue')['IonInput']
+ IonItem: typeof import('@ionic/vue')['IonItem']
+ IonLabel: typeof import('@ionic/vue')['IonLabel']
+ IonPage: typeof import('@ionic/vue')['IonPage']
+ IonRouterOutlet: typeof import('@ionic/vue')['IonRouterOutlet']
+ IonTabBar: typeof import('@ionic/vue')['IonTabBar']
+ IonTabButton: typeof import('@ionic/vue')['IonTabButton']
+ IonTabs: typeof import('@ionic/vue')['IonTabs']
+ IonTitle: typeof import('@ionic/vue')['IonTitle']
+ IonToolbar: typeof import('@ionic/vue')['IonToolbar']
+ LayoutDefault: typeof import('./src/components/layout/default.vue')['default']
+ RouterLink: typeof import('vue-router')['RouterLink']
+ RouterView: typeof import('vue-router')['RouterView']
+ }
+}
diff --git a/package.json b/package.json
index c298567..e5d15db 100644
--- a/package.json
+++ b/package.json
@@ -44,6 +44,8 @@
"simple-git-hooks": "^2.13.1",
"terser": "^5.44.1",
"typescript": "~5.9.3",
+ "unplugin-auto-import": "^20.3.0",
+ "unplugin-vue-components": "^30.0.0",
"vite": "^7.2.7",
"vitest": "^4.0.15",
"vue-tsc": "^3.1.8"
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 7cc304d..b9058a9 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -93,6 +93,12 @@ importers:
typescript:
specifier: ~5.9.3
version: 5.9.3
+ unplugin-auto-import:
+ specifier: ^20.3.0
+ version: 20.3.0
+ unplugin-vue-components:
+ specifier: ^30.0.0
+ version: 30.0.0(@babel/parser@7.28.5)(vue@3.5.25(typescript@5.9.3))
vite:
specifier: ^7.2.7
version: 7.2.7(@types/node@24.10.2)(terser@5.44.1)(yaml@2.8.2)
@@ -1799,6 +1805,10 @@ packages:
character-entities@2.0.2:
resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==}
+ chokidar@4.0.3:
+ resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==}
+ engines: {node: '>= 14.16.0'}
+
chownr@2.0.0:
resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==}
engines: {node: '>=10'}
@@ -2680,6 +2690,9 @@ packages:
js-tokens@4.0.0:
resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
+ js-tokens@9.0.1:
+ resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==}
+
js-yaml@4.1.1:
resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==}
hasBin: true
@@ -3280,6 +3293,10 @@ packages:
resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
engines: {node: '>= 6'}
+ readdirp@4.1.2:
+ resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==}
+ engines: {node: '>= 14.18.0'}
+
refa@0.12.1:
resolution: {integrity: sha512-J8rn6v4DBb2nnFqkqwy6/NnTYMcgLA+sLr0iIO41qpv0n+ngb7ksag2tMRl0inb1bbO/esUwzW1vbJi7K0sI0g==}
engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
@@ -3390,6 +3407,9 @@ packages:
resolution: {integrity: sha512-3A6sD0WYP7+QrjbfNA2FN3FsOaGGFoekCVgTyypy53gPxhbkCIjtO6YWgdrfM+n/8sI8JeXZOIxsHjMTNxQ4nQ==}
engines: {node: ^14.0.0 || >=16.0.0}
+ scule@1.3.0:
+ resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==}
+
semver@6.3.1:
resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
hasBin: true
@@ -3533,6 +3553,9 @@ packages:
resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
engines: {node: '>=8'}
+ strip-literal@3.1.0:
+ resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==}
+
supports-color@7.2.0:
resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
engines: {node: '>=8'}
@@ -3710,6 +3733,10 @@ packages:
resolution: {integrity: sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==}
engines: {node: '>=4'}
+ unimport@5.5.0:
+ resolution: {integrity: sha512-/JpWMG9s1nBSlXJAQ8EREFTFy3oy6USFd8T6AoBaw1q2GGcF4R9yp3ofg32UODZlYEO5VD0EWE1RpI9XDWyPYg==}
+ engines: {node: '>=18.12.0'}
+
unist-util-is@6.0.1:
resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==}
@@ -3726,6 +3753,39 @@ packages:
resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
engines: {node: '>= 10.0.0'}
+ unplugin-auto-import@20.3.0:
+ resolution: {integrity: sha512-RcSEQiVv7g0mLMMXibYVKk8mpteKxvyffGuDKqZZiFr7Oq3PB1HwgHdK5O7H4AzbhzHoVKG0NnMnsk/1HIVYzQ==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@nuxt/kit': ^4.0.0
+ '@vueuse/core': '*'
+ peerDependenciesMeta:
+ '@nuxt/kit':
+ optional: true
+ '@vueuse/core':
+ optional: true
+
+ unplugin-utils@0.3.1:
+ resolution: {integrity: sha512-5lWVjgi6vuHhJ526bI4nlCOmkCIF3nnfXkCMDeMJrtdvxTs6ZFCM8oNufGTsDbKv/tJ/xj8RpvXjRuPBZJuJog==}
+ engines: {node: '>=20.19.0'}
+
+ unplugin-vue-components@30.0.0:
+ resolution: {integrity: sha512-4qVE/lwCgmdPTp6h0qsRN2u642tt4boBQtcpn4wQcWZAsr8TQwq+SPT3NDu/6kBFxzo/sSEK4ioXhOOBrXc3iw==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@babel/parser': ^7.15.8
+ '@nuxt/kit': ^3.2.2 || ^4.0.0
+ vue: 2 || 3
+ peerDependenciesMeta:
+ '@babel/parser':
+ optional: true
+ '@nuxt/kit':
+ optional: true
+
+ unplugin@2.3.11:
+ resolution: {integrity: sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==}
+ engines: {node: '>=18.12.0'}
+
untildify@4.0.0:
resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==}
engines: {node: '>=8'}
@@ -3863,6 +3923,9 @@ packages:
resolution: {integrity: sha512-n4W4YFyz5JzOfQeA8oN7dUYpR+MBP3PIUsn2jLjWXwK5ASUzt0Jc/A5sAUZoCYFJRGF0FBKJ+1JjN43rNdsQzA==}
engines: {node: '>=20'}
+ webpack-virtual-modules@0.6.2:
+ resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==}
+
whatwg-encoding@3.1.1:
resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==}
engines: {node: '>=18'}
@@ -5837,6 +5900,10 @@ snapshots:
character-entities@2.0.2: {}
+ chokidar@4.0.3:
+ dependencies:
+ readdirp: 4.1.2
+
chownr@2.0.0: {}
ci-info@4.3.1: {}
@@ -6803,6 +6870,8 @@ snapshots:
js-tokens@4.0.0: {}
+ js-tokens@9.0.1: {}
+
js-yaml@4.1.1:
dependencies:
argparse: 2.0.1
@@ -7578,6 +7647,8 @@ snapshots:
string_decoder: 1.3.0
util-deprecate: 1.0.2
+ readdirp@4.1.2: {}
+
refa@0.12.1:
dependencies:
'@eslint-community/regexpp': 4.12.2
@@ -7705,6 +7776,8 @@ snapshots:
refa: 0.12.1
regexp-ast-analysis: 0.7.1
+ scule@1.3.0: {}
+
semver@6.3.1: {}
semver@7.7.3: {}
@@ -7851,6 +7924,10 @@ snapshots:
strip-json-comments@3.1.1: {}
+ strip-literal@3.1.0:
+ dependencies:
+ js-tokens: 9.0.1
+
supports-color@7.2.0:
dependencies:
has-flag: 4.0.0
@@ -8002,6 +8079,23 @@ snapshots:
unicode-property-aliases-ecmascript@2.2.0: {}
+ unimport@5.5.0:
+ dependencies:
+ acorn: 8.15.0
+ escape-string-regexp: 5.0.0
+ estree-walker: 3.0.3
+ local-pkg: 1.1.2
+ magic-string: 0.30.21
+ mlly: 1.8.0
+ pathe: 2.0.3
+ picomatch: 4.0.3
+ pkg-types: 2.3.0
+ scule: 1.3.0
+ strip-literal: 3.1.0
+ tinyglobby: 0.2.15
+ unplugin: 2.3.11
+ unplugin-utils: 0.3.1
+
unist-util-is@6.0.1:
dependencies:
'@types/unist': 3.0.3
@@ -8023,6 +8117,43 @@ snapshots:
universalify@2.0.1: {}
+ unplugin-auto-import@20.3.0:
+ dependencies:
+ local-pkg: 1.1.2
+ magic-string: 0.30.21
+ picomatch: 4.0.3
+ unimport: 5.5.0
+ unplugin: 2.3.11
+ unplugin-utils: 0.3.1
+
+ unplugin-utils@0.3.1:
+ dependencies:
+ pathe: 2.0.3
+ picomatch: 4.0.3
+
+ unplugin-vue-components@30.0.0(@babel/parser@7.28.5)(vue@3.5.25(typescript@5.9.3)):
+ dependencies:
+ chokidar: 4.0.3
+ debug: 4.4.3(supports-color@8.1.1)
+ local-pkg: 1.1.2
+ magic-string: 0.30.21
+ mlly: 1.8.0
+ tinyglobby: 0.2.15
+ unplugin: 2.3.11
+ unplugin-utils: 0.3.1
+ vue: 3.5.25(typescript@5.9.3)
+ optionalDependencies:
+ '@babel/parser': 7.28.5
+ transitivePeerDependencies:
+ - supports-color
+
+ unplugin@2.3.11:
+ dependencies:
+ '@jridgewell/remapping': 2.3.5
+ acorn: 8.15.0
+ picomatch: 4.0.3
+ webpack-virtual-modules: 0.6.2
+
untildify@4.0.0: {}
update-browserslist-db@1.2.2(browserslist@4.28.1):
@@ -8140,6 +8271,8 @@ snapshots:
webidl-conversions@8.0.0: {}
+ webpack-virtual-modules@0.6.2: {}
+
whatwg-encoding@3.1.1:
dependencies:
iconv-lite: 0.6.3
diff --git a/src/App.vue b/src/App.vue
index 9f84739..c082607 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -1,5 +1,4 @@
diff --git a/src/auth/components/signup.vue b/src/auth/components/signup.vue
new file mode 100644
index 0000000..b8df156
--- /dev/null
+++ b/src/auth/components/signup.vue
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+ Cancel
+
+
+ Modal
+
+
+ Confirm
+
+
+
+
+
+
+
+
+
+
diff --git a/src/auth/index.ts b/src/auth/index.ts
index c3fe8bb..4d597ba 100644
--- a/src/auth/index.ts
+++ b/src/auth/index.ts
@@ -1,5 +1,12 @@
+import { modalController } from "@ionic/vue";
import { createAuthClient } from "better-auth/vue";
export const authClient = createAuthClient({
- baseURL: "http://192.168.1.36:9527", // The base URL of your auth server
+ baseURL: import.meta.env.VITE_BASE_API_URL, // The base URL of your auth server
});
+
+export function signupController() {
+ return modalController.create({
+ component: () => import("./components/signup.vue"),
+ });
+}
diff --git a/src/components/layout/default.vue b/src/components/layout/default.vue
index 6b329ae..8f1cf8f 100644
--- a/src/components/layout/default.vue
+++ b/src/components/layout/default.vue
@@ -1,5 +1,4 @@
diff --git a/src/router/index.ts b/src/router/index.ts
index f297b55..2804a82 100644
--- a/src/router/index.ts
+++ b/src/router/index.ts
@@ -1,6 +1,6 @@
import type { RouteRecordRaw } from "vue-router";
import { createRouter, createWebHistory } from "@ionic/vue-router";
-import Layout from "@/components/layout/default.vue";
+import LayoutDefault from "@/components/layout/default.vue";
const routes: Array = [
{
@@ -9,12 +9,9 @@ const routes: Array = [
},
{
path: "/layout/",
- component: Layout,
+ component: LayoutDefault,
+ redirect: "/layout/home",
children: [
- {
- path: "",
- redirect: "/layout/home",
- },
{
path: "home",
component: () => import("@/views/home/index.vue"),
diff --git a/tsconfig.json b/tsconfig.json
index 004b9aa..1106af2 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -14,8 +14,9 @@
"noEmit": true,
"paths": {
"@/*": ["./src/*"]
- }
+ },
+ "types": ["./components"]
},
- "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"],
+ "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue", "components.d.ts", "auto-imports.d.ts", "types/*.d.ts"],
"references": [{ "path": "./tsconfig.node.json" }]
}
diff --git a/types/env.d.ts b/types/env.d.ts
new file mode 100644
index 0000000..575baf7
--- /dev/null
+++ b/types/env.d.ts
@@ -0,0 +1,3 @@
+// env.d.ts
+///
+///
diff --git a/vite.config.ts b/vite.config.ts
index 62a5a50..2e16a90 100644
--- a/vite.config.ts
+++ b/vite.config.ts
@@ -1,8 +1,9 @@
-///
-
import path from "node:path";
import legacy from "@vitejs/plugin-legacy";
import vue from "@vitejs/plugin-vue";
+import autoImport from "unplugin-auto-import/vite";
+import { IonicResolver } from "unplugin-vue-components/resolvers";
+import components from "unplugin-vue-components/vite";
import { defineConfig } from "vite";
// https://vitejs.dev/config/
@@ -10,6 +11,14 @@ export default defineConfig({
plugins: [
vue(),
legacy(),
+ autoImport({
+ imports: ["vue", "vue-router"],
+ resolvers: [IonicResolver()],
+ }),
+ components({
+ directoryAsNamespace: true,
+ resolvers: [IonicResolver()],
+ }),
],
resolve: {
alias: {