mirror of
https://github.com/InvoiceShelf/InvoiceShelf.git
synced 2026-05-07 03:54:04 +00:00
Phase 4a: Feature modules — layouts, auth, admin, dashboard,
customers, items, invoices, estimates, shared document form 77 files, 14451 lines. Typed layouts (CompanyLayout, AuthLayout, header, sidebar, company switcher), auth views (login, register, forgot/reset password), admin feature (dashboard, companies, users, settings with typed store), company features (dashboard with chart/ stats, customers CRUD, items CRUD, invoices CRUD with full store, estimates CRUD with full store), and shared document form components (items table, item row, totals, notes, tax popup, template select, exchange rate converter, calculation composable). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
134
resources/scripts-v2/layouts/AuthLayout.vue
Normal file
134
resources/scripts-v2/layouts/AuthLayout.vue
Normal file
@@ -0,0 +1,134 @@
|
||||
<template>
|
||||
<div class="grid h-screen grid-cols-12 overflow-y-hidden bg-surface-tertiary">
|
||||
<NotificationRoot />
|
||||
|
||||
<div
|
||||
class="
|
||||
flex items-center justify-center w-full max-w-sm col-span-12
|
||||
p-4 mx-auto text-heading md:p-8 md:col-span-6 lg:col-span-4
|
||||
flex-2 md:pb-48 md:pt-40
|
||||
"
|
||||
>
|
||||
<div class="w-full">
|
||||
<MainLogo
|
||||
v-if="!loginPageLogo"
|
||||
class="block w-48 h-auto max-w-full mb-32 text-primary-500"
|
||||
/>
|
||||
|
||||
<img
|
||||
v-else
|
||||
:src="loginPageLogo"
|
||||
class="block w-48 h-auto max-w-full mb-32 text-primary-500"
|
||||
/>
|
||||
|
||||
<router-view />
|
||||
|
||||
<div
|
||||
class="
|
||||
pt-24 mt-0 text-sm not-italic font-medium leading-relaxed
|
||||
text-left text-subtle md:pt-40
|
||||
"
|
||||
>
|
||||
<p v-if="copyrightText" class="mb-3">
|
||||
{{ copyrightText }}
|
||||
</p>
|
||||
<p v-else class="mb-3">
|
||||
Powered by
|
||||
<a
|
||||
href="https://invoiceshelf.com/"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
class="text-primary-500 hover:underline"
|
||||
>InvoiceShelf</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div
|
||||
class="
|
||||
relative flex-col items-center justify-center hidden w-full h-full
|
||||
pl-10 bg-no-repeat bg-cover md:col-span-6 lg:col-span-8
|
||||
md:flex content-box overflow-hidden
|
||||
"
|
||||
>
|
||||
<LoginBackground class="absolute h-full w-full" />
|
||||
|
||||
<LoginPlanetCrater
|
||||
class="absolute z-10 top-0 right-0 h-[300px] w-[420px]"
|
||||
/>
|
||||
|
||||
<LoginBackgroundOverlay class="absolute h-full w-full right-[7.5%]" />
|
||||
|
||||
<div class="md:pl-10 xl:pl-0 relative z-50 w-7/12 xl:w-5/12">
|
||||
<h1
|
||||
class="
|
||||
hidden mb-3 text-3xl leading-normal text-left text-white
|
||||
xl:text-5xl xl:leading-tight md:none lg:block
|
||||
"
|
||||
>
|
||||
{{ pageHeading }}
|
||||
</h1>
|
||||
<p
|
||||
class="
|
||||
hidden text-sm not-italic font-normal leading-normal text-left
|
||||
text-gray-100 xl:text-base xl:leading-6 md:none lg:block
|
||||
"
|
||||
>
|
||||
{{ pageDescription }}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<LoginBottomVector
|
||||
class="
|
||||
absolute z-50 w-full bg-no-repeat content-bottom
|
||||
h-[15vw] lg:h-[22vw] right-[32%] bottom-0
|
||||
"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { computed } from 'vue'
|
||||
import NotificationRoot from '../../components/notifications/NotificationRoot.vue'
|
||||
import MainLogo from '../../components/icons/MainLogo.vue'
|
||||
import LoginBackground from '../../components/icons/LoginBackground.vue'
|
||||
import LoginPlanetCrater from '../../components/icons/LoginPlanetCrater.vue'
|
||||
import LoginBottomVector from '../../components/icons/LoginBottomVector.vue'
|
||||
import LoginBackgroundOverlay from '../../components/icons/LoginBackgroundOverlay.vue'
|
||||
|
||||
declare global {
|
||||
interface Window {
|
||||
login_page_heading?: string
|
||||
login_page_description?: string
|
||||
copyright_text?: string
|
||||
login_page_logo?: string
|
||||
}
|
||||
}
|
||||
|
||||
const pageHeading = computed<string>(() => {
|
||||
if (window.login_page_heading) {
|
||||
return window.login_page_heading
|
||||
}
|
||||
return 'Simple Invoicing for Individuals Small Businesses'
|
||||
})
|
||||
|
||||
const pageDescription = computed<string>(() => {
|
||||
if (window.login_page_description) {
|
||||
return window.login_page_description
|
||||
}
|
||||
return 'InvoiceShelf helps you track expenses, record payments & generate beautiful invoices & estimates.'
|
||||
})
|
||||
|
||||
const copyrightText = computed<string | null>(() => {
|
||||
return window.copyright_text ?? null
|
||||
})
|
||||
|
||||
const loginPageLogo = computed<string | false>(() => {
|
||||
if (window.login_page_logo) {
|
||||
return window.login_page_logo
|
||||
}
|
||||
return false
|
||||
})
|
||||
</script>
|
||||
Reference in New Issue
Block a user