From cd9aab8979a80ed831e7887d5ba6358584c428ad Mon Sep 17 00:00:00 2001 From: lethdat Date: Sun, 1 Mar 2026 22:49:30 +0700 Subject: [PATCH] feat(settings): add Billing, Danger Zone, Domains DNS, Notification, Player, and Security settings pages - Implemented Billing page with wallet balance, current plan, usage stats, available plans, and payment history. - Created Danger Zone page for account deletion and data clearing actions with confirmation prompts. - Developed Domains DNS page for managing whitelisted domains for iframe embedding, including add and remove functionality. - Added Notification Settings page to configure email, push, marketing, and Telegram notifications. - Introduced Player Settings page to customize video player behavior such as autoplay, loop, and controls visibility. - Established Security and Connected Accounts page for managing user profile, two-factor authentication, and connected accounts. --- .claude/settings.local.json | 7 + CLAUDE.md | 46 ++- components.d.ts | 68 +++- src/components/DashboardNav.vue | 9 +- src/components/icons/ActivityIcon.vue | 12 + src/components/icons/AdvertisementIcon.vue | 9 + src/components/icons/AlertTriangle.vue | 13 + src/components/icons/Bell.vue | 2 +- src/components/icons/BellIcon.vue | 12 + src/components/icons/CheckIcon.vue | 10 +- src/components/icons/CoinsIcon.vue | 13 + src/components/icons/DownloadIcon.vue | 13 + src/components/icons/Globe.vue | 9 + src/components/icons/GlobeIcon.vue | 14 + src/components/icons/HeartIcon.vue | 11 + src/components/icons/ImageIcon.vue | 13 + src/components/icons/LayoutDashboard.vue | 13 + src/components/icons/LockIcon.vue | 12 + src/components/icons/MailIcon.vue | 12 + src/components/icons/MonitorIcon.vue | 13 + src/components/icons/PlayIcon.vue | 11 + src/components/icons/PlusIcon.vue | 12 + src/components/icons/PlusSquareIcon.vue | 13 + src/components/icons/RepeatIcon.vue | 14 + src/components/icons/SendIcon.vue | 12 + src/components/icons/SettingsIcon.vue | 6 +- src/components/icons/SlidersIcon.vue | 15 + src/components/icons/TelegramIcon.vue | 9 + src/components/icons/UploadIcon.vue | 13 + src/components/icons/UserIcon.vue | 10 + src/components/icons/VideoPlayIcon.vue | 9 + src/components/icons/VolumeIcon.vue | 14 + src/components/icons/VolumeOffIcon.vue | 13 + src/components/icons/WifiIcon.vue | 14 + src/components/icons/XIcon.vue | 12 + src/routes/index.ts | 129 +++++-- src/routes/plans/Plans.vue | 205 ---------- .../plans/components/CurrentPlanCard.vue | 39 -- .../plans/components/EditPlanDialog.vue | 90 ----- .../components/ManageSubscriptionDialog.vue | 57 --- src/routes/plans/components/PlanList.vue | 107 ------ .../plans/components/PlanPaymentHistory.vue | 93 ----- .../plans/components/UsageStatsCard.vue | 39 -- src/routes/profile/Profile.vue | 106 ------ .../profile/components/AccountStatusCard.vue | 47 --- .../components/ChangePasswordDialog.vue | 102 ----- .../profile/components/LinkedAccountsCard.vue | 25 -- src/routes/profile/components/ProfileHero.vue | 83 ----- .../profile/components/ProfileInfoCard.vue | 81 ---- src/routes/settings/Settings.vue | 168 +++++++++ .../components/AvailablePlansCard.vue | 95 +++++ .../components/ConnectedAccountsCard.vue | 196 ++++++++++ .../settings/components/CurrentPlanCard.vue | 39 ++ .../components/PaymentHistoryCard.vue | 97 +++++ .../components/ProfileInformationCard.vue | 165 ++++++++ .../components/SecuritySettingsCard.vue | 198 ++++++++++ .../settings/components/UsageStatsCard.vue | 83 +++++ .../settings/components/WalletBalanceCard.vue | 189 ++++++++++ src/routes/settings/pages/AdsVast.vue | 351 ++++++++++++++++++ src/routes/settings/pages/Billing.vue | 159 ++++++++ src/routes/settings/pages/DangerZone.vue | 94 +++++ src/routes/settings/pages/DomainsDns.vue | 237 ++++++++++++ .../settings/pages/NotificationSettings.vue | 87 +++++ src/routes/settings/pages/PlayerSettings.vue | 172 +++++++++ .../settings/pages/SecurityNConnected.vue | 262 +++++++++++++ 65 files changed, 3150 insertions(+), 1133 deletions(-) create mode 100644 .claude/settings.local.json create mode 100644 src/components/icons/ActivityIcon.vue create mode 100644 src/components/icons/AdvertisementIcon.vue create mode 100644 src/components/icons/AlertTriangle.vue create mode 100644 src/components/icons/BellIcon.vue create mode 100644 src/components/icons/CoinsIcon.vue create mode 100644 src/components/icons/DownloadIcon.vue create mode 100644 src/components/icons/Globe.vue create mode 100644 src/components/icons/GlobeIcon.vue create mode 100644 src/components/icons/HeartIcon.vue create mode 100644 src/components/icons/ImageIcon.vue create mode 100644 src/components/icons/LayoutDashboard.vue create mode 100644 src/components/icons/LockIcon.vue create mode 100644 src/components/icons/MailIcon.vue create mode 100644 src/components/icons/MonitorIcon.vue create mode 100644 src/components/icons/PlayIcon.vue create mode 100644 src/components/icons/PlusIcon.vue create mode 100644 src/components/icons/PlusSquareIcon.vue create mode 100644 src/components/icons/RepeatIcon.vue create mode 100644 src/components/icons/SendIcon.vue create mode 100644 src/components/icons/SlidersIcon.vue create mode 100644 src/components/icons/TelegramIcon.vue create mode 100644 src/components/icons/UploadIcon.vue create mode 100644 src/components/icons/UserIcon.vue create mode 100644 src/components/icons/VideoPlayIcon.vue create mode 100644 src/components/icons/VolumeIcon.vue create mode 100644 src/components/icons/VolumeOffIcon.vue create mode 100644 src/components/icons/WifiIcon.vue create mode 100644 src/components/icons/XIcon.vue delete mode 100644 src/routes/plans/Plans.vue delete mode 100644 src/routes/plans/components/CurrentPlanCard.vue delete mode 100644 src/routes/plans/components/EditPlanDialog.vue delete mode 100644 src/routes/plans/components/ManageSubscriptionDialog.vue delete mode 100644 src/routes/plans/components/PlanList.vue delete mode 100644 src/routes/plans/components/PlanPaymentHistory.vue delete mode 100644 src/routes/plans/components/UsageStatsCard.vue delete mode 100644 src/routes/profile/Profile.vue delete mode 100644 src/routes/profile/components/AccountStatusCard.vue delete mode 100644 src/routes/profile/components/ChangePasswordDialog.vue delete mode 100644 src/routes/profile/components/LinkedAccountsCard.vue delete mode 100644 src/routes/profile/components/ProfileHero.vue delete mode 100644 src/routes/profile/components/ProfileInfoCard.vue create mode 100644 src/routes/settings/Settings.vue create mode 100644 src/routes/settings/components/AvailablePlansCard.vue create mode 100644 src/routes/settings/components/ConnectedAccountsCard.vue create mode 100644 src/routes/settings/components/CurrentPlanCard.vue create mode 100644 src/routes/settings/components/PaymentHistoryCard.vue create mode 100644 src/routes/settings/components/ProfileInformationCard.vue create mode 100644 src/routes/settings/components/SecuritySettingsCard.vue create mode 100644 src/routes/settings/components/UsageStatsCard.vue create mode 100644 src/routes/settings/components/WalletBalanceCard.vue create mode 100644 src/routes/settings/pages/AdsVast.vue create mode 100644 src/routes/settings/pages/Billing.vue create mode 100644 src/routes/settings/pages/DangerZone.vue create mode 100644 src/routes/settings/pages/DomainsDns.vue create mode 100644 src/routes/settings/pages/NotificationSettings.vue create mode 100644 src/routes/settings/pages/PlayerSettings.vue create mode 100644 src/routes/settings/pages/SecurityNConnected.vue diff --git a/.claude/settings.local.json b/.claude/settings.local.json new file mode 100644 index 0000000..608307c --- /dev/null +++ b/.claude/settings.local.json @@ -0,0 +1,7 @@ +{ + "permissions": { + "allow": [ + "Bash(bun run build)" + ] + } +} diff --git a/CLAUDE.md b/CLAUDE.md index 17ec337..125a589 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -40,6 +40,8 @@ bun run cf-typegen bun run tail ``` +**Note**: The project uses Bun as the package manager. If using npm/yarn, replace `bun` with `npm run` or `yarn`. + ## Architecture ### SSR Architecture @@ -70,9 +72,10 @@ Uses **Pinia Colada** for server state with SSR hydration: The API client (`src/api/client.ts`) is auto-generated from OpenAPI spec: - Uses `customFetch` adapter that differs between client/server -- Server adapter (`httpClientAdapter.server.ts`): Forwards cookies, merges headers, calls `api.pipic.fun` -- Client adapter (`httpClientAdapter.client.ts`): Standard fetch with credentials -- API proxy route: `/r/*` paths proxy to `https://api.pipic.fun` +- Server adapter (`httpClientAdapter.server.ts`): Forwards cookies via `hono/context-storage`, merges headers, calls `https://api.pipic.fun` +- Client adapter (`httpClientAdapter.client.ts`): Standard fetch with `credentials: "include"` +- API proxy route: `/r/*` paths proxy to `https://api.pipic.fun` via `apiProxyMiddleware` +- Base API URL constant: `baseAPIURL = "https://api.pipic.fun"` ### Routing Structure @@ -119,6 +122,10 @@ Upload queue (`src/composables/useUploadQueue.ts`): - Presigned POST URLs fetched from API - Parallel chunk upload for large files - Progress tracking with speed calculation +- **Chunk configuration**: 90MB chunks, max 3 parallel uploads, max 3 retries +- **Upload limits**: Max 5 items in queue +- Uses `tmpfiles.org` API for chunk uploads, `/merge` endpoint for finalizing +- Cancel support via XHR abort tracking ### Type Safety @@ -148,6 +155,18 @@ Cloudflare Worker bindings (configured in `wrangler.jsonc`): | Wrangler config | `wrangler.jsonc` | | Vite config | `vite.config.ts` | +## Server Structure + +Middleware and routes are organized in `src/server/`: + +**Middlewares** (`src/server/middlewares/`): +- `setup.ts` - Global middleware: `contextStorage`, CORS, mobile detection via `is-mobile` +- `apiProxy.ts` - Proxies `/r/*` requests to external API + +**Routes** (`src/server/routes/`): +- `ssr.ts` - Handles SSR rendering and state serialization +- `display.ts`, `merge.ts`, `manifest.ts`, `wellKnown.ts` - API endpoints + ## Development Notes - Always use `customFetch` from `@httpClientAdapter` for API calls, never raw fetch @@ -155,4 +174,25 @@ Cloudflare Worker bindings (configured in `wrangler.jsonc`): - MQTT client in `src/lib/liteMqtt.ts` (using `TinyMqttClient`) handles real-time notifications - Icons are custom Vue components in `src/components/icons/` - Upload indicator is a global component showing queue status +- Root component uses error boundary wrapper: `withErrorBoundary(RouterView)` in `src/main.ts` - **Testing & Linting**: There are currently no automated test suites (like Vitest) or linting tools (like ESLint/Prettier) configured. + +## Code Organization + +### Component Structure + +- Keep view components small and focused - extract logical sections into child components +- Page views should compose child components, not contain all logic inline +- Example: `src/routes/settings/Settings.vue` uses child components in `src/routes/settings/components/` +- Components that exceed ~200 lines should be considered for refactoring +- Use `components/` subfolder pattern for page-specific components: `src/routes/{feature}/components/` + +### Icons + +- **Use custom SVG icon components** from `src/components/icons/` for UI icons (e.g., `Home`, `Video`, `Bell`, `SettingsIcon`) +- Custom icons are Vue components with `filled` prop for active/filled state +- PrimeIcons (`pi pi-*` class) should **only** be used for: + - Button icons in PrimeVue components (e.g., `icon="pi pi-check"`) + - Dialog/action icons where no custom SVG exists +- **Do NOT use** `` for navigation icons, action buttons, or UI elements that have custom SVG equivalents +- When adding new icons, create SVG components in `src/components/icons/` following the existing pattern (support `filled` prop) diff --git a/components.d.ts b/components.d.ts index f4114e8..ccb3efe 100644 --- a/components.d.ts +++ b/components.d.ts @@ -12,11 +12,15 @@ export {} /* prettier-ignore */ declare module 'vue' { export interface GlobalComponents { + ActivityIcon: typeof import('./src/components/icons/ActivityIcon.vue')['default'] Add: typeof import('./src/components/icons/Add.vue')['default'] + AdvertisementIcon: typeof import('./src/components/icons/AdvertisementIcon.vue')['default'] + AlertTriangle: typeof import('./src/components/icons/AlertTriangle.vue')['default'] AlertTriangleIcon: typeof import('./src/components/icons/AlertTriangleIcon.vue')['default'] ArrowDownTray: typeof import('./src/components/icons/ArrowDownTray.vue')['default'] ArrowRightIcon: typeof import('./src/components/icons/ArrowRightIcon.vue')['default'] Bell: typeof import('./src/components/icons/Bell.vue')['default'] + BellIcon: typeof import('./src/components/icons/BellIcon.vue')['default'] Button: typeof import('primevue/button')['default'] Chart: typeof import('./src/components/icons/Chart.vue')['default'] Checkbox: typeof import('primevue/checkbox')['default'] @@ -24,56 +28,82 @@ declare module 'vue' { CheckIcon: typeof import('./src/components/icons/CheckIcon.vue')['default'] CheckMarkIcon: typeof import('./src/components/icons/CheckMarkIcon.vue')['default'] ClientOnly: typeof import('./src/components/ClientOnly.tsx')['default'] + CoinsIcon: typeof import('./src/components/icons/CoinsIcon.vue')['default'] Credit: typeof import('./src/components/icons/Credit.vue')['default'] CreditCardIcon: typeof import('./src/components/icons/CreditCardIcon.vue')['default'] DashboardLayout: typeof import('./src/components/DashboardLayout.vue')['default'] DashboardNav: typeof import('./src/components/DashboardNav.vue')['default'] Dialog: typeof import('primevue/dialog')['default'] + DownloadIcon: typeof import('./src/components/icons/DownloadIcon.vue')['default'] EllipsisVerticalIcon: typeof import('./src/components/icons/EllipsisVerticalIcon.vue')['default'] EmptyState: typeof import('./src/components/dashboard/EmptyState.vue')['default'] FileUploadType: typeof import('./src/components/icons/FileUploadType.vue')['default'] - FloatLabel: typeof import('primevue/floatlabel')['default'] GlobalUploadIndicator: typeof import('./src/components/GlobalUploadIndicator.vue')['default'] + Globe: typeof import('./src/components/icons/Globe.vue')['default'] + GlobeIcon: typeof import('./src/components/icons/GlobeIcon.vue')['default'] HardDriveUpload: typeof import('./src/components/icons/HardDriveUpload.vue')['default'] + HeartIcon: typeof import('./src/components/icons/HeartIcon.vue')['default'] Home: typeof import('./src/components/icons/Home.vue')['default'] - IconField: typeof import('primevue/iconfield')['default'] + ImageIcon: typeof import('./src/components/icons/ImageIcon.vue')['default'] InfoIcon: typeof import('./src/components/icons/InfoIcon.vue')['default'] - InputIcon: typeof import('primevue/inputicon')['default'] + InputNumber: typeof import('primevue/inputnumber')['default'] InputText: typeof import('primevue/inputtext')['default'] Layout: typeof import('./src/components/icons/Layout.vue')['default'] + LayoutDashboard: typeof import('./src/components/icons/LayoutDashboard.vue')['default'] LinkIcon: typeof import('./src/components/icons/LinkIcon.vue')['default'] + LockIcon: typeof import('./src/components/icons/LockIcon.vue')['default'] + MailIcon: typeof import('./src/components/icons/MailIcon.vue')['default'] Message: typeof import('primevue/message')['default'] + MonitorIcon: typeof import('./src/components/icons/MonitorIcon.vue')['default'] NotificationDrawer: typeof import('./src/components/NotificationDrawer.vue')['default'] PageHeader: typeof import('./src/components/dashboard/PageHeader.vue')['default'] Paginator: typeof import('primevue/paginator')['default'] PanelLeft: typeof import('./src/components/icons/PanelLeft.vue')['default'] Password: typeof import('primevue/password')['default'] PencilIcon: typeof import('./src/components/icons/PencilIcon.vue')['default'] + PlayIcon: typeof import('./src/components/icons/PlayIcon.vue')['default'] + PlusIcon: typeof import('./src/components/icons/PlusIcon.vue')['default'] + PlusSquareIcon: typeof import('./src/components/icons/PlusSquareIcon.vue')['default'] + RepeatIcon: typeof import('./src/components/icons/RepeatIcon.vue')['default'] RootLayout: typeof import('./src/components/RootLayout.vue')['default'] RouterLink: typeof import('vue-router')['RouterLink'] RouterView: typeof import('vue-router')['RouterView'] - Select: typeof import('primevue/select')['default'] + SendIcon: typeof import('./src/components/icons/SendIcon.vue')['default'] SettingsIcon: typeof import('./src/components/icons/SettingsIcon.vue')['default'] Skeleton: typeof import('primevue/skeleton')['default'] + SlidersIcon: typeof import('./src/components/icons/SlidersIcon.vue')['default'] StatsCard: typeof import('./src/components/dashboard/StatsCard.vue')['default'] Tag: typeof import('primevue/tag')['default'] + TelegramIcon: typeof import('./src/components/icons/TelegramIcon.vue')['default'] TestIcon: typeof import('./src/components/icons/TestIcon.vue')['default'] + ToggleSwitch: typeof import('primevue/toggleswitch')['default'] TrashIcon: typeof import('./src/components/icons/TrashIcon.vue')['default'] Upload: typeof import('./src/components/icons/Upload.vue')['default'] + UploadIcon: typeof import('./src/components/icons/UploadIcon.vue')['default'] + UserIcon: typeof import('./src/components/icons/UserIcon.vue')['default'] Video: typeof import('./src/components/icons/Video.vue')['default'] VideoIcon: typeof import('./src/components/icons/VideoIcon.vue')['default'] + VideoPlayIcon: typeof import('./src/components/icons/VideoPlayIcon.vue')['default'] + VolumeIcon: typeof import('./src/components/icons/VolumeIcon.vue')['default'] + VolumeOffIcon: typeof import('./src/components/icons/VolumeOffIcon.vue')['default'] VueHead: typeof import('./src/components/VueHead.tsx')['default'] + WifiIcon: typeof import('./src/components/icons/WifiIcon.vue')['default'] XCircleIcon: typeof import('./src/components/icons/XCircleIcon.vue')['default'] + XIcon: typeof import('./src/components/icons/XIcon.vue')['default'] } } // For TSX support declare global { + const ActivityIcon: typeof import('./src/components/icons/ActivityIcon.vue')['default'] const Add: typeof import('./src/components/icons/Add.vue')['default'] + const AdvertisementIcon: typeof import('./src/components/icons/AdvertisementIcon.vue')['default'] + const AlertTriangle: typeof import('./src/components/icons/AlertTriangle.vue')['default'] const AlertTriangleIcon: typeof import('./src/components/icons/AlertTriangleIcon.vue')['default'] const ArrowDownTray: typeof import('./src/components/icons/ArrowDownTray.vue')['default'] const ArrowRightIcon: typeof import('./src/components/icons/ArrowRightIcon.vue')['default'] const Bell: typeof import('./src/components/icons/Bell.vue')['default'] + const BellIcon: typeof import('./src/components/icons/BellIcon.vue')['default'] const Button: typeof import('primevue/button')['default'] const Chart: typeof import('./src/components/icons/Chart.vue')['default'] const Checkbox: typeof import('primevue/checkbox')['default'] @@ -81,44 +111,66 @@ declare global { const CheckIcon: typeof import('./src/components/icons/CheckIcon.vue')['default'] const CheckMarkIcon: typeof import('./src/components/icons/CheckMarkIcon.vue')['default'] const ClientOnly: typeof import('./src/components/ClientOnly.tsx')['default'] + const CoinsIcon: typeof import('./src/components/icons/CoinsIcon.vue')['default'] const Credit: typeof import('./src/components/icons/Credit.vue')['default'] const CreditCardIcon: typeof import('./src/components/icons/CreditCardIcon.vue')['default'] const DashboardLayout: typeof import('./src/components/DashboardLayout.vue')['default'] const DashboardNav: typeof import('./src/components/DashboardNav.vue')['default'] const Dialog: typeof import('primevue/dialog')['default'] + const DownloadIcon: typeof import('./src/components/icons/DownloadIcon.vue')['default'] const EllipsisVerticalIcon: typeof import('./src/components/icons/EllipsisVerticalIcon.vue')['default'] const EmptyState: typeof import('./src/components/dashboard/EmptyState.vue')['default'] const FileUploadType: typeof import('./src/components/icons/FileUploadType.vue')['default'] - const FloatLabel: typeof import('primevue/floatlabel')['default'] const GlobalUploadIndicator: typeof import('./src/components/GlobalUploadIndicator.vue')['default'] + const Globe: typeof import('./src/components/icons/Globe.vue')['default'] + const GlobeIcon: typeof import('./src/components/icons/GlobeIcon.vue')['default'] const HardDriveUpload: typeof import('./src/components/icons/HardDriveUpload.vue')['default'] + const HeartIcon: typeof import('./src/components/icons/HeartIcon.vue')['default'] const Home: typeof import('./src/components/icons/Home.vue')['default'] - const IconField: typeof import('primevue/iconfield')['default'] + const ImageIcon: typeof import('./src/components/icons/ImageIcon.vue')['default'] const InfoIcon: typeof import('./src/components/icons/InfoIcon.vue')['default'] - const InputIcon: typeof import('primevue/inputicon')['default'] + const InputNumber: typeof import('primevue/inputnumber')['default'] const InputText: typeof import('primevue/inputtext')['default'] const Layout: typeof import('./src/components/icons/Layout.vue')['default'] + const LayoutDashboard: typeof import('./src/components/icons/LayoutDashboard.vue')['default'] const LinkIcon: typeof import('./src/components/icons/LinkIcon.vue')['default'] + const LockIcon: typeof import('./src/components/icons/LockIcon.vue')['default'] + const MailIcon: typeof import('./src/components/icons/MailIcon.vue')['default'] const Message: typeof import('primevue/message')['default'] + const MonitorIcon: typeof import('./src/components/icons/MonitorIcon.vue')['default'] const NotificationDrawer: typeof import('./src/components/NotificationDrawer.vue')['default'] const PageHeader: typeof import('./src/components/dashboard/PageHeader.vue')['default'] const Paginator: typeof import('primevue/paginator')['default'] const PanelLeft: typeof import('./src/components/icons/PanelLeft.vue')['default'] const Password: typeof import('primevue/password')['default'] const PencilIcon: typeof import('./src/components/icons/PencilIcon.vue')['default'] + const PlayIcon: typeof import('./src/components/icons/PlayIcon.vue')['default'] + const PlusIcon: typeof import('./src/components/icons/PlusIcon.vue')['default'] + const PlusSquareIcon: typeof import('./src/components/icons/PlusSquareIcon.vue')['default'] + const RepeatIcon: typeof import('./src/components/icons/RepeatIcon.vue')['default'] const RootLayout: typeof import('./src/components/RootLayout.vue')['default'] const RouterLink: typeof import('vue-router')['RouterLink'] const RouterView: typeof import('vue-router')['RouterView'] - const Select: typeof import('primevue/select')['default'] + const SendIcon: typeof import('./src/components/icons/SendIcon.vue')['default'] const SettingsIcon: typeof import('./src/components/icons/SettingsIcon.vue')['default'] const Skeleton: typeof import('primevue/skeleton')['default'] + const SlidersIcon: typeof import('./src/components/icons/SlidersIcon.vue')['default'] const StatsCard: typeof import('./src/components/dashboard/StatsCard.vue')['default'] const Tag: typeof import('primevue/tag')['default'] + const TelegramIcon: typeof import('./src/components/icons/TelegramIcon.vue')['default'] const TestIcon: typeof import('./src/components/icons/TestIcon.vue')['default'] + const ToggleSwitch: typeof import('primevue/toggleswitch')['default'] const TrashIcon: typeof import('./src/components/icons/TrashIcon.vue')['default'] const Upload: typeof import('./src/components/icons/Upload.vue')['default'] + const UploadIcon: typeof import('./src/components/icons/UploadIcon.vue')['default'] + const UserIcon: typeof import('./src/components/icons/UserIcon.vue')['default'] const Video: typeof import('./src/components/icons/Video.vue')['default'] const VideoIcon: typeof import('./src/components/icons/VideoIcon.vue')['default'] + const VideoPlayIcon: typeof import('./src/components/icons/VideoPlayIcon.vue')['default'] + const VolumeIcon: typeof import('./src/components/icons/VolumeIcon.vue')['default'] + const VolumeOffIcon: typeof import('./src/components/icons/VolumeOffIcon.vue')['default'] const VueHead: typeof import('./src/components/VueHead.tsx')['default'] + const WifiIcon: typeof import('./src/components/icons/WifiIcon.vue')['default'] const XCircleIcon: typeof import('./src/components/icons/XCircleIcon.vue')['default'] + const XIcon: typeof import('./src/components/icons/XIcon.vue')['default'] } \ No newline at end of file diff --git a/src/components/DashboardNav.vue b/src/components/DashboardNav.vue index c71422c..1e7211c 100644 --- a/src/components/DashboardNav.vue +++ b/src/components/DashboardNav.vue @@ -1,8 +1,8 @@ + + diff --git a/src/components/icons/AdvertisementIcon.vue b/src/components/icons/AdvertisementIcon.vue new file mode 100644 index 0000000..02818f1 --- /dev/null +++ b/src/components/icons/AdvertisementIcon.vue @@ -0,0 +1,9 @@ + + \ No newline at end of file diff --git a/src/components/icons/AlertTriangle.vue b/src/components/icons/AlertTriangle.vue new file mode 100644 index 0000000..92b75e9 --- /dev/null +++ b/src/components/icons/AlertTriangle.vue @@ -0,0 +1,13 @@ + + + diff --git a/src/components/icons/Bell.vue b/src/components/icons/Bell.vue index 742e7c5..d8a3d6f 100644 --- a/src/components/icons/Bell.vue +++ b/src/components/icons/Bell.vue @@ -3,7 +3,7 @@ + fill="currentColor" /> + + diff --git a/src/components/icons/CheckIcon.vue b/src/components/icons/CheckIcon.vue index 8da9b73..bdc73ce 100644 --- a/src/components/icons/CheckIcon.vue +++ b/src/components/icons/CheckIcon.vue @@ -1,3 +1,11 @@ + + \ No newline at end of file diff --git a/src/components/icons/CoinsIcon.vue b/src/components/icons/CoinsIcon.vue new file mode 100644 index 0000000..749fdc1 --- /dev/null +++ b/src/components/icons/CoinsIcon.vue @@ -0,0 +1,13 @@ + + + diff --git a/src/components/icons/DownloadIcon.vue b/src/components/icons/DownloadIcon.vue new file mode 100644 index 0000000..06ea2bd --- /dev/null +++ b/src/components/icons/DownloadIcon.vue @@ -0,0 +1,13 @@ + + + diff --git a/src/components/icons/Globe.vue b/src/components/icons/Globe.vue new file mode 100644 index 0000000..e304c57 --- /dev/null +++ b/src/components/icons/Globe.vue @@ -0,0 +1,9 @@ + + + diff --git a/src/components/icons/GlobeIcon.vue b/src/components/icons/GlobeIcon.vue new file mode 100644 index 0000000..e8d14ab --- /dev/null +++ b/src/components/icons/GlobeIcon.vue @@ -0,0 +1,14 @@ + + + diff --git a/src/components/icons/HeartIcon.vue b/src/components/icons/HeartIcon.vue new file mode 100644 index 0000000..204641e --- /dev/null +++ b/src/components/icons/HeartIcon.vue @@ -0,0 +1,11 @@ + + + diff --git a/src/components/icons/ImageIcon.vue b/src/components/icons/ImageIcon.vue new file mode 100644 index 0000000..8e43bc9 --- /dev/null +++ b/src/components/icons/ImageIcon.vue @@ -0,0 +1,13 @@ + + + diff --git a/src/components/icons/LayoutDashboard.vue b/src/components/icons/LayoutDashboard.vue new file mode 100644 index 0000000..007b30b --- /dev/null +++ b/src/components/icons/LayoutDashboard.vue @@ -0,0 +1,13 @@ + + + diff --git a/src/components/icons/LockIcon.vue b/src/components/icons/LockIcon.vue new file mode 100644 index 0000000..7f52a02 --- /dev/null +++ b/src/components/icons/LockIcon.vue @@ -0,0 +1,12 @@ + + + diff --git a/src/components/icons/MailIcon.vue b/src/components/icons/MailIcon.vue new file mode 100644 index 0000000..a3b155e --- /dev/null +++ b/src/components/icons/MailIcon.vue @@ -0,0 +1,12 @@ + + + diff --git a/src/components/icons/MonitorIcon.vue b/src/components/icons/MonitorIcon.vue new file mode 100644 index 0000000..927ef3f --- /dev/null +++ b/src/components/icons/MonitorIcon.vue @@ -0,0 +1,13 @@ + + + diff --git a/src/components/icons/PlayIcon.vue b/src/components/icons/PlayIcon.vue new file mode 100644 index 0000000..d6fae61 --- /dev/null +++ b/src/components/icons/PlayIcon.vue @@ -0,0 +1,11 @@ + + + diff --git a/src/components/icons/PlusIcon.vue b/src/components/icons/PlusIcon.vue new file mode 100644 index 0000000..1a4aef9 --- /dev/null +++ b/src/components/icons/PlusIcon.vue @@ -0,0 +1,12 @@ + + + diff --git a/src/components/icons/PlusSquareIcon.vue b/src/components/icons/PlusSquareIcon.vue new file mode 100644 index 0000000..c6d577d --- /dev/null +++ b/src/components/icons/PlusSquareIcon.vue @@ -0,0 +1,13 @@ + + + diff --git a/src/components/icons/RepeatIcon.vue b/src/components/icons/RepeatIcon.vue new file mode 100644 index 0000000..327e7df --- /dev/null +++ b/src/components/icons/RepeatIcon.vue @@ -0,0 +1,14 @@ + + + diff --git a/src/components/icons/SendIcon.vue b/src/components/icons/SendIcon.vue new file mode 100644 index 0000000..516d089 --- /dev/null +++ b/src/components/icons/SendIcon.vue @@ -0,0 +1,12 @@ + + + diff --git a/src/components/icons/SettingsIcon.vue b/src/components/icons/SettingsIcon.vue index ea1491f..d5df7e7 100644 --- a/src/components/icons/SettingsIcon.vue +++ b/src/components/icons/SettingsIcon.vue @@ -1,9 +1,5 @@ - diff --git a/src/routes/plans/components/CurrentPlanCard.vue b/src/routes/plans/components/CurrentPlanCard.vue deleted file mode 100644 index 2c5836b..0000000 --- a/src/routes/plans/components/CurrentPlanCard.vue +++ /dev/null @@ -1,39 +0,0 @@ - - - diff --git a/src/routes/plans/components/EditPlanDialog.vue b/src/routes/plans/components/EditPlanDialog.vue deleted file mode 100644 index 3671065..0000000 --- a/src/routes/plans/components/EditPlanDialog.vue +++ /dev/null @@ -1,90 +0,0 @@ - - -