diff --git a/.claude/settings.local.json b/.claude/settings.local.json new file mode 100644 index 0000000..168552e --- /dev/null +++ b/.claude/settings.local.json @@ -0,0 +1,18 @@ +{ + "permissions": { + "allow": [ + "Bash(bun run build)", + "mcp__ide__getDiagnostics", + "Bash(bun install:*)", + "Bash(bun preview:*)", + "Bash(curl:*)", + "Bash(python -:*)", + "Bash(bun run:*)", + "Bash(bunx:*)", + "Bash(bun:*)", + "Bash(git diff:*)", + "Bash(git add:*)", + "Bash(git status:*)" + ] + } +} diff --git a/.deploy/stream.ui-production.yaml b/.deploy/stream.ui-production.yaml new file mode 100644 index 0000000..cc00184 --- /dev/null +++ b/.deploy/stream.ui-production.yaml @@ -0,0 +1,79 @@ +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: stream.ui-config + namespace: stream-production + labels: + app: stream.ui +data: + STREAM_API_GRPC_ADDR: "stream.api-svc:9000" + GOOGLE_AUTH_FINALIZE_PATH: "/auth/google/finalize" +--- +kind: Service +apiVersion: v1 +metadata: + name: stream.ui-svc + namespace: stream-production + labels: + app: stream.ui +spec: + selector: + app: stream.ui + ports: + - protocol: TCP + port: 80 + targetPort: 3000 + type: NodePort +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: stream.ui-dep + namespace: stream-production + labels: + app: stream.ui +spec: + replicas: 1 + selector: + matchLabels: + app: stream.ui + template: + metadata: + labels: + app: stream.ui + spec: + imagePullSecrets: + - name: registry-production-secret + containers: + - name: stream.ui + image: registry.awing.vn/stream-production/stream.ui:$BUILD_NUMBER + ports: + - containerPort: 3000 + env: + - name: STREAM_API_GRPC_ADDR + valueFrom: + configMapKeyRef: + name: stream.ui-config + key: STREAM_API_GRPC_ADDR + - name: GOOGLE_AUTH_FINALIZE_PATH + valueFrom: + configMapKeyRef: + name: stream.ui-config + key: GOOGLE_AUTH_FINALIZE_PATH + - name: STREAM_INTERNAL_AUTH_MARKER + valueFrom: + secretKeyRef: + name: stream.ui-secret + key: STREAM_INTERNAL_AUTH_MARKER + - name: STREAM_UI_JWT_SECRET + valueFrom: + secretKeyRef: + name: stream.ui-secret + key: STREAM_UI_JWT_SECRET + - name: STREAM_UI_REDIS_URL + valueFrom: + secretKeyRef: + name: stream.ui-secret + key: STREAM_UI_REDIS_URL + diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..5f81cec --- /dev/null +++ b/.dockerignore @@ -0,0 +1,68 @@ +# Dependencies +node_modules +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# Build outputs +dist +build +.rsbuild +node_modules +/node_modules +# Environment files +.env +.env.local +.env.development.local +.env.test.local +.env.production.local + +# IDE and editor files +.vscode +.idea +*.swp +*.swo +*~ + +# OS generated files +.DS_Store +.DS_Store? +._* +.Spotlight-V100 +.Trashes +ehthumbs.db +Thumbs.db + +# Git +.git +.gitignore + +# Docker +Dockerfile +.dockerignore +docker-compose.yml + +# Documentation +README.md +*.md + +# Test files +coverage +.coverage +.nyc_output +test +tests +__tests__ +*.test.js +*.test.ts +*.spec.js +*.spec.ts + +# Linting +.eslintrc* +.prettierrc* +.stylelintrc* + +# Other +.husky \ No newline at end of file diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..fc9f4d9 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,374 @@ +# AGENTS.md + +This file provides guidance for AI coding agents working with the Holistream codebase. +hallo +## Project Overview + +**Holistream** is a Vue 3 streaming application with Server-Side Rendering (SSR) deployed on Cloudflare Workers. It provides video upload, management, and streaming capabilities for content creators. + +### Key Characteristics + +- **Type**: Full-stack web application with SSR +- **Primary Language**: TypeScript +- **Package Manager**: Bun (evident from `bun.lock`) +- **Deployment Target**: Cloudflare Workers + +## Technology Stack + +| Category | Technology | Version | +|----------|------------|---------| +| Framework | Vue | 3.5.27 | +| Router | Vue Router | 5.0.2 | +| Server Framework | Hono | 4.11.7 | +| Build Tool | Vite | 7.3.1 | +| CSS Framework | UnoCSS | 66.6.0 | +| UI Components | PrimeVue | 4.5.4 | +| State Management | Pinia | 3.0.4 | +| Server State | Pinia Colada | 0.21.2 | +| Meta/SEO | @unhead/vue | 2.1.2 | +| Utilities | VueUse | 14.2.0 | +| Validation | Zod | 4.3.6 | +| Deployment | Wrangler | 4.62.0 | + +## Project Structure + +``` +. +├── src/ +│ ├── api/ # API client and HTTP adapters +│ │ ├── client.ts # Auto-generated API client from OpenAPI spec +│ │ ├── httpClientAdapter.client.ts # Client-side fetch adapter +│ │ └── httpClientAdapter.server.ts # Server-side fetch adapter +│ ├── client.ts # Client entry point (hydration) +│ ├── components/ # Vue components +│ │ ├── dashboard/ # Dashboard-specific components +│ │ ├── icons/ # Custom icon components +│ │ ├── ui/ # UI primitive components +│ │ ├── ClientOnly.tsx # SSR-safe client-only wrapper +│ │ ├── DashboardLayout.vue # Main dashboard layout +│ │ ├── GlobalUploadIndicator.vue +│ │ ├── NotificationDrawer.vue +│ │ └── RootLayout.vue # Root application layout +│ ├── composables/ # Vue composables +│ │ └── useUploadQueue.ts # Upload queue management +│ ├── index.tsx # Server entry point (Hono app) +│ ├── lib/ # Utility libraries +│ │ ├── constants.ts # Application constants +│ │ ├── directives/ # Custom Vue directives +│ │ ├── hoc/ # Higher-order components +│ │ ├── interface.ts # TypeScript interfaces +│ │ ├── liteMqtt.ts # MQTT client (browser) +│ │ ├── manifest.ts # Vite manifest utilities +│ │ ├── PiniaSharedState.ts # Pinia state hydration plugin +│ │ ├── primePassthrough.ts # PrimeVue theme configuration +│ │ ├── replateStreamText.ts +│ │ └── utils.ts # Utility functions (cn, formatters, etc.) +│ ├── main.ts # App factory function +│ ├── mocks/ # Mock data for development +│ ├── routes/ # Route components (page components) +│ │ ├── auth/ # Authentication pages +│ │ ├── home/ # Public pages (landing, terms, privacy) +│ │ ├── notification/ # Notification page +│ │ ├── overview/ # Dashboard overview +│ │ ├── plans/ # Payments & plans +│ │ ├── profile/ # User profile +│ │ ├── upload/ # Video upload +│ │ ├── video/ # Video management +│ │ ├── index.ts # Router configuration +│ │ └── NotFound.vue # 404 page +│ ├── server/ # Server-side utilities +│ │ └── modules/ +│ │ └── merge.ts # Video chunk merge logic +│ ├── stores/ # Pinia stores +│ │ └── auth.ts # Authentication store +│ ├── type.d.ts # TypeScript declarations +│ └── worker/ # Worker utilities +│ ├── html.ts +│ └── ssrLayout.ts +├── bootstrap_btn.ts # Bootstrap button preset for UnoCSS +├── ssrPlugin.ts # Custom Vite SSR plugin +├── uno.config.ts # UnoCSS configuration +├── vite.config.ts # Vite configuration +├── wrangler.jsonc # Cloudflare Workers configuration +├── tsconfig.json # TypeScript configuration +├── package.json # Package dependencies +├── bun.lock # Bun lock file +├── docs.json # OpenAPI/Swagger spec for API +├── auto-imports.d.ts # Auto-generated type declarations +└── components.d.ts # Auto-generated component declarations +``` + +## Build and Development Commands + +```bash +# Install dependencies +bun install + +# Start development server with hot reload +bun dev + +# Build for production (client + worker) +bun run build + +# Preview production build locally +bun preview + +# Deploy to Cloudflare Workers +bun run deploy + +# Generate TypeScript types from Wrangler config +bun run cf-typegen + +# View Cloudflare Worker logs +bun run tail +``` + +> **Note**: While npm commands work (`npm run dev`, etc.), the project uses Bun as its primary package manager. + +## Architecture Details + +### SSR Architecture + +The application uses a custom SSR setup defined in `ssrPlugin.ts`: + +1. **Build Order**: Client bundle is built FIRST, then the Worker bundle +2. **Manifest Injection**: Vite manifest is injected into the server build for asset rendering +3. **Environment-based Resolution**: `httpClientAdapter` and `liteMqtt` resolve to different implementations based on SSR context + +**Entry Points:** +- **Server**: `src/index.tsx` - Hono app that renders Vue SSR stream +- **Client**: `src/client.ts` - Hydrates the SSR-rendered application +- **App Factory**: `src/main.ts` - Creates the Vue app instance (used by both) + +### State Management with SSR + +Uses **Pinia Colada** for server state with SSR hydration: + +- Server-side queries are fetched and serialized to `window.__APP_DATA__` +- Client hydrates the query cache via `hydrateQueryCache()` +- Pinia state is serialized and restored via `PiniaSharedState` plugin + +### Module Aliases + +Configured in `tsconfig.json` and `vite.config.ts`: + +| Alias | Resolution | +|-------|------------| +| `@/` | `src/` | +| `@httpClientAdapter` | `src/api/httpClientAdapter.server.ts` (SSR) or `.client.ts` (browser) | +| `@liteMqtt` | `src/lib/liteMqtt.server.ts` (SSR) or `.ts` (browser) | + +### API Client Architecture + +The API client (`src/api/client.ts`) is **auto-generated** from the OpenAPI spec (`docs.json`): + +- Uses `customFetch` adapter that differs between client/server +- **Server adapter** (`httpClientAdapter.server.ts`): Forwards cookies, merges headers, proxies to `api.pipic.fun` +- **Client adapter** (`httpClientAdapter.client.ts`): Standard fetch with credentials +- API proxy route: `/r/*` paths proxy to `https://api.pipic.fun` + +### Routing Structure + +Routes are defined in `src/routes/index.ts` with three main layout groups: + +1. **Public** (`/`): Landing page, terms, privacy +2. **Auth** (`/login`, `/sign-up`, `/forgot`): Authentication pages (redirects if logged in) +3. **Dashboard**: Protected routes requiring authentication + - `/overview` - Main dashboard + - `/upload` - Video upload with queue management + - `/video` - Video list + - `/video/:id` - Video detail/edit + - `/payments-and-plans` - Billing management + - `/notification`, `/profile` - User settings + +Route meta supports `@unhead/vue` for SEO: +```ts +meta: { + head: { + title: "Page Title", + meta: [{ name: "description", content: "..." }] + } +} +``` + +### Styling System (UnoCSS) + +Configuration in `uno.config.ts`: + +- **Presets**: Wind4 (Tailwind-like), Typography, Attributify, Bootstrap buttons +- **Custom Colors**: + - `primary` (#14a74b) + - `secondary` (#fd7906) + - `accent`, `success`, `info`, `warning`, `danger` +- **Shortcuts**: `press-animated` for button press effects +- **Transformers**: + - `transformerCompileClass` (prefix: `_` for compiled classes) + - `transformerVariantGroup` + +Use `cn()` from `src/lib/utils.ts` for conditional class merging (combines `clsx` + `tailwind-merge`). + +### Component Auto-Import + +Components are auto-imported via `unplugin-vue-components`: + +- PrimeVue components resolved via `PrimeVueResolver` +- Vue/Pinia/Vue Router APIs auto-imported via `unplugin-auto-import` +- Type declarations auto-generated to `components.d.ts` and `auto-imports.d.ts` + +## Development Guidelines + +### Code Style + +- **TypeScript**: Strict mode enabled +- **JSX/TSX**: Supported for components (import source: `vue`) +- **CSS**: Use UnoCSS utility classes; custom CSS in component ` diff --git a/src/components/dashboard/PageHeader.vue b/src/components/dashboard/PageHeader.vue new file mode 100644 index 0000000..88fe376 --- /dev/null +++ b/src/components/dashboard/PageHeader.vue @@ -0,0 +1,77 @@ + + + diff --git a/src/components/dashboard/StatsCard.vue b/src/components/dashboard/StatsCard.vue new file mode 100644 index 0000000..cdead9d --- /dev/null +++ b/src/components/dashboard/StatsCard.vue @@ -0,0 +1,86 @@ + + + diff --git a/src/components/icons/ActivityIcon.vue b/src/components/icons/ActivityIcon.vue new file mode 100644 index 0000000..cabbb86 --- /dev/null +++ b/src/components/icons/ActivityIcon.vue @@ -0,0 +1,12 @@ + + + diff --git a/src/components/icons/Add.vue b/src/components/icons/Add.vue index e952a0f..7c61e9e 100644 --- a/src/components/icons/Add.vue +++ b/src/components/icons/Add.vue @@ -6,14 +6,14 @@ fill="#a6acb9" /> + fill="currentColor" /> + fill="currentColor" /> \ No newline at end of file diff --git a/src/components/icons/AdvertisementIcon.vue b/src/components/icons/AdvertisementIcon.vue new file mode 100644 index 0000000..7822e5a --- /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..6279d97 --- /dev/null +++ b/src/components/icons/AlertTriangle.vue @@ -0,0 +1,10 @@ + + + diff --git a/src/components/icons/AlertTriangleIcon.vue b/src/components/icons/AlertTriangleIcon.vue new file mode 100644 index 0000000..eea2902 --- /dev/null +++ b/src/components/icons/AlertTriangleIcon.vue @@ -0,0 +1,16 @@ + + + diff --git a/src/components/icons/ArrowDownTray.vue b/src/components/icons/ArrowDownTray.vue new file mode 100644 index 0000000..afa52f6 --- /dev/null +++ b/src/components/icons/ArrowDownTray.vue @@ -0,0 +1,17 @@ + + diff --git a/src/components/icons/ArrowRightIcon.vue b/src/components/icons/ArrowRightIcon.vue new file mode 100644 index 0000000..5219d46 --- /dev/null +++ b/src/components/icons/ArrowRightIcon.vue @@ -0,0 +1,15 @@ + + + diff --git a/src/components/icons/Bell.vue b/src/components/icons/Bell.vue index 3cfdf82..62bf0f5 100644 --- a/src/components/icons/Bell.vue +++ b/src/components/icons/Bell.vue @@ -1,18 +1,11 @@ \ No newline at end of file +defineProps<{ filled?: boolean }>(); + diff --git a/src/components/icons/BellDot.vue b/src/components/icons/BellDot.vue new file mode 100644 index 0000000..c41a7e1 --- /dev/null +++ b/src/components/icons/BellDot.vue @@ -0,0 +1,7 @@ + + diff --git a/src/components/icons/BellOff.vue b/src/components/icons/BellOff.vue new file mode 100644 index 0000000..40bd21a --- /dev/null +++ b/src/components/icons/BellOff.vue @@ -0,0 +1,7 @@ + + diff --git a/src/components/icons/Chart.vue b/src/components/icons/Chart.vue new file mode 100644 index 0000000..9261c17 --- /dev/null +++ b/src/components/icons/Chart.vue @@ -0,0 +1,7 @@ + + \ No newline at end of file diff --git a/src/components/icons/CheckCircleIcon.vue b/src/components/icons/CheckCircleIcon.vue new file mode 100644 index 0000000..60f2266 --- /dev/null +++ b/src/components/icons/CheckCircleIcon.vue @@ -0,0 +1,16 @@ + + + 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/CheckMarkIcon.vue b/src/components/icons/CheckMarkIcon.vue new file mode 100644 index 0000000..cd541f1 --- /dev/null +++ b/src/components/icons/CheckMarkIcon.vue @@ -0,0 +1,14 @@ + + + diff --git a/src/components/icons/CoinsIcon.vue b/src/components/icons/CoinsIcon.vue new file mode 100644 index 0000000..30d7b5f --- /dev/null +++ b/src/components/icons/CoinsIcon.vue @@ -0,0 +1,10 @@ + + + diff --git a/src/components/icons/Credit.vue b/src/components/icons/Credit.vue index b106cf6..8546f35 100644 --- a/src/components/icons/Credit.vue +++ b/src/components/icons/Credit.vue @@ -1,7 +1,7 @@ \ No newline at end of file diff --git a/src/components/icons/CreditCardIcon.vue b/src/components/icons/CreditCardIcon.vue new file mode 100644 index 0000000..e45780c --- /dev/null +++ b/src/components/icons/CreditCardIcon.vue @@ -0,0 +1,16 @@ + + + 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/EllipsisVerticalIcon.vue b/src/components/icons/EllipsisVerticalIcon.vue new file mode 100644 index 0000000..6365193 --- /dev/null +++ b/src/components/icons/EllipsisVerticalIcon.vue @@ -0,0 +1,5 @@ + diff --git a/src/components/icons/FileUploadType.vue b/src/components/icons/FileUploadType.vue new file mode 100644 index 0000000..77d2fe0 --- /dev/null +++ b/src/components/icons/FileUploadType.vue @@ -0,0 +1,23 @@ + + diff --git a/src/components/icons/Globe.vue b/src/components/icons/Globe.vue new file mode 100644 index 0000000..cd353ae --- /dev/null +++ b/src/components/icons/Globe.vue @@ -0,0 +1,10 @@ + + + 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/HardDriveUpload.vue b/src/components/icons/HardDriveUpload.vue new file mode 100644 index 0000000..2e409d8 --- /dev/null +++ b/src/components/icons/HardDriveUpload.vue @@ -0,0 +1,7 @@ + + 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/Home.vue b/src/components/icons/Home.vue index de9ab31..f2800c8 100644 --- a/src/components/icons/Home.vue +++ b/src/components/icons/Home.vue @@ -1,18 +1,17 @@ \ No newline at end of file +defineProps<{ filled?: boolean }>(); + 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/Inbox.vue b/src/components/icons/Inbox.vue new file mode 100644 index 0000000..037ceb1 --- /dev/null +++ b/src/components/icons/Inbox.vue @@ -0,0 +1,7 @@ + + diff --git a/src/components/icons/InfoIcon.vue b/src/components/icons/InfoIcon.vue new file mode 100644 index 0000000..5e26ce6 --- /dev/null +++ b/src/components/icons/InfoIcon.vue @@ -0,0 +1,16 @@ + + + diff --git a/src/components/icons/LanguageIcon.vue b/src/components/icons/LanguageIcon.vue new file mode 100644 index 0000000..d876388 --- /dev/null +++ b/src/components/icons/LanguageIcon.vue @@ -0,0 +1,7 @@ + + \ No newline at end of file diff --git a/src/components/icons/Layout.vue b/src/components/icons/Layout.vue index c5302fa..18930d7 100644 --- a/src/components/icons/Layout.vue +++ b/src/components/icons/Layout.vue @@ -6,14 +6,14 @@ fill="#a6acb9" /> + fill="currentColor" /> + fill="currentColor" /> \ No newline at end of file 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/LinkIcon.vue b/src/components/icons/LinkIcon.vue new file mode 100644 index 0000000..299545d --- /dev/null +++ b/src/components/icons/LinkIcon.vue @@ -0,0 +1,7 @@ + + \ No newline at end of file diff --git a/src/components/icons/ListIcon.vue b/src/components/icons/ListIcon.vue new file mode 100644 index 0000000..f902573 --- /dev/null +++ b/src/components/icons/ListIcon.vue @@ -0,0 +1,7 @@ + + \ No newline at end of file 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..aaafa44 --- /dev/null +++ b/src/components/icons/MailIcon.vue @@ -0,0 +1,13 @@ + + + diff --git a/src/components/icons/MoneyCheck.vue b/src/components/icons/MoneyCheck.vue new file mode 100644 index 0000000..cfb44ac --- /dev/null +++ b/src/components/icons/MoneyCheck.vue @@ -0,0 +1,10 @@ + + + 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/PanelLeft.vue b/src/components/icons/PanelLeft.vue new file mode 100644 index 0000000..78e6f5e --- /dev/null +++ b/src/components/icons/PanelLeft.vue @@ -0,0 +1,17 @@ + + + diff --git a/src/components/icons/PencilIcon.vue b/src/components/icons/PencilIcon.vue new file mode 100644 index 0000000..40e9bab --- /dev/null +++ b/src/components/icons/PencilIcon.vue @@ -0,0 +1,8 @@ + + + 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..52b9907 --- /dev/null +++ b/src/components/icons/SendIcon.vue @@ -0,0 +1,13 @@ + + + diff --git a/src/components/icons/SettingsIcon.vue b/src/components/icons/SettingsIcon.vue new file mode 100644 index 0000000..dd7a483 --- /dev/null +++ b/src/components/icons/SettingsIcon.vue @@ -0,0 +1,14 @@ + + + diff --git a/src/components/icons/SlidersIcon.vue b/src/components/icons/SlidersIcon.vue new file mode 100644 index 0000000..e1f6803 --- /dev/null +++ b/src/components/icons/SlidersIcon.vue @@ -0,0 +1,15 @@ + + + diff --git a/src/components/icons/TelegramIcon.vue b/src/components/icons/TelegramIcon.vue new file mode 100644 index 0000000..9e506b7 --- /dev/null +++ b/src/components/icons/TelegramIcon.vue @@ -0,0 +1,9 @@ + + + diff --git a/src/components/icons/TrashIcon.vue b/src/components/icons/TrashIcon.vue new file mode 100644 index 0000000..2cf3e82 --- /dev/null +++ b/src/components/icons/TrashIcon.vue @@ -0,0 +1,14 @@ + + + diff --git a/src/components/icons/Upload.vue b/src/components/icons/Upload.vue index 9ebc8be..0f178c3 100644 --- a/src/components/icons/Upload.vue +++ b/src/components/icons/Upload.vue @@ -1,18 +1,18 @@ \ No newline at end of file diff --git a/src/components/icons/UploadIcon.vue b/src/components/icons/UploadIcon.vue new file mode 100644 index 0000000..03ac238 --- /dev/null +++ b/src/components/icons/UploadIcon.vue @@ -0,0 +1,13 @@ + + + diff --git a/src/components/icons/UserIcon copy.vue b/src/components/icons/UserIcon copy.vue new file mode 100644 index 0000000..53f8003 --- /dev/null +++ b/src/components/icons/UserIcon copy.vue @@ -0,0 +1,10 @@ + + + diff --git a/src/components/icons/UserIcon.vue b/src/components/icons/UserIcon.vue new file mode 100644 index 0000000..53f8003 --- /dev/null +++ b/src/components/icons/UserIcon.vue @@ -0,0 +1,10 @@ + + + diff --git a/src/components/icons/Video.vue b/src/components/icons/Video.vue index cee8c15..ecef1a8 100644 --- a/src/components/icons/Video.vue +++ b/src/components/icons/Video.vue @@ -1,16 +1,16 @@ \ No newline at end of file +defineProps<{ filled?: boolean }>(); + diff --git a/src/components/icons/VideoIcon.vue b/src/components/icons/VideoIcon.vue new file mode 100644 index 0000000..8fc1485 --- /dev/null +++ b/src/components/icons/VideoIcon.vue @@ -0,0 +1,16 @@ + + + diff --git a/src/components/icons/VideoPlayIcon.vue b/src/components/icons/VideoPlayIcon.vue new file mode 100644 index 0000000..4156172 --- /dev/null +++ b/src/components/icons/VideoPlayIcon.vue @@ -0,0 +1,9 @@ + + \ No newline at end of file diff --git a/src/components/icons/VolumeIcon.vue b/src/components/icons/VolumeIcon.vue new file mode 100644 index 0000000..ffc2831 --- /dev/null +++ b/src/components/icons/VolumeIcon.vue @@ -0,0 +1,14 @@ + + + diff --git a/src/components/icons/VolumeOffIcon.vue b/src/components/icons/VolumeOffIcon.vue new file mode 100644 index 0000000..eb2f1c1 --- /dev/null +++ b/src/components/icons/VolumeOffIcon.vue @@ -0,0 +1,13 @@ + + + diff --git a/src/components/icons/WifiIcon.vue b/src/components/icons/WifiIcon.vue new file mode 100644 index 0000000..108b156 --- /dev/null +++ b/src/components/icons/WifiIcon.vue @@ -0,0 +1,14 @@ + + + diff --git a/src/components/icons/XCircleIcon.vue b/src/components/icons/XCircleIcon.vue new file mode 100644 index 0000000..9f762fd --- /dev/null +++ b/src/components/icons/XCircleIcon.vue @@ -0,0 +1,17 @@ + + + diff --git a/src/components/icons/XIcon.vue b/src/components/icons/XIcon.vue new file mode 100644 index 0000000..65dfdfb --- /dev/null +++ b/src/components/icons/XIcon.vue @@ -0,0 +1,12 @@ + + + diff --git a/src/components/icons/hard-drive.vue b/src/components/icons/hard-drive.vue new file mode 100644 index 0000000..d2271f4 --- /dev/null +++ b/src/components/icons/hard-drive.vue @@ -0,0 +1,8 @@ + + + diff --git a/src/components/icons/index.ts b/src/components/icons/index.ts deleted file mode 100644 index fce96b8..0000000 --- a/src/components/icons/index.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { createStaticVNode } from "vue"; - -export const Home = createStaticVNode(``, 1); -export const HomeFilled = createStaticVNode(``, 1); -export const Dashboard = createStaticVNode(``, 1); -export const DashboardFilled = createStaticVNode(``, 1); -export const Add = createStaticVNode(``, 1); -export const AddFilled = createStaticVNode(``, 1); -export const Bell = createStaticVNode(``, 1); -export const BellFilled = createStaticVNode(``, 1); -export const Search = createStaticVNode(``, 1); \ No newline at end of file diff --git a/src/components/icons/shield-user.vue b/src/components/icons/shield-user.vue new file mode 100644 index 0000000..89c6fdf --- /dev/null +++ b/src/components/icons/shield-user.vue @@ -0,0 +1,7 @@ + + \ No newline at end of file diff --git a/src/components/icons/windows.vue b/src/components/icons/windows.vue new file mode 100644 index 0000000..f5a4e38 --- /dev/null +++ b/src/components/icons/windows.vue @@ -0,0 +1,7 @@ + + diff --git a/src/components/ui/AppButton.vue b/src/components/ui/AppButton.vue new file mode 100644 index 0000000..65eb606 --- /dev/null +++ b/src/components/ui/AppButton.vue @@ -0,0 +1,71 @@ + + + diff --git a/src/components/ui/AppConfirmHost.vue b/src/components/ui/AppConfirmHost.vue new file mode 100644 index 0000000..e0c5108 --- /dev/null +++ b/src/components/ui/AppConfirmHost.vue @@ -0,0 +1,47 @@ + + + diff --git a/src/components/ui/AppDialog.vue b/src/components/ui/AppDialog.vue new file mode 100644 index 0000000..f36a66b --- /dev/null +++ b/src/components/ui/AppDialog.vue @@ -0,0 +1,117 @@ + + + diff --git a/src/components/ui/AppInput.vue b/src/components/ui/AppInput.vue new file mode 100644 index 0000000..509595a --- /dev/null +++ b/src/components/ui/AppInput.vue @@ -0,0 +1,125 @@ + + +