diff --git a/PLAN.md b/PLAN.md new file mode 100644 index 0000000..17934af --- /dev/null +++ b/PLAN.md @@ -0,0 +1,217 @@ +# TapTrack Website — Development Plan + +**Stack:** Vue 3 + TypeScript · Tailwind CSS v4 · Vite +**Deployment:** Vercel / Netlify +**Design source:** `pencil-new.pen` + +--- + +## Phase 1 — Project Scaffold & Foundation +**Goal:** Runnable dev server with global styles, fonts, and design tokens in place. + +### Tasks +1. Scaffold project with `npm create vite@latest` (Vue + TypeScript) +2. Install and configure Tailwind CSS v4 +3. Install `lucide-vue-next` for icons +4. Add Inter font via Google Fonts (`index.html`) +5. Define global CSS variables (colors, spacing) from design tokens +6. Set up base `App.vue` shell with router placeholder +7. Move `public/screenshots/` and `Reports.jpg` into `public/` asset tree +8. Verify `npm run dev` runs clean with blank page + +### Deliverable +Clean Vite + Vue 3 + Tailwind v4 dev server at `localhost:5173` + +--- + +## Phase 2 — Layout Shell & Navigation +**Goal:** Full-width page shell with sticky nav and footer wired up. + +### Tasks +1. Create `AppNavbar.vue` + - TapTrack logo mark (blue "T" box) + wordmark + - Nav links: Features, How It Works, Services, Contact + - "Request a Demo" CTA button (scrolls to contact section) + - Sticky on scroll, white background, bottom border +2. Create `AppFooter.vue` + - Brand column with logo + tagline + - 3 link columns: Product, Company, Legal + - Bottom bar with copyright +3. Wire `App.vue` → `AppNavbar` + `` + `AppFooter` +4. Create `LandingPage.vue` as the `/` route + +### Deliverable +Navigable page shell with working sticky header and footer + +--- + +## Phase 3 — Hero Section +**Goal:** Above-the-fold hero with real screenshot mockup. + +### Tasks +1. Create `HeroSection.vue` + - "Built for Philippine Schools" pill badge + - H1: "Attendance That Runs Itself." + - Subtitle paragraph + - Two CTA buttons ("Request a Demo" + "See How It Works") + - Trust row (two checkmark lines) + - Right column: screenshot of Live Attendance (`public/screenshots/58IBI.png`) in a rounded frame with border + - Caption below screenshot +2. Responsive: stack to single column on mobile + +### Deliverable +Pixel-faithful hero section matching the Pencil design + +--- + +## Phase 4 — Privacy Banner & "See It Live" Section +**Goal:** Two full-width sections between Hero and Features. + +### Tasks +1. Create `PrivacyBanner.vue` + - Dark navy background + - Left: "DATA PRIVACY" label + headline + subtitle + - Right: 3 stat items (On-Premises, DepEd Aligned, Works Offline) with Lucide icons +2. Create `SeeItLiveSection.vue` + - Light blue background + - Centered headline + subtitle + - Gate View screenshot (`public/screenshots/gE861.png`) in rounded frame + - Caption below + +### Deliverable +Two polished full-width sections + +--- + +## Phase 5 — Features Section +**Goal:** 6-card features grid. + +### Tasks +1. Create reusable `FeatureCard.vue` component + - Props: icon name, icon bg color, icon color, title, description +2. Create `FeaturesSection.vue` + - "WHAT TAPTRACK DOES" label + headline + subtitle + - 2 rows × 3 cards using `FeatureCard` + - Cards: NFC Tap-In, Parent SMS, Live Dashboard, Reports, Student Mgmt, SMS Credits + +### Deliverable +Full features grid, pixel-faithful to design + +--- + +## Phase 6 — App Screenshots Section +**Goal:** 2-column screenshot showcase with labels. + +### Tasks +1. Create `ScreenshotsSection.vue` + - "INSIDE TAPTRACK" label + headline + subtitle + - 2-column grid: + - Student Directory card (`public/screenshots/4frZA.png`) + - Reports & Analytics card (`Reports.jpg`) + - Each card: screenshot image + title + description below +2. Responsive: stack to single column on mobile + +### Deliverable +Screenshot showcase section + +--- + +## Phase 7 — How It Works Section +**Goal:** 3-step explainer + billing card side panel. + +### Tasks +1. Create `HowItWorksSection.vue` + - Left column: "HOW IT WORKS" label + headline + subtitle + 3 numbered steps + - Right column: "How billing works" white card + - One-Time Implementation Fee item + - Prepaid SMS Credits item + - "No subscription fee" green note + +### Deliverable +How It Works section with billing breakdown + +--- + +## Phase 8 — Support Section +**Goal:** 5 support cards + 1 quote card. + +### Tasks +1. Reuse `FeatureCard.vue` or create `SupportCard.vue` +2. Create `SupportSection.vue` + - "AFTER-SALES SUPPORT" label + headline + subtitle + - Row 1: Dedicated Support, System Updates, Staff Re-training + - Row 2: Remote Troubleshooting, Data Backup, Quote card (blue tint) + +### Deliverable +Full support section + +--- + +## Phase 9 — Contact / CTA Section +**Goal:** Dark contact section with embedded demo request form. + +### Tasks +1. Create `ContactSection.vue` + - Dark navy background + - Left: "GET IN TOUCH" label + headline + subtitle + 3 bullet points + - Right: dark "Request a Demo" form card + - Fields: School Name, Contact Person, Phone / Email + - "Send Request" blue button +2. Wire up basic form validation (required fields) +3. Optional: integrate with Formspree or EmailJS for real submissions + +### Deliverable +Working contact/demo request form + +--- + +## Phase 10 — Polish, Responsiveness & Deployment +**Goal:** Production-ready site, fully responsive, deployed. + +### Tasks +1. Mobile responsiveness pass for all sections (breakpoints: sm, md, lg) +2. Smooth scroll behavior for anchor nav links +3. Scroll-triggered fade-in animations (Intersection Observer) +4. Add `` SEO tags (title, description, og:image) +5. Favicon using the TapTrack "T" blue mark +6. Run `npm run build` — fix any TypeScript or Tailwind errors +7. Deploy to Vercel (connect GitHub repo → auto deploy) +8. Verify live URL renders correctly + +### Deliverable +Live production URL on Vercel/Netlify + +--- + +## Section → Component Map + +| Section | Component | Screenshot / Asset | +|---|---|---| +| Navigation | `AppNavbar.vue` | — | +| Hero | `HeroSection.vue` | `58IBI.png` | +| Privacy Banner | `PrivacyBanner.vue` | — | +| See It Live | `SeeItLiveSection.vue` | `gE861.png` | +| Features | `FeaturesSection.vue` + `FeatureCard.vue` | — | +| App Screenshots | `ScreenshotsSection.vue` | `4frZA.png` + `Reports.jpg` | +| How It Works | `HowItWorksSection.vue` | — | +| Support | `SupportSection.vue` | — | +| Contact / CTA | `ContactSection.vue` | — | +| Footer | `AppFooter.vue` | — | + +--- + +## Design Tokens + +| Token | Value | +|---|---| +| Primary blue | `#1D4ED8` | +| Dark navy | `#0F172A` | +| Body text | `#475569` | +| Muted text | `#64748B` | +| Subtle text | `#94A3B8` | +| Background alt | `#F8FAFF` | +| Card background | `#F8FAFC` | +| Border | `#E2E8F0` | +| Font | Inter | +| Icons | Lucide (lucide-vue-next) | +| Page width | 1440px max, 100px padding | diff --git a/Reports.jpg b/Reports.jpg new file mode 100644 index 0000000..28d5bb5 Binary files /dev/null and b/Reports.jpg differ diff --git a/index.html b/index.html new file mode 100644 index 0000000..8544fe7 --- /dev/null +++ b/index.html @@ -0,0 +1,39 @@ + + + + + + + + + TapTrack — Attendance That Runs Itself + + + + + + + + + + + + + + + + + + + + + + + +
+ + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..c87ff5c --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2170 @@ +{ + "name": "taptrack-website", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "taptrack-website", + "version": "0.0.0", + "dependencies": { + "lucide-vue-next": "^0.511.0", + "vue": "^3.5.13" + }, + "devDependencies": { + "@tailwindcss/vite": "^4.1.4", + "@vitejs/plugin-vue": "^5.2.3", + "@vue/tsconfig": "^0.7.0", + "tailwindcss": "^4.1.4", + "typescript": "~5.7.2", + "vite": "^6.3.3", + "vue-tsc": "^2.2.8" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", + "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", + "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", + "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", + "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", + "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", + "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", + "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", + "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", + "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", + "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", + "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", + "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", + "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", + "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", + "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", + "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", + "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", + "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", + "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", + "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", + "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", + "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", + "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", + "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", + "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", + "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@tailwindcss/node": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.2.1.tgz", + "integrity": "sha512-jlx6sLk4EOwO6hHe1oCGm1Q4AN/s0rSrTTPBGPM0/RQ6Uylwq17FuU8IeJJKEjtc6K6O07zsvP+gDO6MMWo7pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "^5.19.0", + "jiti": "^2.6.1", + "lightningcss": "1.31.1", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.2.1" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.2.1.tgz", + "integrity": "sha512-yv9jeEFWnjKCI6/T3Oq50yQEOqmpmpfzG1hcZsAOaXFQPfzWprWrlHSdGPEF3WQTi8zu8ohC9Mh9J470nT5pUw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.2.1", + "@tailwindcss/oxide-darwin-arm64": "4.2.1", + "@tailwindcss/oxide-darwin-x64": "4.2.1", + "@tailwindcss/oxide-freebsd-x64": "4.2.1", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.1", + "@tailwindcss/oxide-linux-arm64-gnu": "4.2.1", + "@tailwindcss/oxide-linux-arm64-musl": "4.2.1", + "@tailwindcss/oxide-linux-x64-gnu": "4.2.1", + "@tailwindcss/oxide-linux-x64-musl": "4.2.1", + "@tailwindcss/oxide-wasm32-wasi": "4.2.1", + "@tailwindcss/oxide-win32-arm64-msvc": "4.2.1", + "@tailwindcss/oxide-win32-x64-msvc": "4.2.1" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.2.1.tgz", + "integrity": "sha512-eZ7G1Zm5EC8OOKaesIKuw77jw++QJ2lL9N+dDpdQiAB/c/B2wDh0QPFHbkBVrXnwNugvrbJFk1gK2SsVjwWReg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.2.1.tgz", + "integrity": "sha512-q/LHkOstoJ7pI1J0q6djesLzRvQSIfEto148ppAd+BVQK0JYjQIFSK3JgYZJa+Yzi0DDa52ZsQx2rqytBnf8Hw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.2.1.tgz", + "integrity": "sha512-/f/ozlaXGY6QLbpvd/kFTro2l18f7dHKpB+ieXz+Cijl4Mt9AI2rTrpq7V+t04nK+j9XBQHnSMdeQRhbGyt6fw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.2.1.tgz", + "integrity": "sha512-5e/AkgYJT/cpbkys/OU2Ei2jdETCLlifwm7ogMC7/hksI2fC3iiq6OcXwjibcIjPung0kRtR3TxEITkqgn0TcA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.2.1.tgz", + "integrity": "sha512-Uny1EcVTTmerCKt/1ZuKTkb0x8ZaiuYucg2/kImO5A5Y/kBz41/+j0gxUZl+hTF3xkWpDmHX+TaWhOtba2Fyuw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.2.1.tgz", + "integrity": "sha512-CTrwomI+c7n6aSSQlsPL0roRiNMDQ/YzMD9EjcR+H4f0I1SQ8QqIuPnsVp7QgMkC1Qi8rtkekLkOFjo7OlEFRQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.2.1.tgz", + "integrity": "sha512-WZA0CHRL/SP1TRbA5mp9htsppSEkWuQ4KsSUumYQnyl8ZdT39ntwqmz4IUHGN6p4XdSlYfJwM4rRzZLShHsGAQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.2.1.tgz", + "integrity": "sha512-qMFzxI2YlBOLW5PhblzuSWlWfwLHaneBE0xHzLrBgNtqN6mWfs+qYbhryGSXQjFYB1Dzf5w+LN5qbUTPhW7Y5g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.2.1.tgz", + "integrity": "sha512-5r1X2FKnCMUPlXTWRYpHdPYUY6a1Ar/t7P24OuiEdEOmms5lyqjDRvVY1yy9Rmioh+AunQ0rWiOTPE8F9A3v5g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.2.1.tgz", + "integrity": "sha512-MGFB5cVPvshR85MTJkEvqDUnuNoysrsRxd6vnk1Lf2tbiqNlXpHYZqkqOQalydienEWOHHFyyuTSYRsLfxFJ2Q==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.8.1", + "@emnapi/runtime": "^1.8.1", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.1.1", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.1.tgz", + "integrity": "sha512-YlUEHRHBGnCMh4Nj4GnqQyBtsshUPdiNroZj8VPkvTZSoHsilRCwXcVKnG9kyi0ZFAS/3u+qKHBdDc81SADTRA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.1.tgz", + "integrity": "sha512-rbO34G5sMWWyrN/idLeVxAZgAKWrn5LiR3/I90Q9MkA67s6T1oB0xtTe+0heoBvHSpbU9Mk7i6uwJnpo4u21XQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.2.1.tgz", + "integrity": "sha512-TBf2sJjYeb28jD2U/OhwdW0bbOsxkWPwQ7SrqGf9sVcoYwZj7rkXljroBO9wKBut9XnmQLXanuDUeqQK0lGg/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.2.1", + "@tailwindcss/oxide": "4.2.1", + "tailwindcss": "4.2.1" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vitejs/plugin-vue": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz", + "integrity": "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@volar/language-core": { + "version": "2.4.15", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.15.tgz", + "integrity": "sha512-3VHw+QZU0ZG9IuQmzT68IyN4hZNd9GchGPhbD9+pa8CVv7rnoOZwo7T8weIbrRmihqy3ATpdfXFnqRrfPVK6CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/source-map": "2.4.15" + } + }, + "node_modules/@volar/source-map": { + "version": "2.4.15", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.15.tgz", + "integrity": "sha512-CPbMWlUN6hVZJYGcU/GSoHu4EnCHiLaXI9n8c9la6RaI9W5JHX+NqG+GSQcB0JdC2FIBLdZJwGsfKyBB71VlTg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@volar/typescript": { + "version": "2.4.15", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.15.tgz", + "integrity": "sha512-2aZ8i0cqPGjXb4BhkMsPYDkkuc2ZQ6yOpqwAuNwUoncELqoy5fRgOQtLR9gB0g902iS0NAkvpIzs27geVyVdPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.15", + "path-browserify": "^1.0.1", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.30.tgz", + "integrity": "sha512-s3DfdZkcu/qExZ+td75015ljzHc6vE+30cFMGRPROYjqkroYI5NV2X1yAMX9UeyBNWB9MxCfPcsjpLS11nzkkw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@vue/shared": "3.5.30", + "entities": "^7.0.1", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.30.tgz", + "integrity": "sha512-eCFYESUEVYHhiMuK4SQTldO3RYxyMR/UQL4KdGD1Yrkfdx4m/HYuZ9jSfPdA+nWJY34VWndiYdW/wZXyiPEB9g==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.30", + "@vue/shared": "3.5.30" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.30.tgz", + "integrity": "sha512-LqmFPDn89dtU9vI3wHJnwaV6GfTRD87AjWpTWpyrdVOObVtjIuSeZr181z5C4PmVx/V3j2p+0f7edFKGRMpQ5A==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@vue/compiler-core": "3.5.30", + "@vue/compiler-dom": "3.5.30", + "@vue/compiler-ssr": "3.5.30", + "@vue/shared": "3.5.30", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.8", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.30.tgz", + "integrity": "sha512-NsYK6OMTnx109PSL2IAyf62JP6EUdk4Dmj6AkWcJGBvN0dQoMYtVekAmdqgTtWQgEJo+Okstbf/1p7qZr5H+bA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.30", + "@vue/shared": "3.5.30" + } + }, + "node_modules/@vue/compiler-vue2": { + "version": "2.7.16", + "resolved": "https://registry.npmjs.org/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz", + "integrity": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==", + "dev": true, + "license": "MIT", + "dependencies": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, + "node_modules/@vue/language-core": { + "version": "2.2.12", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.2.12.tgz", + "integrity": "sha512-IsGljWbKGU1MZpBPN+BvPAdr55YPkj2nB/TBNGNC32Vy2qLG25DYu/NBN2vNtZqdRbTRjaoYrahLrToim2NanA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.15", + "@vue/compiler-dom": "^3.5.0", + "@vue/compiler-vue2": "^2.7.16", + "@vue/shared": "^3.5.0", + "alien-signals": "^1.0.3", + "minimatch": "^9.0.3", + "muggle-string": "^0.4.1", + "path-browserify": "^1.0.1" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.30.tgz", + "integrity": "sha512-179YNgKATuwj9gB+66snskRDOitDiuOZqkYia7mHKJaidOMo/WJxHKF8DuGc4V4XbYTJANlfEKb0yxTQotnx4Q==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.30" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.30.tgz", + "integrity": "sha512-e0Z+8PQsUTdwV8TtEsLzUM7SzC7lQwYKePydb7K2ZnmS6jjND+WJXkmmfh/swYzRyfP1EY3fpdesyYoymCzYfg==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.30", + "@vue/shared": "3.5.30" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.30.tgz", + "integrity": "sha512-2UIGakjU4WSQ0T4iwDEW0W7vQj6n7AFn7taqZ9Cvm0Q/RA2FFOziLESrDL4GmtI1wV3jXg5nMoJSYO66egDUBw==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.30", + "@vue/runtime-core": "3.5.30", + "@vue/shared": "3.5.30", + "csstype": "^3.2.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.30.tgz", + "integrity": "sha512-v+R34icapydRwbZRD0sXwtHqrQJv38JuMB4JxbOxd8NEpGLny7cncMp53W9UH/zo4j8eDHjQ1dEJXwzFQknjtQ==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.30", + "@vue/shared": "3.5.30" + }, + "peerDependencies": { + "vue": "3.5.30" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.30.tgz", + "integrity": "sha512-YXgQ7JjaO18NeK2K9VTbDHaFy62WrObMa6XERNfNOkAhD1F1oDSf3ZJ7K6GqabZ0BvSDHajp8qfS5Sa2I9n8uQ==", + "license": "MIT" + }, + "node_modules/@vue/tsconfig": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@vue/tsconfig/-/tsconfig-0.7.0.tgz", + "integrity": "sha512-ku2uNz5MaZ9IerPPUyOHzyjhXoX2kVJaVf7hL315DC17vS6IiZRmmCPfggNbU16QTvM80+uYYy3eYJB59WCtvg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "typescript": "5.x", + "vue": "^3.4.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "vue": { + "optional": true + } + } + }, + "node_modules/alien-signals": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-1.0.13.tgz", + "integrity": "sha512-OGj9yyTnJEttvzhTUWuscOvtqxq5vrhF7vL9oS0xJ2mK0ItPYP1/y+vCFebfxoEyAz0++1AIwJ5CMr+Fk3nDmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", + "dev": true, + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.20.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.0.tgz", + "integrity": "sha512-/ce7+jQ1PQ6rVXwe+jKEg5hW5ciicHwIQUagZkp6IufBoY3YDgdTTY1azVs0qoRgVmvsNB+rbjLJxDAeHHtwsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/lightningcss": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.31.1.tgz", + "integrity": "sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.31.1", + "lightningcss-darwin-arm64": "1.31.1", + "lightningcss-darwin-x64": "1.31.1", + "lightningcss-freebsd-x64": "1.31.1", + "lightningcss-linux-arm-gnueabihf": "1.31.1", + "lightningcss-linux-arm64-gnu": "1.31.1", + "lightningcss-linux-arm64-musl": "1.31.1", + "lightningcss-linux-x64-gnu": "1.31.1", + "lightningcss-linux-x64-musl": "1.31.1", + "lightningcss-win32-arm64-msvc": "1.31.1", + "lightningcss-win32-x64-msvc": "1.31.1" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.31.1.tgz", + "integrity": "sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.31.1.tgz", + "integrity": "sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.31.1.tgz", + "integrity": "sha512-1ObhyoCY+tGxtsz1lSx5NXCj3nirk0Y0kB/g8B8DT+sSx4G9djitg9ejFnjb3gJNWo7qXH4DIy2SUHvpoFwfTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.31.1.tgz", + "integrity": "sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.31.1.tgz", + "integrity": "sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.31.1.tgz", + "integrity": "sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.31.1.tgz", + "integrity": "sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.31.1.tgz", + "integrity": "sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.31.1.tgz", + "integrity": "sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.31.1.tgz", + "integrity": "sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.31.1.tgz", + "integrity": "sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lucide-vue-next": { + "version": "0.511.0", + "resolved": "https://registry.npmjs.org/lucide-vue-next/-/lucide-vue-next-0.511.0.tgz", + "integrity": "sha512-VSv0F3pHniGN7JMMzDcLFNMQbl8381+shNnHwV8hi+El7xl2ZL8qdNuzPoiBViKk8mTKK5K3ZDfmE/wEcTZVIQ==", + "license": "ISC", + "peerDependencies": { + "vue": ">=3.0.1" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/muggle-string": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", + "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", + "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/rollup": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", + "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.59.0", + "@rollup/rollup-android-arm64": "4.59.0", + "@rollup/rollup-darwin-arm64": "4.59.0", + "@rollup/rollup-darwin-x64": "4.59.0", + "@rollup/rollup-freebsd-arm64": "4.59.0", + "@rollup/rollup-freebsd-x64": "4.59.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", + "@rollup/rollup-linux-arm-musleabihf": "4.59.0", + "@rollup/rollup-linux-arm64-gnu": "4.59.0", + "@rollup/rollup-linux-arm64-musl": "4.59.0", + "@rollup/rollup-linux-loong64-gnu": "4.59.0", + "@rollup/rollup-linux-loong64-musl": "4.59.0", + "@rollup/rollup-linux-ppc64-gnu": "4.59.0", + "@rollup/rollup-linux-ppc64-musl": "4.59.0", + "@rollup/rollup-linux-riscv64-gnu": "4.59.0", + "@rollup/rollup-linux-riscv64-musl": "4.59.0", + "@rollup/rollup-linux-s390x-gnu": "4.59.0", + "@rollup/rollup-linux-x64-gnu": "4.59.0", + "@rollup/rollup-linux-x64-musl": "4.59.0", + "@rollup/rollup-openbsd-x64": "4.59.0", + "@rollup/rollup-openharmony-arm64": "4.59.0", + "@rollup/rollup-win32-arm64-msvc": "4.59.0", + "@rollup/rollup-win32-ia32-msvc": "4.59.0", + "@rollup/rollup-win32-x64-gnu": "4.59.0", + "@rollup/rollup-win32-x64-msvc": "4.59.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tailwindcss": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.1.tgz", + "integrity": "sha512-/tBrSQ36vCleJkAOsy9kbNTgaxvGbyOamC30PRePTQe/o1MFwEKHQk4Cn7BNGaPtjp+PuUrByJehM1hgxfq4sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/typescript": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/vite": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz", + "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vscode-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", + "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/vue": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.30.tgz", + "integrity": "sha512-hTHLc6VNZyzzEH/l7PFGjpcTvUgiaPK5mdLkbjrTeWSRcEfxFrv56g/XckIYlE9ckuobsdwqd5mk2g1sBkMewg==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.30", + "@vue/compiler-sfc": "3.5.30", + "@vue/runtime-dom": "3.5.30", + "@vue/server-renderer": "3.5.30", + "@vue/shared": "3.5.30" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-tsc": { + "version": "2.2.12", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.2.12.tgz", + "integrity": "sha512-P7OP77b2h/Pmk+lZdJ0YWs+5tJ6J2+uOQPo7tlBnY44QqQSPYvS0qVT4wqDJgwrZaLe47etJLLQRFia71GYITw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/typescript": "2.4.15", + "@vue/language-core": "2.2.12" + }, + "bin": { + "vue-tsc": "bin/vue-tsc.js" + }, + "peerDependencies": { + "typescript": ">=5.0.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..5998594 --- /dev/null +++ b/package.json @@ -0,0 +1,24 @@ +{ + "name": "taptrack-website", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vue-tsc -b && vite build", + "preview": "vite preview" + }, + "dependencies": { + "lucide-vue-next": "^0.511.0", + "vue": "^3.5.13" + }, + "devDependencies": { + "@tailwindcss/vite": "^4.1.4", + "@vitejs/plugin-vue": "^5.2.3", + "@vue/tsconfig": "^0.7.0", + "tailwindcss": "^4.1.4", + "typescript": "~5.7.2", + "vite": "^6.3.3", + "vue-tsc": "^2.2.8" + } +} diff --git a/pencil-new.pen b/pencil-new.pen new file mode 100644 index 0000000..b6ec1be --- /dev/null +++ b/pencil-new.pen @@ -0,0 +1,2958 @@ +{ + "version": "2.8", + "children": [ + { + "type": "frame", + "id": "bi8Au", + "x": 0, + "y": 0, + "name": "Frame", + "clip": true, + "width": 800, + "height": 600, + "fill": "#FFFFFF", + "layout": "none" + }, + { + "type": "frame", + "id": "ZtWEm", + "x": 0, + "y": 0, + "name": "TapTrack Landing Page", + "width": 1440, + "fill": "#FFFFFF", + "layout": "vertical", + "children": [ + { + "type": "frame", + "id": "btZFL", + "name": "Navigation", + "width": "fill_container", + "height": 68, + "fill": "#FFFFFF", + "stroke": { + "align": "outside", + "thickness": 1, + "fill": "#E2E8F0" + }, + "gap": 48, + "padding": [ + 0, + 100 + ], + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "ZVhQt", + "name": "Logo", + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "b5wCQ", + "name": "navLogoMark", + "width": 32, + "height": 32, + "fill": "#1D4ED8", + "cornerRadius": 8, + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "tQzq4", + "name": "navLogoMarkText", + "fill": "#FFFFFF", + "content": "T", + "fontFamily": "Inter", + "fontSize": 16, + "fontWeight": "bold" + } + ] + }, + { + "type": "text", + "id": "KQKD6", + "name": "navLogoName", + "fill": "#0F172A", + "content": "TapTrack", + "fontFamily": "Inter", + "fontSize": 18, + "fontWeight": "bold" + } + ] + }, + { + "type": "frame", + "id": "t5eqc", + "name": "navSpacer", + "width": "fill_container", + "height": 1 + }, + { + "type": "frame", + "id": "4E962", + "name": "navLinks", + "gap": 36, + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "X0Qej", + "name": "navL1", + "fill": "#475569", + "content": "Features", + "fontFamily": "Inter", + "fontSize": 14, + "fontWeight": "medium" + }, + { + "type": "text", + "id": "CF6JN", + "name": "navL2", + "fill": "#475569", + "content": "How It Works", + "fontFamily": "Inter", + "fontSize": 14, + "fontWeight": "medium" + }, + { + "type": "text", + "id": "KMjy8", + "name": "navL3", + "fill": "#475569", + "content": "Services", + "fontFamily": "Inter", + "fontSize": 14, + "fontWeight": "medium" + }, + { + "type": "text", + "id": "Z5i8G", + "name": "navL4", + "fill": "#475569", + "content": "Contact", + "fontFamily": "Inter", + "fontSize": 14, + "fontWeight": "medium" + } + ] + }, + { + "type": "frame", + "id": "UC7lY", + "name": "navCta", + "fill": "#1D4ED8", + "cornerRadius": 8, + "padding": [ + 10, + 22 + ], + "children": [ + { + "type": "text", + "id": "2gUMd", + "name": "navCtaText", + "fill": "#FFFFFF", + "content": "Request a Demo", + "fontFamily": "Inter", + "fontSize": 14, + "fontWeight": "semibold" + } + ] + } + ] + }, + { + "type": "frame", + "id": "iSw4I", + "name": "Hero", + "width": "fill_container", + "height": 640, + "fill": "#F8FAFF", + "gap": 80, + "padding": [ + 0, + 100 + ], + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "En22C", + "name": "Hero Left", + "width": "fill_container", + "layout": "vertical", + "gap": 28, + "children": [ + { + "type": "frame", + "id": "Q5X1W", + "name": "heroPill", + "fill": "#EFF6FF", + "cornerRadius": 20, + "gap": 6, + "padding": [ + 5, + 12 + ], + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "axZA7", + "name": "heroPillDot", + "width": 6, + "height": 6, + "fill": "#1D4ED8", + "cornerRadius": 3 + }, + { + "type": "text", + "id": "qB9gJ", + "name": "heroPillText", + "fill": "#1D4ED8", + "content": "Built for Philippine Schools", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "semibold" + } + ] + }, + { + "type": "text", + "id": "XOkf8", + "name": "H1", + "fill": "#0F172A", + "textGrowth": "fixed-width", + "width": 560, + "content": "Attendance That\nRuns Itself.", + "lineHeight": 1.1, + "fontFamily": "Inter", + "fontSize": 58, + "fontWeight": "bold" + }, + { + "type": "text", + "id": "hupvA", + "name": "Sub", + "fill": "#475569", + "textGrowth": "fixed-width", + "width": 520, + "content": "TapTrack is an on-premises NFC attendance system — students tap their ID card, parents get an SMS, and your records are updated automatically. No manual registers. No paper trails.", + "lineHeight": 1.7, + "fontFamily": "Inter", + "fontSize": 17, + "fontWeight": "normal" + }, + { + "type": "frame", + "id": "v5Iu9", + "name": "heroBtns", + "gap": 12, + "children": [ + { + "type": "frame", + "id": "4BbwD", + "name": "heroBtn1", + "fill": "#1D4ED8", + "cornerRadius": 8, + "padding": [ + 13, + 26 + ], + "children": [ + { + "type": "text", + "id": "idkdB", + "name": "heroBtn1Txt", + "fill": "#FFFFFF", + "content": "Request a Demo", + "fontFamily": "Inter", + "fontSize": 15, + "fontWeight": "semibold" + } + ] + }, + { + "type": "frame", + "id": "xNEMD", + "name": "heroBtn2", + "fill": "#FFFFFF", + "cornerRadius": 8, + "stroke": { + "thickness": 1, + "fill": "#CBD5E1" + }, + "padding": [ + 13, + 26 + ], + "children": [ + { + "type": "text", + "id": "v3yiW", + "name": "heroBtn2Txt", + "fill": "#334155", + "content": "See How It Works", + "fontFamily": "Inter", + "fontSize": 15, + "fontWeight": "medium" + } + ] + } + ] + }, + { + "type": "frame", + "id": "zKR1a", + "name": "heroTrustRow", + "gap": 20, + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "KGOM4", + "name": "heroTrust1", + "fill": "#64748B", + "content": "✓ Student data stays on your servers", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "HEUTM", + "name": "heroTrust2", + "fill": "#64748B", + "content": "✓ No cloud lock-in", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "normal" + } + ] + } + ] + }, + { + "type": "frame", + "id": "Cdt5X", + "name": "Hero Right", + "width": 580, + "layout": "vertical", + "gap": 16, + "children": [ + { + "type": "text", + "id": "H6AHd", + "name": "heroCaption", + "fill": "#94A3B8", + "textGrowth": "fixed-width", + "width": 580, + "content": "Live dashboard running on your school's own server — data never leaves your premises.", + "textAlign": "center", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + }, + { + "type": "frame", + "id": "s5g4Q", + "name": "Dashboard Mockup", + "clip": true, + "width": 580, + "height": 380, + "fill": { + "type": "image", + "enabled": true, + "url": "public/screenshots/58IBI.png", + "mode": "fill" + }, + "cornerRadius": 16, + "stroke": { + "thickness": 2, + "fill": "#E2E8F0" + }, + "layout": "none" + } + ] + } + ] + }, + { + "type": "frame", + "id": "aGonW", + "name": "Privacy Banner", + "width": "fill_container", + "fill": "#0F172A", + "gap": 80, + "padding": [ + 56, + 100 + ], + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "JWKIj", + "name": "privLeft", + "width": "fill_container", + "layout": "vertical", + "gap": 12, + "children": [ + { + "type": "frame", + "id": "YXiL8", + "name": "privLabel", + "fill": "#1E3A5F", + "cornerRadius": 4, + "padding": [ + 4, + 10 + ], + "children": [ + { + "type": "text", + "id": "BPoZv", + "name": "privLabelTxt", + "fill": "#60A5FA", + "content": "DATA PRIVACY", + "fontFamily": "Inter", + "fontSize": 11, + "fontWeight": "semibold", + "letterSpacing": 1 + } + ] + }, + { + "type": "text", + "id": "zwuAz", + "name": "privTitle", + "fill": "#FFFFFF", + "textGrowth": "fixed-width", + "width": 500, + "content": "Student data never leaves your school.", + "lineHeight": 1.2, + "fontFamily": "Inter", + "fontSize": 28, + "fontWeight": "bold" + }, + { + "type": "text", + "id": "xZ89x", + "name": "privSub", + "fill": "#94A3B8", + "textGrowth": "fixed-width", + "width": 500, + "content": "TapTrack runs entirely on your own server. No student records, attendance logs, or personal data are ever uploaded to a third-party cloud.", + "lineHeight": 1.6, + "fontFamily": "Inter", + "fontSize": 15, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "q9k23", + "name": "privRight", + "gap": 40, + "children": [ + { + "type": "frame", + "id": "AXLbG", + "name": "privStat1", + "layout": "vertical", + "gap": 6, + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "NzuLL", + "name": "privStat1Icon", + "width": 28, + "height": 28, + "iconFontName": "server", + "iconFontFamily": "lucide", + "fill": "#60A5FA" + }, + { + "type": "text", + "id": "PBZ1G", + "name": "privStat1Txt", + "fill": "#FFFFFF", + "content": "On-Premises", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "semibold" + }, + { + "type": "text", + "id": "9XXek", + "name": "privStat1Sub", + "fill": "#64748B", + "content": "Your server only", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "OEGKl", + "name": "privStat2", + "layout": "vertical", + "gap": 6, + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "Q24zj", + "name": "privStat2Icon", + "width": 28, + "height": 28, + "iconFontName": "shield", + "iconFontFamily": "lucide", + "fill": "#60A5FA" + }, + { + "type": "text", + "id": "mYlLy", + "name": "privStat2Txt", + "fill": "#FFFFFF", + "content": "DepEd Aligned", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "semibold" + }, + { + "type": "text", + "id": "Te2k9", + "name": "privStat2Sub", + "fill": "#64748B", + "content": "Data privacy ready", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "8TQwS", + "name": "privStat3", + "layout": "vertical", + "gap": 6, + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "AmbAw", + "name": "privStat3Icon", + "width": 28, + "height": 28, + "iconFontName": "wifi-off", + "iconFontFamily": "lucide", + "fill": "#60A5FA" + }, + { + "type": "text", + "id": "E5d8M", + "name": "privStat3Txt", + "fill": "#FFFFFF", + "content": "Works Offline", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "semibold" + }, + { + "type": "text", + "id": "HBirQ", + "name": "privStat3Sub", + "fill": "#64748B", + "content": "No internet required", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + } + ] + } + ] + } + ] + }, + { + "type": "frame", + "id": "8tiWV", + "name": "See It Live Section", + "width": "fill_container", + "fill": "#F8FAFF", + "layout": "vertical", + "gap": 40, + "padding": [ + 96, + 100 + ], + "children": [ + { + "type": "frame", + "id": "2b1LH", + "name": "seeHdr", + "width": "fill_container", + "layout": "vertical", + "gap": 10, + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "kRTbL", + "name": "seeLabel", + "fill": "#1D4ED8", + "content": "THE SYSTEM IN ACTION", + "fontFamily": "Inter", + "fontSize": 11, + "fontWeight": "semibold", + "letterSpacing": 2 + }, + { + "type": "text", + "id": "t6XZI", + "name": "seeTitle", + "fill": "#0F172A", + "textGrowth": "fixed-width", + "width": 600, + "content": "The gate display students see every morning.", + "lineHeight": 1.15, + "textAlign": "center", + "fontFamily": "Inter", + "fontSize": 38, + "fontWeight": "bold" + }, + { + "type": "text", + "id": "0FlMY", + "name": "seeSub", + "fill": "#64748B", + "textGrowth": "fixed-width", + "width": 600, + "content": "A full-screen kiosk view runs at your school gate — students tap their NFC ID card and instantly see their name, section, and status confirmed.", + "lineHeight": 1.6, + "textAlign": "center", + "fontFamily": "Inter", + "fontSize": 16, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "Sel0H", + "name": "Gate View Mockup", + "clip": true, + "width": 960, + "height": 540, + "fill": { + "type": "image", + "enabled": true, + "url": "public/screenshots/gE861.png", + "mode": "fill" + }, + "cornerRadius": 16, + "stroke": { + "thickness": 1, + "fill": "#E2E8F0" + }, + "layout": "none" + }, + { + "type": "text", + "id": "JWOx5", + "name": "seeCaption", + "fill": "#94A3B8", + "textGrowth": "fixed-width", + "width": 700, + "content": "Full-screen gate display running on a monitor at your school entrance. No login required for students — just tap and go.", + "textAlign": "center", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "48I9K", + "name": "Features Section", + "width": "fill_container", + "fill": "#FFFFFF", + "layout": "vertical", + "gap": 72, + "padding": [ + 96, + 100 + ], + "children": [ + { + "type": "frame", + "id": "KqYcK", + "name": "featsHdr", + "width": "fill_container", + "layout": "vertical", + "gap": 10, + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "dwzDo", + "name": "featsHdrLabel", + "fill": "#1D4ED8", + "content": "WHAT TAPTRACK DOES", + "fontFamily": "Inter", + "fontSize": 11, + "fontWeight": "semibold", + "letterSpacing": 2 + }, + { + "type": "text", + "id": "tlicn", + "name": "featsHdrTitle", + "fill": "#0F172A", + "textGrowth": "fixed-width", + "width": 560, + "content": "Every feature your school\nactually needs.", + "lineHeight": 1.15, + "textAlign": "center", + "fontFamily": "Inter", + "fontSize": 40, + "fontWeight": "bold" + }, + { + "type": "text", + "id": "wG2Tn", + "name": "featsHdrSub", + "fill": "#64748B", + "textGrowth": "fixed-width", + "width": 560, + "content": "Designed around the real workflow of Filipino schools — from homeroom attendance to parent communication.", + "lineHeight": 1.6, + "textAlign": "center", + "fontFamily": "Inter", + "fontSize": 17, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "0uUEw", + "name": "featsRow1", + "width": "fill_container", + "gap": 24, + "children": [ + { + "type": "frame", + "id": "NIakN", + "name": "fcard1", + "width": "fill_container", + "fill": "#F8FAFC", + "cornerRadius": 14, + "stroke": { + "thickness": 1, + "fill": "#E2E8F0" + }, + "layout": "vertical", + "gap": 14, + "padding": [ + 32, + 28 + ], + "children": [ + { + "type": "frame", + "id": "Xl2lr", + "name": "fcard1Icon", + "width": 44, + "height": 44, + "fill": "#EFF6FF", + "cornerRadius": 10, + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "xK2EV", + "name": "fcard1IconI", + "width": 22, + "height": 22, + "iconFontName": "credit-card", + "iconFontFamily": "lucide", + "fill": "#1D4ED8" + } + ] + }, + { + "type": "text", + "id": "pgyKT", + "name": "fcard1Title", + "fill": "#0F172A", + "content": "NFC Tap-In Attendance", + "fontFamily": "Inter", + "fontSize": 16, + "fontWeight": "semibold" + }, + { + "type": "text", + "id": "pfgfN", + "name": "fcard1Desc", + "fill": "#64748B", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "Students tap their NFC ID card on the reader. Attendance is recorded instantly — no queuing, no manual entry, no errors.", + "lineHeight": 1.65, + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "KXpRQ", + "name": "fcard2", + "width": "fill_container", + "fill": "#F8FAFC", + "cornerRadius": 14, + "stroke": { + "thickness": 1, + "fill": "#E2E8F0" + }, + "layout": "vertical", + "gap": 14, + "padding": [ + 32, + 28 + ], + "children": [ + { + "type": "frame", + "id": "UUhEY", + "name": "fcard2Icon", + "width": 44, + "height": 44, + "fill": "#ECFDF5", + "cornerRadius": 10, + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "6hs9P", + "name": "fcard2IconI", + "width": 22, + "height": 22, + "iconFontName": "message-square", + "iconFontFamily": "lucide", + "fill": "#059669" + } + ] + }, + { + "type": "text", + "id": "E7hgZ", + "name": "fcard2Title", + "fill": "#0F172A", + "content": "Instant Parent SMS Alerts", + "fontFamily": "Inter", + "fontSize": 16, + "fontWeight": "semibold" + }, + { + "type": "text", + "id": "BV4Yg", + "name": "fcard2Desc", + "fill": "#64748B", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "Parents receive an automatic SMS the moment their child arrives or is marked absent. No app required on their end.", + "lineHeight": 1.65, + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "4mLYg", + "name": "fcard3", + "width": "fill_container", + "fill": "#F8FAFC", + "cornerRadius": 14, + "stroke": { + "thickness": 1, + "fill": "#E2E8F0" + }, + "layout": "vertical", + "gap": 14, + "padding": [ + 32, + 28 + ], + "children": [ + { + "type": "frame", + "id": "NRoTb", + "name": "fcard3Icon", + "width": 44, + "height": 44, + "fill": "#FEF9C3", + "cornerRadius": 10, + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "dVGnR", + "name": "fcard3IconI", + "width": 22, + "height": 22, + "iconFontName": "layout-dashboard", + "iconFontFamily": "lucide", + "fill": "#CA8A04" + } + ] + }, + { + "type": "text", + "id": "CpvDP", + "name": "fcard3Title", + "fill": "#0F172A", + "content": "Live Attendance Dashboard", + "fontFamily": "Inter", + "fontSize": 16, + "fontWeight": "semibold" + }, + { + "type": "text", + "id": "3aJpm", + "name": "fcard3Desc", + "fill": "#64748B", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "Principals and advisers see real-time attendance, late counts, and absent students — all from a single screen.", + "lineHeight": 1.65, + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "normal" + } + ] + } + ] + }, + { + "type": "frame", + "id": "6P7WS", + "name": "featsRow2", + "width": "fill_container", + "gap": 24, + "children": [ + { + "type": "frame", + "id": "JP8th", + "name": "fcard4", + "width": "fill_container", + "fill": "#F8FAFC", + "cornerRadius": 14, + "stroke": { + "thickness": 1, + "fill": "#E2E8F0" + }, + "layout": "vertical", + "gap": 14, + "padding": [ + 32, + 28 + ], + "children": [ + { + "type": "frame", + "id": "sEePT", + "name": "fcard4Icon", + "width": 44, + "height": 44, + "fill": "#F3E8FF", + "cornerRadius": 10, + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "r0jW3", + "name": "fcard4IconI", + "width": 22, + "height": 22, + "iconFontName": "book-open", + "iconFontFamily": "lucide", + "fill": "#7C3AED" + } + ] + }, + { + "type": "text", + "id": "TVabl", + "name": "fcard4Title", + "fill": "#0F172A", + "content": "Automated Attendance Reports", + "fontFamily": "Inter", + "fontSize": 16, + "fontWeight": "semibold" + }, + { + "type": "text", + "id": "qM8kr", + "name": "fcard4Desc", + "fill": "#64748B", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "Monthly attendance summaries are generated and sent automatically to administrators — with per-student and per-class breakdowns.", + "lineHeight": 1.65, + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "eopYd", + "name": "fcard5", + "width": "fill_container", + "fill": "#F8FAFC", + "cornerRadius": 14, + "stroke": { + "thickness": 1, + "fill": "#E2E8F0" + }, + "layout": "vertical", + "gap": 14, + "padding": [ + 32, + 28 + ], + "children": [ + { + "type": "frame", + "id": "tLc9A", + "name": "fcard5Icon", + "width": 44, + "height": 44, + "fill": "#FFF1F2", + "cornerRadius": 10, + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "lNQCY", + "name": "fcard5IconI", + "width": 22, + "height": 22, + "iconFontName": "users", + "iconFontFamily": "lucide", + "fill": "#E11D48" + } + ] + }, + { + "type": "text", + "id": "R1X0W", + "name": "fcard5Title", + "fill": "#0F172A", + "content": "Student & Section Management", + "fontFamily": "Inter", + "fontSize": 16, + "fontWeight": "semibold" + }, + { + "type": "text", + "id": "os9f7", + "name": "fcard5Desc", + "fill": "#64748B", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "Manage your full student roster, assign sections and advisers, and link each student to their parent's contact number.", + "lineHeight": 1.65, + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "SV7SQ", + "name": "fcard6", + "width": "fill_container", + "fill": "#F8FAFC", + "cornerRadius": 14, + "stroke": { + "thickness": 1, + "fill": "#E2E8F0" + }, + "layout": "vertical", + "gap": 14, + "padding": [ + 32, + 28 + ], + "children": [ + { + "type": "frame", + "id": "qGKmq", + "name": "fcard6Icon", + "width": 44, + "height": 44, + "fill": "#E0F2FE", + "cornerRadius": 10, + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "7FZmK", + "name": "fcard6IconI", + "width": 22, + "height": 22, + "iconFontName": "activity", + "iconFontFamily": "lucide", + "fill": "#0284C7" + } + ] + }, + { + "type": "text", + "id": "DMVMy", + "name": "fcard6Title", + "fill": "#0F172A", + "content": "SMS Credit Monitoring", + "fontFamily": "Inter", + "fontSize": 16, + "fontWeight": "semibold" + }, + { + "type": "text", + "id": "Cs7MB", + "name": "fcard6Desc", + "fill": "#64748B", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "Track your prepaid SMS credit balance in real time. Low-credit alerts let you top up before you run out — no interruptions to parent notifications.", + "lineHeight": 1.65, + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "normal" + } + ] + } + ] + } + ] + }, + { + "type": "frame", + "id": "3fXON", + "name": "App Screenshots Section", + "width": "fill_container", + "fill": "#FFFFFF", + "layout": "vertical", + "gap": 56, + "padding": [ + 96, + 100 + ], + "children": [ + { + "type": "frame", + "id": "pxpqw", + "name": "screensHdr", + "width": "fill_container", + "layout": "vertical", + "gap": 10, + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "4V8T8", + "name": "screensLabel", + "fill": "#1D4ED8", + "content": "INSIDE TAPTRACK", + "fontFamily": "Inter", + "fontSize": 11, + "fontWeight": "semibold", + "letterSpacing": 2 + }, + { + "type": "text", + "id": "cOmDd", + "name": "screensTitle", + "fill": "#0F172A", + "textGrowth": "fixed-width", + "width": 600, + "content": "A system built for how your school actually works.", + "lineHeight": 1.15, + "textAlign": "center", + "fontFamily": "Inter", + "fontSize": 38, + "fontWeight": "bold" + }, + { + "type": "text", + "id": "JlmF0", + "name": "screensSub", + "fill": "#64748B", + "textGrowth": "fixed-width", + "width": 580, + "content": "Every screen is purpose-built for school administrators, advisers, and principals — not generic enterprise software.", + "lineHeight": 1.6, + "textAlign": "center", + "fontFamily": "Inter", + "fontSize": 16, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "9K50I", + "name": "screensGrid", + "width": "fill_container", + "gap": 28, + "children": [ + { + "type": "frame", + "id": "aTbgz", + "name": "screen2Card", + "width": "fill_container", + "cornerRadius": 14, + "stroke": { + "thickness": 1, + "fill": "#E2E8F0" + }, + "layout": "vertical", + "gap": 16, + "children": [ + { + "type": "frame", + "id": "Fg6TC", + "name": "screen2Img", + "clip": true, + "width": "fill_container", + "height": 340, + "fill": { + "type": "image", + "enabled": true, + "url": "public/screenshots/4frZA.png", + "mode": "fill" + }, + "cornerRadius": [ + 14, + 14, + 0, + 0 + ], + "layout": "none" + }, + { + "type": "frame", + "id": "Tuk1K", + "name": "screen2Info", + "width": "fill_container", + "layout": "vertical", + "gap": 6, + "padding": [ + 20, + 24 + ], + "children": [ + { + "type": "text", + "id": "xaAtu", + "name": "screen2Title", + "fill": "#0F172A", + "content": "Student Directory", + "fontFamily": "Inter", + "fontSize": 16, + "fontWeight": "semibold" + }, + { + "type": "text", + "id": "AT90i", + "name": "screen2Desc", + "fill": "#64748B", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "Manage your full roster — NFC ID assignments, parent numbers, section placement, and enrolment status all in one place.", + "lineHeight": 1.6, + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "normal" + } + ] + } + ] + }, + { + "type": "frame", + "id": "kO7g1", + "name": "screen3Card", + "width": "fill_container", + "cornerRadius": 14, + "stroke": { + "thickness": 1, + "fill": "#E2E8F0" + }, + "layout": "vertical", + "gap": 16, + "children": [ + { + "type": "frame", + "id": "xJzl4", + "name": "screen3Img", + "clip": true, + "width": "fill_container", + "height": 340, + "fill": { + "type": "image", + "enabled": true, + "url": "public/screenshots/rj2JV.png", + "mode": "fill" + }, + "cornerRadius": [ + 14, + 14, + 0, + 0 + ], + "layout": "none" + }, + { + "type": "frame", + "id": "4Gc8e", + "name": "screen3Info", + "width": "fill_container", + "layout": "vertical", + "gap": 6, + "padding": [ + 20, + 24 + ], + "children": [ + { + "type": "text", + "id": "80CdL", + "name": "screen3Title", + "fill": "#0F172A", + "content": "Reports & Analytics", + "fontFamily": "Inter", + "fontSize": 16, + "fontWeight": "semibold" + }, + { + "type": "text", + "id": "RpoaA", + "name": "screen3Desc", + "fill": "#64748B", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "Generate attendance summaries by class, date range, and section. Export to PDF or Excel for DepEd compliance and parent meetings.", + "lineHeight": 1.6, + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "normal" + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "frame", + "id": "QRXXX", + "name": "How It Works", + "width": "fill_container", + "fill": "#F8FAFF", + "gap": 80, + "padding": [ + 96, + 100 + ], + "children": [ + { + "type": "frame", + "id": "DrayE", + "name": "hiwLeft", + "width": "fill_container", + "layout": "vertical", + "gap": 40, + "children": [ + { + "type": "frame", + "id": "ra4oY", + "name": "hiwHdr", + "layout": "vertical", + "gap": 10, + "children": [ + { + "type": "text", + "id": "3lOXU", + "name": "hiwLabel", + "fill": "#1D4ED8", + "content": "HOW IT WORKS", + "fontFamily": "Inter", + "fontSize": 11, + "fontWeight": "semibold", + "letterSpacing": 2 + }, + { + "type": "text", + "id": "A1BOd", + "name": "hiwTitle", + "fill": "#0F172A", + "textGrowth": "fixed-width", + "width": 480, + "content": "Simple to set up.\nSimple to run.", + "lineHeight": 1.15, + "fontFamily": "Inter", + "fontSize": 38, + "fontWeight": "bold" + }, + { + "type": "text", + "id": "wIoF7", + "name": "hiwSub", + "fill": "#64748B", + "textGrowth": "fixed-width", + "width": 460, + "content": "Our team handles the full installation. Once you're live, the system runs on its own.", + "lineHeight": 1.6, + "fontFamily": "Inter", + "fontSize": 16, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "nOhV8", + "name": "step1", + "width": "fill_container", + "gap": 20, + "children": [ + { + "type": "frame", + "id": "nnTJe", + "name": "step1Num", + "width": 36, + "height": 36, + "fill": "#1D4ED8", + "cornerRadius": 18, + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "51Ziy", + "name": "step1NumTxt", + "fill": "#FFFFFF", + "content": "1", + "fontFamily": "Inter", + "fontSize": 15, + "fontWeight": "bold" + } + ] + }, + { + "type": "frame", + "id": "pq7CK", + "name": "step1Content", + "width": "fill_container", + "layout": "vertical", + "gap": 6, + "children": [ + { + "type": "text", + "id": "Phrhf", + "name": "step1Title", + "fill": "#0F172A", + "content": "We install TapTrack on your school's hardware", + "fontFamily": "Inter", + "fontSize": 15, + "fontWeight": "semibold" + }, + { + "type": "text", + "id": "b7xLt", + "name": "step1Desc", + "fill": "#64748B", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "Our team sets up the on-premises software and NFC reader. You pay a one-time implementation fee and you own the setup.", + "lineHeight": 1.6, + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "normal" + } + ] + } + ] + }, + { + "type": "frame", + "id": "OfAsb", + "name": "step2", + "width": "fill_container", + "gap": 20, + "children": [ + { + "type": "frame", + "id": "ywxn6", + "name": "step2Num", + "width": 36, + "height": 36, + "fill": "#1D4ED8", + "cornerRadius": 18, + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "OLZ34", + "name": "step2NumTxt", + "fill": "#FFFFFF", + "content": "2", + "fontFamily": "Inter", + "fontSize": 15, + "fontWeight": "bold" + } + ] + }, + { + "type": "frame", + "id": "2hMIh", + "name": "step2Content", + "width": "fill_container", + "layout": "vertical", + "gap": 6, + "children": [ + { + "type": "text", + "id": "gGkux", + "name": "step2Title", + "fill": "#0F172A", + "content": "We enrol your students and train your staff", + "fontFamily": "Inter", + "fontSize": 15, + "fontWeight": "semibold" + }, + { + "type": "text", + "id": "caOy9", + "name": "step2Desc", + "fill": "#64748B", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "We import your student list, assign NFC ID cards, add parent numbers, and run a full walkthrough with your administrators.", + "lineHeight": 1.6, + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "normal" + } + ] + } + ] + }, + { + "type": "frame", + "id": "JT9fZ", + "name": "step3", + "width": "fill_container", + "gap": 20, + "children": [ + { + "type": "frame", + "id": "UiVXf", + "name": "step3Num", + "width": 36, + "height": 36, + "fill": "#1D4ED8", + "cornerRadius": 18, + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "jerZw", + "name": "step3NumTxt", + "fill": "#FFFFFF", + "content": "3", + "fontFamily": "Inter", + "fontSize": 15, + "fontWeight": "bold" + } + ] + }, + { + "type": "frame", + "id": "am5Gi", + "name": "step3Content", + "width": "fill_container", + "layout": "vertical", + "gap": 6, + "children": [ + { + "type": "text", + "id": "8bhqY", + "name": "step3Title", + "fill": "#0F172A", + "content": "Top up SMS credits monthly as needed", + "fontFamily": "Inter", + "fontSize": 15, + "fontWeight": "semibold" + }, + { + "type": "text", + "id": "YYBXZ", + "name": "step3Desc", + "fill": "#64748B", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "No recurring subscription. You purchase prepaid SMS credits when you need them. The system keeps sending alerts as long as your credits last.", + "lineHeight": 1.6, + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "normal" + } + ] + } + ] + } + ] + }, + { + "type": "frame", + "id": "LHLGY", + "name": "Billing Card", + "width": 460, + "fill": "#FFFFFF", + "cornerRadius": 20, + "stroke": { + "thickness": 1, + "fill": "#E2E8F0" + }, + "layout": "vertical", + "gap": 24, + "padding": 40, + "children": [ + { + "type": "text", + "id": "hA6o2", + "name": "hiwBillingTitle", + "fill": "#0F172A", + "content": "How billing works", + "fontFamily": "Inter", + "fontSize": 20, + "fontWeight": "bold" + }, + { + "type": "text", + "id": "hLi1d", + "name": "hiwBillingSub", + "fill": "#64748B", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "Transparent, no surprises. You only pay for what you actually use.", + "lineHeight": 1.6, + "fontFamily": "Inter", + "fontSize": 14, + "fontWeight": "normal" + }, + { + "type": "frame", + "id": "wwmUm", + "name": "hiwBillingItem1", + "stroke": { + "align": "outside", + "thickness": 1, + "fill": "#F1F5F9" + }, + "gap": 14, + "padding": [ + 16, + 0 + ], + "children": [ + { + "type": "frame", + "id": "uRBFf", + "name": "hiwBI1Icon", + "width": 36, + "height": 36, + "fill": "#EFF6FF", + "cornerRadius": 8, + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "b9KkC", + "name": "hiwBI1IconI", + "width": 18, + "height": 18, + "iconFontName": "wrench", + "iconFontFamily": "lucide", + "fill": "#1D4ED8" + } + ] + }, + { + "type": "frame", + "id": "hYd5i", + "name": "hiwBI1Text", + "width": 340, + "layout": "vertical", + "gap": 3, + "children": [ + { + "type": "text", + "id": "fgq7v", + "name": "hiwBI1Title", + "fill": "#0F172A", + "content": "One-Time Implementation Fee", + "fontFamily": "Inter", + "fontSize": 14, + "fontWeight": "semibold" + }, + { + "type": "text", + "id": "iP8qv", + "name": "hiwBI1Desc", + "fill": "#64748B", + "textGrowth": "fixed-width", + "width": 300, + "content": "Covers installation, student enrolment, NFC reader setup, and staff training. Paid once.", + "lineHeight": 1.5, + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "normal" + } + ] + } + ] + }, + { + "type": "frame", + "id": "Kmf4p", + "name": "hiwBillingItem2", + "gap": 14, + "padding": [ + 16, + 0 + ], + "children": [ + { + "type": "frame", + "id": "ol6TY", + "name": "hiwBI2Icon", + "width": 36, + "height": 36, + "fill": "#ECFDF5", + "cornerRadius": 8, + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "IUDJB", + "name": "hiwBI2IconI", + "width": 18, + "height": 18, + "iconFontName": "zap", + "iconFontFamily": "lucide", + "fill": "#059669" + } + ] + }, + { + "type": "frame", + "id": "pYF6P", + "name": "hiwBI2Text", + "width": 340, + "layout": "vertical", + "gap": 3, + "children": [ + { + "type": "text", + "id": "SXK0g", + "name": "hiwBI2Title", + "fill": "#0F172A", + "content": "Prepaid SMS Credits", + "fontFamily": "Inter", + "fontSize": 14, + "fontWeight": "semibold" + }, + { + "type": "text", + "id": "FpBM3", + "name": "hiwBI2Desc", + "fill": "#64748B", + "textGrowth": "fixed-width", + "width": 300, + "content": "Purchase credits when you need them. Each parent notification consumes one credit. Top up anytime.", + "lineHeight": 1.5, + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "normal" + } + ] + } + ] + }, + { + "type": "frame", + "id": "Y3kNw", + "name": "hiwBillingNote", + "fill": "#F0FDF4", + "cornerRadius": 8, + "gap": 10, + "padding": [ + 12, + 14 + ], + "children": [ + { + "type": "icon_font", + "id": "hA2N4", + "name": "hiwBillingNoteIcon", + "width": 16, + "height": 16, + "iconFontName": "circle-check", + "iconFontFamily": "lucide", + "fill": "#16A34A" + }, + { + "type": "text", + "id": "B2bfM", + "name": "hiwBillingNoteTxt", + "fill": "#15803D", + "textGrowth": "fixed-width", + "width": 300, + "content": "No monthly subscription fee. No lock-in contract. Pricing shared upon request.", + "lineHeight": 1.5, + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "normal" + } + ] + } + ] + } + ] + }, + { + "type": "frame", + "id": "3wIMb", + "name": "Support Section", + "width": "fill_container", + "fill": "#FFFFFF", + "layout": "vertical", + "gap": 64, + "padding": [ + 96, + 100 + ], + "children": [ + { + "type": "frame", + "id": "h7Mtq", + "name": "suppHdr", + "width": "fill_container", + "layout": "vertical", + "gap": 10, + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "4hXNC", + "name": "suppLabel", + "fill": "#1D4ED8", + "content": "AFTER-SALES SUPPORT", + "fontFamily": "Inter", + "fontSize": 11, + "fontWeight": "semibold", + "letterSpacing": 2 + }, + { + "type": "text", + "id": "vdmTB", + "name": "suppTitle", + "fill": "#0F172A", + "textGrowth": "fixed-width", + "width": 560, + "content": "We don't just install and leave.", + "lineHeight": 1.15, + "textAlign": "center", + "fontFamily": "Inter", + "fontSize": 38, + "fontWeight": "bold" + }, + { + "type": "text", + "id": "1FDQ5", + "name": "suppSub", + "fill": "#64748B", + "textGrowth": "fixed-width", + "width": 560, + "content": "Our team stays with you long after go-live. If something breaks or your staff needs help, we're one message away.", + "lineHeight": 1.6, + "textAlign": "center", + "fontFamily": "Inter", + "fontSize": 17, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "DvKwg", + "name": "suppGrid", + "width": "fill_container", + "gap": 24, + "children": [ + { + "type": "frame", + "id": "GBZla", + "name": "sc1", + "width": "fill_container", + "fill": "#F8FAFC", + "cornerRadius": 14, + "stroke": { + "thickness": 1, + "fill": "#E2E8F0" + }, + "layout": "vertical", + "gap": 16, + "padding": [ + 36, + 28 + ], + "children": [ + { + "type": "frame", + "id": "ZXQaf", + "name": "sc1IconBox", + "width": 44, + "height": 44, + "fill": "#EFF6FF", + "cornerRadius": 10, + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "XpJFI", + "name": "sc1Icon", + "width": 22, + "height": 22, + "iconFontName": "headphones", + "iconFontFamily": "lucide", + "fill": "#1D4ED8" + } + ] + }, + { + "type": "text", + "id": "i2F2d", + "name": "sc1Title", + "fill": "#0F172A", + "content": "Dedicated Support Channel", + "fontFamily": "Inter", + "fontSize": 16, + "fontWeight": "semibold" + }, + { + "type": "text", + "id": "457ul", + "name": "sc1Desc", + "fill": "#64748B", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "Get direct access to our technical team via chat or phone. No ticket queues, no bots — real people who know your setup.", + "lineHeight": 1.65, + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "R2nlN", + "name": "sc2", + "width": "fill_container", + "fill": "#F8FAFC", + "cornerRadius": 14, + "stroke": { + "thickness": 1, + "fill": "#E2E8F0" + }, + "layout": "vertical", + "gap": 16, + "padding": [ + 36, + 28 + ], + "children": [ + { + "type": "frame", + "id": "JdtY0", + "name": "sc2IconBox", + "width": 44, + "height": 44, + "fill": "#FEF9C3", + "cornerRadius": 10, + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "CfTnB", + "name": "sc2Icon", + "width": 22, + "height": 22, + "iconFontName": "settings", + "iconFontFamily": "lucide", + "fill": "#CA8A04" + } + ] + }, + { + "type": "text", + "id": "JadMf", + "name": "sc2Title", + "fill": "#0F172A", + "content": "System Updates & Maintenance", + "fontFamily": "Inter", + "fontSize": 16, + "fontWeight": "semibold" + }, + { + "type": "text", + "id": "qZjuh", + "name": "sc2Desc", + "fill": "#64748B", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "We push updates to fix bugs and add improvements. Your system stays current without you having to do anything.", + "lineHeight": 1.65, + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "WYJQJ", + "name": "sc3", + "width": "fill_container", + "fill": "#F8FAFC", + "cornerRadius": 14, + "stroke": { + "thickness": 1, + "fill": "#E2E8F0" + }, + "layout": "vertical", + "gap": 16, + "padding": [ + 36, + 28 + ], + "children": [ + { + "type": "frame", + "id": "i9zaY", + "name": "sc3IconBox", + "width": 44, + "height": 44, + "fill": "#ECFDF5", + "cornerRadius": 10, + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "Iy7km", + "name": "sc3Icon", + "width": 22, + "height": 22, + "iconFontName": "graduation-cap", + "iconFontFamily": "lucide", + "fill": "#059669" + } + ] + }, + { + "type": "text", + "id": "ugVrW", + "name": "sc3Title", + "fill": "#0F172A", + "content": "Staff Re-training Assistance", + "fontFamily": "Inter", + "fontSize": 16, + "fontWeight": "semibold" + }, + { + "type": "text", + "id": "iFChx", + "name": "sc3Desc", + "fill": "#64748B", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "New school year, new staff? We'll get your team up to speed. Re-training sessions available on request.", + "lineHeight": 1.65, + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "normal" + } + ] + } + ] + }, + { + "type": "frame", + "id": "TkUcL", + "name": "suppGrid2", + "width": "fill_container", + "gap": 24, + "children": [ + { + "type": "frame", + "id": "pssKD", + "name": "sc4", + "width": "fill_container", + "fill": "#F8FAFC", + "cornerRadius": 14, + "stroke": { + "thickness": 1, + "fill": "#E2E8F0" + }, + "layout": "vertical", + "gap": 16, + "padding": [ + 36, + 28 + ], + "children": [ + { + "type": "frame", + "id": "eYx3S", + "name": "sc4IconBox", + "width": 44, + "height": 44, + "fill": "#F3E8FF", + "cornerRadius": 10, + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "93UUS", + "name": "sc4Icon", + "width": 22, + "height": 22, + "iconFontName": "monitor", + "iconFontFamily": "lucide", + "fill": "#7C3AED" + } + ] + }, + { + "type": "text", + "id": "JIWdx", + "name": "sc4Title", + "fill": "#0F172A", + "content": "Remote Troubleshooting", + "fontFamily": "Inter", + "fontSize": 16, + "fontWeight": "semibold" + }, + { + "type": "text", + "id": "5lp1E", + "name": "sc4Desc", + "fill": "#64748B", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "Most issues can be resolved remotely. Our team can connect to your system and fix problems without an on-site visit.", + "lineHeight": 1.65, + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "Pk5eK", + "name": "sc5", + "width": "fill_container", + "fill": "#F8FAFC", + "cornerRadius": 14, + "stroke": { + "thickness": 1, + "fill": "#E2E8F0" + }, + "layout": "vertical", + "gap": 16, + "padding": [ + 36, + 28 + ], + "children": [ + { + "type": "frame", + "id": "8WWqI", + "name": "sc5IconBox", + "width": 44, + "height": 44, + "fill": "#FFF1F2", + "cornerRadius": 10, + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "2iTu3", + "name": "sc5Icon", + "width": 22, + "height": 22, + "iconFontName": "database-backup", + "iconFontFamily": "lucide", + "fill": "#E11D48" + } + ] + }, + { + "type": "text", + "id": "CYdPq", + "name": "sc5Title", + "fill": "#0F172A", + "content": "Data Backup Assistance", + "fontFamily": "Inter", + "fontSize": 16, + "fontWeight": "semibold" + }, + { + "type": "text", + "id": "OlgZI", + "name": "sc5Desc", + "fill": "#64748B", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "We help you set up regular attendance data backups so your records are always safe, even if hardware fails.", + "lineHeight": 1.65, + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "ylmbq", + "name": "sc6", + "width": "fill_container", + "fill": "#EFF6FF", + "cornerRadius": 14, + "stroke": { + "thickness": 1, + "fill": "#BFDBFE" + }, + "layout": "vertical", + "gap": 16, + "padding": [ + 36, + 28 + ], + "children": [ + { + "type": "text", + "id": "BR5cX", + "name": "sc6Quote", + "fill": "#1E3A5F", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "\"Think of us as your school's IT partner for attendance — not just a vendor who sold you something.\"", + "lineHeight": 1.65, + "fontFamily": "Inter", + "fontSize": 16, + "fontWeight": "medium" + }, + { + "type": "frame", + "id": "dmk4Z", + "name": "sc6AuthorRow", + "gap": 10, + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "Wr3Eh", + "name": "sc6AuthorAvatar", + "width": 36, + "height": 36, + "fill": "#1D4ED8", + "cornerRadius": 18, + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "4xA9L", + "name": "sc6AuthorAvatarTxt", + "fill": "#FFFFFF", + "content": "TT", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "bold" + } + ] + }, + { + "type": "text", + "id": "W8lTm", + "name": "sc6AuthorName", + "fill": "#1D4ED8", + "content": "TapTrack Support Team", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "semibold" + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "frame", + "id": "en5G6", + "name": "Contact CTA", + "width": "fill_container", + "fill": "#0F172A", + "gap": 80, + "padding": [ + 80, + 100 + ], + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "947bL", + "name": "ctaLeft", + "width": "fill_container", + "layout": "vertical", + "gap": 20, + "children": [ + { + "type": "text", + "id": "VGvGS", + "name": "ctaLabel", + "fill": "#60A5FA", + "content": "GET IN TOUCH", + "fontFamily": "Inter", + "fontSize": 11, + "fontWeight": "semibold", + "letterSpacing": 2 + }, + { + "type": "text", + "id": "itsQi", + "name": "ctaTitle", + "fill": "#FFFFFF", + "textGrowth": "fixed-width", + "width": 520, + "content": "Ready to bring TapTrack\nto your school?", + "lineHeight": 1.15, + "fontFamily": "Inter", + "fontSize": 40, + "fontWeight": "bold" + }, + { + "type": "text", + "id": "y1xLX", + "name": "ctaSub", + "fill": "#94A3B8", + "textGrowth": "fixed-width", + "width": 520, + "content": "Tell us about your school and we'll get back to you with a tailored proposal — including implementation scope, NFC hardware, and SMS credit packages that fit your needs.", + "lineHeight": 1.65, + "fontFamily": "Inter", + "fontSize": 16, + "fontWeight": "normal" + }, + { + "type": "frame", + "id": "0ofIP", + "name": "ctaPoints", + "layout": "vertical", + "gap": 10, + "children": [ + { + "type": "text", + "id": "CShbW", + "name": "ctaP1", + "fill": "#CBD5E1", + "content": "✓ Free consultation call with our team", + "fontFamily": "Inter", + "fontSize": 14, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "Xslft", + "name": "ctaP2", + "fill": "#CBD5E1", + "content": "✓ Custom quote based on your school size", + "fontFamily": "Inter", + "fontSize": 14, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "i29xA", + "name": "ctaP3", + "fill": "#CBD5E1", + "content": "✓ Demo of the live system before you commit", + "fontFamily": "Inter", + "fontSize": 14, + "fontWeight": "normal" + } + ] + } + ] + }, + { + "type": "frame", + "id": "GMH1q", + "name": "Contact Form Card", + "width": 480, + "fill": "#1E293B", + "cornerRadius": 16, + "layout": "vertical", + "gap": 20, + "padding": 36, + "children": [ + { + "type": "text", + "id": "5SbQ0", + "name": "ctaFormTitle", + "fill": "#FFFFFF", + "content": "Request a Demo", + "fontFamily": "Inter", + "fontSize": 20, + "fontWeight": "bold" + }, + { + "type": "text", + "id": "wtaf1", + "name": "ctaFormSub", + "fill": "#64748B", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "Fill this out and we'll reach you within 24 hours.", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "normal" + }, + { + "type": "frame", + "id": "0csb8", + "name": "ctaField1", + "width": "fill_container", + "layout": "vertical", + "gap": 6, + "children": [ + { + "type": "text", + "id": "YhpsN", + "name": "ctaField1Label", + "fill": "#CBD5E1", + "content": "School Name", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "medium" + }, + { + "type": "frame", + "id": "3sBMK", + "name": "ctaField1Input", + "width": "fill_container", + "height": 42, + "fill": "#0F172A", + "cornerRadius": 8, + "stroke": { + "thickness": 1, + "fill": "#334155" + }, + "padding": [ + 0, + 12 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "tip4C", + "name": "ctaField1Placeholder", + "fill": "#475569", + "content": "e.g. San Pedro Elementary School", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "normal" + } + ] + } + ] + }, + { + "type": "frame", + "id": "Q9xNt", + "name": "ctaField2", + "width": "fill_container", + "layout": "vertical", + "gap": 6, + "children": [ + { + "type": "text", + "id": "P1rm1", + "name": "ctaField2Label", + "fill": "#CBD5E1", + "content": "Contact Person", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "medium" + }, + { + "type": "frame", + "id": "jrWfx", + "name": "ctaField2Input", + "width": "fill_container", + "height": 42, + "fill": "#0F172A", + "cornerRadius": 8, + "stroke": { + "thickness": 1, + "fill": "#334155" + }, + "padding": [ + 0, + 12 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "8pD2r", + "name": "ph2", + "fill": "#475569", + "content": "Principal / Administrator name", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "normal" + } + ] + } + ] + }, + { + "type": "frame", + "id": "GK75z", + "name": "ctaField3", + "width": "fill_container", + "layout": "vertical", + "gap": 6, + "children": [ + { + "type": "text", + "id": "vTidm", + "name": "ctaField3Label", + "fill": "#CBD5E1", + "content": "Phone / Email", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "medium" + }, + { + "type": "frame", + "id": "QPcto", + "name": "ctaField3Input", + "width": "fill_container", + "height": 42, + "fill": "#0F172A", + "cornerRadius": 8, + "stroke": { + "thickness": 1, + "fill": "#334155" + }, + "padding": [ + 0, + 12 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "QXdZV", + "name": "ph3", + "fill": "#475569", + "content": "+63 9XX XXX XXXX or email@school.edu.ph", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "normal" + } + ] + } + ] + }, + { + "type": "frame", + "id": "hUVLW", + "name": "ctaFormBtn", + "width": "fill_container", + "fill": "#1D4ED8", + "cornerRadius": 8, + "padding": [ + 13, + 0 + ], + "justifyContent": "center", + "children": [ + { + "type": "text", + "id": "UZjVB", + "name": "ctaFormBtnTxt", + "fill": "#FFFFFF", + "content": "Send Request", + "fontFamily": "Inter", + "fontSize": 15, + "fontWeight": "semibold" + } + ] + } + ] + } + ] + }, + { + "type": "frame", + "id": "WnZ5O", + "name": "Footer", + "width": "fill_container", + "fill": "#020617", + "layout": "vertical", + "padding": [ + 56, + 100, + 28, + 100 + ], + "children": [ + { + "type": "frame", + "id": "BNFdS", + "name": "footerTop", + "width": "fill_container", + "gap": 64, + "padding": [ + 0, + 0, + 40, + 0 + ], + "children": [ + { + "type": "frame", + "id": "Pu71t", + "name": "fBrand", + "width": 260, + "layout": "vertical", + "gap": 14, + "children": [ + { + "type": "frame", + "id": "kpOL0", + "name": "fLogoRow", + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "KeADH", + "name": "fLogoBox", + "width": 28, + "height": 28, + "fill": "#1D4ED8", + "cornerRadius": 6, + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "NKQVP", + "name": "fLogoBoxT", + "fill": "#FFFFFF", + "content": "T", + "fontFamily": "Inter", + "fontSize": 14, + "fontWeight": "bold" + } + ] + }, + { + "type": "text", + "id": "uIvDc", + "name": "fLogoName", + "fill": "#FFFFFF", + "content": "TapTrack", + "fontFamily": "Inter", + "fontSize": 16, + "fontWeight": "bold" + } + ] + }, + { + "type": "text", + "id": "eAR87", + "name": "fTagline", + "fill": "#475569", + "textGrowth": "fixed-width", + "width": 220, + "content": "On-premises NFC attendance for Philippine schools. Student data stays where it belongs — with you.", + "lineHeight": 1.65, + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "hYr6I", + "name": "fSpacer", + "width": "fill_container", + "height": 1 + }, + { + "type": "frame", + "id": "L0P62", + "name": "fNav1", + "layout": "vertical", + "gap": 12, + "children": [ + { + "type": "text", + "id": "8FmCT", + "name": "fNav1T", + "fill": "#D1D5DB", + "content": "Product", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "semibold" + }, + { + "type": "text", + "id": "iCLIh", + "name": "fNav1L1", + "fill": "#6B7280", + "content": "Features", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "QVTkx", + "name": "fNav1L2", + "fill": "#6B7280", + "content": "How It Works", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "wwySt", + "name": "fNav1L3", + "fill": "#6B7280", + "content": "Services", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "GoNGy", + "name": "fNav2", + "layout": "vertical", + "gap": 12, + "children": [ + { + "type": "text", + "id": "ZvrzP", + "name": "fNav2T", + "fill": "#D1D5DB", + "content": "Company", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "semibold" + }, + { + "type": "text", + "id": "THjrB", + "name": "fNav2L1", + "fill": "#6B7280", + "content": "About Us", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "eRfnv", + "name": "fNav2L2", + "fill": "#6B7280", + "content": "Contact", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "HO3Dg", + "name": "fNav2L3", + "fill": "#6B7280", + "content": "Blog", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "VwlEK", + "name": "fNav3", + "layout": "vertical", + "gap": 12, + "children": [ + { + "type": "text", + "id": "HN4w3", + "name": "fNav3T", + "fill": "#D1D5DB", + "content": "Legal", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "semibold" + }, + { + "type": "text", + "id": "Gob2m", + "name": "fNav3L1", + "fill": "#6B7280", + "content": "Privacy Policy", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "aIBEu", + "name": "fNav3L2", + "fill": "#6B7280", + "content": "Terms of Service", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "normal" + } + ] + } + ] + }, + { + "type": "frame", + "id": "9wXlK", + "name": "fDiv", + "width": "fill_container", + "height": 1, + "fill": "#1E293B" + }, + { + "type": "frame", + "id": "W8ca8", + "name": "fBottom", + "width": "fill_container", + "padding": [ + 20, + 0, + 0, + 0 + ], + "children": [ + { + "type": "text", + "id": "E7qAW", + "name": "fCopy", + "fill": "#374151", + "content": "© 2025 TapTrack. All rights reserved. Built in the Philippines.", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + }, + { + "type": "frame", + "id": "kvQK9", + "name": "fBottomSpacer", + "width": "fill_container", + "height": 1 + }, + { + "type": "text", + "id": "r623I", + "name": "fBottomRight", + "fill": "#374151", + "content": "Student data never leaves your premises.", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + } + ] + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/public/favicon.svg b/public/favicon.svg new file mode 100644 index 0000000..1661fbd --- /dev/null +++ b/public/favicon.svg @@ -0,0 +1,4 @@ + + + T + diff --git a/public/icons.svg b/public/icons.svg new file mode 100644 index 0000000..e952219 --- /dev/null +++ b/public/icons.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/screenshots/4frZA.png b/public/screenshots/4frZA.png new file mode 100644 index 0000000..c3855a6 Binary files /dev/null and b/public/screenshots/4frZA.png differ diff --git a/public/screenshots/58IBI.png b/public/screenshots/58IBI.png new file mode 100644 index 0000000..3af9f80 Binary files /dev/null and b/public/screenshots/58IBI.png differ diff --git a/public/screenshots/Reports.jpg b/public/screenshots/Reports.jpg new file mode 100644 index 0000000..28d5bb5 Binary files /dev/null and b/public/screenshots/Reports.jpg differ diff --git a/public/screenshots/gE861.png b/public/screenshots/gE861.png new file mode 100644 index 0000000..526113f Binary files /dev/null and b/public/screenshots/gE861.png differ diff --git a/public/screenshots/rj2JV.png b/public/screenshots/rj2JV.png new file mode 100644 index 0000000..a78d83a Binary files /dev/null and b/public/screenshots/rj2JV.png differ diff --git a/src/App.vue b/src/App.vue new file mode 100644 index 0000000..432fab1 --- /dev/null +++ b/src/App.vue @@ -0,0 +1,16 @@ + + + diff --git a/src/components/AppFooter.vue b/src/components/AppFooter.vue new file mode 100644 index 0000000..b864fdd --- /dev/null +++ b/src/components/AppFooter.vue @@ -0,0 +1,99 @@ + + + diff --git a/src/components/AppNavbar.vue b/src/components/AppNavbar.vue new file mode 100644 index 0000000..b007d7b --- /dev/null +++ b/src/components/AppNavbar.vue @@ -0,0 +1,116 @@ + + + diff --git a/src/components/ContactSection.vue b/src/components/ContactSection.vue new file mode 100644 index 0000000..210f273 --- /dev/null +++ b/src/components/ContactSection.vue @@ -0,0 +1,146 @@ + + + diff --git a/src/components/FeatureCard.vue b/src/components/FeatureCard.vue new file mode 100644 index 0000000..a9ac5b0 --- /dev/null +++ b/src/components/FeatureCard.vue @@ -0,0 +1,29 @@ + + + diff --git a/src/components/FeaturesSection.vue b/src/components/FeaturesSection.vue new file mode 100644 index 0000000..6adcf8b --- /dev/null +++ b/src/components/FeaturesSection.vue @@ -0,0 +1,105 @@ + + + diff --git a/src/components/HeroSection.vue b/src/components/HeroSection.vue new file mode 100644 index 0000000..632362b --- /dev/null +++ b/src/components/HeroSection.vue @@ -0,0 +1,71 @@ + + + diff --git a/src/components/HowItWorksSection.vue b/src/components/HowItWorksSection.vue new file mode 100644 index 0000000..6bb5211 --- /dev/null +++ b/src/components/HowItWorksSection.vue @@ -0,0 +1,118 @@ + + + diff --git a/src/components/PrivacyBanner.vue b/src/components/PrivacyBanner.vue new file mode 100644 index 0000000..b17782d --- /dev/null +++ b/src/components/PrivacyBanner.vue @@ -0,0 +1,46 @@ + + + diff --git a/src/components/ScreenshotsSection.vue b/src/components/ScreenshotsSection.vue new file mode 100644 index 0000000..d9ea3a1 --- /dev/null +++ b/src/components/ScreenshotsSection.vue @@ -0,0 +1,61 @@ + + + diff --git a/src/components/SeeItLiveSection.vue b/src/components/SeeItLiveSection.vue new file mode 100644 index 0000000..57fc202 --- /dev/null +++ b/src/components/SeeItLiveSection.vue @@ -0,0 +1,38 @@ + + + diff --git a/src/components/SupportSection.vue b/src/components/SupportSection.vue new file mode 100644 index 0000000..fe73ee4 --- /dev/null +++ b/src/components/SupportSection.vue @@ -0,0 +1,109 @@ + + + diff --git a/src/directives/reveal.ts b/src/directives/reveal.ts new file mode 100644 index 0000000..d9fce5d --- /dev/null +++ b/src/directives/reveal.ts @@ -0,0 +1,39 @@ +import type { Directive } from 'vue' + +// v-reveal — fades + slides element up when it enters the viewport +// Usage:
or
+ +interface RevealOptions { + delay?: number // ms delay before animation starts (default 0) + duration?: number // ms animation duration (default 600) + y?: number // px to translate from (default 24) +} + +const reveal: Directive = { + mounted(el, binding) { + const { delay = 0, duration = 600, y = 24 } = binding.value ?? {} + + // Set initial invisible state + el.style.opacity = '0' + el.style.transform = `translateY(${y}px)` + el.style.transition = `opacity ${duration}ms ease, transform ${duration}ms ease` + el.style.transitionDelay = `${delay}ms` + + const observer = new IntersectionObserver( + (entries) => { + entries.forEach((entry) => { + if (entry.isIntersecting) { + el.style.opacity = '1' + el.style.transform = 'translateY(0)' + observer.unobserve(el) + } + }) + }, + { threshold: 0.12 }, + ) + + observer.observe(el) + }, +} + +export default reveal diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 0000000..37b2f11 --- /dev/null +++ b/src/main.ts @@ -0,0 +1,8 @@ +import { createApp } from 'vue' +import './style.css' +import App from './App.vue' +import reveal from './directives/reveal' + +const app = createApp(App) +app.directive('reveal', reveal) +app.mount('#app') diff --git a/src/pages/LandingPage.vue b/src/pages/LandingPage.vue new file mode 100644 index 0000000..6175cb7 --- /dev/null +++ b/src/pages/LandingPage.vue @@ -0,0 +1,23 @@ + + + diff --git a/src/style.css b/src/style.css new file mode 100644 index 0000000..dea61cb --- /dev/null +++ b/src/style.css @@ -0,0 +1,99 @@ +@import "tailwindcss"; + +/* ─── Design Tokens ─────────────────────────────────────── */ +@theme { + /* Colors — Primary */ + --color-primary: #1D4ED8; + --color-primary-hover: #1A43C0; + --color-primary-light: #EFF6FF; + --color-primary-dark: #1E3A5F; + + /* Colors — Navy / Dark backgrounds */ + --color-navy: #0F172A; + --color-navy-mid: #1E293B; + --color-navy-light: #334155; + + /* Colors — Text */ + --color-text-heading: #0F172A; + --color-text-body: #475569; + --color-text-muted: #64748B; + --color-text-subtle: #94A3B8; + --color-text-faint: #CBD5E1; + + /* Colors — Backgrounds */ + --color-bg-white: #FFFFFF; + --color-bg-alt: #F8FAFF; + --color-bg-card: #F8FAFC; + + /* Colors — Borders */ + --color-border: #E2E8F0; + --color-border-dark: #334155; + + /* Colors — Status */ + --color-success: #059669; + --color-success-bg: #ECFDF5; + --color-success-text: #4ADE80; + --color-success-dark: #14532D; + + --color-warning: #CA8A04; + --color-warning-bg: #FEF9C3; + + --color-danger: #E11D48; + --color-danger-bg: #FFF1F2; + + /* Colors — Accent */ + --color-purple: #7C3AED; + --color-purple-bg: #F3E8FF; + + --color-sky: #0284C7; + --color-sky-bg: #E0F2FE; + + --color-blue-400: #60A5FA; + + /* Typography */ + --font-sans: 'Inter', ui-sans-serif, system-ui, sans-serif; +} + +/* ─── Base Reset ────────────────────────────────────────── */ +*, *::before, *::after { + box-sizing: border-box; + margin: 0; + padding: 0; +} + +html { + scroll-behavior: smooth; +} + +body { + font-family: var(--font-sans); + color: #475569; + background-color: #ffffff; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +/* ─── Page Container ────────────────────────────────────── */ +.page-container { + max-width: 1440px; + margin-inline: auto; + padding-inline: 100px; +} + +@media (max-width: 1280px) { + .page-container { + padding-inline: 64px; + } +} + +@media (max-width: 1024px) { + .page-container { + padding-inline: 40px; + } +} + +@media (max-width: 640px) { + .page-container { + padding-inline: 24px; + } +} diff --git a/tsconfig.app.json b/tsconfig.app.json new file mode 100644 index 0000000..7319ced --- /dev/null +++ b/tsconfig.app.json @@ -0,0 +1,14 @@ +{ + "extends": "@vue/tsconfig/tsconfig.dom.json", + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "types": ["vite/client"], + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"] +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..1ffef60 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/tsconfig.node.json b/tsconfig.node.json new file mode 100644 index 0000000..1b46bb1 --- /dev/null +++ b/tsconfig.node.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "ES2022", + "lib": ["ES2022"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["vite.config.ts"] +} diff --git a/vercel.json b/vercel.json new file mode 100644 index 0000000..6a92648 --- /dev/null +++ b/vercel.json @@ -0,0 +1,5 @@ +{ + "rewrites": [ + { "source": "/(.*)", "destination": "/" } + ] +} diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..1cb8510 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,11 @@ +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' +import tailwindcss from '@tailwindcss/vite' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [ + vue(), + tailwindcss(), + ], +})