2025-12-18 13:50:39 +08:00
|
|
|
# Layout Components
|
|
|
|
|
|
|
|
|
|
Vue 3 layout components for the Sub2API frontend, built with Composition API, TypeScript, and TailwindCSS.
|
|
|
|
|
|
|
|
|
|
## Components
|
|
|
|
|
|
|
|
|
|
### 1. AppLayout.vue
|
2025-12-25 08:40:12 -08:00
|
|
|
|
2025-12-18 13:50:39 +08:00
|
|
|
Main application layout with sidebar and header.
|
|
|
|
|
|
|
|
|
|
**Usage:**
|
2025-12-25 08:40:12 -08:00
|
|
|
|
2025-12-18 13:50:39 +08:00
|
|
|
```vue
|
|
|
|
|
<template>
|
|
|
|
|
<AppLayout>
|
|
|
|
|
<!-- Your page content here -->
|
|
|
|
|
<h1>Dashboard</h1>
|
|
|
|
|
<p>Welcome to your dashboard!</p>
|
|
|
|
|
</AppLayout>
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
<script setup lang="ts">
|
2025-12-25 08:40:12 -08:00
|
|
|
import { AppLayout } from '@/components/layout'
|
2025-12-18 13:50:39 +08:00
|
|
|
</script>
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
**Features:**
|
2025-12-25 08:40:12 -08:00
|
|
|
|
2025-12-18 13:50:39 +08:00
|
|
|
- Responsive sidebar (collapsible)
|
|
|
|
|
- Fixed header at top
|
|
|
|
|
- Main content area with slot
|
|
|
|
|
- Automatically adjusts margin based on sidebar state
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
### 2. AppSidebar.vue
|
2025-12-25 08:40:12 -08:00
|
|
|
|
2025-12-18 13:50:39 +08:00
|
|
|
Navigation sidebar with user and admin sections.
|
|
|
|
|
|
|
|
|
|
**Features:**
|
2025-12-25 08:40:12 -08:00
|
|
|
|
2025-12-18 13:50:39 +08:00
|
|
|
- Logo/brand at top
|
|
|
|
|
- User navigation links:
|
|
|
|
|
- Dashboard
|
|
|
|
|
- API Keys
|
|
|
|
|
- Usage
|
|
|
|
|
- Redeem
|
|
|
|
|
- Profile
|
|
|
|
|
- Admin navigation links (shown only if user is admin):
|
|
|
|
|
- Admin Dashboard
|
|
|
|
|
- Users
|
|
|
|
|
- Groups
|
|
|
|
|
- Accounts
|
|
|
|
|
- Proxies
|
|
|
|
|
- Redeem Codes
|
|
|
|
|
- Collapsible sidebar with toggle button
|
|
|
|
|
- Active route highlighting
|
|
|
|
|
- Icons using HTML entities
|
|
|
|
|
- Responsive (mobile-friendly)
|
|
|
|
|
|
|
|
|
|
**Used automatically by AppLayout** - no need to import separately.
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
### 3. AppHeader.vue
|
2025-12-25 08:40:12 -08:00
|
|
|
|
2025-12-18 13:50:39 +08:00
|
|
|
Top header with user info and actions.
|
|
|
|
|
|
|
|
|
|
**Features:**
|
2025-12-25 08:40:12 -08:00
|
|
|
|
2025-12-18 13:50:39 +08:00
|
|
|
- Mobile menu toggle button
|
|
|
|
|
- Page title (from route meta or slot)
|
|
|
|
|
- User balance display (desktop only)
|
|
|
|
|
- User dropdown menu with:
|
|
|
|
|
- Profile link
|
|
|
|
|
- Logout button
|
|
|
|
|
- User avatar with initials
|
|
|
|
|
- Click-outside handling for dropdown
|
|
|
|
|
- Responsive design
|
|
|
|
|
|
|
|
|
|
**Usage with custom title:**
|
2025-12-25 08:40:12 -08:00
|
|
|
|
2025-12-18 13:50:39 +08:00
|
|
|
```vue
|
|
|
|
|
<template>
|
|
|
|
|
<AppLayout>
|
2025-12-25 08:40:12 -08:00
|
|
|
<template #title> Custom Page Title </template>
|
2025-12-18 13:50:39 +08:00
|
|
|
|
|
|
|
|
<!-- Your content -->
|
|
|
|
|
</AppLayout>
|
|
|
|
|
</template>
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
**Used automatically by AppLayout** - no need to import separately.
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
### 4. AuthLayout.vue
|
2025-12-25 08:40:12 -08:00
|
|
|
|
2025-12-18 13:50:39 +08:00
|
|
|
Simple centered layout for authentication pages (login/register).
|
|
|
|
|
|
|
|
|
|
**Usage:**
|
2025-12-25 08:40:12 -08:00
|
|
|
|
2025-12-18 13:50:39 +08:00
|
|
|
```vue
|
|
|
|
|
<template>
|
|
|
|
|
<AuthLayout>
|
|
|
|
|
<!-- Login/Register form content -->
|
2025-12-25 08:40:12 -08:00
|
|
|
<h2 class="mb-6 text-2xl font-bold">Login</h2>
|
2025-12-18 13:50:39 +08:00
|
|
|
|
|
|
|
|
<form @submit.prevent="handleLogin">
|
|
|
|
|
<!-- Form fields -->
|
|
|
|
|
</form>
|
|
|
|
|
|
|
|
|
|
<!-- Optional footer slot -->
|
|
|
|
|
<template #footer>
|
|
|
|
|
<p>
|
|
|
|
|
Don't have an account?
|
2025-12-25 08:40:12 -08:00
|
|
|
<router-link to="/register" class="text-indigo-600 hover:underline"> Sign up </router-link>
|
2025-12-18 13:50:39 +08:00
|
|
|
</p>
|
|
|
|
|
</template>
|
|
|
|
|
</AuthLayout>
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
<script setup lang="ts">
|
2025-12-25 08:40:12 -08:00
|
|
|
import { AuthLayout } from '@/components/layout'
|
2025-12-18 13:50:39 +08:00
|
|
|
|
|
|
|
|
function handleLogin() {
|
|
|
|
|
// Login logic
|
|
|
|
|
}
|
|
|
|
|
</script>
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
**Features:**
|
2025-12-25 08:40:12 -08:00
|
|
|
|
2025-12-18 13:50:39 +08:00
|
|
|
- Centered card container
|
|
|
|
|
- Gradient background
|
|
|
|
|
- Logo/brand at top
|
|
|
|
|
- Main content slot
|
|
|
|
|
- Optional footer slot for links
|
|
|
|
|
- Fully responsive
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## Route Configuration
|
|
|
|
|
|
|
|
|
|
To set page titles in the header, add meta to your routes:
|
|
|
|
|
|
|
|
|
|
```typescript
|
|
|
|
|
// router/index.ts
|
|
|
|
|
const routes = [
|
|
|
|
|
{
|
|
|
|
|
path: '/dashboard',
|
|
|
|
|
component: DashboardView,
|
2025-12-25 08:40:12 -08:00
|
|
|
meta: { title: 'Dashboard' }
|
2025-12-18 13:50:39 +08:00
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
path: '/api-keys',
|
|
|
|
|
component: ApiKeysView,
|
2025-12-25 08:40:12 -08:00
|
|
|
meta: { title: 'API Keys' }
|
|
|
|
|
}
|
2025-12-18 13:50:39 +08:00
|
|
|
// ...
|
2025-12-25 08:40:12 -08:00
|
|
|
]
|
2025-12-18 13:50:39 +08:00
|
|
|
```
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## Store Dependencies
|
|
|
|
|
|
|
|
|
|
These components use the following Pinia stores:
|
|
|
|
|
|
|
|
|
|
- **useAuthStore**: For user authentication state, role checking, and logout
|
|
|
|
|
- **useAppStore**: For sidebar state management and toast notifications
|
|
|
|
|
|
|
|
|
|
Make sure these stores are properly initialized in your app.
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## Styling
|
|
|
|
|
|
|
|
|
|
All components use TailwindCSS utility classes. Make sure your `tailwind.config.js` includes the component paths:
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
module.exports = {
|
2025-12-25 08:40:12 -08:00
|
|
|
content: ['./index.html', './src/**/*.{vue,js,ts,jsx,tsx}']
|
2025-12-18 13:50:39 +08:00
|
|
|
// ...
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## Icons
|
|
|
|
|
|
|
|
|
|
Components use HTML entity icons for simplicity:
|
2025-12-25 08:40:12 -08:00
|
|
|
|
2025-12-18 13:50:39 +08:00
|
|
|
- 📈 Chart (Dashboard)
|
|
|
|
|
- 🔑 Key (API Keys)
|
|
|
|
|
- 📊 Bar Chart (Usage)
|
|
|
|
|
- 🎁 Gift (Redeem)
|
|
|
|
|
- 👤 User (Profile)
|
|
|
|
|
- 🔌 Admin
|
|
|
|
|
- 👥 Users
|
|
|
|
|
- 📁 Folder (Groups)
|
|
|
|
|
- 🌐 Globe (Accounts)
|
|
|
|
|
- 🔄 Network (Proxies)
|
|
|
|
|
- 🏷 Ticket (Redeem Codes)
|
|
|
|
|
|
|
|
|
|
You can replace these with your preferred icon library (e.g., Heroicons, Font Awesome) if needed.
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## Mobile Responsiveness
|
|
|
|
|
|
|
|
|
|
All components are fully responsive:
|
2025-12-25 08:40:12 -08:00
|
|
|
|
2025-12-18 13:50:39 +08:00
|
|
|
- **AppSidebar**: Fixed positioning on desktop, hidden by default on mobile
|
|
|
|
|
- **AppHeader**: Shows mobile menu toggle on small screens, hides balance display
|
|
|
|
|
- **AuthLayout**: Adapts padding and card size for mobile devices
|
|
|
|
|
|
|
|
|
|
The sidebar uses Tailwind's responsive breakpoints (md:) to adjust behavior.
|