diff --git a/app/app.vue b/app/app.vue index 490f2bf..af13f7e 100644 --- a/app/app.vue +++ b/app/app.vue @@ -5,6 +5,14 @@ diff --git a/app/assets/css/tailwind.css b/app/assets/css/tailwind.css new file mode 100644 index 0000000..decef86 --- /dev/null +++ b/app/assets/css/tailwind.css @@ -0,0 +1,10 @@ +@import "@fontsource-variable/nunito"; + +html, body { + --font-family: 'Nunito Variable', sans-serif; + font-family: var(--font-family); +} + +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/app/assets/images/cloudy-lamb.png b/app/assets/images/cloudy-lamb.png new file mode 100755 index 0000000..0eeb8c1 Binary files /dev/null and b/app/assets/images/cloudy-lamb.png differ diff --git a/app/assets/images/cloudy-lamb@dark.png b/app/assets/images/cloudy-lamb@dark.png new file mode 100755 index 0000000..e8c9723 Binary files /dev/null and b/app/assets/images/cloudy-lamb@dark.png differ diff --git a/app/components/CaptchaWidget.vue b/app/components/CaptchaWidget.vue new file mode 100644 index 0000000..66c7dbf --- /dev/null +++ b/app/components/CaptchaWidget.vue @@ -0,0 +1,70 @@ + + + diff --git a/app/pages/auth/create-account.vue b/app/pages/auth/create-account.vue new file mode 100644 index 0000000..9479106 --- /dev/null +++ b/app/pages/auth/create-account.vue @@ -0,0 +1,163 @@ + + + diff --git a/app/pages/auth/login.vue b/app/pages/auth/login.vue new file mode 100644 index 0000000..dd673e9 --- /dev/null +++ b/app/pages/auth/login.vue @@ -0,0 +1,434 @@ + + + diff --git a/app/pages/index.vue b/app/pages/index.vue index dc52b1f..f8a8569 100644 --- a/app/pages/index.vue +++ b/app/pages/index.vue @@ -1,19 +1,17 @@ + + diff --git a/app/types/api/geo.ts b/app/types/api/geo.ts new file mode 100644 index 0000000..5bbc68a --- /dev/null +++ b/app/types/api/geo.ts @@ -0,0 +1,65 @@ +export interface GeoIpLocation { + latitude: number | null + longitude: number | null + countryCode: string | null + country: string | null + city: string | null +} + +export interface SnAuthChallenge { + id: string + expiredAt: string | null + stepRemain: number + stepTotal: number + failedAttempts: number + type: number + blacklistFactors: string[] + audiences: unknown[] + scopes: unknown[] + ipAddress: string + userAgent: string + nonce: string | null + location: GeoIpLocation | null + accountId: string + createdAt: string + updatedAt: string + deletedAt: string | null +} + +export interface SnAuthSession { + id: string + label: string | null + lastGrantedAt: string + expiredAt: string | null + accountId: string + challengeId: string + challenge: SnAuthChallenge + createdAt: string + updatedAt: string + deletedAt: string | null +} + +export interface SnAuthFactor { + id: string + type: number + contact?: string | null + createdAt: string + updatedAt: string + deletedAt: string | null + expiredAt: string | null + enabledAt: string | null + trustworthy: number + createdResponse: Record | null +} + +export interface SnAccountConnection { + id: string + accountId: string + provider: string + providedIdentifier: string + meta: Record + lastUsedAt: string + createdAt: string + updatedAt: string + deletedAt: string | null +} diff --git a/app/types/api/index.ts b/app/types/api/index.ts index b403f8d..3aa2c88 100644 --- a/app/types/api/index.ts +++ b/app/types/api/index.ts @@ -4,3 +4,4 @@ export type { SnVerification, SnPublisher } from './publisher' export type { SnActivity } from './activity' export type { SnVersion } from './version' export type { SnAccountLink, SnAccountBadge, SnAccountPerkSubscription, SnAccountProfile, SnAccount } from './user' +export type { GeoIpLocation, SnAuthChallenge, SnAuthSession, SnAuthFactor, SnAccountConnection } from './geo' diff --git a/bun.lock b/bun.lock index b58fa44..a358599 100644 --- a/bun.lock +++ b/bun.lock @@ -7,6 +7,7 @@ "@date-io/luxon": "^3.2.0", "@fingerprintjs/fingerprintjs": "^4.6.2", "@fontsource-variable/nunito": "^5.2.7", + "@hcaptcha/vue3-hcaptcha": "^1.3.0", "@nuxt/eslint": "1.9.0", "@nuxt/image": "1.11.0", "@nuxtjs/i18n": "10.1.0", @@ -194,6 +195,8 @@ "@fontsource-variable/nunito": ["@fontsource-variable/nunito@5.2.7", "", {}, "sha512-2N8QhatkyKgSUbAGZO2FYLioxA32+RyI1EplVLawbpkGjUeui9Qg9VMrpkCaik1ydjFjfLV+kzQ0cGEsMrMenQ=="], + "@hcaptcha/vue3-hcaptcha": ["@hcaptcha/vue3-hcaptcha@1.3.0", "", { "dependencies": { "vue": "^3.2.19" } }, "sha512-IEonS6JiYdU7uy6aeib8cYtMO4nj8utwStbA9bWHyYbOvOvhpkV+AW8vfSKh6SntYxqle/TRwhv+kU9p92CfsA=="], + "@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="], "@humanfs/node": ["@humanfs/node@0.16.7", "", { "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.4.0" } }, "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ=="], diff --git a/nuxt.config.ts b/nuxt.config.ts index 7832393..7d3a259 100644 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -10,6 +10,9 @@ export default defineNuxtConfig({ "vuetify-nuxt-module", "@nuxtjs/i18n" ], + pinia: { + storesDirs: ["./app/stores/**"] + }, features: { inlineStyles: false }, diff --git a/package.json b/package.json index 3bc86f7..0a77788 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "@date-io/luxon": "^3.2.0", "@fingerprintjs/fingerprintjs": "^4.6.2", "@fontsource-variable/nunito": "^5.2.7", + "@hcaptcha/vue3-hcaptcha": "^1.3.0", "@nuxt/eslint": "1.9.0", "@nuxt/image": "1.11.0", "@nuxtjs/i18n": "10.1.0", diff --git a/tailwind.config.ts b/tailwind.config.ts new file mode 100644 index 0000000..cfc6e88 --- /dev/null +++ b/tailwind.config.ts @@ -0,0 +1,11 @@ +import type { Config } from "tailwindcss" + +export default >{ + theme: { + extend: { + fontFamily: { + sans: ["Nunito Variable", "Helvatica", "sans-serif"] + } + } + } +} diff --git a/vuetify.config.ts b/vuetify.config.ts index 059e058..e932c1a 100644 --- a/vuetify.config.ts +++ b/vuetify.config.ts @@ -8,5 +8,5 @@ export default defineVuetifyConfiguration({ }, date: { adapter: 'luxon' - } + }, });